典型时钟
AMD 设备上的典型时钟电路结构如下:
输入端口 (IBUF ) → BUFG → FDCE/C
如果使用 MMCM 或 PLL 修改时钟,则其结构如下:
输入端口 (IBUF) → BUFG → MMCM/PLL → BUFG → FDCE/C
对于 GT 时钟,其结构如下:
GT_QUAD → BUFG_GT → FDCE/C
I/O 时钟布局阶段可能会发生错误,表明该工具无法放置时钟结构直到最后一个 BUFG。
分析
发生这种情况的原因可能有多种:
- 时钟结构单元上的 LOC 或 CLOCK_REGION 的选择
- 时钟结构复杂,无法不经过人工干预就放置
- 工具中的 I/O Clock Placer 算法存在错误
当该工具遇到这种情况时,它会打印详细的错误消息,其中包括以下信息:
- 可以解决此错误的 CLOCK_DEDICATED_ROUTE 约束
- 来自时钟结构的细胞
- 由工具决定的时钟缓冲器和 MMCM 的临时位置
- 所有 I/O 时钟架构规则,以及临时放置所违反的规则
虽然 CLOCK_DEDICATED_ROUTE 可以解决错误,但用户在将其纳入工作流程之前了解以下内容非常重要。
- 使用 CDR 对设计 QoR 的影响
- 错误是否是由于用户约束、LOC、CLOCK_REGION 或 P-BLOCK 造成的
- 时钟结构是否复杂,可以通过手动约束来解决
- 这是否是 I/O Clock Placer 算法的一个真正问题
本博客讨论了如何理解 I/O 时钟布局器错误、评估 CDR 约束的必要性以及如何确定工具是否可以放置具有附加约束的结构。
以下用户指南中提到了 CLOCK_DEDICATED_ROUTE 的各种值:
- Versal - Versal 自适应 SoC 硬件、IP 和平台开发方法指南 (UG1387)
- UltraScale - FPGA 和 SoC 的 UltraFast 设计方法指南 (UG949)
对于复杂的时钟结构,I/O Clock Placer 错误的解决方案可以是多个单元和网络的 CDR、LOC 和 CLOCK_REGION 约束的混合。
在深入调试之前,您应该熟悉以下先决条件:
- 您使用的设备的 I/O 架构:
- 对于 UltraScale,请参阅UltraScale 架构 SelectIO 资源用户指南 (UG571)
- 对于 Versal,请参阅Versal Adaptive SoC SelectIO 资源架构手册 (AM010)
- 您使用的设备的时钟架构:
- 对于 UltraScale,请参阅UltraScale 架构时钟资源用户指南 (UG572)
- 对于 Versal,请参阅Versal 自适应 SoC 时钟资源架构手册 (AM003)
- 使用**"查找"**窗口列出设备中的各个可用站点(BUFG 和 MMCM/PLL)。
- 使用网络表中的**"查找"** 窗口列出错误中提到的单元和网络。
- 使用 Vivado Design Suite 进行基本的 Tcl 脚本编写。
调试
I/O Clock Placer 算法是一种基于规则的算法,它将网表中的时钟结构映射到特定规则。这些规则用于为设计中的 MMCM/PLL 和 BUFG 分配临时布局。
然而,需要注意的是,这些临时放置可能对某些单元格是正确的,但对其他单元格则不正确。下面提供的规则可用于理解和评估算法所做的放置。
Versal - Versal 自适应 SoC 硬件、IP 和平台开发方法指南 (UG1387)
UltraScale - AMD Technical Information Portal
由于这些规则源自实际硅片,因此 I/O Clock Placer Error 不太可能是工具中的真正错误。不过,本博客介绍了这种可能性,以防万一。
每当您遇到这些问题时,建议对 .runs /impl_1文件夹中的后期选择检查点进行操作。
如果您是非项目模式用户,则需要明确生成后期选择检查点。
- 打开检查点 post_opt.dcp
- 使用place_ports命令代替place_design
当place_design失败时,它不会在内存设计中留下部分布局以供检查。可以改为运行place_ports命令,以便重现相同的错误,同时提供结果部分布局以供检查。 - 显示所提及的单元和网络的示意图。
您可以使用 Vivado 中的 Ctrl+F 选项返回错误中提到的单元,或者使用 Tcl 脚本将单元和网络放入错误消息中的 Tcl 变量中。 - 显示时钟区域中的 BUFG 和 MMCM 站点的对象,以检查特定时钟区域的利用率。
- 将时钟结构分成几段。
例如,如果时钟结构如下-
(IBUF) → BUFG → MMCM/PLL → BUFG → FDCE/C
第 1 段 = IBUF → BUFG
第 2 段 = BUFG → MMCM/PLL
第 3 段 = MMCM/PLL → BUFG - 使用文档中提到的规则交叉检查 Vivado 的临时布局。
例如,如果这是 Versal 设备,段 1 很明显,并且位于同一时钟区域,即第一行。
段 2 位于规则中提到的最后一行。为了解决这个问题,如果您在 MMCM 上放置 LOC,则段 3 位于规则的第 2 行。
检查提到的单元是否有任何用户约束,以及它们是否影响任何规则。
如果进行迭代分析: 您需要验证布局是否符合规则。如果不符合,请检查其他单元是否影响此布局。
**注意:**规则在上面的链接中提到。 - 确定强制 Vivado 遵循规则的约束。
- 使用新的约束在后期选择中重新运行。
重复上述步骤,以识别错误中报告的任何新单元。通过反复执行这些步骤,我们将获得一组可用于继续进行设计实施的约束。
**注意:**在某些情况下,CDR = false 是不可避免的,例如当使用非 CCIO 引脚作为输入时钟时。在这种情况下,必须对 IBUF 的输出进行 CDR = False 约束。