跳转到主要内容

RQS 设计收敛建议 ID RQS_CLOCK-12

judy 提交于

<font color="#FF8000">作者:Syedz,来源:AMD Xilinx开发者社区</font>

在先前博文<a target="_self" href="https://support.xilinx.com/s/article/1054754?language=zh_CN"&gt;在 Vivado 中利用 report_qor_suggestions 提升 QoR</a>和<a target="_self" href="https://support.xilinx.com/s/article/1131364?language=zh_CN"&gt;利用 RQA 和 RQS 实现设计收敛</a>中,我们了解了“Report QOR Suggestions (RQS)”(QoR 建议报告)如何借助时钟设置、使用率、拥塞和时序建议来帮助达成设计收敛。

在本篇博文中,我们来聊聊“RQS_CLOCK-12”时钟设置建议以及它如何帮助达成时序收敛。

要求:

<ul data-aura-rendered-by="75:216;a">
<li>掌握如何生成和应用<a target="_self" href="https://docs.xilinx.com/r/zh-CN/ug906-vivado-design-analysis/Report-QoR…;
</ul>
<li>基本掌握 CLOCK_LOW_FANOUT 约束。</li>

<strong>RQS_CLOCK-12:</strong>

RQS_CLOCK-12 建议属于专为 UltraScale 和 UltraScale+ 器件生成的自动增量式友好建议。

它使用“CLOCK_LOW_FANOUT”属性,并将该属性分配给时钟信号线或者一组寄存器,由全局时钟缓冲器根据其负载数目来驱动。

1. 将该属性应用于时钟信号线时,全局时钟缓冲器的负载将被约束并放置到单个时钟区域内。

2. 将该属性应用于一组寄存器时,在 opt_design 期间创建的现有全局时钟缓冲器的基础上,还会并行复制一个全新的全局时钟缓冲器。新全局时钟缓冲器的负载仅适用于该属性应用到的各组寄存器,并约束到单个时钟区域。

现在我们来看看 RQS_CLOCK-12 建议如何应用 CLOCK_LOW_FANOUT 来降低时钟偏差,进而帮助设计达成时序收敛。

假设已布线的设计中存在如下两个场景,其中存在错误的时钟偏差,导致从寄存器到全局缓冲器的控制管脚 (CE/CLR) 的路径上存在时序违例。

<strong>场景 1:</strong>
<center><img src="https://cdn.eetrend.com/files/2023-06/wen_zhang_/100571790-306373-shixu…; alt=""></center>

在这条时序收敛失败的路径中,时钟缓冲器 BUFGCE1 (clockout3_buf)、寄存器及其驱动程序 BUFGCE2 (bufce_i) 全都布局在同一个时钟区域内。驱动寄存器的 BUFGCE1 存在高扇出 (6419),且负载导致其时钟信号线遍布整个器件,如图高亮所示。

该工具所选的 CLOCK_ROOT 位置远离驱动它的全局时钟缓冲器,导致时钟信号线延迟过高且时钟偏差过高。

<strong>场景 1 的解决办法:</strong>

对寄存器应用 CLOCK_LOW_FANOUT,这样即可复制 opt_design 期间创建的原始 BUFGCE1 以创建新的 BUFGCE (clkout3_buf_replica),且仅将其用于驱动此关键寄存器。这样将把信号线约束到单个时钟区域内,从而减少时钟信号线延迟。

并且,由于时钟源和负载都位于相同时钟区域内,CLOCK_LOW_FANOUT 会强制将 clock root(时钟根)包含在相同时钟区域内,从而帮助降低时钟偏差。

对关键寄存器应用 CLOCK_LOW_FANOUT 后的板级原理图:
<center><img src="https://cdn.eetrend.com/files/2023-06/wen_zhang_/100571790-306374-shixu…; alt=""></center>

在 opt_design 的 BUFG 最优化阶段,在为 CLOCK_LOW_FANOUT 属性创建的全局时钟缓冲器上应该会显示一条消息。

例如:
INFO: [Opt 31-1077] Phase BUFG optimization inserted 1 global clock buffer(s) for CLOCK_LOW_FANOUT.
语法:
set_property CLOCK_LOW_FANOUT TRUE [get_cells <flipflops_driven_by_globalclockbuffer>]

<strong>场景 2:</strong>
<center><img src="https://cdn.eetrend.com/files/2023-06/wen_zhang_/100571790-306375-shixu…; alt=""></center>

在这条时序收敛失败的路径中,时钟缓冲器 BUFGCE1 (clkout1_BUFG_inst)、寄存器及其驱动程序 BUFGCE2 同样全都布局在同一个时钟区域内。BUFGCE1 驱动寄存器的扇出较低 (16),但负载分布于多个时钟区域(以红色标记)。由此导致该工具所选的 CLOCK_ROOT 不同于驱动它的全局时钟缓冲器,进而导致时钟信号线延迟过高且时钟偏差过高。

<strong>场景 2 的解决办法:</strong>

当 BUFGCE1 扇出较低 (<2000) 但时钟负载遍布多个时钟区域时,对 BUFGCE1 直接驱动的时钟信号线应用 CLOCK_LOW_FANOUT 即可将其所有负载的布局都约束到单个时钟区域内。这将减少时钟信号线延迟。

现在,时钟源和负载都位于相同时钟区域内,因此 CLOCK_LOW_FANOUT 会强制将 clock root 包含在相同时钟区域内,从而帮助降低时钟偏差。

对时钟信号线应用 CLOCK_LOW_FANOUT 后的板级原理图:
<center><img src="https://cdn.eetrend.com/files/2023-06/wen_zhang_/100571790-306376-shixu…; alt=""></center>

语法:
set_property CLOCK_LOW_FANOUT TRUE [get_nets <net_driven_by_globalclockbuffer>]

<strong>总结</strong>

在本篇博文中,我们学习了 2 个设计示例,其中演示了如何生成 RQS_CLOCK-12 建议以将 CLOCK_LOW_FANOUT 属性应用于由全局时钟缓冲器直接驱动的寄存器或时钟信号线。