我试图连续减去一个特定的数字来得到数字的最后一位数(没有除法)。例如,当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中实现上述功能的任何建议都会有所帮助。
答案 0 :(得分:1)
该代码无法合成。对于合成,循环必须具有编译时间已知的迭代次数。因此,它必须知道要做多少次减法。在这种情况下,它不能。
永远不要忘记,对于综合,您正在将语言转换为硬件。在这种情况下,工具需要生成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)?