我用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'b100000
与i
的长度相同,这使得循环channel
无限期地运行。
此外,Xilinx软件中存在一些错误,但我没有使用它。
有人知道为什么我会收到此错误或为什么它与仿真有所不同吗? 有没有没有循环的方法来实现此功能的方法?
这是代码:
11111 + 1 = 00000
答案 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
这通过了综合,并在仿真中给出了预期的结果。