Verilog:for 循环内总是

Verilog : For loop inside an always

我正在尝试实现一个在 always 块中使用 for 循环的模块 我们使用 0 和 1 的数组来记录在特定时间内接收到的信号数量。

不幸的是,我们收到了那种错误:

ERROR:Xst:2636 - "Tourniquet.v" line 54: Loop has iterated 10000 times. Use "set -loop_iteration_limit XX" to iterate more.

似乎在 always 块中不允许使用 for 循环(n 似乎没有重置)。 我查看了各种网站和论坛,但没有找到任何解决方案。

这是我的代码:

  module Tourniquet(
    input t0,
    input mvt,
     input clk,
    output init
    );

reg initialisation;
reg [0:99] memoire;
reg count = 0;
reg compteur = 0;
reg n;

assign init = initialisation;

always @(posedge clk) 
begin
    if (count==99) 
    begin 
            if (mvt)
            begin 
            memoire[count]=1;
            count=0;
            end

            else
            begin 
            memoire[count]=0;
            count=0;
            end
    end 

    else
    begin 
            if (mvt)
            begin 
            memoire[count]=1;
            count = count + 1;
            end

            else
            begin 
            memoire[count]=0;
            count = count + 1;
            end
    end
end

always @(posedge clk) 
begin
initialisation = 0;
for (n=0; n<99; n=n+1) compteur = compteur + memoire[n];
if (compteur>10) initialisation = 1;
compteur = 0;
end

endmodule

我找不到解决方案,也不确定问题出在哪里,欢迎任何提示或帮助。 非常感谢!

您需要循环迭代 100 次。为此,您需要 至少 8 位计数器变量.

但是这里,n被声明为reg n,一个单位计数器变量。所以,n+1 给出 1 并再次执行 n+1 给出 0

所以,n<100的for循环条件总是满足。而且 for 循环 永远不会终止 .

这是您的 for 循环重复多次的主要原因。

通常 integer 数据类型用于此类计数器。 integer 类似于 32 位 reg。将 n 声明为 integer nreg [7:0] n 以获得 适当的计数器增量 和适当的循环终止。

根据@sharvil111 的回答,我看到所有 这些都是单个位:

reg initialisation;
reg count = 0;
reg compteur = 0;
reg n;

Verilog中的一个N位reg是正常声明的,例如:

reg [N-1:0] n;

其中 N 是某个数字(常数)。我看到这是一个 100 位数:

reg [0:99] memoire;

显然,我不知道你的设计意图,但我怀疑你想要一个 N 位数字的数组:

reg [N-1:0] memoire [0:99];

其中 N 又是某个数字(常数)。