2014-11-21 141 views
0

我有我的设计代码的一部分,如下所示。systemverilog算术运算返回负值

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

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 
+0

显示,在基数变化无符号,小数给出不同的结果,我同意。但是我陷入了一个特殊的情况。 参数n = 256; input [n-1:0] x; 输出y; 初始开始 x = 0; (0> = unsigned'(x-9)) y = 1;其他 y = 0; 结束 在这里,我期待Y为0,因为我的'if'逻辑是“0小于0-9,即247”但是变为1.我认为我遵循错误的编码方法。你能帮我解决这个问题吗? – 2014-11-21 08:22:11

+0

@VinayakHiremath我已经添加了一个例子,向您展示如何为您的条件使用'$ unsigned'。如果这仍然导致问题添加评论和更新答案与最新信息。 – Morgan 2014-11-21 08:36:03