使用Icarus Verilog编译时遇“Incomprehensible for loop”错误求助
解决Icarus Verilog中For循环语法错误的问题
看起来你遇到的问题是Icarus Verilog对SystemVerilog语法的默认支持限制导致的,咱们一步步来搞定它:
问题根源
你testbench里的for循环用了int i,这是SystemVerilog的语法特性,但Icarus Verilog默认遵循传统Verilog(比如Verilog-2001)标准,并不识别int类型,所以会抛出语法错误。而你参考的浏览器环境(比如在线EDA工具)通常默认启用了SystemVerilog支持,所以讲师的代码能正常运行。
两种解决方案
方案1:改用Verilog标准兼容的循环变量类型
把循环里的int换成Verilog原生支持的integer类型,修改后的testbench代码如下:
module maj3_tb; reg a, b, c; wire out; maj3 DUT1(out, a, b, c); initial begin for (integer i=0; i<8; i=i+1) begin #5 {a,b,c} = i; end end initial begin $monitor(a,b,c,out); end endmodule
这个修改不需要调整编译命令,直接用常规的iverilog maj3.v testbench.v -o maj3_tb就能编译通过。
方案2:开启SystemVerilog支持编译
如果你想保留int类型的写法,可以在编译时加上-g2012参数,让Icarus Verilog启用SystemVerilog(IEEE 1800-2012)标准支持,编译命令如下:
iverilog -g2012 maj3.v testbench.v -o maj3_tb
执行完编译后,用vvp maj3_tb就能运行仿真了。
验证效果
不管用哪种方案,编译通过后运行仿真,你应该能看到8组输入对应的输出结果,完全符合3输入多数表决器的逻辑:当至少两个输入为1时,输出为1,否则为0。
内容的提问来源于stack exchange,提问作者Jack Frye
相关产品推荐
相关产品推荐

