SystemVerilog带符号加法器MSB计算逻辑及综合实现问题咨询
问题1解答
这个认知是正确的。
无符号数n位加法的n+1位输出,确实可以直接取n位加法器的原始进位输出拼接n位运算结果。但补码形式的带符号数做位宽扩展的运算时,不能直接复用n位加法器的进位作为扩展位的结果:必须先将两个输入操作数符号扩展到目标位宽(此处为6位),再用对应位宽的全加器完成运算,新增的最高位由两个符号扩展位加上低位的进位输入通过全加器计算得到,你遇到的12-13结果错误的情况,本质就是未做符号扩展、直接用无符号加法进位当最高位导致的。
问题2解答
综合工具会完全匹配你编写的RTL语义生成电路,不会擅自修改运算逻辑:
- 你最初写的
sum = a - b,由于logic类型默认是无符号的,语义为「两个5位无符号数相减,结果零扩展为6位赋值给sum」,所以综合工具会生成5位减法器,结果最高位直接接5位减法器的进位输出,不会新增全加器。 - 你修改后的
sum = $signed(a) - $signed(b),语义为「两个5位带符号数先符号扩展为6位,再执行带符号减法」,综合工具会自动实例化6位全加器,最高位的全加器会完成两个符号扩展位+低位进位的运算,和你手动计算的逻辑完全一致。
你之前的认知只适用于无符号数的位宽扩展加法场景,带符号补码运算的位宽扩展必须通过符号扩展+增加全加器层级实现,综合工具会根据你指定的带/无符号语义自动处理对应的电路结构。
内容的提问来源于stack exchange,提问作者Andrew Lees
相关产品推荐
相关产品推荐

