【问题标题】:verilog reg as loop counter cannot use the max numberverilog reg 作为循环计数器不能使用最大数量
【发布时间】:2018-10-02 02:19:04
【问题描述】:

我使用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],一切都会好起来的。

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

【问题讨论】:

    标签: verilog


    【解决方案1】:

    你的错误是你创建了一个无限循环。 for 循环的结束条件永远不会为真。 4 位 reg 的最大值为 15 (4'hf)。当 i=15 时,执行 i=i+1 再次设置 i=0。通过将 reg 再扩展一位,可以将最大值增加到 31,并且可以避免无限循环。

    按照惯例,你会改变:

    reg [3:0] i;
    

    到:

    integer i;
    

    【讨论】:

      【解决方案2】:

      在 for 循环中,变量会被更改,直到条件为假。

      因此首先增加i (i = i + 1'b1),然后代码检查是否应该执行 for 循环。对于 i==15,该值仍然为 true,因此执行循环。然后发生增量:15+1 但这给出了 0,这仍然是正确的。因此,您有一个无限循环。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-30
        相关资源
        最近更新 更多