基于4位加法器的8位selectAdd8仿真输出全为不定态X问题求助
问题定位与修正说明
- 变量位宽定义错误:
sumL(低位4位加法器的和输出,位宽应为4bit)、sum0(低位进位为0时高位4位加法器的和输出,位宽4bit)、sum1(低位进位为1时高位4位加法器的和输出,位宽4bit)被错误定义为1bit的reg,位宽不匹配导致信号采样异常。 - 低位加法器端口连接错误:
add_lower实例的输出端口错误连接到了最终输出sum、cout,而这两个输出同时被后续always块赋值,产生多驱动冲突,是输出不定态的直接原因;同时你定义的coutL没有被任何信号驱动,始终为x态,导致always块的判断逻辑完全失效。 - 高位进位输出逻辑错误:最终进位输出
cout需要根据低位进位结果选择高位加法器的进位输出cout0或cout1,直接写死为0或1会导致高位溢出时进位输出错误。
修正后selectAdd8模块代码
module selectAdd8( input [7:0] a, input [7:0] b, input cin, output reg [7:0] sum, output reg cout ); reg coutL, cout0, cout1; reg [3:0] sumL, sum0, sum1; add4 add_lower(a[3:0],b[3:0],cin,sumL,coutL); add4 add4_0(a[7:4],b[7:4],0,sum0,cout0); add4 add4_1(a[7:4],b[7:4],1,sum1,cout1); always @ (*) begin if (coutL==1) begin sum = {sum1, sumL}; cout = cout1; end else begin sum = {sum0, sumL}; cout = cout0; end end endmodule
修正后重新编译仿真即可得到正确的计算结果,不会出现不定态输出。
内容的提问来源于stack exchange,提问作者marchive7
相关产品推荐
相关产品推荐

