我正在尝试连续减去一个特定的数字,以获得该数字的最后一位数(不除法)。例如,当为q=54时,我们在循环之后得到q=4。q=205也是如此,输出为q=5。
if(q>10)
while(q>10)
begin
q=q-10;
end迭代应该在逻辑上收敛。然而,我得到了一个错误:"Synth 8-3380循环条件在2000次迭代后不收敛“
我查了Use of For loop in always block的帖子。它说循环中的迭代次数必须是固定的。
然后我尝试用固定的迭代来实现这个循环,如下所示(只是为了检查这是否至少是综合的):
if(q>10)
while(loopco<9)
begin
q=q-10;
loopco=loopco-1;
end但上述方法也不起作用。得到相同的错误"Synth 8-3380循环条件在2000次迭代后不收敛“。从逻辑上讲,它应该是10次迭代,因为我已经声明了loopco=8的值。
任何关于如何在verilog中实现上述功能的建议都将是有帮助的。
发布于 2018-01-22 05:32:06
该代码不能被综合。对于综合,循环必须具有编译时已知的迭代次数。因此,它必须知道要做多少减法。在这种情况下,它不能。
永远不要忘记,对于合成,你是在将一种语言转换为硬件。在这种情况下,工具需要生成N个减法的代码,但N的值是未知的。
你已经说过你正在努力避免分裂。这告诉我,你知道一般的除法运算符是不能综合的。尝试使用重复减法来解决这个问题是行不通的。你应该心存疑虑:如果这件事真的那么简单,现在应该已经完成了。
如果你知道Q的上限(根据位数),你可以自己构建它:
wire [5:0] q;
reg [3:0] rem;
always @( * )
if (q<6'd10)
rem = q;
else if (q<6'd20)
rem = q - 6'd10;
else if (q<6'd30)
rem = q - 6'd20;
etc.
else
rem = q - 6'd60;我注意到了你的问题旁边弹出的这个链接,表明你过去曾问过这个问题:How to NOT use while() loops in verilog (for synthesis)?
https://stackoverflow.com/questions/48370869
复制相似问题