systemverilog算术运算返回负值

时间:2014-11-21 07:32:47

标签: verilog system-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)。我的问题可能是错的,但我的项目需要这个要求。

1 个答案:

答案 0 :(得分:0)

247和-9是相同的位模式,因此算术正确。 Signed vs unsigned是对位模式的解释。

注意: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