У меня возникли проблемы с пониманием того, как обращаться с переполнением при добавлении или вычитании подписанных чисел в 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;
Я не связан с синтезируемостью, я просто хочу, чтобы выяснить, как бороться с переливом на одноместный арифметике подписанных значений.
Если бы кто-нибудь мог указать мне в правильном направлении, я был бы очень благодарен, спасибо!
спасибо за идею, что IEEE Std для SystemVerilog, которая немного отличается от Verilog. Только для справки IEEE.1364-2005 для verilog. Тем не менее, я все еще не вижу ничего конкретного, касающегося методов переполнения для подписанной математики. – kenbonilla
IEEE 1364-2005 был превзойден IEEE 1800-2012, который служит стандартом для Verilog и SystemVerilog. – wilcroft