You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Verilog结构建模中4位加法器调用后高位输出为X问题求助

问题排查:8位加法器高4位输出为X的原因及解决

问题背景

采用结构建模方式构建32位加法器:先实现1位全加器,再基于此搭建4位加法器,进而扩展为8位加法器。4位加法器单独仿真正常,但在8位加法器中调用时,仿真结果显示高4位输出为X(未知态)。

相关代码

1位全加器

module adder_1bit(Sum,CarryOut,A,B,CarryIn);

output Sum,CarryOut;
input A,B,CarryIn;

assign Sum = A^B^CarryIn;
assign CarryOut = (A&B) | (B&CarryIn) | (A&CarryIn);

endmodule

4位加法器

module adder_4bit(Sum,CarryOut,A,B,CarryIn);

output [3:0] Sum;
output CarryOut; 
input [3:0] A,B;
input CarryIn;
wire w[2:0];

assign CarryIn = 1'b0;
adder_1bit add0(Sum[0],w[0],A[0],B[0],CarryIn);
adder_1bit add1(Sum[1],w[1],A[1],B[1],w[0]);
adder_1bit add2(Sum[2],w[2],A[2],B[2],w[1]);
adder_1bit add3(Sum[3],CarryOut,A[3],B[3],w[2]);

endmodule 

8位加法器

module adder_8bit(Sum,CarryOut,A,B,CarryIn);

output [7:0] Sum;
output CarryOut; 
input [7:0] A,B;
input CarryIn;
wire w;

assign CarryIn = 1'b0;
adder_4bit add4(Sum[3:0],w,A[3:0],B[3:0],CarryIn);
adder_4bit add5(Sum[7:4],CarryOut,A[7:4],B[7:4],w);

endmodule 

测试平台

module adder_test;

reg [7:0] A,B;
reg CarryIn;
wire [7:0] Sum;
wire CarryOut;

adder_8bit UUT (Sum,CarryOut,A,B,CarryIn);

initial
    begin
    A = 8'b00101011;
    B = 8'b01010110;
    CarryIn = 1'b0;
#10;
    
    end
endmodule

问题原因分析

核心问题出在子模块内部对输入端口直接赋值:

  1. 在adder_4bit模块中,CarryIn是模块的输入端口,但代码里用assign CarryIn = 1'b0;强制赋值。当8位加法器调用adder_4bit add5时,外部试图将低4位加法器的进位输出w作为add5的CarryIn输入,此时add5内部的assign CarryIn = 1'b0与外部驱动的w形成多驱动冲突,导致add5的CarryIn信号变为未知态(X),进而使得高4位的全加器计算全部出错,输出X。
  2. 同理,adder_8bit模块中也存在assign CarryIn = 1'b0;,这会覆盖测试平台传入的CarryIn信号,虽然本次测试中传入的是0,但这种写法破坏了模块的可复用性和信号驱动的正确性。

解决方案

删除所有子模块内部对输入端口的赋值语句:

  1. 修改adder_4bit,去掉assign CarryIn = 1'b0;。如果需要默认进位输入为0,应在调用该模块的上层(如测试平台或8位加法器)传入0,而非在子模块内部强制赋值。
  2. 修改adder_8bit,去掉assign CarryIn = 1'b0;,让测试平台传入的CarryIn正常生效。

修改后的adder_4bit代码:

module adder_4bit(Sum,CarryOut,A,B,CarryIn);

output [3:0] Sum;
output CarryOut; 
input [3:0] A,B;
input CarryIn;
wire w[2:0];

adder_1bit add0(Sum[0],w[0],A[0],B[0],CarryIn);
adder_1bit add1(Sum[1],w[1],A[1],B[1],w[0]);
adder_1bit add2(Sum[2],w[2],A[2],B[2],w[1]);
adder_1bit add3(Sum[3],CarryOut,A[3],B[3],w[2]);

endmodule 

修改后的adder_8bit代码:

module adder_8bit(Sum,CarryOut,A,B,CarryIn);

output [7:0] Sum;
output CarryOut; 
input [7:0] A,B;
input CarryIn;
wire w;

adder_4bit add4(Sum[3:0],w,A[3:0],B[3:0],CarryIn);
adder_4bit add5(Sum[7:4],CarryOut,A[7:4],B[7:4],w);

endmodule 

此时重新仿真,高4位输出将恢复正常。

内容的提问来源于stack exchange,提问作者Sachin Mirajkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:21:39