Verilator - VerilatedVcdC->dump() 的解释

Verilator - explanation of VerilatedVcdC->dump()

我正在读一本很棒的 Verilator tutorial and in these slides (第 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

A bit of confusion here:

Does this means CPU cycle or OS cycle? I programatically already found out here that on my Linux Debian OS cycle is 10 ms. I assume from now on that Verilator authors meant CPU cycle because gtkwave in the end will show units of nano seconds (keep reading)!

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

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

//dump 2ns before the tick

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

VerilatedVcdC->dump(8);

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

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

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


有没有可能 VerilatedVcdC->dump(x) 中的 x 实际上是 OS 滴答计数器的 绝对值 而不是某个相对时间?

我也刚开始使用 verilator。我相信 x 代表您使用 verilog 创建的电路中的延迟。它在一些书中被称为 'delta'。它不应该与您机器上的任何东西 运行 specifically.for tickcount = 1 相关,调用将数据转储到值 (1 * 10 - 2),即 delta = 8。下一个计数是 (2 * 10 - 2) 即 delta = 18 等等。这是我正在关注的教程的 link:https://www.itsembedded.com/dhd/verilator_1/。简而言之,tickcount 与您的机器无关,它是模拟 'time'

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

换句话说,它是您转储的模拟时间点——实际上,如果(如教程中那样)您在每个时钟滴答和 'eval()' 之后转储,只需将参数递增 1 .请参阅 Verilator 的 issue 2924 中的解释,如 @71GA 在之前的评论中所述。