【发布时间】: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