符号加法器实现



假设我有两个逻辑向量:

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(计算的。

我的问题是:

  1. 我认为有符号加法器确实需要MSB上的全加法器来计算正确的结果,这是正确的吗
  2. 如果以上是正确的,那么合成工具会如何处理?它还会知道在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"。

最新更新