循环收敛-Verilog综合

循环收敛-Verilog综合,verilog,synthesis,Verilog,Synthesis,我试图连续减去一个特定的数字,以得到数字的最后一位,而不需要除法。例如,当q=54时,我们在循环后得到q=4。q=205也是如此,输出为q=5 if(q>10) while(q>10) begin q=q-10; end 迭代应该在逻辑上收敛。但是,我得到一个错误: [Synth 8-3380]循环条件在2000次迭代后不收敛 我查看了邮件-。它说循环中的迭代次数必须是固定的 然后,我尝试使用固定迭代实现此循环,如下所示,只是为了检查此循环是否至

我试图连续减去一个特定的数字,以得到数字的最后一位,而不需要除法。例如,当q=54时,我们在循环后得到q=4。q=205也是如此,输出为q=5

  if(q>10)
    while(q>10)
    begin
    q=q-10;
    end
迭代应该在逻辑上收敛。但是,我得到一个错误: [Synth 8-3380]循环条件在2000次迭代后不收敛

我查看了邮件-。它说循环中的迭代次数必须是固定的

然后,我尝试使用固定迭代实现此循环,如下所示,只是为了检查此循环是否至少合成:

if(q>10)
    while(loopco<9)
    begin
    q=q-10;
    loopco=loopco-1;
    end
但上述措施也不起作用。获得相同的错误[Synth 8-3380]循环条件在2000次迭代后不会收敛。从逻辑上讲,应该是10次迭代,因为我已经声明了loopco=8的值


任何关于如何在verilog中实现上述功能的建议都会很有帮助。

这段代码无法合成。对于合成,循环必须具有编译时已知的迭代次数。因此,它必须知道要进行多少次减法。在这种情况下,它不能

永远不要忘记,对于合成,您正在将语言转换为硬件。在这种情况下,工具需要生成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;
刚刚注意到在您的问题旁边弹出的链接,它表明您过去曾被问过:

如果loopco在你减量时开始低于9,那么你的第二个条件肯定会永远持续下去。。。。请查看其他代码。q集在哪里?这可能会干扰你的循环。毕竟Verilog是一种并行语言。等一下,这只会在合成中失败?不,那不行@谢谢你的帮助。是的,我尝试了一些变通办法,但没有奏效。你说得对,谢谢你的回答。你是对的。应该指定循环迭代。我尝试在一个循环中使用最多10次的多个for循环,这是可合成的:ifq>1000 fori=0;i1000;i=i+1开始q=q-1000;当i=0时,结束ifq>100;i100;i=i+1开始q=q-100;当i=0时,结束ifq>10;i10;i=i+1开始q=q-10;终止