myFPGA.com.cnFPGA 技术与产业观察
← 返回栏目

FPGA PCIe 入门:Endpoint、Lane、链路建立与 BAR

myfpga.com.cn 编辑部 · 2026-10-05

把 FPGA 板卡接入主机的 PCIe 插槽后,至少需要回答三个问题:链路是否建立,主机是否识别设备,软件能否访问板上的功能。它们属于不同层次,不能用“能看到设备”替代整个设计的验证。

Endpoint 在系统中的位置

PCIe 使用点对点链路组织互联。Root Complex 将处理器、内存系统与 PCIe 层次连接起来,Root Port 提供下游连接,交换机可以扩展连接;Endpoint 是提供具体功能的端点设备。FPGA 插卡常按 Endpoint 方式设计,但 FPGA 的角色与可用功能应按目标器件和 IP 确认,不能默认每个器件都支持 Endpoint 或 Root Port。

在 FPGA 工程中,可以把实现分为串行收发与链路、PCIe 协议/IP、应用逻辑及主机软件几部分。厂商 IP 暴露的用户接口和各部分边界并不相同。例如 AMD PG213 系统概览介绍集成块与用户设计的关系;Intel 多通道 DMA 指南则说明一种集成 PCIe 与 DMA 的实现。二者是具体产品资料,不是所有 FPGA 的能力清单。

Lane 数、插槽外形与实际链路

一条 Lane 包含两个传输方向,各使用一对差分信号。x1、x4 等表示链路的 Lane 数,不是某个应用固定可获得的传输速率。插槽外形、板卡布线、主机端口配置及最终协商宽度也不是同一件事。

链路宽度和工作速率需要双方能力及连接条件配合。上板后应读取实际链路状态,并与工程配置和原理图核对;不能仅看插槽长度或 IP 参数就判断链路已按预期工作。AMD 的链路训练说明给出了特定 IP 的宽度训练行为,具体降宽、重训练和 Lane 映射能力仍需查目标版本手册。

本文不列通用吞吐数字:代际、编码与协议开销、传输类型、负载大小、主机和 FPGA 数据路径都会影响应用结果。

链路建立先于配置与应用访问

链路训练由 LTSSM(链路训练与状态机)管理,其过程涉及检测对端、训练并建立可通信链路。L0 是正常活动状态,但链路后续还可能进入其他状态或重新训练,不能把一次达到 L0 当作长期稳定性结论。

初次 Bring-up 时,先确认供电、配置完成时间、参考时钟、复位和高速引脚连接,再检查 LTSSM、链路建立指示及实际宽度/速率。状态信号名称、编码和复位时序均属于器件/IP 相关内容,需使用配套指南,不要直接移植其他系列的数值。

链路建立也不等于主机已经完成枚举。枚举阶段由主机固件与操作系统发现设备、读取配置空间并分配资源;驱动随后才能管理具体功能。FPGA 配置与主机枚举的时间关系应在系统启动流程中安排,不能假定重新下载 FPGA 后主机一定自动恢复设备。

配置空间与应用寄存器不同

配置空间描述设备身份和能力,例如 Vendor ID、Device ID、Command/Status、BAR 与能力结构。主机通过配置访问读取或设置这些信息。AMD 的配置空间表展示了 Endpoint 与端口的不同头部布局。

应用状态、控制寄存器或缓冲窗口则通常放在另行设计的地址映射中。配置空间不是用户数据缓冲区;给应用逻辑增加一个寄存器,也不会自动让主机知道如何使用它。需要在硬件、地址映射文档和驱动之间约定偏移、位定义、访问宽度及读写副作用。

BAR:声明资源窗口,不是整块内存

BAR 是 Base Address Register。对于内存类型 BAR,Endpoint 声明所需资源窗口的大小和属性,主机在枚举时分配基地址。用户逻辑再将该窗口内的访问解码到寄存器或存储等目标。

概念上,若主机给某个 BAR 分配基地址 B,窗口内偏移为 O,相关主机地址为 B+O。软件使用驱动建立的映射访问 O;不能把 FPGA 内部地址直接当成主机进程指针,也不能把某次启动的 B 固定写进程序。

BAR 自身不存放业务数据,也不等同于 DMA 缓冲区。内存 BAR 可能采用 32 位或 64 位地址;64 位 BAR 会占用相邻两个 BAR 寄存器位置,不能把它们当作两个独立窗口。大小、类型与预取属性应与实现一致,具体选项可参阅 AMD PF BARs 配置说明。具有读取副作用的寄存器不能随意按可预取普通内存对待。

入门验证顺序

  1. 核对目标器件、封装、IP 版本、时钟与板级连接。
  2. 确认链路建立并记录实际宽度、速率及异常状态。
  3. 在主机确认设备身份和 BAR 资源分配。
  4. 通过驱动访问一个明确无副作用的只读版本寄存器。
  5. 再验证可写测试寄存器、应用数据路径和复位恢复;每一步保留软硬件版本及结果。

主线延伸阅读

信息来源