3. PolarFire PCIe硬核架构解析

PolarFire系列FPGA的PCIe子系统并不是用软核在通用逻辑资源里“搭”出来的,而是由芯片内固定的PCIe硬核控制器(PCIe Controller)与专用高速SerDes通道共同构成。理解这套硬核架构,关键要抓住四条线索:控制器内部由哪些功能块组成、SerDes通道如何与PCIe Lane一一映射、时钟与复位如何按域划分、以及硬核与FPGA逻辑之间到底通过什么边界交换数据与控制信息。只有把这四条线索理清,后续的IP配置、地址映射、DMA设计和时序约束才有稳定的落脚点。

一、硬核控制器的内部结构

PolarFire的PCIe硬核控制器位于芯片的专用PCIe硬核区域,其内部大致可划分为四个功能层。最靠近链路的是物理层(PHY)接口逻辑,它负责与SerDes PMA(Physical Medium Attachment)对接,完成8b/10b编解码、弹性缓冲(Elastic Buffer)、通道对齐与去偏斜(Lane Deskew)。往上一层是数据链路层(DLL),负责TLP的CRC生成与校验、ACK/NAK重传、序列号管理以及流控信用(Credit)维护。再往上是事务层(TL),处理配置空间访问、Memory/IO/Configuration三类TLP的拆分与组装、完成包(CPL)匹配以及Max Payload Size等参数约束。最外层是应用接口层,也就是硬核暴露给FPGA逻辑的AXI或本地接口,用于承载TLP的收发与配置访问。

需要特别注意的是,PolarFire的PCIe硬核支持Gen2(5.0 GT/s)与Gen3(8.0 GT/s)两种速率。Gen3在物理层引入了128b/130b编码替代8b/10b,因此硬核内部对Gen3路径的处理与Gen2并不完全一致:Gen3下弹性缓冲和通道对齐逻辑需要适配新的块同步机制,而Gen2则沿用8b/10b的K码对齐方式。这意味着在切换速率时,不能只改一个速率寄存器,还要确认PHY与DLL的配置是否同步切换。

二、SerDes通道映射关系

PCIe硬核的Lane并不是任意可用的,而是绑定到特定的SerDes通道(Lane)上。以常见的PolarFire器件为例,PCIe硬核通常占用一组连续的SerDes Quad,例如Lane 0~Lane 3对应某个Quad内的四个通道。每个Lane由一对差分信号(TX+/TX-、RX+/RX-)构成,硬核内部通过PMA完成串并转换、时钟数据恢复(CDR)和均衡(Equalization)。

通道映射的核心约束有三点:第一,Lane编号必须连续,不能跳号使用,例如不能只启用Lane 0和Lane 2而跳过Lane 1;第二,Lane 0承担链路训练中的关键角色,它负责发送TS1/TS2有序集并参与极性反转和通道反转的协商;第三,当链路宽度从x4降为x2或x1时,被禁用的Lane必须正确断电或置为电气空闲,否则可能影响链路训练的稳定性。在实际设计中,如果PCB走线导致TX/RX极性接反,可以通过硬核的极性反转(Polarity Inversion)配置来纠正,而不必改板。

PolarFire PCIe硬核架构与接口边界 FPGA 通用逻辑区(Fabric) 用户应用逻辑 / DMA AXI 互联 / 地址译码 配置寄存器访问 中断控制 硬核与FPGA逻辑接口边界(AXI / 本地接口) PCIe 硬核控制器 事务层 TL TLP拆分/组装 · CPL匹配 数据链路层 DLL CRC · ACK/NAK · 流控信用 物理层 PHY 8b/10b · 128b/130b · 弹性缓冲 配置空间 Type0/Type1 SerDes 通道(PMA) Lane 0 (TX/RX) Lane 1 (TX/RX) Lane 2 (TX/RX) Lane 3 (TX/RX) PMA接口 时钟域:pclk(核心) · pclk_div(用户) · refclk(100MHz参考) 复位域:perst_n(全局) · 逻辑复位(软) · SerDes复位(PMA)

