如何解决EDA Playground上《数字设计与计算机架构》sillyfunction例程design.sv第1行语法错误
错误原因及修复方案
核心问题有两个,你之前修改变量类型未生效是因为语法错误优先级高于类型检查,先抛出了第一行的语法错误:
- iverilog默认未开启SystemVerilog支持:你代码中使用的
logic是SystemVerilog专属类型,iverilog默认按Verilog标准解析,识别不了input logic语法直接报错。 - 测试平台端口类型定义错误:testbench中需要主动赋值的激励信号a、b、c不能定义为input,需改为reg类型;连接dut输出的y不能定义为output,需改为wire类型。
步骤1:修改测试平台代码
修正后的testbench代码如下:
module testbench(); reg a, b, c; wire y; sillyfunction dut(a,b,c,y); initial begin $dumpfile("file.vcd"); $dumpvars(0, testbench); a = 0; b = 0; c = 0; #10 c = 1; #10 b = 1; c = 0; #10 c = 1; #10 a = 1; b = 0; c = 0; #10 c = 1; #10 b = 1; c = 0; #10 c = 1; $finish; end endmodule
$dumpvars明确指定模块层级可以避免层级遍历异常
步骤2:调整编译命令
给iverilog添加-g2012参数开启SystemVerilog IEEE 2012标准支持,修改后的编译运行命令为:
iverilog -g2012 -Wall design.sv testbench.sv && vvp a.out
可选兼容方案(不需要SystemVerilog)
如果不想使用SystemVerilog特性,可以把设计代码中的logic全部替换为Verilog原生类型,修改后的设计代码如下:
module sillyfunction(input wire a,b,c, output wire y); assign y = ~a & ~b & ~c | a & ~b & ~c | a & ~b & c; endmodule
该方案无需修改编译命令,使用原有命令即可正常编译运行。
内容的提问来源于stack exchange,提问作者asimtot
相关产品推荐
相关产品推荐

