综合中超过了循环迭代限制,但仿真中没有超过

时间:2019-03-16 21:57:39

标签: verilog fpga synthesis

我用verilog编写了遍历活动通道的代码。 想法是跳过活动矢量中标记为0的频道。

我在模拟器中测试了代码 screen shot from simulatior,它可以按预期工作并执行。

当我尝试使用Synplify Pro合成代码时,出现错误: “超出了E CS162循环迭代限制4000-在循环构造test1.v(11)之前添加'//合成loop_limit 8000'”

错误指向循环条件(if first.endTime >= second.startTime { mergedMeetings = append(mergedMeetings, Meeting{first.startTime, second.endTime}) } )。

在google中搜索错误时,我在类似的代码中发现了一个常见错误,即i < 6'b100000i的长度相同,这使得循环channel无限期地运行。

此外,Xilinx软件中存在一些错误,但我没有使用它。

有人知道为什么我会收到此错误或为什么它与仿真有所不同吗? 有没有没有循环的方法来实现此功能的方法?

这是代码:

11111 + 1 = 00000

1 个答案:

答案 0 :(得分:3)

首先,迭代次数不是循环迭代,而是编译迭代。

问题是试图退出中间的循环(i = 6'b101111行)。这不能展开为一系列命令。似乎循环只会使您免于一遍又一遍地重复输入相同的内容,而不能做更复杂的事情。

一种可能的解决方案是键入所有32个if...else...if...else...,以便在找到1中的第一个activity时满足条件,而不必输入下一个{{ 1}}。我认为它看起来像这样:

else

我用标志解决了这个问题(如EML所建议)。有了该标志,该代码将被分解为32个重复的相同代码,但重复的always @(activity, channel) begin next_channel = 5'b0; if (activity[channel + 1]) next_channel = channel + 1; else if (activity[channel + 2]) next_channel = channel + 2; else if (activity[channel + 3]) next_channel = channel + 3; else if (activity[channel + 4]) next_channel = channel + 4; . . . 不同,并且通过更改fls来实现“停止”,以便在进一步的重复中不满足该条件。

解决方案代码:

i

这通过了综合,并在仿真中给出了预期的结果。