Verilog加法运算中carry-out进位位cout无法捕获溢出问题求助
问题原因
你的问题根源是Verilog的表达式位宽推断规则:
- 赋值语句右侧的表达式运算位宽默认由参与运算的操作数的最大位宽决定,你代码中参与运算的
~matrix_A是8位、matrix_B是8位、1'b1是1位,最大位宽为8位,因此整个加法运算默认按8位执行,运算过程中产生的第9位进位会直接被截断。 - 把已经被截断的8位运算结果赋值给左侧9位的
{cout, matrix_BA}拼接信号时,高位会默认补0,因此cout始终为0。
解决方法
只需要将右侧运算中的任意一个操作数手动扩展为9位,即可让整个表达式按9位运算,保留进位结果:
// 对~matrix_A高位补1位0,扩展为9位,触发整体9位运算 assign {cout,matrix_BA} = {1'b0, ~matrix_A} + matrix_B + 1'b1;
修改后运算结果为9'h103,此时cout会被赋值为1,matrix_BA为8'h03,符合你的预期计算结果。
内容的提问来源于stack exchange,提问作者user10995546
相关产品推荐
相关产品推荐

