我在48页引用了this ppt。
Q1。如果签名的加法操作有正或负溢出怎么办? 在(签名签名)或(签名+签名)之间,我该怎么办?
例如,-63 + -96或72 + 105 如何处理这些?
Q2。我从这里找到了这样的代码。
reg signed [7:0] a;
reg [7:0] b;
initial
begin
result = a; //Signed
result = a * a; //Signed
result = a * 10; //Signed
result = $unsigned(a); //Unsigned
result = a[0]; //Unsigned
result = a[7:0]; //Unsigned
result = {a,a}; //Unsigned
result = {10{a}}; //Unsigned
result = a + b; //Unsigned
result = a * b; //Unsigned
end
这是真的吗?
答案 0 :(得分:0)
最好单独询问问题,以便接受每个部分的最佳答案。
Emman发布了a previous answer of mine链接,我认为它与问题的第一部分有关,因为它显示了如何检测溢出和下溢。
由于dave_59已经提到基于溢出/下溢的限制或允许包装完全取决于所需的算术。对于某些操作,您知道并且溢出将在下一个操作中返回到范围内,因此您可以在不需要硬件的情况下获得扩展精度的效果。通常在积分器(累积值)中进行区分(或者是相反的方式?)。
在我的大部分工作中,我需要限制,一旦检测到限制,只需指定最大值,最小值或实际值。
always @* begin
if (overflow) begin
result = {1'b0, {WIDTH-1{1'b1}}; //MAX +ve
end
else if (underflow) begin
result = {1'b1, {WIDTH-1{1'b0}}; // MAX -ve
end
else begin
result = the_real_result;
end
end
关于有符号/无符号算术的问题,它们看起来是正确的,但是一种简单的检查方法是设置为负值并使用$display("%d", variable_x);
运行模拟以查看算术的值类型。
注意:Verilog更喜欢无符号算术,并且会抓住机会去做。必须为签名算术签名所有操作数。