我有一部分我的设计代码如下。
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