2. Agilex FPGA PCIe硬核架构:Agilex PCIe HIP内部框图、PCS与PMA层功能划分、PHY时钟域与复位架构
Agilex FPGA的PCIe硬核(HIP)并非简单的协议栈堆叠,而是将数字逻辑层(PCS)与模拟混合信号层(PMA)深度耦合的专用硬宏单元。理解其内部框图、层间划分以及时钟/复位架构,是定位链路训练失败的基础。
2.1 Agilex PCIe HIP 内部框图
下图展示了Agilex PCIe HIP的顶层架构,包含从应用层接口到高速SerDes的全路径。
关键洞察:Agilex HIP 的物理层被明确拆分为 PCS(数字逻辑)和 PMA(模拟混合信号)两个子层。链路训练失败时,必须首先定位故障发生在 PCS 侧(如弹性缓冲溢出、加扰器失锁)还是 PMA 侧(如 CDR 失锁、信号完整性不足)。
2.2 PCS 与 PMA 层功能划分
物理层是链路训练的直接参与者。PCS 和 PMA 的功能边界清晰,但相互依赖性强。
| 功能域 | PCS(物理编码子层) | PMA(物理介质附加子层) |
|---|---|---|
| 核心职责 | 数字编码/解码、加扰/解扰、弹性缓冲、符号对齐 | 串行/解串、时钟数据恢复(CDR)、TX/RX 均衡、阻抗校准 |
| Gen1/Gen2 编码 | 8b/10b 编码器/解码器、逗号字符检测 | 不参与编码,仅处理串行比特流 |
| Gen3/Gen4 编码 | 128b/130b 编码器/解码器、加扰器(LFSR)、块对齐 | 不参与编码,仅处理串行比特流 |
| 时钟域 | 核心时钟域(core_clk)与 PMA 时钟域(pma_clk)之间的弹性缓冲 | 高速串行时钟域(由 CDR 恢复或参考时钟倍频产生) |
| 链路训练角色 | 发送/接收 TS1/TS2 有序集、训练序列状态机(LTSSM) | 提供 CDR 锁定状态、信号检测(RxDetect)、电气空闲退出检测 |
| 常见故障模式 | 弹性缓冲上溢/下溢、加扰器失锁、SKP OS 插入错误 | CDR 无法锁定、RX 均衡器收敛失败、阻抗校准超差 |
实战要点:在 Agilex 调试套件中,PCS 状态可以通过
hip_pcs_status 寄存器组读取,PMA 状态则通过 hip_pma_status 寄存器组读取。当链路训练卡在 Polling.Active 或 Configuration.Linkwidth 状态时,优先检查 PMA 的 CDR 锁定标志;当卡在 Recovery 状态时,优先检查 PCS 的弹性缓冲错误计数。
2.3 PHY 时钟域架构
Agilex PCIe HIP 的时钟架构是典型的多时钟域设计,涉及三个主要时钟域。时钟域之间的同步和相位关系直接影响链路训练的稳定性。
常见陷阱:许多工程师误以为 PCIe 只有一个时钟域。实际上,REFCLK 域、PMA 域和核心域是三个独立的时钟域。链路训练失败的一个常见原因是 REFCLK 抖动超标(超过 PCIe 规范规定的 86 ps 峰峰值),导致 PMA 的 PLL 无法锁定或 CDR 失锁。务必使用频谱分析仪或示波器测量 REFCLK 的相位噪声。
2.4 复位架构与复位序列
Agilex PCIe HIP 的复位架构分为全局复位、PERST# 复位和功能级复位(FLR)三个层次。链路训练失败往往与复位时序不满足要求有关。
| 复位类型 | 触发源 | 影响范围 | 对链路训练的影响 |
|---|---|---|---|
| 全局复位(Global Reset) | FPGA 配置完成(nSTATUS 释放) | 整个 HIP 包括所有寄存器 | HIP 完全初始化,LTSSM 从 Detect 状态开始 |
| PERST# 复位 | 主板 PCIe 复位信号 | 物理层、数据链路层、事务层 | LTSSM 回到 Detect 状态,重新开始链路训练 |
| 功能级复位(FLR) | 软件通过配置空间发起 | 仅事务层及用户逻辑 | 物理层保持链接,不重新训练 |
复位时序检查清单:
- PERST# 有效宽度:PCIe 规范要求至少 100 µs,Agilex 建议至少 1 ms 以确保 PMA 模拟电路完全放电。
- REFCLK 稳定时间:PERST# 释放前,REFCLK 必须稳定至少 100 µs。
- HIP 初始化完成:PERST# 释放后,HIP 内部初始化需要约 20 µs,之后 LTSSM 才会进入 Detect 状态。
- 核心逻辑复位:用户逻辑必须在 HIP 初始化完成后才能开始访问 HIP 寄存器,否则可能导致配置错误。
在 Agilex 设计中,可以通过 hip_ctl 接口的 hip_ready 信号判断 HIP 初始化是否完成。建议在用户逻辑中使用该信号作为复位释放的条件,而不是简单地使用 PERST# 的上升沿。