For loop verilog中无止境循环的求解

For loop verilog中无止境循环的求解,for-loop,verilog,For Loop,Verilog,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:完整代码可在此处找到: 埃里克在评论中给出了答案,因此我将其复制到这里作为答案: 在verilogreg[31:0]i被解

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:完整代码可在此处找到:
埃里克在评论中给出了答案,因此我将其复制到这里作为答案:

在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])

是否将
i
解释为未签名的数字?在这种情况下,
0-1=2^32-1>0
,这将解释无限循环。