2015-06-20 3 views
0

У меня возникли проблемы с пониманием того, как обращаться с переполнением при добавлении или вычитании подписанных чисел в verilog.verilog signed сложение и вычитание

Когда я сделал это с числами без знака, это было очень просто:

input [15:0] A; 
input [15:0] B; 
input [3:0] S; 
output reg [15:0] AddAB; 
... 
[email protected](*) 
    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; 
... 
[email protected](*) 
    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, но я get DisplayOF = 1. То же самое происходит с вычитанием. Я получаю правильное значение для SubAB, но я получаю переполнение на DisplayOF, когда не должен.

Если это делает никакой разницы, мой испытательный стенд выглядит в основном, как этот

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

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

Я не связан с синтезируемостью, я просто хочу, чтобы выяснить, как бороться с переливом на одноместный арифметике подписанных значений.

Если бы кто-нибудь мог указать мне в правильном направлении, я был бы очень благодарен, спасибо!

+0

спасибо за идею, что IEEE Std для SystemVerilog, которая немного отличается от Verilog. Только для справки IEEE.1364-2005 для verilog. Тем не менее, я все еще не вижу ничего конкретного, касающегося методов переполнения для подписанной математики. – kenbonilla

+1

IEEE 1364-2005 был превзойден IEEE 1800-2012, который служит стандартом для Verilog и SystemVerilog. – wilcroft

ответ

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 
Смежные вопросы