假设我有两个逻辑向量:
logic [4:0] a;
logic [4:0] b;
保持2的补码值。我想进行减法运算,并将结果扩展1位。例如,假设我想计算-12 - 13
并存储-25
:的结果
logic [5:0] sum;
sum = a - b;
上面的模拟正如我所期望的,我得到了6'b100111
的期望值。手工完成:
1 0 1 0 0 -12
1 0 0 1 0 invert bits of +13
1 carry-in
---------------
1 0 0 1 1 1 = -25
因此,结果的MSB只是加法的进位。然而,如果我计算12 - 13
,结果应该是6'b111111
,但我得到了6'b011111
的模拟结果。手工完成此示例:
0 1 1 0 0 12
1 0 0 1 0 invert bits of +13
1 carry-in
---------------
0 1 1 1 1 1 = +31
因此,结果不正确,因为MSB的进位为零。
我可以通过如下更改RTL来修复模拟结果:
logic [5:0] sum;
sum = $signed(a) - $signed(b);
返回CCD_ 7的预期结果。在阅读了SystemVerilog LRM以了解这里发生的事情后,我发现加法是以最大操作数的比特大小进行的,包括赋值操作的LHS。此外,使用$signed
关键字会使5位输入操作数符号扩展到6位。考虑到这一点并再次手动执行操作:
[0] 0 1 1 0 0 12
[1] 1 0 0 1 0 invert bits of +13
1 carry-in
---------------
1 1 1 1 1 1 = -1
其中CCD_ 9和CCD_。由此可以清楚地看出,MSB实际上是由全加法器([0] + [1] + carry-out from previous column
(计算的。
我的问题是:
- 我认为有符号加法器确实需要MSB上的全加法器来计算正确的结果,这是正确的吗
- 如果以上是正确的,那么合成工具会如何处理?它还会知道在MSB上实例化一个全加法器吗
我一直认为,在SystemVerilog中写入一个加法器,其中输入为n位宽,将导致合成工具实例化一个n位加法器,其中(n+1(位输出只是该加法器的进位。
您忘记了符号扩展-13(10011(应该是110011。因此,您对第二个简历的解读不正确。它不是+31(6位(,在5位版本中应解释为-1
。要生成6位结果,请同时扩展两个操作数:
ext
0 | 0 1 1 0 0 -- 12
1 | 1 0 0 1 1 -- -13
==|==========
1 | 1 1 1 1 1 -- -1 (6 bit)
只有使用无符号数字时,您才可以不用扩展,因为它总是"0"。