我正在阅读精彩的 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)
理论上应该在转储文件中写入/转储x
CPU 周期(整个周期而不是 ½ 周期)的数据tfp
。
但是由于某种原因,作者将其乘以 10 并减去 2。他的评论比说:
//dump 2ns before the tick
起初我无法相信这一点,因为当 时tickcount = 1
,我们得到:
VerilatedVcdC->dump(8);
因此我们应该转储 8 个 CPU 周期...
出于某种原因,我错了,如果我将转储文件上传到内部gtkwave
并检查波形,则可以确认这一点。
确实,2ns的数据在开始时被转储到转储文件中。这怎么可能?
是否可能x
inVerilatedVcdC->dump(x)
实际上是操作系统滴答计数器的绝对值而不是相对时间?