【问题标题】:Loop Convergence - Verilog Synthesis循环收敛 - Verilog 综合
【发布时间】:2018-01-22 05:32:05
【问题描述】:

我试图连续减去一个特定的数字以获得该数字的最后一位(不除法)。例如当 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中实现上述功能的建议都会有所帮助。

【问题讨论】:

  • 如果 loopco 在您递减时开始低于 9,您的第二个条件肯定会永远持续下去。... Sill 看着您的其他代码。 q 在哪里设置?这可能会干扰您的循环。毕竟 Verilog 是一种并行语言。只是片刻,这仅在合成中失败?不,那行不通!
  • @oldfart 感谢您的帮助。是的,我尝试了一些解决方法,但没有奏效。你是对的。

标签: verilog synthesis


【解决方案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)?

【讨论】:

  • 感谢您的回答。你是对的。应指定循环迭代。我尝试在一个循环中使用多个 for 循环,最多 10 次,这是可综合的: if(q>1000) for(i=0;((i1000));i=i+1 ) 开始 q=q-1000;结束 if(q>100) for(i=0;((i100));i=i+1) 开始 q=q-100;结束 if(q>10) for(i=0;((i10));i=i+1) 开始 q=q-10;结束
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多