系统Verilog算术运算返回负值



我有一部分我的设计代码如下。

parameter n=256;
input [n-1:0] x;
output y;
initial begin
x = 0;
if(0 >= unsigned'(x-9))
y = 1;
end

我的期望是,无符号减法运算应该返回十进制 247,但实际上它返回 -9。有没有人有更好的编码方法来实现这一目标?我的实际要求是,即使我从大值中减去较小的值,该值也应该滚动到 w.r.t. 参数宽度(好像 0-1 应该产生 255)。我的问题可能是错误的,但这个要求在我的项目中是必要的。

247 和 -9 是相同的位模式,因此算术是正确的。有符号与无符号是对位模式的解释。

注意:0-1 只有 255,有 8 位数字,您已将它们定义为 256 位数字。

以下示例应该有助于澄清,我们使用$signed$unsigned关键字,这些关键字会更改十进制表示的显示方式,但底层二进制形式不会更改。

module tb;
  parameter n=8;
  logic [n-1:0] x;
  logic y;
 initial begin
  x = 0;
  $display("%1d", x-9);
  $display("%1b", x-9);
  $display("");
  $display("%1d", $unsigned(x-9) );
  $display("%1b", $unsigned(x-9) );
  $display("");
  $display("%1d", $signed(x-9) );
  $display("%1b", $signed(x-9) );
  $display("");
  $finish;
end
endmodule

哪些输出:

4294967287
11111111111111111111111111110111
4294967287
11111111111111111111111111110111
-9
11111111111111111111111111110111

对于您的示例,您只需要使用$unsigned

module tb;
parameter n=8;
 logic [n-1:0] x;
 logic y;
 initial begin
   x = 0;
   if(0 >= $unsigned(x-9)) begin
     y = 1;
   end
   else begin
     y = 0;
   end
   $display("y: %b", y);
   $finish;
 end
 endmodule

最新更新