Verilog仿真报fulladder未引用错误 模块实例化仿真失败求助
Verilog仿真报错修复方案
核心报错根因
报错Unresolved reference to 'fulladder'的根本原因是:Verilog中模块实例化属于并行语句,禁止写在always、initial这类过程块内部。你将fulladder和shifter两个模块的实例化语句写在了my_multiplier的时钟沿触发always块内,仿真器无法识别这种不符合语法规范的写法,因此报找不到模块引用的错误。
其他需同步修复的逻辑问题
- shifter模块输出端口O为16位,但内部赋值的
out_reg仅8位,位宽不匹配会导致高位数据丢失 - 8位乘法需要对应8次移位累加,你将计数变量C定义为2位、循环终止条件设为C==3,仅能实现低4位乘法,功能不完整
- 模块实例化必须指定实例名,不能仅写模块名加端口列表
- testbench中未给时钟信号
clk_tb赋初始值,仿真时时钟会一直处于不定态X $monitor语句放在300个时间单位的延时之后,会错过所有前期的输出打印
具体修改步骤
- 将
shifter和fulladder的实例化语句从always块内移出,放到my_multiplier模块的内部、所有过程块之外,补充实例名:
// 写在my_multiplier模块内,always块之前 wire [15:0] shift_result; shifter shift_u0 ( .in({8'd0, A}), .N({1'b0, C}), .O(shift_result) ); fulladder adder_u0 ( .x(shift_result), .y(O), .O(Otemp) );
- 修正shifter的内部寄存器位宽:
// 将shifter模块内的reg [7:0] out_reg;修改为 reg [15:0] out_reg;
- 调整计数变量位宽和循环终止条件:
// 将reg [1:0] C;修改为 reg [2:0] C; // 将S2状态内的if (C == 3)修改为 if (C == 7)
- 删除always块内原来写的
shifter ( A, C, Atemp);和fulladder (Atemp, O, Otemp);两行非法语句 - 给testbench补充时钟初始值,调整监控语句位置:
initial begin clk_tb = 0; // 补充时钟初始值 $monitor($time, "\t A=%d,\t B=%d,\t O=%d", A_tb, B_tb, O_tb); // 移到最开头 A_tb = 8'd8; B_tb = 8'd7; Rst_tb = 1; #10 Rst_tb = 0; #15 Ld_tb = 1; #10 Ld_tb = 0; #300 $finish; end
内容的提问来源于stack exchange,提问作者Faye Valentine
相关产品推荐
相关产品推荐

