在always块中使用For循环

时间:2016-11-09 06:45:40

标签: verilog fpga vivado

我正在编写一个用于计算十进制数字位数的Verilog代码。在下面的代码中,我初始化了c的值等于a。 我能够正确地获得模拟结果,但无法进行同步,错误是由于&c; a ='。我该如何摆脱错误?是否还有其他逻辑来计算位数?

Error: [Synth 8-3380] loop condition does not converge after 2000 iterations 

代码: -

module numdigits(a,b);
parameter n=100;
input [0:n-1] a;
output reg [0:n-1]b;   //THIS MODULE COUNTS THE NUMBER OF DIGITS IN DECIMAL FORM
reg [0:n-1] d,c;
always @(*)
begin 
    d=0;
    for(c=a;c>0;c=c/10)
    begin
    d=d+1;
    end
    b=d;
end 
endmodule

1 个答案:

答案 0 :(得分:0)

为了使for循环可以合成,它必须是 static :也就是说,循环的最大迭代次数必须是固定的。考虑到a具有固定的位数,可能看起来循环的迭代次数最多,但请记住,你的合成器不会模拟你的代码,所以它无法分辨。

您需要重构代码;你需要以这样的方式编写它,以便修复循环迭代的最大数量。换句话说,循环的迭代次数必须是固定的,但如果您愿意,可以提前跳出(使用disable语句)。