Icarus Verilog模拟:范围索引表达式不是常数:i

时间:2013-07-11 21:03:10

标签: verilog icarus

我正在模拟Icarus Verilog中的16位MIPS网表。 这是我在testbench中得到的错误

mips_16_core_top_tb_0.v:144: error: Scope index expression is not constant: i
mips_16_core_top_tb_0.v:144: error: Unable to bind wire/reg/memory `uut.register_file_inst.reg_array[i]' in `mips_16_core_top_tb_0_v.display_all_regs'

Related code : 
task display_all_regs;
begin
$display("display_all_regs:");
$display("------------------------------");
$display("R0\tR1\tR2\tR3\tR4\tR5\tR6\tR7");
for(i=0; i<8; i=i+1)
$write("%d\t",uut.register_file_inst.reg_array[i]); <--- error points to this line

$display("\n------------------------------");
end
endtask

当我模拟RTL时,我也得到同样的错误,但我仍然将vcd文件转出。如果是网表,我甚至都没有生成vcd文件。 很高兴听到你的想法。

2 个答案:

答案 0 :(得分:1)

您的代码看起来很好,我刚刚测试了Icarus中的数组的跨模块变量索引(当前版本,来自git)并且它可以工作。

我怀疑你的问题是你自己正在编译mips_16_core_top_tb_0.v - 如果你这样做的话,伊卡洛斯会给你这个消息。所有源文件都需要在Icarus中一起编译。其他一些模拟器将允许您自己编译该文件,然后仅在精心设计期间检查错误(即运行模拟时),但Icarus的方式是Verilog最初打算使用的方式。

答案 1 :(得分:0)

在这种情况下,寄存器[index]中的索引必须是常量。在reg_array [i]中,我是一个变量而不是固定的。要模拟使用此代码,您必须重新设计设计,以便它不需要变量索引寄存器。它可能是特定于模拟器的此功能缺乏支持。如果是这种情况,您应该尝试不同的模拟器。