Verilog 中的 For 循环不收敛

For Loop In Verilog Does Not Converge

我正在尝试使用 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 吗?

for 循环的合成必须在 COMPILE 期间收敛。 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

我假设它是某种类型的触发器逻辑,因为无论如何这都会产生状态元素。因此,您需要为结果和标志使用正确的 nbas。