带Verilog签名的加减法

问题描述 投票:2回答:2

我无法理解在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;

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

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

overflow verilog addition signed subtraction
2个回答
1
投票

{OFAdd, AddAB} <= 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

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.