Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Icarus verilog转储内存阵列($dumpvars)_Arrays_Memory_Verilog_Dump_Icarus - Fatal编程技术网

Arrays Icarus verilog转储内存阵列($dumpvars)

Arrays Icarus verilog转储内存阵列($dumpvars),arrays,memory,verilog,dump,icarus,Arrays,Memory,Verilog,Dump,Icarus,我尝试转储数组(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]); 整数idx; 对于(idx=0;idx

我尝试转储数组(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]);
整数idx;
对于(idx=0;idx<32;idx=idx+1)
$dumpvars(0,cpu_tb.cpu0.cpu_dp.cpu_regs.data[idx]);
它起作用了,但发生了两件事

  • 出现警告:VCD警告:数组字cpu_tb.cpu0.cpu_dp.cpu_regs.data[0]将与转义标识符冲突
  • 在GTKWave中,SST窗口中有类似的内容:\data[0][31:0]
  • 有什么解决办法吗


    提前谢谢,我的英语很抱歉

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

    要转储数组单词,Icarus需要转义名称 与VCD转储格式兼容。这就是\data[0][31:0]的含义。信息技术 是数据数组的第0个32位字。因为一个转义的名字 现在数组名可能与Icarus产生的警告冲突。信息技术 最好能检查转义的标识符冲突和 只有在出现问题时才打印消息,但我记得这一点 这是不可能的

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

    我同意如果我们能让警告更准确就好了, 但我们通常忙于其他事情,所以很小的烦恼 似乎很难解决的问题往往得不到解决。正如我 记住,这已经有很多年了,问题是如果你 搜索转义标识符,找到数组元素,然后 无法在VPI中搜索下一个事件。这是可能的 在Icarus搜索中按名称查找数组元素 实现是一个bug

    卡里


    “要转储数组单词,Icarus需要转义名称 与VCD转储格式兼容。这就是\data[0][31:0]的含义。 它是数据数组的第0个32位字。因为 名称和数组名称现在可能会发生冲突 警告。最好能检查转义标识符 冲突,仅在出现问题时打印消息,但正如我所说 记住这是不可能的。”

    …我不认为有必要逃避这些名字。两个风投 (后跟fsdb2vcd)和CVC直接发出名称,不带 问题。剪切和粘贴示例如下所示:

    $var wire 5`'IC_DrAd0[3][4:0]$end$var wire 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]$end

    我意识到VCD规范没有定义这一点,但我不得不在一个 这些年来,gtkwave中有很多这样的扩展 工具生成这些构造。转义可能导致保存文件 尝试在上模拟时不兼容(缺少信号) 伊维洛格对风投

    随着时间的推移,SV构造可能会导致更多的东西添加到 VCD文件。好了,1364规格的VCD部分根本没有更新 自从Verilog XL。CVC通过 添加+dump_数组plusarg(不,您不必在每个数组上循环) 数组元素)

    -托尼

    我还向GTKWave的创建者Tony Bybell发送了一封邮件:

    你好,

    问题是编译器没有将这些值发送到 转储文件。你必须和伊维洛格联系 开发者。如果我运行sim卡并与之进行比较,我会发现同样的问题 另一个模拟器,如CVC,打开了+dump_阵列,这会 转储阵列,它们在gtkwave中可见

    | 允许$dumpvars接受要转储的数组成员

    …看起来在“初始”时间内,您可能需要添加 要转储的每个数组元素的$dumpvars语句。我不 知道数组名称本身是否有效。将每个元素指定给 “电线”也可能有用

    我从未在iverilog中尝试过这个功能,所以我不知道 它起作用了。您可能需要进行实验或询问开发人员

    -托尼


    我最近也有类似的问题:

    如问题所示,当使用for循环转储VAR时,会发生以下vcd错误:

    ERROR: $dumpvars cannot dump a vpiConstant.
    
    我的解决方法是使用assign语句生成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
    
    reg[31:0]寄存器[31:0];
    生成
    genvar-idx;
    对于(idx=0;idx<32;idx=idx+1)开始:寄存器
    导线[31:0]tmp;
    分配tmp=寄存器[idx];
    结束
    最终生成
    

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

    omg,它真的很有效。我只需要将注册名改为tmp而不是注册。