我使用for
循环编写了一个模块:
reg [3:0] i;
always @ ( a or b )
begin
for ( i = 4'h0; i <= 4'hf; i = i + 1'b1 )
//some code
end
我认为应该可以编译,但是vivado会说“循环极限超出”。
如果我将reg[3:0]
更改为reg[4:0]
,一切都很好。
我很困惑为什么当前的代码无法编译;我犯了一个错误吗?
答案 0 :(得分:0)
您的错误是您创建了一个无限循环。 for
循环的结束条件永远不会为真。 4位reg
的最大值为15(4'hf)。当i = 15时,执行i = i + 1会再次设置i = 0。通过将reg
再扩展一位,可以将最大值增加到31,从而避免了无限循环。
通常,您会更改:
reg [3:0] i;
收件人:
integer i;
答案 1 :(得分:0)
在for循环中,变量将一直更改,直到条件为false为止。
因此,第一个i
递增(i = i + 1'b1
),然后代码检查是否应执行for循环。对于i == 15,该值仍然为true,因此将执行循环。然后发生增量:15 + 1,但这得到0,这仍然是正确的。因此,您有一个无限循环。