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

Posted

技术标签:

【中文标题】Icarus Verilog 模拟:范围索引表达式不是常数:i【英文标题】:Icarus Verilog simulation : Scope index expression is not constant: i 【发布时间】:2013-07-11 21:03:10 【问题描述】:

我正在 Icarus Verilog 中模拟 16 位 MIPS 网表。 这是我在测试台中遇到的错误

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 文件。 很高兴听到您的想法。

【问题讨论】:

reg_array 是如何定义的?请在任务中定义integer i;。同一个i 可能存在冲突的驱动程序。 尝试添加整数 i;它在第 i 行表示语法错误;错误 mips_16_core_top_tb_0.v:140:语法错误 mips_16_core_top_tb_0.v:140:错误:语句格式错误 integer i; 移动到 begin 之前。您不能直接在此处附加文件。您可以将其上传到具有公共访问权限的文件共享站点(或您自己的个人站点)并提供链接。 如果 reg_array 没有定义,你希望如何写出它的内容?您是否已验证网表中寄存器值的分层路径与 RTL 中的相同? 很抱歉给您带来了困惑。 reg_array 是 register_file.v 中声明的寄存器。它不是输入/输出端口。这是调用不属于端口声明列表一部分的信号的语法正确方法吗?。 【参考方案1】:

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

我怀疑你的问题是你自己编译mips_16_core_top_tb_0.v - 如果你这样做,Icarus 会给出这个消息。所有源文件都需要在 Icarus 中一起编译。其他一些模拟器将允许您自行编译此文件,然后仅在细化过程中检查错误(即,当您运行模拟时),但 Icarus 的做法是 Verilog 最初打算使用的方式。

【讨论】:

自己编译和需要一起编译的源文件是什么意思?你是说我应该在运行时完全提及文件名。对不起,我有点新手。 我有 Icarus 版本 9.5,是当前版本之前的一个 iverilog file1.v file2.v .... filen.v 运行编译命令,即。将 all 您的源文件放在iverilog 命令行上。这会给你一个可执行文件,称为a.out 或类似的东西。 iverilog 需要一次查看所有源文件以检查错误并生成可执行文件。像某些语言一样,Verilog 没有“一次编译一个文件并链接并稍后检查其他错误”的规范。但是,无论如何,一些供应商已经这样做了。换句话说,那些供应商会让你“一次编译一个”,但 Icarus 不会。 我有一个解决方案,你有机会可以看看这个吗? ***.com/questions/18422889/…【参考方案2】:

在这种情况下,您在 register[index] 中的索引必须保持不变。在 reg_array[i] 中,i 是一个变量而不是固定的。要使用此代码进行仿真,您必须重新建模设计,使其不需要变量索引寄存器。这可能是特定于模拟器的对此功能的支持不足。如果是这种情况,您应该尝试不同的模拟器。

【讨论】:

已将索引值更改为数字,但我仍然收到相同的错误。我应该在端口列表中声明 reg-array 吗?。 嗯,当你说数字时,你的意思是像数字“0”这样的常数吗?该错误看起来与端口声明无关。如果您可以提供问题的最小可编译示例,我相信我会更有帮助。

以上是关于Icarus Verilog 模拟:范围索引表达式不是常数:i的主要内容,如果未能解决你的问题,请参考以下文章

在 Icarus Verilog 中调试组合逻辑循环

Icarus Verilog:多位数组解析错误

如果有条件,icarus verilog 指定不遵守延迟

如何使用 Icarus Verilog 在 Verilog 中转换 VHDL 代码?

Icarus Verilog和GTKwave使用简析

使用自由软件Icarus Verilog Simulator进行仿真