我的设计代码的一部分如下。
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)。我的问题可能是错的,但我的项目需要这个要求。
答案 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