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 在之前的评论中所述。
我正在读一本很棒的 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 在之前的评论中所述。