2016-11-09 35 views
0

我正在写一个Verilog代码来计算十进制数中的位数。在下面的代码中,我已经初始化c的值等于a。 我能够正确地获得模拟结果,但无法同步,错误归因于'c = a'。我怎样才能摆脱错误?有没有其他的逻辑来计算数字的数量?总是使用for循环块

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 
+0

我对你的模块没有任何问题。也许它是一个测试台或工具问题?请参阅:https://www.edaplayground.com/x/24e3 – Hida

+0

@Hida我正在使用vivado软件,为什么我们需要测试台来合成代码?它主要用于模拟,对吧? –

+0

我同意它没有正确回答你的问题。不过,我想指出,您应该始终模拟您的RTL,以减少花费在FPGA /综合反馈上的调试时间。 – Hida

回答

0

为了使for循环是综合的,它必须是静态:即迭代轮循环的最大数量必须是固定的。看起来你的循环的迭代次数是最大的,因为a有固定的位数,但要记住你的合成器不能模拟你的代码,所以它不能说明这一点。

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

+0

是否有任何其他的逻辑来找到一个数字的位数? –

+0

那么,你的算法是好的,它只是不可写的方式合成。对于初学者,你需要循环固定次数:'n/3'怎么样?这太多了,但是'n/4'太少了。然后可以保持十分制并增加一个计数器,当你达到零时停止。此时,如果您愿意,您可以使用'disable'跳出循环,但这不是必需的。 (重要的是当'c'变为零时,你停止递增你的计数器。) –