For loop Verilog中的For循环不收敛

For loop Verilog中的For循环不收敛,for-loop,verilog,vivado,For Loop,Verilog,Vivado,我试图使用for循环来计算32位数字中重复的前导位。为此,我正在做: input[31:0] A; output reg result; Integer i; for (i = 31; i > -1; i = i - 1) begin if (A[i] == 0) begin result = result + 1; end else if (A[i] == 1) begin i = -1; end end 然而,当我合成程

我试图使用for循环来计算32位数字中重复的前导位。为此,我正在做:

input[31:0] A;
output reg result;
Integer i;
for (i = 31; i > -1; i = i - 1) begin
    if (A[i] == 0) begin
        result = result + 1;
    end
    else if (A[i] == 1) begin
        i = -1;
    end
end

然而,当我合成程序时,我收到一条警告,说程序没有收敛。我使用for循环错误吗?在此之前,我使用了I>=0,甚至使用了一段时间,但它并没有改变结果。我将感谢任何帮助。我应该在运行循环之前将结果设置为0吗?

对于循环的合成,必须在编译时收敛。编译时无法确定
A[i]==1
的条件,因此循环在结束之前从32变为2^31-1


Verilog是一种HDL,在许多方面与标准计算机语言完全不同

A[i]==1
使迭代次数不确定,并导致合成失败。解决方法是让循环展开到最后,并使用条件变量来处理计算。如下所示:

input[31:0] A;
output reg result;
Integer i;
reg flag;

flag = 0;
for (i = 31; i > -1; i = i - 1) begin
    if (flag == 0 && A[i] == 0) begin
        result = result + 1;
    end
    else if (A[i] == 1) begin
        flag = 1;
    end
end

我假设这是某种类型的触发器逻辑,因为在任何情况下,这都会产生状态元素。所以,您需要对结果和标志使用正确的NBA

你的意思是偶然的
i=i-1
?是的,对不起。那是一个复制错误我怎样才能执行那种检查?我应该使用while循环吗?