Verilog 8位加减法器负数运算错误排查与修复求助
解决8位加减法器的负数赋值与计算错误问题
首先,咱们得先揪出测试平台里的核心错误:你用-8'b10101001这种方式给寄存器赋值是不对的!Verilog的语法规则里,-8'bxxxxxxxxx并不是把这个二进制数当成补码负数,而是先把这个二进制串解析成无符号十进制数,再对它取负,最后用补码表示。
举个例子:8'b10101001作为无符号数是169,-8'b10101001实际得到的是-169的8位补码(也就是8'b01010111),但你想要的是-87的补码(8'b10101001),这完全不是一回事!同样,-8'b10001100实际是-140的补码,而不是你需要的-116的补码(8'b10001100本身就是-116的8位补码)。
第一步:修正测试平台的赋值方式
你有两种正确的赋值方法:
- 直接用十进制负数赋值:Verilog会自动把十进制负数转换成对应的8位补码,这是最直观的方式:
#10 A = -87; B = -116; op = 1; - 直接赋值补码二进制(不要加负号):因为
8'b10101001本身就是-87的8位补码,8'b10001100是-116的8位补码,所以直接写:#10 A = 8'b10101001; B = 8'b10001100; op = 1;
第二步:检查加减法器的核心逻辑是否正确
确保你的减法实现是用补码减法规则:A - B = A + (~B + 1),也就是把B取反加1后和A相加。你的模块大致应该是这样的:
module addsub8 ( input [7:0] A, input [7:0] B, input mode, // 0=加,1=减 output [7:0] result, output overflow ); wire [7:0] B_comp; // 减法时,B取反加1;加法时直接用B assign B_comp = mode ? (~B + 1'b1) : B; // 计算结果,进位位作为溢出标志(适用于有符号数溢出判断) assign {overflow, result} = A + B_comp; endmodule
这里的{overflow, result}是把加法的进位作为溢出标志——当两个正数相加结果为负,或者两个负数相加结果为正,溢出标志会置1,符合有符号数的溢出判断逻辑。
验证修正后的结果
当你修正测试平台的赋值后,计算-87 - (-116)也就是-87 + 116,对应的补码运算就是8'b10101001 + 8'b01110100(116的补码),结果正好是8'b00011101(也就是十进制29),和你的预期一致。
内容的提问来源于stack exchange,提问作者MinSeob Lim
相关产品推荐
相关产品推荐

