【问题标题】:verilog signed addition and subtractionverilog 签名加减法
【发布时间】:2015-06-20 17:57:34
【问题描述】:

在 Verilog 中添加或减去有符号数字时,我无法理解如何处理溢出。

当我用无符号数做这个时,它非常简单:

input [15:0] A;
input [15:0] B;
input [3:0] S;
output reg [15:0] AddAB;
...
always@(*)
    begin
        {OFAdd, AddAB} <= A + B;
        {OFSub, SubAB} <= A - B;
...
        case(S)
            0:
            begin
                Display <= AddAB;
                DisplayOF <= OFAdd;
            end
            1:
            begin
                Display <= SubAB;
                DisplayOF <= OFSub;
            end
...

我会得到正确的输出。 但是对带符号的输入做同样的事情,我的溢出值是错误的

input signed [15:0] A;
input signed [15:0] B;
input [3:0] S;
output reg signed [15:0] AddAB;
...
always@(*)
    begin
        {OFAdd, AddAB} <= A + B;
        {OFSub, SubAB} <= A - B;
...
        case(S)
            0:
            begin
                Display <= AddAB;
                DisplayOF <= OFAdd;
            end
            1:
            begin
                Display <= SubAB;
                DisplayOF <= OFSub;
            end
...

例如,如果 A =-21846 和 B = 88,我得到正确的值 AddAB = -21758,但我得到 DisplayOF = 1。减法也会发生同样的情况。我得到了 SubAB 的正确值,但是当我不应该得到 DisplayOF 溢出时。

如果有什么不同的话,我的测试台基本上是这样的

    A = 16'sb1010101010101010;
    B = 16'sd88;
    S = 4'd0;
    #10;

    A = 16'sb1010101010101010;
    B = 16'sd88;
    S = 4'd1;
    #10;

我不关心可综合性,我只想弄清楚如何处理有符号值的一元算术溢出。

如果有人能指出我正确的方向,我将非常感激,谢谢!

【问题讨论】:

  • 感谢您的想法,IEEE 标准适用于 SystemVerilog,与 Verilog 略有不同。仅供参考 IEEE.1364-2005 用于 verilog。不过,我仍然没有看到任何专门处理签名数学溢出方法的内容。
  • IEEE 1364-2005 已被 IEEE 1800-2012 取代,后者作为 Verilog 和 SystemVerilog 的标准。

标签: overflow verilog addition signed subtraction


【解决方案1】:

{OFAdd, AddAB} &lt;= A + B; 在示例中,MSB (OFAdd) 不是溢出位。如果您可以访问加法器最后一位的进位,这可能会导致溢出,但在 RTL 中,您只能访问另一个全加器位。

A more detailed previous answer,展示了如何使用两个 MSB 检测上溢和下溢。

一个基本的上溢/下溢限制器:

AddAB = A + B;
case (AddAB[MSB:MSB-1])
  2’b01 : add = MAX_POS;//Overflow
  2’b10 : add = MAX_NEG;//Underflow
 default: add = AddAB[MSB-1:0]; //In Range
endcase

【讨论】:

    【解决方案2】:

    如果两个输入具有相同的符号并且结果具有相反的符号,则您有符号溢出。看 https://electronics.stackexchange.com/questions/476250/signed-overflow-detection/476254#476254

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 1970-01-01
      相关资源
      最近更新 更多