2. PCIe 协议基础与 Kria 硬核资源

PCIe 不是一条简单的并行总线,而是一套分层、带事务语义、可扩展的高速串行互连协议。理解它的分层结构、TLP 包格式、配置空间,以及 Kria 器件中硬核 PCIe 的位置与能力,是后续做 DMA、地址映射和驱动开发的前提。本节先建立协议视角,再落到 Kria 的具体资源与时钟复位约束。

一、PCIe 分层架构:从应用到链路

PCIe 协议自上而下分为三层:事务层(Transaction Layer)、数据链路层(Data Link Layer)和物理层(Physical Layer)。发送方向,上层软件产生请求,事务层把它封装成 TLP(Transaction Layer Packet);数据链路层在 TLP 前后加上序列号与 LCRC,形成 DLLP 承载的帧;物理层再完成字节条带化、加扰、编码(Gen3/Gen4 使用 128b/130b)并串行发送到链路。接收方向则逐层剥离、校验、重组,最终还原为事务。

三层职责可以这样记:事务层管“做什么事务”,数据链路层管“可靠传输”,物理层管“电气与比特流”。事务层还负责流量控制信用(Credit)和 QoS;数据链路层负责 ACK/NAK 重传与链路管理;物理层负责链路训练与状态机(LTSSM),从 Detect、Polling、Configuration 到 L0 正常工作态。

PCIe 分层架构与 TLP 封装/解封装路径 发送方向(封装) 应用 / 驱动请求 Memory Read / Write / Config 事务层 生成 TLP:Header + Data 信用流控 / 排序 数据链路层 加 Seq + LCRC ACK/NAK 重传 物理层 加扰 / 128b130b 编码 串行发送 / LTSSM PCIe 链路(Lane 0..N) 差分对 TX+/TX- / RX+/RX- Gen3 8GT/s · Gen4 16GT/s 接收方向(解封装) 应用 / 驱动响应 Completion / Data 事务层 解析 TLP / 匹配请求 返回 Completion 数据链路层 校验 LCRC / Seq 回 ACK / 触发重传 物理层 解扰 / 解码 / 对齐 恢复比特流 TLP 结构(事务层包) Header Data Payload ECRC Seq LCRC ← 链路层附加

二、TLP 包格式与常见事务类型

TLP 由 Header、可选 Data Payload 和可选 ECRC 组成。Header 长度分 3DW(12 字节)和 4DW(16 字节)两种,4DW 用于 64 位地址。Header 中的关键字段包括:Fmt(格式,指示是否带数据、Header 长度)、Type(事务类型)、TC(流量类别)、Length(数据长度,以 DW 为单位)、Requester ID、Tag、Address 等。数据链路层再在 TLP 外层附加 Sequence Number 和 LCRC,接收端用 LCRC 校验、用 Seq 判断是否丢包并触发重传。

常见事务类型有四类:Memory Read/Write(存储器读写)、I/O Read/Write(已基本淘汰)、Configuration Read/Write(配置空间访问)、Message(消息,如中断 MSI/MSI-X、电源管理)。其中 Memory Write 是 Posted 事务,不需要 Completion;Memory Read 是 Non-Posted,必须由目标返回 Completion with Data(CplD)。理解 Posted 与 Non-Posted 的区别,对判断 DMA 写完成时机和读延迟非常关键。

三、配置空间:设备的“身份证”

每个 PCIe 功能都有 4KB 配置空间,前 256 字节与 PCI 兼容,后 3.75KB 为 PCIe 扩展能力。前 64 字节是标准头:Vendor ID、Device ID、Command、Status、Class Code、Header Type、BAR0~BAR5、Subsystem ID、Capabilities Pointer 等。BAR(Base Address Register)用于声明设备需要的地址窗口,系统枚举时写入基地址,驱动据此访问设备寄存器或内存。

配置空间访问通过 Configuration Read/Write TLP 完成,使用 Bus/Device/Function 号定位。Kria 作为 Endpoint 时,其配置空间由硬核 PCIe 控制器实现,BAR 的映射与地址翻译由 IP 配置决定。调试时常用 lspci -vvv 查看链路速率、宽度、BAR 分配和能力结构。

四、Kria 器件中的 PCIe 硬核位置与能力

Kria K26 基于 Zynq UltraScale+ MPSoC,其 PCIe 由 PS(Processing System)侧的硬核控制器实现,而非 PL 逻辑搭建。K26 通常提供 PCIe Gen3 x4 的硬核资源,部分型号/封装可支持 Gen4。硬核位于 PS 的 PS-PCIe 模块中,通过 AXI 接口与 PS 内部互连,PL 侧可通过 AXI Bridge 访问。硬核包含事务层、数据链路层和物理层,用户主要配置链路宽度、速率、BAR、中断和 DMA。

需要区分两个概念:PS 硬核 PCIe 与 PL 侧 PCIe IP。Kria 上常用的是 PS 硬核,它功耗低、性能稳定、不占用 PL 资源;若需要更多通道或特殊拓扑,才考虑 PL 实现。硬核能力受封装和器件等级限制,设计前必须查对应型号的 datasheet 确认最大 Lane 数和速率。

五、参考时钟与复位要求

PCIe 对参考时钟非常敏感。Gen3/Gen4 要求 100MHz 差分参考时钟,抖动(Jitter)必须满足规范,通常使用专用时钟芯片或从金手指引入。参考时钟质量直接影响链路训练成功率与误码率。Kria 开发板上一般提供板载 100MHz 差分时钟,也可通过外部时钟源输入。

复位方面,PCIe 使用 PERST#(PCI Express Reset)作为全局复位信号,低有效。系统上电后,PERST# 需保持有效至少 100ms,待电源和时钟稳定后释放,硬核才开始 LTSSM 链路训练。此外还有热复位和功能级复位。设计时要注意 PERST# 的时序、去抖和与参考时钟的先后关系:时钟必须先于 PERST# 释放稳定,否则链路可能训练失败。

调试提示:若链路训练失败,优先检查参考时钟是否存在、频率是否正确、PERST# 时序是否满足,再查 Lane 映射和极性反转配置。

六、关键参数速查

项目Gen3Gen4
单 Lane 速率8 GT/s16 GT/s
编码方式128b/130b128b/130b
单 Lane 有效带宽约 985 MB/s约 1969 MB/s
x4 有效带宽约 3.94 GB/s约 7.88 GB/s
参考时钟100 MHz 差分100 MHz 差分