首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环收敛- Verilog综合

循环收敛- Verilog综合
EN

Stack Overflow用户
提问于 2018-01-22 03:33:56
回答 1查看 1.5K关注 0票数 0

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

代码语言:javascript
复制
  if(q>10)
    while(q>10)
    begin
    q=q-10;
    end

迭代应该在逻辑上收敛。然而,我得到了一个错误:"Synth 8-3380循环条件在2000次迭代后不收敛“

我查了Use of For loop in always block的帖子。它说循环中的迭代次数必须是固定的。

然后我尝试用固定的迭代来实现这个循环,如下所示(只是为了检查这是否至少是综合的):

代码语言:javascript
复制
if(q>10)
    while(loopco<9)
    begin
    q=q-10;
    loopco=loopco-1;
    end

但上述方法也不起作用。得到相同的错误"Synth 8-3380循环条件在2000次迭代后不收敛“。从逻辑上讲,它应该是10次迭代,因为我已经声明了loopco=8的值。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-22 05:32:06

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

永远不要忘记,对于合成,你是在将一种语言转换为硬件。在这种情况下,工具需要生成N个减法的代码,但N的值是未知的。

你已经说过你正在努力避免分裂。这告诉我,你知道一般的除法运算符是不能综合的。尝试使用重复减法来解决这个问题是行不通的。你应该心存疑虑:如果这件事真的那么简单,现在应该已经完成了。

如果你知道Q的上限(根据位数),你可以自己构建它:

代码语言:javascript
复制
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)?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48370869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档