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 更喜欢无符号算术,并且会抓住机会这样做。对于有符号算术,所有操作数都必须有符号。