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
问题原因分析
核心问题出在子模块内部对输入端口直接赋值:
- 在
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。 - 同理,
adder_8bit模块中也存在assign CarryIn = 1'b0;,这会覆盖测试平台传入的CarryIn信号,虽然本次测试中传入的是0,但这种写法破坏了模块的可复用性和信号驱动的正确性。
解决方案
删除所有子模块内部对输入端口的赋值语句:
- 修改
adder_4bit,去掉assign CarryIn = 1'b0;。如果需要默认进位输入为0,应在调用该模块的上层(如测试平台或8位加法器)传入0,而非在子模块内部强制赋值。 - 修改
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
相关产品推荐
相关产品推荐

