verilog reg作为循环计数器不能使用最大数量

时间:2018-10-01 15:11:12

标签: verilog

我使用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],一切都很好。

我很困惑为什么当前的代码无法编译;我犯了一个错误吗?

2 个答案:

答案 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,这仍然是正确的。因此,您有一个无限循环。