1

我正在阅读精彩的 Verilator教程,在这些幻灯片 (第 25 页)中,作者使用了库调用:

tfp->dump(tickcount * 10 - 2);

我知道这tfp是一个指向 Verilator 库对象的指针 VerilatedVcdC,因此这个调用实际上是:

VerilatedVcdC->dump(tickcount * 10 - 2);

但是这个调用实际上做了什么?头文件/usr/share/verilator/include/verilated_vcd_c.h中的描述有点短。它只说:

/// Write one cycle of dump data

这里有点混乱:

这是否意味着 CPU 周期或 OS 周期?我已经在这里以编程方式发现我的 Linux Debian OS 周期是 10 毫秒。我假设从现在开始 Verilator 作者的意思是 CPU 周期,因为 gtkwave 最后会显示纳秒单位(继续阅读)!

所以VerilatedVcdC->dump(x)理论上应该在转储文件中写入/转储xCPU 周期(整个周期而不是 ½ 周期)的数据tfp

但是由于某种原因,作者将其乘以 10 并减去 2。他的评论比说:

//dump 2ns before the tick

起初我无法相信这一点,因为当 时tickcount = 1,我们得到:

VerilatedVcdC->dump(8);

因此我们应该转储 8 个 CPU 周期...

出于某种原因,我错了,如果我将转储文件上传到内部gtkwave并检查波形,则可以确认这一点。

在此处输入图像描述

确实,2ns的数据在开始时被转储到转储文件中。这怎么可能?


是否可能xinVerilatedVcdC->dump(x)实际上是操作系统滴答计数器的绝对值而不是相对时间?

4

2 回答 2

1

我也刚开始使用verilator。我相信 x 代表您使用 verilog 创建的电路中的延迟。在某些书中,它被称为“三角洲”。它不应该与您机器上运行的任何东西特别相关。对于 tickcount = 1,调用将数据转储为值 (1 * 10 - 2),即 delta = 8。下一个计数是 (2 * 10 - 2),即delta = 18 依此类推。这是我正在关注的教程的链接:https ://www.itsembedded.com/dhd/verilator_1/ 。简而言之,tickcount 与您的机器无关,它是模拟“时间”

于 2021-09-17T17:19:58.047 回答
1

我在 ZipCPU 教程的同一点上被绊倒了,我花了一段时间才想出一个非常简单的解决方案:关键是参数 toVerilatedVcdC->dump()不是“延迟”,而是“瞬间”。

换句话说,它是您转储的模拟时间点——实际上,如果(如教程中所示)您在每个时钟滴答和“eval()”之后转储,只需将参数加一即可。请参阅 Verilator 的问题 2924中的解释,正如@71GA 在之前的评论中所提到的。

于 2021-10-13T14:18:43.950 回答