FPGA SERDES 通用基础(四)从工程实现看 GTX 初始化与复位

发布时间:2026/8/18 21:13:23
FPGA SERDES 通用基础(四)从工程实现看 GTX 初始化与复位 GTX 初始化不是对若干复位端口的简单拉高、拉低而是一条具有明确依赖关系的启动链路参考时钟有效后PLL 完成复位并锁定TX/RX 数据通路退出顺序复位用户时钟进入稳定状态随后才能确认复位完成并执行相位对齐或数据有效性检查。任一前置条件缺失都可能表现为 RESETDONE 长时间不拉高或者链路启动后再次失效。本文以 UG476 的复位结构为基础并结合 7 系列 Transceivers Wizard 生成的 TX_STARTUP_FSM 与 RX_STARTUP_FSM 源码从工程实现角度梳理 GTX 的初始化与故障重试过程。TX 与 RX 共享 PLL、GT 顺序复位和用户时钟等前置条件完成 RESETDONE 后再进入各自的后续流程公共前置条件CPLL/QPLL 复位并锁定 → GTTXRESET/GTRXRESET 启动顺序复位 → 用户时钟稳定并置位 TXUSERRDY/RXUSERRDYTXTXRESETDONE → 相位对齐 → TX_FSM_RESET_DONERXRXRESETDONE → 相位对齐 → DATA_VALID 监测 → RX_FSM_RESET_DONE1. GTX 初始化总体关系GTX 配置完成后的 TX/RX 初始化关系FPGA 配置完成后TX 与 RX 都需要经历一次完整初始化。图中最上层的 CPLLRESET、QPLLRESET 分别启动对应 PLL 的复位与重新锁定GTTXRESET 和 GTRXRESET 则启动发送端与接收端的顺序复位。只有所选 PLL 已锁定、用户时钟可用并且相关就绪条件满足GT 内部状态机才会继续释放 PMA、PCS 等数据通路。UG476 同时给出了两类复位入口。初始化复位面向整条 TX 或 RX 通路通常由 GTTXRESET、GTRXRESET 发起组件复位只作用于 PMA、PCS、接收缓冲或眼图扫描等局部区域。器件上电后的首次初始化和整条链路重新初始化通常采用前者组件复位更适合已经明确故障边界后的局部恢复。TXRESETDONE 和 RXRESETDONE 表示 GT 硬核内部的顺序复位已经完成但它们不是整个应用链路“可用”的唯一判据。Wizard 示例还会继续检查用户时钟、相位对齐以及接收数据有效性最终才给出 TX_FSM_RESET_DONE 或 RX_FSM_RESET_DONE。2. CPLL 与 QPLL 复位时序CPLL 复位时序ChannelQPLL 复位时序CommonCPLLRESET 或 QPLLRESET 拉高后GT 内部复位信号进入有效状态外部复位撤销后内部复位仍会保持规定时间随后 PLL 才开始重新捕获参考时钟并建立锁定。因此外部复位脉冲结束不等于 PLL 已经可用后级初始化必须继续等待 CPLLLOCK 或 QPLLLOCK。CPLL 位于每个 GTXE2_CHANNEL 内各 Channel 可以独立复位。QPLL 位于 GTXE2_COMMON 内由同一 Quad 中的多个 Channel 共享。复位共享 QPLL 会同时影响所有使用该 QPLL 的收发通道因此多通道设计不能只从单个 Channel 的局部状态判断是否允许重启 QPLL。工程控制逻辑通常将 PLL 锁定作为 GT 数据通路退出复位的前置条件并为“释放复位后长期未锁定”设置超时返回路径。这样既能覆盖上电启动也能处理参考时钟异常、PLL 失锁或配置切换后的重新初始化。3. TX 初始化与复位GTX 发送端顺序复位路径发送端完整复位由 GTTXRESET 发起。复位有效期间TX PMA 与 TX PCS 保持在复位状态GTTXRESET 撤销后内部顺序状态机先处理 TX PMA再在 TXUSERRDY 有效的条件下释放 TX PCS最后拉高 TXRESETDONE。这条顺序反映了发送通路的实际依赖关系PMA 串行侧必须先获得稳定的 PLL 时钟PCS 并行侧还依赖 TXUSRCLK 和 TXUSRCLK2。若用户时钟尚未稳定就提前置位 TXUSERRDYPCS 可能无法按预期完成初始化反之若 TXUSERRDY 始终保持无效流程会停在 PCS 释放之前TXRESETDONE 也不会拉高。TXPMARESET 和 TXPCSRESET 是局部复位入口可分别重置 PMA 或 PCS。使用 GTTXRESET 执行完整初始化时这些组件复位应保持无效避免局部复位与内部顺序状态机同时控制同一区域。TXRESETDONE 拉高后若采用 Buffer Bypass还需完成 TX 相位对齐随后才能将发送端交给上层业务逻辑。4. RX 初始化与复位GTX 接收端顺序复位路径接收端的复位区域比发送端更多。除 RX PMA 和 RX PCS 外还包括 DFE/LPM、Eye Scan 与 RX Buffer 等接收专用模块。GTRXRESET 启动完整顺序复位时内部流程沿主路径依次释放这些区域RXUSERRDY 有效后PCS 才能完成初始化并拉高 RXRESETDONE。局部复位端口允许单独重置某一接收模块但它们与完整初始化的用途不同。例如 RXBUFRESET 只重新初始化接收缓冲不能替代 CDR、PMA 和 PCS 的完整复位。若链路失效原因尚未定位直接使用 GTRXRESET 重新建立整条接收通路通常更容易形成确定的恢复边界。RX 对恢复时钟和数据质量还有额外依赖。GTRXRESET 撤销后接收 CDR 需要重新建立稳定状态RXRESETDONE 只说明 GT 内部复位流程完成并不表示已经获得连续有效的链路数据。因此工程状态机还需要在 RXRESETDONE 之后检查相位对齐结果并根据协议或应用定义的数据有效条件决定是否进入工作状态。5. GT Wizard Startup FSM 工程实现UG476 描述的是 GT 硬核内部的复位顺序。以 Transceivers Wizard IP 为例生成的 Startup FSM 位于 FPGA Fabric 中通过驱动 PLLRESET、GTTXRESET、GTRXRESET、TXUSERRDY 和 RXUSERRDY 等信号将 PLL 锁定、用户时钟、RESETDONE、相位对齐与超时重试组织成完整的工程控制流程。5.1 TX/RX 状态编码TX Startup FSM 使用 4 bit 状态寄存器定义十个状态。状态编码本身只用于标识流程位置真正的复位输出和跳转条件由后续组合逻辑与时序逻辑决定。localparam [3:0] INIT 4b0000, ASSERT_ALL_RESETS 4b0001, WAIT_FOR_PLL_LOCK 4b0010, RELEASE_PLL_RESET 4b0011, WAIT_FOR_TXOUTCLK 4b0100, RELEASE_MMCM_RESET 4b0101, WAIT_FOR_TXUSRCLK 4b0110, WAIT_RESET_DONE 4b0111, DO_PHASE_ALIGNMENT 4b1000, RESET_FSM_DONE 4b1001; reg [3:0] tx_state INIT;RX Startup FSM 增加了恢复时钟确认和数据有效性监测因此共有十一个状态。localparam [3:0] INIT 4b0000, ASSERT_ALL_RESETS 4b0001, WAIT_FOR_PLL_LOCK 4b0010, RELEASE_PLL_RESET 4b0011, VERIFY_RECCLK_STABLE 4b0100, RELEASE_MMCM_RESET 4b0101, WAIT_FOR_RXUSRCLK 4b0110, WAIT_RESET_DONE 4b0111, DO_PHASE_ALIGNMENT 4b1000, MONITOR_DATA_VALID 4b1001, FSM_DONE 4b1010; reg [3:0] rx_state INIT;两组编码显示了 TX 与 RX 的共同主线建立复位初态、释放 PLL、等待用户时钟、确认 RESETDONE、执行相位对齐。RX 在此基础上增加 VERIFY_RECCLK_STABLE 和 MONITOR_DATA_VALID将恢复时钟与接收数据有效性纳入初始化判据。5.2 关键控制代码完整 TX/RX Startup FSM 还包含端口声明、跨时钟域同步、计数器和输出重定时等通用逻辑直接铺开会显著影响博客阅读。下面保留与初始化主线直接相关的超时参数和状态转移省略重复的同步与计数器实现。5.2.1 超时与重试参数Startup FSM 由 STABLE_CLOCK 驱动源码根据时钟周期将时间转换为计数值。TX 重点使用 PLL/MMCM 锁定、TXRESETDONE 和相位对齐超时RX 还增加恢复时钟、DATA_VALID 与 DFE 自适应监测。localparam integer STARTUP_DELAY 500; // 配置完成后等待 500 ns localparam integer WAIT_TIMEOUT_2ms 2000000 / STABLE_CLOCK_PERIOD; localparam integer WAIT_TLOCK_MAX 100000 / STABLE_CLOCK_PERIOD; localparam integer WAIT_TIMEOUT_500us 500000 / STABLE_CLOCK_PERIOD; localparam integer WAIT_1us_CYCLES 1000 / STABLE_CLOCK_PERIOD; localparam integer MAX_RETRIES 2**RETRY_COUNTER_BITWIDTH - 1; reg [RETRY_COUNTER_BITWIDTH-1:0] retry_counter_int 0;不同状态共用超时计数器。等待条件在门限内未满足时状态机增加 retry_counter并返回 ASSERT_ALL_RESETS 重新建立完整初态。5.2.2 TX 状态转移节选以下代码省略 PLL 选路的展开条件、同步寄存器和重复的 retry_counter 更新只保留 TX 初始化的主要转移关系。case (tx_state) INIT: if (init_wait_done) tx_state ASSERT_ALL_RESETS; ASSERT_ALL_RESETS: begin gttxreset_i 1b1; MMCM_RESET 1b1; // 根据 TX_QPLL_USED 选择 CPLL_RESET 或 QPLL_RESET if (pll_reset_asserted) tx_state WAIT_FOR_PLL_LOCK; end WAIT_FOR_PLL_LOCK: if (wait_time_done) tx_state RELEASE_PLL_RESET; RELEASE_PLL_RESET: begin pll_reset_asserted 1b0; if (cplllock_sync || qplllock_sync) tx_state WAIT_FOR_TXOUTCLK; else if (time_out_2ms) tx_state ASSERT_ALL_RESETS; end WAIT_FOR_TXOUTCLK: begin gttxreset_i 1b0; if (wait_time_done) tx_state RELEASE_MMCM_RESET; end RELEASE_MMCM_RESET: begin MMCM_RESET 1b0; if (mmcm_lock_reclocked) tx_state WAIT_FOR_TXUSRCLK; else if (time_tlock_max) tx_state ASSERT_ALL_RESETS; end WAIT_FOR_TXUSRCLK: if (wait_time_done) tx_state WAIT_RESET_DONE; WAIT_RESET_DONE: begin TXUSERRDY 1b1; if (txresetdone_s3) tx_state DO_PHASE_ALIGNMENT; else if (time_out_500us) tx_state ASSERT_ALL_RESETS; end DO_PHASE_ALIGNMENT: begin run_phase_alignment_int 1b1; if (PHALIGNMENT_DONE) tx_state RESET_FSM_DONE; else if (time_out_wait_bypass_s3) tx_state ASSERT_ALL_RESETS; end RESET_FSM_DONE: tx_fsm_reset_done_int 1b1; endcase5.2.3 RX 状态转移节选RX 与 TX 共享 PLL、用户时钟和 RESETDONE 主线同时增加 RECCLK_STABLE 与 DATA_VALID 两级接收判据。case (rx_state) INIT: if (init_wait_done) rx_state ASSERT_ALL_RESETS; ASSERT_ALL_RESETS: begin gtrxreset_i 1b1; mmcm_reset_i 1b1; // 根据 RX_QPLL_USED 以及 TX 侧 PLL 状态决定是否复位 PLL if (pll_reset_asserted || (RX_QPLL_USED TX_QPLL_USED)) rx_state WAIT_FOR_PLL_LOCK; end WAIT_FOR_PLL_LOCK: if (wait_time_done) rx_state RELEASE_PLL_RESET; RELEASE_PLL_RESET: begin pll_reset_asserted 1b0; if (cplllock_sync || qplllock_sync) rx_state VERIFY_RECCLK_STABLE; else if (time_out_2ms) rx_state ASSERT_ALL_RESETS; end VERIFY_RECCLK_STABLE: begin gtrxreset_i 1b0; if (RECCLK_STABLE) rx_state RELEASE_MMCM_RESET; else if (recclk_mon_restart_count 2) rx_state ASSERT_ALL_RESETS; end RELEASE_MMCM_RESET: begin mmcm_reset_i 1b0; if (mmcm_lock_reclocked) rx_state WAIT_FOR_RXUSRCLK; else if (time_tlock_max) rx_state ASSERT_ALL_RESETS; end WAIT_FOR_RXUSRCLK: if (wait_time_done) rx_state WAIT_RESET_DONE; WAIT_RESET_DONE: begin if (TXUSERRDY) RXUSERRDY 1b1; if (rxresetdone_s3) rx_state DO_PHASE_ALIGNMENT; else if (time_out_2ms) rx_state ASSERT_ALL_RESETS; end DO_PHASE_ALIGNMENT: begin run_phase_alignment_int 1b1; if (PHALIGNMENT_DONE) rx_state MONITOR_DATA_VALID; else if (time_out_wait_bypass_s3) rx_state ASSERT_ALL_RESETS; end MONITOR_DATA_VALID: begin if (data_valid_sync) rx_state FSM_DONE; else if (time_out_100us !DONT_RESET_ON_DATA_ERROR) rx_state ASSERT_ALL_RESETS; end FSM_DONE: begin if (!data_valid_sync) rx_state MONITOR_DATA_VALID; else if (time_out_1us) rx_fsm_reset_done_int 1b1; end endcase以上节选用于说明状态关系并非可单独综合的完整模块。实际工程仍应以 Wizard 生成文件中的端口、同步、计数器和 PLL 选择条件为准。5.3 TX_STARTUP_FSM 状态分析TX Startup FSM 状态转移与超时返回路径TX Startup FSM 由十个状态组成各状态依次建立 PLL、GT 数据通路和用户时钟之间的启动关系。INIT状态机上电后首先进入 INIT并等待约 500 ns。该等待来自 GT Wizard 对启动初态的处理用于避开器件配置完成后全局时钟和复位控制仍在建立的阶段。SOFT_RESET 有效时状态机也会返回 INIT并将相关完成信号和控制输出恢复到初始值。ASSERT_ALL_RESETS该状态建立一次完整初始化的统一起点拉高 GTTXRESET 和 MMCM_RESET并根据当前 Channel 的 PLL 选择向 CPLL 或 QPLL 发出复位脉冲同时清除相位对齐控制、超时标志和本轮计数。后续任何关键阶段超时状态机都会增加 retry_counter 并返回这里重新启动。WAIT_FOR_PLL_LOCK状态机继续保持 GT 和用户时钟路径处于复位状态并等待固定的复位保持时间。虽然状态名包含 PLL_LOCK但本状态并不直接判断 CPLLLOCK 或 QPLLLOCK其作用是保证 PLL 复位脉冲和相关保持时间满足要求。RELEASE_PLL_RESET撤销所选 PLL 的复位后状态机开始等待 CPLLLOCK 或 QPLLLOCK。只有锁定信号有效才允许继续释放发送数据通路若锁定等待超过公共超时门限状态机返回 ASSERT_ALL_RESETS重新执行完整复位。WAIT_FOR_TXOUTCLKPLL 锁定后撤销 GTTXRESET使 TX PMA/PCS 的内部顺序复位开始运行同时为 TXOUTCLK 及其后级时钟路径预留稳定时间。生成源码在这里采用固定计时等待并没有直接检测 TXOUTCLK 的频率或边沿因此状态名应理解为“等待发送时钟路径建立”。RELEASE_MMCM_RESET状态机释放示例设计中用户时钟网络的 MMCM_RESET并等待 MMCM_LOCK。MMCM 未在规定时间内锁定时流程返回 ASSERT_ALL_RESETS若实际工程没有采用 Wizard 示例中的 MMCM该输入通常由等效的用户时钟就绪条件代替。WAIT_FOR_TXUSRCLKMMCM 锁定后继续等待一个固定稳定时间使 TXUSRCLK 和 TXUSRCLK2 到达 GT 接口并进入稳定状态。该状态把“时钟管理模块已经锁定”和“GT 用户时钟已经可以安全使用”分成两个阶段处理。WAIT_RESET_DONE状态机置位 TXUSERRDY通知 GT 内部顺序复位状态机用户时钟已经可用并等待 TXRESETDONE。TXRESETDONE 表示 TX PMA/PCS 的硬核复位流程完成若约 500 μs 内仍未完成状态机增加重试计数并返回 ASSERT_ALL_RESETS。DO_PHASE_ALIGNMENT对需要用户侧相位对齐的配置状态机置位 RUN_PHALIGNMENT、撤销 RESET_PHALIGNMENT并等待 PHALIGNMENT_DONE。相位对齐超时同样触发完整重试使用不同缓冲模式时该阶段由相应的相位对齐逻辑给出完成条件。RESET_FSM_DONEPLL、GT 复位、用户时钟和相位对齐全部完成后状态机置位 TX_FSM_RESET_DONE发送初始化结束。该信号表示 Wizard 外层启动流程完成其层级高于 GT 硬核给出的 TXRESETDONE。5.4 RX_STARTUP_FSM 状态分析RX Startup FSM 状态转移、数据监测与重试路径RX Startup FSM 在发送端主线的基础上增加了恢复时钟检查和数据有效性监测共包含十一个状态。INIT状态机上电或收到 SOFT_RESET 后进入 INIT等待约 500 ns并将 RX_FSM_RESET_DONE、RXUSERRDY、相位对齐控制和数据监测计数恢复到初始状态。ASSERT_ALL_RESETS拉高 GTRXRESET 和 MMCM_RESET并根据 RX 使用的 PLL 产生 CPLL/QPLL 复位控制同时清除 CDR 重试、数据有效监测和相位对齐状态。PLL、MMCM、RXRESETDONE、相位对齐或数据监测失败时状态机均可返回该状态重新建立接收初态。WAIT_FOR_PLL_LOCK该状态保持接收通路处于复位并等待固定的 PLL 复位保持时间。与 TX 一样这里不直接判断 PLLLOCK真正的锁定检查发生在下一状态。RELEASE_PLL_RESET撤销所选 PLL 的复位并等待 CPLLLOCK 或 QPLLLOCK。PLL 在公共超时门限内未锁定时retry_counter 增加流程返回 ASSERT_ALL_RESETS。该机制使参考时钟异常或 PLL 启动失败能够进入统一恢复路径。VERIFY_RECCLK_STABLEPLL 锁定后撤销 GTRXRESET接收 CDR 开始从串行输入中恢复时钟。状态机等待 RECCLK_STABLE并监测 CDR 重启次数恢复时钟无法稳定或重试次数达到门限时重新执行完整 RX 初始化。RELEASE_MMCM_RESET恢复时钟满足条件后状态机释放接收用户时钟网络的 MMCM_RESET并等待 MMCM_LOCK。若锁定超时增加重试计数并返回 ASSERT_ALL_RESETS。实际工程可用等效的 RX 用户时钟就绪条件替代示例 MMCM 锁定输入。WAIT_FOR_RXUSRCLKMMCM 锁定后再等待固定时间使 RXUSRCLK 和 RXUSRCLK2 在 GT 接口侧稳定。该阶段结束后才允许通过 RXUSERRDY 通知 GT 内部 PCS 用户时钟已经可用。WAIT_RESET_DONE当 TXUSERRDY 条件满足时状态机置位 RXUSERRDY并等待 RXRESETDONE。该 TXUSERRDY 依赖用于覆盖 RXUSRCLK 由 TXOUTCLK 派生的结构若 RX 用户时钟独立产生应按实际时钟关系连接该条件。RXRESETDONE 在约 2 ms 内未拉高时流程返回 ASSERT_ALL_RESETS。图中将该条件写成 RXUSERRDY 属于文字笔误实际源码判断的是 TXUSERRDY。DO_PHASE_ALIGNMENTRX 硬核复位完成后根据缓冲模式启动接收相位对齐并等待 PHALIGNMENT_DONE。相位对齐失败或超时会触发完整重试避免在并行数据相位关系尚未建立时进入数据监测阶段。MONITOR_DATA_VALID状态机持续检查应用提供的 DATA_VALID用于判断解码、码组、帧结构或其他上层条件是否已经稳定。若连续约 100 μs 未获得有效数据且配置允许在数据错误时自动复位状态机返回 ASSERT_ALL_RESETS。使用 DFE 时自适应等待达到设定时限后还可通过 RXDFEAGCHOLD 和 RXDFELFHOLD 冻结相关自适应环路。FSM_DONEDATA_VALID 连续有效约 1 μs 后状态机置位 RX_FSM_RESET_DONE表示 RX Startup FSM 完成。进入该状态后仍会监测 DATA_VALID数据失效时返回 MONITOR_DATA_VALID若持续无效并允许自动恢复则最终重新初始化接收通路。DATA_VALID 是应用侧判据不等同于 RXRESETDONE也不是单一的 GT 硬核状态位。5.5 硬核复位与工程状态机的边界层级主要职责完成标志GTX 硬核顺序复位按内部依赖释放 PMA、PCS、缓冲等区域TXRESETDONE / RXRESETDONEGT Wizard Startup FSM组织 PLL、GT 复位、用户时钟、相位对齐和超时重试TX_FSM_RESET_DONE / RX_FSM_RESET_DONE应用链路控制判断码组、帧、协议训练或业务数据是否有效由具体设计定义三层状态不能相互替代。RESETDONE 长期不拉高时应先检查 PLL 锁定、用户时钟和 USERRDYRESETDONE 已拉高而链路仍无有效数据时应继续检查相位对齐、CDR、数据有效判据及协议层状态。将这三个层级分开能够避免把所有链路故障都归因于“GT 没有复位好”。6. 总结本文结合 UG476 的初始化顺序与 Transceivers Wizard 生成的 Startup FSM 源码梳理了 CPLL/QPLL、GT 数据通路、用户时钟和 PCS 之间的复位依赖并分别分析 TX、RX 状态机对 PLL 锁定、USERRDY、RESETDONE、相位对齐及接收数据有效性的控制过程。由此可以将 GTX 初始化理解为一组由前置条件、完成反馈和超时重试共同约束的状态转换而不是若干复位信号的简单延时释放。工程调试应以 TX/RX 状态机的实际停留状态为入口检查当前状态的跳转条件、反馈信号和超时分支。PLL 锁定阶段重点核查参考时钟与 PLLLOCK用户时钟阶段核查 TXOUTCLK/RXOUTCLK、MMCM 及 USRCLK顺序复位阶段核查 USERRDY 与 RESETDONE后续再检查相位对齐和 RX DATA_VALID。结合 retry_counter 等重试信息可以明确故障发生在哪一次状态转换并将初始化失败定位到 PLL、用户时钟、GT 硬核握手、相位对齐或接收数据链路。