我正在尝试使用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吗?
答案 0 :(得分:1)
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。
答案 1 :(得分:0)
对于综合来说,循环必须在COMPILE时间内收敛。 A[i]==1
的条件无法在编译时确定,因此循环在结束之前从32变为2 ^ 31-1。
Verilog是HDL,在许多方面与标准计算机语言完全不同。