3

所以我遇到了一些我必须复制的旧代码,但它不能用新的 Xilinx 编译器编译,所以我需要弄清楚它到底做了什么。我有这样的事情:

if rising_edge(clk) then
   —do some things
   if rising_edge(clk) then
      —do some other things
   end if
end if

是否需要 2 个时钟周期才能到达内部 if 语句,或者第二个 if 语句只是多余的?

此外,赛灵思给出了错误:“信号逻辑由时钟控制,但似乎不是有效的顺序描述”</p>

谢谢,任何帮助表示赞赏。

4

4 回答 4

6

鉴于这rising_edge(clk)true第一个if,当然它在第二个嵌套时仍然是正确的if。这假设在该部分内没有时间过去-- do some stuff,这可能是这种情况。

因此,第二个 if 可以被替换为if true then... 或者确实被忽略了!

于 2011-06-17T10:48:25.753 回答
1

这在我见过的任何工具中都无法综合。不要这样做,即使是为了模拟。

第二条语句rising_edge 不是顺序语句,例如赋值。这是一个涉及时间的陈述,因此您可以确定。

于 2011-06-16T17:17:52.053 回答
1

如果它在合成器故障/错误之前合成。您对代码与经过测试并确定有效的代码相匹配的确定程度如何?(听起来你只知道这是之前合成的正确代码。)

现有系统是否可用于比较和测试?涉及哪些工具版本?您可以使用旧工具并验证它的合成以及它提供的警告吗?根据您使用的版本,您可能可以使用合成报告、fpgaeditor(或类似工具)来查看实际合成的内容。
或者,您可以分析代码以了解设计人员的意图并使用有效的 HDL 进行复制。

如果你没有剩下的就是反复试验。尝试假设:

  1. 嵌套上升沿内的语句始终处于活动状态。(删除嵌套的上升沿 if 语句离开它包围的代码块)。
  2. 嵌套上升沿内的语句从不活动。移除整个嵌套的上升沿块。
  3. 你可以试试,但我真的无法想象合成器会如何产生 2 个周期的延迟。您可能会被迫尝试这种或其他更不可能的情况。很难预测这种故障模式会是什么。
于 2011-06-16T18:44:45.803 回答
0

实际上,您要推断的是嵌套的时钟进程。

这不应该合成,因为它不代表有意义的硬件。

您应该根据 xst.pdf 重写您的代码(例如,如果您使用 Xilinx ISE)。

亲切的问候,尼古拉斯·卡夫瓦迪亚斯

于 2011-06-23T10:38:57.690 回答