三、时钟与复位域划分

PolarFire PCIe硬核涉及多个时钟域,理解它们的分工是避免跨时钟域问题的前提。首先是参考时钟refclk,通常为100 MHz差分时钟,由外部晶振或时钟芯片提供,直接送入SerDes PMA,用于CDR和链路训练。其次是核心时钟pclk,由硬核内部PLL从refclk倍频得到,驱动TL、DLL和PHY的数字逻辑。第三是用户时钟pclk_div,它是pclk的分频版本,用于驱动FPGA逻辑侧的AXI接口,其频率与链路宽度和速率相关。例如Gen2 x4下,pclk_div通常为125 MHz或250 MHz,具体取决于硬核配置。

复位域同样需要分层看待。perst_n是来自主机的全局复位,低有效,它复位整个PCIe硬核并触发链路重新训练。逻辑复位是软复位,只复位FPGA逻辑侧的接口逻辑,不影响硬核内部状态。SerDes复位则针对PMA,通常在链路训练失败或需要重新协商速率时使用。实际调试中,如果发现链路无法建立,应首先确认perst_n是否已释放、refclk是否稳定,再检查SerDes复位是否被意外触发。

四、与FPGA逻辑的接口边界

硬核与FPGA逻辑之间的边界是设计中最容易出问题的地方。PolarFire PCIe硬核通常提供两种接口形态:一种是AXI4接口,包括AXI4-Master用于发起Memory读写、AXI4-Slave用于接收主机访问;另一种是本地接口(Local Interface),以更直接的方式暴露TLP收发端口。无论哪种形态,边界上传递的信息都包括:TLP数据、TLP有效信号、TLP类型标识、以及配置访问的地址与数据。

在接口边界上,设计者需要关注三个关键点。第一,位宽匹配:硬核内部数据路径可能是64位或128位,而用户逻辑可能按32位处理,需要通过位宽转换逻辑或直接使用硬核提供的位宽。第二,背压处理:当用户逻辑无法及时接收TLP时,必须通过ready/valid握手信号正确反压,否则会导致硬核内部缓冲溢出。第三,地址映射:硬核的配置空间访问与用户BAR空间的地址译码需要在边界处明确区分,避免主机访问落到未映射区域而产生UR(Unsupported Request)完成包。

在实际工程中,建议在硬核与用户逻辑之间插入一层轻量的“接口适配层”,用于处理位宽转换、跨时钟域同步和简单的TLP过滤。这层逻辑不改变PCIe协议行为,但能显著降低用户逻辑与硬核直接耦合带来的调试难度。

五、关键参数与配置示例

以下是一组典型的PolarFire PCIe硬核配置参数示例(以Gen2 x4为例),用于说明各参数之间的关联关系:

参数 示例值 说明
链路速率 Gen2 (5.0 GT/s) 需与主机协商一致
链路宽度 x4 占用Lane 0~3
参考时钟 100 MHz差分 送入SerDes PMA
pclk_div 125 MHz 用户逻辑AXI时钟
Max Payload Size 256 Bytes 影响TLP拆分粒度
BAR0 大小 64 KB 用户寄存器空间

这些参数并非孤立存在:链路宽度决定Lane映射范围,速率决定PHY编码方式,pclk_div由速率和宽度共同决定,而Max Payload Size则直接影响DLL的流控信用计算。在修改任一参数后,都应重新检查时钟约束和复位序列是否仍然成立。

六、常见架构级问题与判断依据

当PCIe链路无法正常工作时,可以从架构层面按以下顺序排查:首先确认refclk是否在PMA端被正确检测到,可通过硬核的状态寄存器读取PLL锁定状态;其次检查perst_n释放后链路训练是否进入L0状态,若停留在Detect或Polling状态,通常是SerDes通道映射或极性配置有误;再次确认pclk_div是否稳定输出,若用户逻辑时钟缺失,AXI接口将无法完成任何事务;最后检查接口边界的ready/valid握手是否出现死锁,这通常表现为TLP发送停滞但硬核状态正常。