一般 AMD 不建议使用级联缓冲器在不相关的时钟树分支之间人为增加延迟并减少偏差。不同于 BUFGCTRL 之间的连接,其他时钟缓冲器连接在架构中不具有专用路径。因此,时钟缓冲器的相对布局不可预测,并且所有布局规则都优先于未约束的级联缓冲器的布局。
但是,使用级联时钟缓冲器可以实现以下功能:
- 从 XPIO 角点 (corner) bank 布线到位于不同时钟区域中的时钟资源。
在 Versal 器件中,XPIO 角点 bank 无法连接到一般互连结构,并且全局时钟功能受限。例如,XPIO 角点 bank 能够访问通用 BUFGCE,但无法访问 BUFGCTRL 和 BUFGCE_DIV 资源。下图显示了 IOB-MMCM-BUFG 路径的输出,此路径连接到其他 XPIO 时钟区域内的并行 BUFGCE 和 BUFGCE_DIV 以插入延迟匹配。
图 1. XPIO 角点 bank 级联时钟缓冲器以下是用于为角点 bank 实现时钟拓扑结构的约束:#PORT clkIn is in Corner Bank GCIO set_property PACKAGE_PIN AF35 [get_ports clkIn] #prevent opt_design removal of the BUFG_inst to BUFG_casc_inst cascade set_property DONT_TOUCH TRUE [get_cells {BUFG_inst BUFG_casc_inst}] #design of the clock structures set_property CLOCK_DEDICATED_ROUTE SAME_CMT_ROW [get_nets -of [get_pins BUFG_inst/O]] set_property CLOCK_REGION X6Y0 [get_cells BUFGCE_DIV_casc_inst] set_property CLOCK_REGION X6Y0 [get_cells BUFG_casc_inst] set_property CLOCK_DELAY_GROUP myDelayGrp [get_nets -of [get_pins {BUFGCE_DIV_casc_inst/O BUFG_casc_inst/O}]]
- 将时钟布线到位于不同时钟区域中的另一个时钟缓冲器。
对由其他时钟区域内的 MMCM 生成的时钟使用时钟多路复用器时,通常采用此方法。虽然其中 1 个 MMCM 可以直接驱动 BUFGCTRL (BUFGMUX),但是另一个 MMCM 需要中间时钟缓冲器来将时钟信号布线到其他区域。下图显示了 1 个示例。
图 2. 将时钟布线到另一个时钟区域以下是用于为时钟多路复用器实现时钟拓扑结构的约束:
#PORT clkIn_1 is in XPIO ClockRegion X3Y0 GCIO set_property PACKAGE_PIN AU27 [get_ports clkIn_1] #PORT clkIn_2 is in XPIO ClockRegion X8Y0 GCIO set_property PACKAGE_PIN AJ5 [get_ports clkIn_2] #Guide placement of BUFGMUX set_property CLOCK_DEDICATED_ROUTE SAME_CMT_ROW [get_nets -of [get_pins BUFG_inst_2/O]]
- 当时钟树分支之间存在同步路径时,平衡这些分支之间的时钟缓冲器等级数。
以驱动 group_A(通过位于其他时钟区域内的 BUFGCTRL 驱动的时序单元)和 group_B(时序单元)的 MMCME5_inst_2 输出上的时钟为例。为了更好匹配分支之间的延迟,请为 group_B 插入 BUFGCE 并将其布局在 BUFGCTRL 所在的时钟区域内。这样可确保 group_A 与 group_B 之间的同步路径的偏差量可控。下图显示了 1 个示例。
注释: Vivado 工具逻辑最优化命令opt_design
无法确认时序时钟与时钟网络分支之间的时序关系。因此,opt_design
会尽可能删除更多级联时钟缓冲器或冗余时钟缓冲器。在此示例中,opt_design
会移除 BUFG_inst_casc_2,除非您在其中设置DONT_TOUCH="TRUE"
属性。如果在时钟树分支之间只有异步路径,那么只要接收端时钟域上存在正常的同步电路,就不需要平衡这些分支。图 3. 为时钟区域之间的同步路径平衡时钟树以下是用于实现时钟树平衡电路的约束:#PORT clkIn_1 is in XPIO ClockRegion X3Y0 GCIO set_property PACKAGE_PIN AU27 [get_ports clkIn_1] #PORT clkIn_2 is in XPIO ClockRegion X8Y0 GCIO set_property PACKAGE_PIN AJ5 [get_ports clkIn_2] #allow for routing from BUFG_inst_2 (X8Y0) to BUFG_inst_casc_2 (X3Y0) and prevent optimization set_property CLOCK_DEDICATED_ROUTE SAME_CMT_ROW [get_nets -of [get_pins BUFG_inst_2/O]] set_property CLOCK_REGION X3Y0 [get_cells BUFG_inst_casc_2] set_property DONT_TOUCH TRUE [get_cells BUFG_inst_casc_2] #balance output of BUFGMUX and BUFG_inst_casc_2, both placed in X3Y0 set_property CLOCK_DELAY_GROUP myDelayGrp [get_nets -of [get_pins {BUFG_inst_casc_2/O BUFGMUX_inst/O}]]
- 构建时钟多路复用器。
为减少插入延迟和偏差变动,AMD 建议使用级联时钟缓冲器时遵循以下准则:
- 将级联缓冲器保持在相同或相邻时钟区域内。
- 平衡时钟树分支时,将相同等级的所有时钟缓冲器都分配到相同时钟区域内。 注释: 如果确实有必要,AMD 建议使用 2 个级联 BUFGCTRL 代替级联 BUFGCE。使用专用布线即可将 2 个相邻 BUFGCTRL 加以级联,当这 2 个 BUFGCTRL 都布局在相同时钟区域内时可最大程度降低延迟。