我在verilog中遇到了for循环语句的一些问题。
reg [31:0] i;
initial begin
for (i=2; i > 0; i = i - 1) begin
$display ("%d\n", i);
end
end
此代码运行没有任何问题,但如果我将中间条件更改为i> = 0,则程序会反复运行,而无需停止。
我不明白为什么会这样!
PS:完整的代码可以在这里找到: http://pastebin.com/3LX0Mkg0
答案 0 :(得分:4)
Eric在评论中给出了答案,所以我在这里复制它作为答案:
在verilog中reg [31:0] i;
被解释为无符号数。因此i >= 0
永远都是真的。要将i
定义为已签名,您必须按以下方式对其进行定义:reg signed [31:0] i;
虽然我们在讨论verilog中的已签名数字,但我想指出一个主要问题:如果你选择一个有符号数字(如i[15:0]
),则结果是无符号的。即使您选择i[31:0]
之类的所有位,情况也是如此。您可以使用$signed
这样的任务来解决此问题:$signed(i[15:0])