AMD Vivado™ Design Suite 实现 - 解决 I/O 时钟布局器错误

本文作者:AMD 工程师 Suraj Chothawe

AMD 器件上的典型时钟电路结构如下所示:

输入端口 (IBUF) → BUFG → FDCE/C

如果使用 MMCM 或 PLL 修改了时钟,那么其结构如下所示:

输入端口 (IBUF) → BUFG → MMCM/PLL → BUFG → FDCE/C

对于 GT 时钟,其结构如下所示: 

GT_QUAD → BUFG_GT → FDCE/C 

在 I/O 时钟布局器阶段可能会发生错误,指出该工具无法对该时钟结构进行布局,直至最后 BUFG 仍然无法完成布局。

发生这种问题的原因可能如下:

1. 时钟结构中的各单元上所选的 LOC 或 CLOCK_REGION。

2. 时钟结构纷繁复杂,若无手动约束则无法完成其布局。

3. 工具中存在 I/O 时钟布局器算法漏洞。

该工具遇到这种情况时会打印详细的错误消息,其中包括以下信息:

  • 可解决此错误的 CLOCK_DEDICATED_ROUTE 约束

  • 来自时钟结构的单元

  • 由工具决定的时钟缓冲器与 MMCM 的临时布局

  • 所有 I/O 时钟架构规则,以及临时布局所违反的规则

虽然 CLOCK_DEDICATED_ROUTE 可以解决该错误,但在将其纳入工作流程之前,用户必须知晓以下内容:

  • 使用 CDR 对设计 QoR 所带来的影响

  • 引发错误的原因是用户约束、LOC、CLOCK_REGION 还是 P-BLOCK

  • 时钟结构是否复杂,是否可以通过手动约束来解决

  • 是否真的是 I/O 时钟布局器算法的问题

本篇博客探讨了如何理解 I/O 时钟布局器错误、如何评估 CDR 约束必要性,以及如何判定该工具是否可以通过额外添加的约束来完成结构布局。

在下列用户指南中提供了 CLOCK_DEDICATED_ROUTE 的各种值:

AMD Versal™ 自适应 SoC《Versal 自适应 SoC 硬件、IP 和平台开发方法指南》(UG1387):

https://docs.amd.com/access/sources/dita/topic?isLatest=true&url=ug1387-acap-hardware-ip-platform-dev-methodology&resourceid=uwc1571265539541.html&ft:locale=en-US 

AMD UltraScale™ FPGA《适用于 FPGA 和 SoC 的 UltraFast 设计方法指南》(UG949):

https://docs.amd.com/access/sources/dita/topic?isLatest=true&url=ug949-vivado-design-methodology&resourceid=using-clock_dedicated_route-constraint-aa661636.html&ft:locale=en-US 

对于复杂的时钟结构,可以通过混用多个单元和信号线的 CDR、LOC 与 CLOCK_REGION 约束来解决 I/O 时钟布局器错误。

在进行深入调试之前,应该熟悉以下前提条件:

1. 使用的器件的 I/O 架构:

2. 使用的器件的时钟架构:

3. 使用“Find”(查找)窗口即可列出器件中可用的各 site 位置(BUFG 和 MMCM/PLL)。

4. 在网表中使用“Find”窗口即可列出错误中提及的单元和信号线。

5. AMD Vivado™ Design Suite 的基本 Tcl 脚本编制。

调试

I/O 时钟布局器算法是一种基于规则的算法,可将网表中的时钟结构映射到具体规则。这些规则用于为设计中的 MMCM/PLL 和 BUFG 分配临时布局。但请务必注意,这些临时布局对某些单元可能是正确的,但对其他单元则不正确。以下提供的规则可用于理解与评估该算法所做的布局:

由于这些规则均衍生自实际硅片,因此 I/O 时钟布局器错误不太可能源自于工具中的真实漏洞。但本篇博客涵盖了这种可能性,以防万一。

遇到这些问题时,建议使用 .runs/impl_1 文件夹中找到的优化后检查点来开展工作。如果您是非工程模式用户,则需要显式在 opt_design 之后生成 dcp 文件。 

1. open_checkpoint post_opt.dcp。

2. 使用 place_ports 命令代替 place_design。
当 place_design 运行失败时,并不会在存内设计中留下可用的部分布局以供检验。可以改为运行 place_ports 命令,以便复现同样的错误,同时提供产生的部分布局以供检验。

3. 显示提及的单元和信号线的原理图。
您可以使用 Vivado 中的 Ctrl+F 选项返回错误中提及的单元,或者使用 Tcl 脚本将错误消息中的单元和信号线放入 Tcl 变量中。

4. 显示时钟区域中 BUFG 与 MMCM site 位置的对象,以检查特定时钟区域的使用率。

5. 对时钟结构进行分段。
例如,如果时钟结构如下:
(IBUF) → BUFG → MMCM/PLL → BUFG → FDCE/C
第 1 段 = IBUF → BUFG
第 2 段 = BUFG → MMCM/PLL
第 3 段 = MMCM/PLL →  BUFG

6. 将 Vivado 的临时布局与文档中提到的规则进行交叉比对。
例如,如果这是个 Versal 器件,那么第 1 段显然是被布局在同一个时钟区域内的,即第一行。
第 2 段属于规则中提到的最后一行。为了解决这个问题,如果您将 LOC 放在 MMCM 上,那么第 3 段就归属于规则的第 2 行。
检查提及的单元上是否有任何用户约束,如果有,那么请检查这些约束是否对任何规则产生影响。
如果进行迭代分析:您需要验证布局是否遵守上述规则。如不遵守这些规则,请检查其他单元是否影响该布局。
注释:以上链接中提到了这些规则。

7. 判定一个约束,用于强制 Vivado 遵循这些规则。

8. 使用新约束重新运行优化后的步骤。 

9. 重复上述步骤,以识别错误中是否会报告任何新单元。通过迭代方式执行这些步骤,即可获得一组约束,用于继续执行设计实现。

注释:在某些情况下,CDR = false 是不可避免的,例如,为输入时钟使用非 CCIO 管脚时就是如此。在此情况下,必须在 IBUF 的输出上设置 CDR = False 约束。

以下提供了在 Versal 架构和 UltraScale 架构中调试这些问题的一些示例。 

1. CLOCK_DEDICATED_ROUTE 异常示例:

https://adaptivesupport.amd.com/s/article/Vivado-Implementation-Resolving-IO-Clock-Placer?language=zh_CN 

2. UltraScale 示例:

https://adaptivesupport.amd.com/s/article/Vivado-Implementation-Resolving-IO-Clock-Placer-Errors-Example-Ultrascale?language=zh_CN 

3. Versal 示例:

https://adaptivesupport.amd.com/s/article/Vivado-Implementation-Resolving-IO-Clock-Placer-Errors-Example-Versal?language=zh_CN 

文章来源:AMD Xilinx开发者社区