Vivado里让Aurora、Chip2chip和Ethernet IP共享一对GT时钟的实战踩坑记

Vivado里让Aurora、Chip2chip和Ethernet IP共享一对GT时钟的实战踩坑记

Vivado中多SerDes IP共享GT时钟的工程实践与解决方案

在Xilinx UltraScale+ FPGA设计中,GT(Gigabit Transceiver)时钟资源的合理分配往往是高速通信系统稳定运行的关键。当设计包含Aurora、Chip2chip和Ethernet等多种高速串行协议IP时,工程师常面临GT时钟资源紧张的问题——特别是当板上仅有一对GT差分时钟可用,而多个IP核心又需要共享此时钟源时。本文将深入探讨这一典型场景下的设计挑战、常见误区及系统级解决方案。

1. 问题背景与设计约束

现代FPGA系统设计中,SerDes(串行器/解串器)技术的应用越来越广泛。以Xilinx UltraScale+系列为例,KU3P和ZU67等器件通常包含多个GT Bank,每个Bank可支持多对差分通道。但在实际工程中,我们常遇到以下典型约束:

  • 物理时钟资源有限:开发板上可能仅提供一对GT参考时钟输入
  • IP核异构性:部分IP(如Ethernet)可能被封装在不可修改的Block Design中
  • 协议多样性:Aurora、Chip2chip和Ethernet对时钟的要求各不相同
// 典型GT时钟输入原语实例 IBUFDS_GTE3 #( .REFCLK_EN_TX_PATH(1'b0), .REFCLK_HROW_CK_SEL(2'b00), .REFCLK_ICNTL_RX(2'b00) ) IBUFDS_GTE3_inst ( .O(clk_out), .ODIV2(), .CEB(1'b0), .I(clk_p), .IB(clk_n) );

注意:直接使用IBUFDS_GTE3输出的时钟信号无法被多个IP共享,需要特殊处理

2. 常见错误方案与其失效机理

在资源受限场景下,工程师常尝试以下两种看似合理的错误连接方式:

2.1 OBUFDS串联方案

错误拓扑: GT时钟源 → IBUFDS_GTE3 → OBUFDS → 多个IP核

失效原因

  • OBUFDS设计用于驱动FPGA外部引脚,其输出阻抗和电气特性不适用于内部信号传输
  • Vivado布线器会阻止此类连接,报错提示"OBUFDS输出必须连接至FPGA引脚"

2.2 IBUFDS混用方案

错误拓扑: GT时钟源 → IBUFDS_GTE3 → IBUFDS_DIFF_OUT → 多个IP核

失效原因

  • IBUFDS_DIFF_OUT是专为HPIO(高性能IO)设计的原语
  • GT时钟需要特殊的时钟缓冲和分布网络,普通差分缓冲器无法满足时序要求

3. 关键技术:QPLL/GT资源剥离与共享

正确的解决方案需要深入理解Xilinx GT架构的时钟分配机制。以下是核心思路:

3.1 QPLL与CPLL的选择策略

特性QPLLCPLL
覆盖范围整个Quad(4个GT)单个GT通道
时钟质量更高相对较低
功耗较高较低
适用场景多通道时钟共享独立通道时钟

对于多IP共享场景,优先考虑使用QPLL资源:

  1. 在IP配置中启用"GT/QPLL剥离"选项
  2. 确保所有IP使用相同的参考时钟频率
  3. 在IP配置中明确指定共享的QPLL实例

3.2 IP核配置关键参数

Aurora IP配置要点

  • 勾选"Enable GT Separation"(非必须全GT剥离)
  • 在"Shared Logic"选项卡选择"Include Shared Logic in core"
  • 设置正确的Lane数量和QPLL选择

Ethernet IP配置技巧

# 示例:设置Ethernet IP使用共享QPLL set_property CONFIG.GT_TYPE {GTY} [get_ips eth_ip] set_property CONFIG.USE_GT_REFCLK {true} [get_ips eth_ip] set_property CONFIG.GT_REFCLK_SRC {X0Y1} [get_ips eth_ip]

Chip2chip IP注意事项

  • 根据物理层需求选择正确的"Phy Type"
  • 对于SerDes-only设计,选择"Aurora 8B/10B"协议
  • 在"GT Selection"中明确指定共享的QPLL位置

4. 实战解决方案:混合IP场景处理

当设计中包含不可修改的Block Design IP时,需要采用特殊策略:

4.1 时钟缓冲树方案

  1. 使用BUFG_GT原语创建全局时钟网络
  2. 通过MMCM/PLL生成所需频率
  3. 将处理后的时钟分配给各IP核
// 时钟缓冲树示例 BUFG_GT bufg_gt_inst ( .CE(1'b1), .CEMASK(1'b0), .CLR(1'b0), .CLRMASK(1'b0), .DIV(3'b000), .I(gt_clk_out), .O(global_gt_clk) );

4.2 针对固定IP的变通方法

对于无法修改的Block Design中的Ethernet IP:

  1. 在顶层设计中例化额外的IBUFDS_GTE3
  2. 将同一物理时钟信号连接到原始IP和新建IBUFDS
  3. 确保时钟相位对齐

关键检查点

  • 使用Vivado Clocking Wizard验证时钟拓扑
  • 通过Timing Constraints确保时钟关系正确
  • 在Implementation后检查Clock Interaction报告

5. 验证与调试策略

成功实现时钟共享后,必须进行严格验证:

  1. 眼图测试:使用IBERT或硬件测试仪检查信号质量
  2. 协议一致性测试
    • Aurora:端到端数据完整性检查
    • Ethernet:RFC2544吞吐量测试
    • Chip2chip:误码率测试
  3. 系统级验证
    • 同时运行所有协议的压力测试
    • 长时间稳定性监测

调试技巧

  • 使用Vivado Hardware Manager监控QPLL锁定状态
  • 在ILA中添加GT控制信号探针
  • 检查QPLL/CPLL的电源噪声和接地质量

6. 高级优化技巧

对于追求极致性能的设计,可考虑:

  1. 时钟校准技术

    • 使用GT通道的RXOUTCLK进行时钟补偿
    • 动态调整时钟相位
  2. 电源优化

# 优化GT Bank电源约束 set_property CONFIG.GT_SUPPLY {VCCINT_1V0} [get_ips aurora_ip] set_property CONFIG.GT_DRP_CLK_SRC {Internal} [get_ips eth_ip]
  1. 布局约束
  • 对共享QPLL的IP核施加区域约束
  • 使用RLOC_ORIGIN约束优化GT位置

在最近的一个ZU67项目中,通过精确的QPLL共享配置和时钟树优化,我们成功实现了3个Aurora IP(4 lanes)、2个Ethernet IP(2.5G/10G双模)和1个Chip2chip IP共享同一对GT参考时钟,系统连续运行72小时无误码。关键点在于为每个IP核精心配置了GT Selection参数,并使用BUFG_GT解决了时钟分配难题。