2. PCIe协议基础与Agilex实现映射
PCIe 的分层结构是理解 Agilex 硬核 IP 配置方式的起点。协议把一次事务拆成三层协作:事务层(Transaction Layer)负责“要做什么”,数据链路层(Data Link Layer)负责“可靠地送到对端”,物理层(Physical Layer)负责“在链路上真正传出去”。Agilex 的 PCIe 硬核 IP 并不是把三层完全交给用户逻辑,而是把物理层、数据链路层以及事务层的大部分固定逻辑固化在硬核中,只把与用户设计相关的接口、配置空间、BAR、DMA 等边界开放出来。理解这条“协议层—硬核切分—可配置边界”的映射关系,才能判断哪些功能必须自己写、哪些只需配置参数。
三层分工与报文格式
事务层生成 TLP(Transaction Layer Packet)。一个 TLP 由头部、可选数据载荷和可选 ECRC 组成。头部前 4 字节包含 Fmt、Type、TC、TD、EP、Attr、Length 等字段,决定这是存储器读写、配置读写还是完成报文。例如存储器读请求使用 3DW 头、Length 表示请求的 DW 数量;完成报文则携带 Completer ID、Status 和 Lower/Upper Address。TLP 是端到端语义的载体,路由方式由头部地址或 ID 决定。
数据链路层在 TLP 前后加上序列号与 LCRC,形成 DLLP 封装,并生成独立的 DLLP,如 Ack/Nak、InitFC、UpdateFC。DLLP 不携带事务语义,只服务于链路可靠性:接收端校验 LCRC 后回 Ack,出错则回 Nak 触发重传。物理层把 DLLP 与 TLP 进一步封装进有序集(Ordered Set)和帧定界符中,在链路上以符号为单位传输。有序集用于链路训练、通道对齐、电气空闲退出等底层控制,例如 TS1/TS2 用于链路训练,SKP 有序集用于时钟补偿。
Agilex 硬核 IP 的切分方式
在 Agilex 器件中,PCIe 控制器以硬核形式集成在芯片内,物理层编码、SerDes、PCS、PMA 以及数据链路层的 LCRC、Ack/Nak、流控信用管理都由硬核完成。事务层中,TLP 的解析、生成、路由、配置空间寄存器、BAR 匹配、MSI/MSI-X 中断也由硬核实现。用户真正需要接触的是硬核暴露出来的接口:Avalon-MM 或 AXI 事务接口、DMA 描述符接口、配置空间访问端口以及各类状态信号。这种切分意味着用户不需要自己实现 TLP 编解码,但必须正确配置硬核参数,并在用户逻辑侧遵守接口时序和流控约定。
可配置边界主要体现在几个方面。链路参数包括链路宽度(x1/x2/x4/x8/x16)、链路速率(Gen1~Gen5)、参考时钟频率、是否启用 SR-IOV、是否启用 AER 等。事务层参数包括 BAR 数量与大小、配置空间 Vendor ID/Device ID、Class Code、是否支持 64 位 BAR、是否启用 MSI/MSI-X。DMA 参数包括描述符数量、通道数、读写方向、最大载荷。这些参数在 IP 例化时确定,部分可在运行时通过配置空间寄存器修改。理解哪些参数属于硬核固定、哪些属于可配置边界,是后续做地址映射和性能调优的基础。
TLP、DLLP 与有序集的格式对照
三类报文在链路上的封装关系可以这样理解:有序集是最外层物理层控制单元,DLLP 是链路层控制单元,TLP 是事务层数据单元。发送时,TLP 先被加上序列号和 LCRC 形成 DLLP 封装,再与其它 DLLP 一起被放入物理层的帧中,帧之间用有序集分隔。接收时顺序相反:物理层先识别有序集完成对齐和训练,再提取帧中的 DLLP,校验 LCRC 后交给数据链路层,数据链路层去掉序列号和 LCRC 后把 TLP 交给事务层。
| 报文类型 | 所属层 | 关键字段 | 作用 |
|---|---|---|---|
| TLP | 事务层 | Fmt、Type、TC、Length、Address/ID、Data、ECRC | 承载存储器/配置/完成事务,端到端路由 |
| DLLP | 数据链路层 | Type、Ack/Nak、Seq Num、FC Credit、LCRC | 确认、重传、流控信用更新 |
| 有序集 | 物理层 | TS1/TS2、SKP、EIEOS、符号对齐字段 | 链路训练、通道对齐、时钟补偿、电气空闲 |
配置示例与判断依据
假设在 Agilex 上例化一个 Gen4 x8 的 PCIe 硬核,目标是用 BAR0 映射 64KB 控制寄存器,BAR2 映射 4MB 数据缓冲区,并启用 MSI-X。在 IP 参数界面中,链路速率选 Gen4,链路宽度选 x8,参考时钟选 100MHz。BAR0 设为 64 位、不可预取、大小 64KB;BAR2 设为 64 位、可预取、大小 4MB。MSI-X 表大小设为 16 项。例化后,硬核会生成对应的配置空间寄存器,用户逻辑通过 Avalon-MM 从端口访问 BAR 空间。
// 示例:BAR 参数配置(示意,非实际工程文件)
BAR0: 64-bit, non-prefetchable, 64 KB
BAR2: 64-bit, prefetchable, 4 MB
MSI-X: enabled, table size = 16
Link: Gen4 x8, refclk = 100 MHz
判断配置是否生效,可以在上电后读取配置空间的 Link Status 寄存器,确认 Negotiated Link Width 为 x8、Current Link Speed 为 Gen4。若链路只训练到 x4 或 Gen1,需要检查参考时钟、复位时序、通道映射和 PCB 走线。若 BAR 访问返回全 0 或全 F,需要检查 BAR 是否被正确使能、地址是否与其它设备冲突。这些判断依据都来自硬核暴露的状态寄存器和用户逻辑的读写响应,而不是靠猜测。
把三层分工、报文格式和 Agilex 硬核切分放在一起看,可以得到一条清晰的判断路径:用户逻辑只处理事务层接口和可配置边界,数据链路层和物理层的可靠性、训练、编码由硬核负责。后续做地址映射、DMA 描述符设计和性能分析时,都应先确认当前配置落在哪一层边界上,再决定是改 IP 参数、改用户逻辑,还是检查物理链路。