循环收敛 - Verilog 综合

Loop Convergence - 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 次迭代后不收敛”

我检查了 post - 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 中实现上述功能的任何建议都会有所帮助。

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

永远不要忘记,对于综合,您是在将一种语言转换为硬件。在这种情况下,该工具需要生成 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;

刚刚注意到这个 link 会弹出到您的问题旁边,表明过去有人问过它: How to NOT use while() loops in verilog (for synthesis)?