要解决任何综合崩溃问题,通常应该从了解崩溃发生在综合的哪个阶段着手,以及工具方面是否有任何迹象指向特定的模块、赋值、声明或推断。 如果以下**无法帮助您解决您查询的问题,请分享在运行文件夹中生成的 hs_pidxxxx.log 文件以及“project_name.runs/synth_1/”目录下的综合日志文件。 在某些情况下会出现日志不足的状况,并且需要与赛灵思共享 RTL 设计,才能对问题进行进一步调试。 Elaboration 阶段中的工具崩溃: 这意味着该工具是在对 RTL 设计进行细化时崩溃的,综合日志看上去如下所示: ---------------------------------------------------------------------------------
Starting RTL Elaboration : Time (s): …
---------------------------------------------------------------------------------
…….
Abnormal program termination (11)
Please check '..hs_err_pidxxxx.log' for details
Parent process (pid xxxxx) has died. This helper process will now exit
OR
---------------------------------------------------------------------------------
Starting RTL Elaboration : Time (s): …
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
Finished RTL Elaboration : Time (s): cpu = …
---------------------------------------------------------------------------------
RTL Elaboration failed 在综合日志中,您应该会看到类似于“Abnormal program termination (11)”的崩溃相关消息(尽管可能是在没有消息的情况下)。这些问题就是崩溃问题。 如果是细分崩溃问题,在大多数情况下,问题出在工具中未得到正确处理的 RTL 或 RTL 的某些部分。 如果是这类情况,请与我们分享您的工程,以便我们可以在工具中添加修复程序,避免将来出现这类问题。 要在您这里调试此类问题,以下步骤可能会有用: 这里的目标是将崩溃缩小到“设计模块”,然后 -> “RTL 文件” -> “某部分 RTL” -> “Line of RTL 代码行” 确定发生问题的 RTL 文件是最艰巨的任务之一。要找到有问题的模块,可以使用以下方法: 使用黑匣子方法: 假设设计结构及层级如下所示:
这里的目标是使用 black_box 属性消除其他三个模块。 我们需要假设一个模块有问题。 假设 A 有问题:对于这种情况,保持 A 模块完好无损,并将 RTL 文件中的 B、C 和 D 都设为 black_box: (* black_box *) module B (
…)
end module (* black_box *) module C (
…)
end module (* black_box *) module D (
…)
end module 运行 Synthesis 并检查工具是否以崩溃。 如果工具已崩溃,则问题要么出在模块 A,要么出在其子模块 (A11、A12 ... A21、A22 ......)中。 在这种情况下,通过保留 A1 并将 A2 设为 black_box 继续调试,依此类推。 如果工具没有崩溃,则尝试保持 B 模块完好无损,并将 A、C 和 D 标记为 black_box。 这里有一个简单的示例工程:
在综合上述层级时,该工具崩溃并在综合日志中出现以下错误:
….
….
Parameter break bound to: 8'b11110000
An unrecoverable error has occurred, synthesis canceled.
---------------------------------------------------------------------------------
Finished RTL Elaboration : Time (s): cpu = 00:00:05 ; elapsed = 00:00:07 . Memory (MB): peak = 3278.059 ; gain = 194.688 ; free physical = 20020 ; free virtual = 114523
---------------------------------------------------------------------------------
RTL Elaboration failed
INFO: [Common 17-83] Releasing license: Synthesis
4 Infos, 5 Warnings, 0 Critical Warnings and 1 Errors encountered.
synth_design failed
ERROR: [Common 17-69] Command failed: Synthesis failed - please see the console or run log file for details
INFO: [Common 17-206] Exiting Vivado at Thu Feb 21 23:37:22 2019... 正如您在日志中可以清楚地看到的那样,当工具试图对设计进行细分时发生了崩溃。 为了调试这个问题,我们需要开始对模块进行黑盒测试。 尝试多个组合后,当使用 black_box 属性禁用 ps2_to_ascii1 时,综合通过,同样,当仅启用 pas2_to_ascii2 时,该工具会崩溃,如下所示: …
attribute black_box : string;
attribute black_box of Debounce : component is "yes";
attribute black_box of sinchronizer : component is "yes";
attribute black_box of SIPO : component is "yes";
attribute black_box of Driver : component is "yes";
… 由于我们已经确定了 RTL 文件/模块,现在的目标是要找到 RTL 中导致崩溃的部分。 这可能是因大循环迭代、长而复杂的赋值、复杂的位片操作或不正确的编码方式或不支持的结构而导致的。 在上述示例中,由于不支持编码方式,导致工具崩溃: process(…)
begin
case dummy is
when S1 =>
if rising_edge(clk) then
...
end if;
end if;
when S2 =>
if rising_edge(clk) then
...
end if;
end if;
when S3 =>
if rising_edge(clk) then
...
end if;
end if;
when S4 =>
...
end case;
end process; **也可以通过使单个模块成为综合的“顶层模块”来查看工具是否会崩溃来找到引起问题的模块或RTL文件。 例如,当 pas2_to_ascii2 被设置为顶层模块时,上述工程会以相同的错误崩溃
|