Verilog 有符号无符号操作
Verilog signed unsigned operation
我在第 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
这是真的吗?
问题最好单独提出,以便接受每个部分的最佳答案。
Emman 向 a previous answer of mine 发布了 link 我认为它与问题的第一部分相关,因为它显示了如何检测溢出和下溢。
正如 dave_59 提到的基于 overflow/underflow 的限制或允许换行完全取决于所需的算法。对于某些您知道的操作,下一个操作会将溢出带回范围内,因此您可以在不需要硬件的情况下获得扩展精度的效果。通常在积分器(累积值)中进行微分(或者相反?)。
在我的大部分工作中我都需要限制,一旦你检测到限制,它只是分配最大值、最小值或实际值的情况。
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
关于你关于 signed/unsigned 算术的问题,它们看起来是正确的,但一种简单的检查方法是将 a 设置为负值,然后 运行 使用 $display("%d", variable_x);
进行模拟以查看该值算术类型。
注意:Verilog 更喜欢无符号算术,并且会抓住机会这样做。对于有符号算术,所有操作数都必须有符号。
我在第 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
这是真的吗?
问题最好单独提出,以便接受每个部分的最佳答案。
Emman 向 a previous answer of mine 发布了 link 我认为它与问题的第一部分相关,因为它显示了如何检测溢出和下溢。
正如 dave_59 提到的基于 overflow/underflow 的限制或允许换行完全取决于所需的算法。对于某些您知道的操作,下一个操作会将溢出带回范围内,因此您可以在不需要硬件的情况下获得扩展精度的效果。通常在积分器(累积值)中进行微分(或者相反?)。
在我的大部分工作中我都需要限制,一旦你检测到限制,它只是分配最大值、最小值或实际值的情况。
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
关于你关于 signed/unsigned 算术的问题,它们看起来是正确的,但一种简单的检查方法是将 a 设置为负值,然后 运行 使用 $display("%d", variable_x);
进行模拟以查看该值算术类型。
注意:Verilog 更喜欢无符号算术,并且会抓住机会这样做。对于有符号算术,所有操作数都必须有符号。