Icarus verilog 转储内存数组 ($dumpvars)

问题描述 投票:0回答:2

我尝试转储一个数组(reg [31:0] data [31:0]),但我无法成功完成。 我已经尝试过iverilog wiki中的方法:

integer idx;
for (idx = 0; idx < 32; idx = idx + 1)
    $dumpvars(0,cpu_tb.cpu0.cpu_dp.cpu_regs.data[idx]);

它有效,但是发生了两件事。

  1. 出现警告:VCD 警告:
    array word cpu_tb.cpu0.cpu_dp.cpu_regs.data[0] will conflict with an escaped identifier
  2. 在 GTKWave 中,我在 SST 窗口中有类似这样的内容:
    \data[0][31:0]

有什么解决办法吗?

arrays memory verilog dump icarus
2个回答
8
投票

我已经通过电子邮件发送了 Icarus Verilog 的邮件列表。以下是一些答案:

要转储数组单词 Icarus 需要对名称进行转义,因此它是 兼容VCD转储格式。这就是 \data[0][31:0] 的意思。它 是数据数组的第 0 个 32 位字。因为一个转义的名字 并且数组名称现在可能会发生冲突 Icarus 会生成警告。它 如果它可以检查转义标识符冲突并且 仅在出现问题时打印一条消息,但据我记得这一点 是不可能的。

我们选择使用转义标识符,以便所有转储者都可以 处理数组字。另一个常见的选择是只支持他们 使用仅适用于某些转储的特殊转储命令 格式。

我同意如果我们能让警告更准确就好了, 但我们通常忙于其他事情所以小烦恼 看起来修复起来很复杂的问题通常不会得到解决。正如我 请记住,已经过去很多年了,问题是你是否 搜索转义标识符,它找到数组元素并在那里 VPI 中无法搜索下一次出现的情况。这是可能的 在伊卡洛斯搜索中按名称查找数组元素 实施是一个错误。

卡里


“要转储数组单词 Icarus 需要转义名称,所以它是 兼容VCD转储格式。这就是 \data[0][31:0] 的意思。 是第零个吗?数据数组的 32 位字。因为一逃走 名称和数组名称现在可能会发生冲突 Icarus 产生 警告。如果它可以检查转义标识符,那就最好了 冲突并且仅在出现问题时打印一条消息,但正如我所言 请记住这是不可能的。”

...我认为没有必要转义这些名字。两个VCS (后跟 fsdb2vcd)并且 CVC 直接发出名称,没有 问题。剪切和粘贴示例如下所示:

$var 电线 5 `' IC_DrAd0 [3][4:0] $end $var 电线 5 a' IC_DrAd0 [2][4:0] $end $var 电线 5 b' IC_DrAd0 [1][4:0] $end $var 电线 5 c' IC_DrAd0 [0][4:0]$结束

我意识到 VCD 规范没有定义这一点,但我不得不折叠 这些年来 gtkwave 中出现了很多此类扩展,就像其他扩展一样 工具生成这些结构。转义可能会导致保存文件 尝试模拟时不兼容(丢失信号) iverilog 与 VCS。

随着时间的推移,SV 构造可能会导致更多的东西添加到 VCD 文件。 AFAIK,1364 规范的 VCD 部分根本没有更新 自 Verilog-XL 以来。 CVC 通过以下方式解决了可能的不兼容性问题 添加 +dump_arrays plusarg (不,你不必在每个 数组元素之一)。

-托尼

我还给 GTKWave 创建者 Tony Bybell 发了一封邮件:

你好,

问题是编译器没有将这些值发送到 转储文件。您必须与 iverilog 联系 开发商。如果我运行 sim 并进行比较,我会看到同样的问题 另一个模拟器,例如打开了 +dump_arrays 的 CVC,它会 转储数组,它们在 gtkwave 中可见。

http://iverilog.wikia.com/wiki/Release_Notes_Icarus_Verilog_0_9_2 | 允许 $dumpvars 接受数组成员进行转储,

...看起来在“初始”时间你可能需要添加一个 对于每个要转储的数组element的 $dumpvars 语句。我不 知道数组名称本身是否有效。将每个元素分配给 “电线”也可能有用。

我从未在iverilog中尝试过此功能,所以我不知道是否可以 有用。您可能需要进行试验或询问开发人员。

-托尼


3
投票

我最近也遇到了类似的问题:

当像问题一样使用 for 循环转储变量时,会发生此 vcd 错误:

ERROR: $dumpvars cannot dump a vpiConstant.

我的解决方法是生成 n 条电线,并使用赋值语句将其分配给相应的数组字,如下所示:

reg     [31:0]  registers [31:0];
generate
  genvar idx;
  for(idx = 0; idx < 32; idx = idx+1) begin: register
    wire [31:0] tmp;
    assign tmp = registers[idx];
  end
endgenerate

现在在 GTKWave 中,我已正确转储生成块。

© www.soinside.com 2019 - 2024. All rights reserved.