FPGA 原型验证专题 33:PCIe/SerDes 上原型——硬核收发器、降速子卡、LTSSM 训练与 DMA 时延偏差
更新时间:2026-09-13。本文是原型外围姊妹系列第八篇、模块 C 第三篇。专家层 04 PCIe 接口深水区、05 PCIe DMA 架构讲的是 PCIe/DMA 本身怎么设计;31 速率适配器 Speed Adapter 弹性FIFO/两种范式给了通用速率适配原理。本篇讲的是另一件事:把设计里的 PCIe/SerDes 从原型引出来、连到一个真实端点并让它训练成功、枚举通过、DMA 跑起来。
这一篇在体系里的位置
PCIe 与前面的低速接口、乃至 DDR 都不同:它建立在**高速串行收发器(SerDes)**之上,物理层是 CDR、均衡、8b/10b 或 128b/1b 编码、扰码、链路训练,全都锁死在标称线速(Gen3 8 GT/s、Gen4 16 GT/s、Gen5 32 GT/s)。31 速率适配器 Speed Adapter 弹性FIFO/两种范式的核心矛盾在 SerDes 上最尖锐:**DUT 逻辑可以降频,串行收发器不能"半速训练"还指望真实端点认它。**这决定了 PCIe 接入必须借助收发器硬核和专门的桥/子卡,而不是在软逻辑里随便改个时钟。
本文要回答的问题
- 为什么 SerDes/PCIe 不能简单降频?LTSSM、CDR、均衡在哪几个点锁死了速率?
- 两条现实路径——FPGA 硬核收发器直连(+异步桥)与专用 PCIe 速率适配子卡——分别怎么工作、怎么选?
- 参考时钟(refclk)、PERST# 复位、上电时序、LTSSM 训练在原型上为什么容易反复失败?
- DUT 控制器(用户 RTL)和硬核/桥之间,时钟域、数据位宽、PIPE 接口怎么适配?
- 枚举、配置空间、BAR、MSI/MSI-X、DMA 在慢原型上的时序偏差与超时怎么处理?
- 从一条原型 PCIe 链路上,哪些结论可信、哪些不可信?
一、为什么 SerDes 不能整体降频
普通并行接口降速,只要两边都慢,协议仍成立。SerDes 不行,原因有四层:
- **时钟数据恢复(CDR)锁定范围有限。**接收端从数据流里恢复时钟,PLL/CDR 只在标称速率附近一定容差内锁定。半速或非标准速率的串行流,对端 CDR 直接失锁,连比特都恢复不出来。
- 链路训练(LTSSM)按标准速率协商。PCIe 的 LTSSM 在 Polling/Configuration 阶段发送 training sequence(TS1/TS2),在一组标准数据速率(2.5/5/0/8/16/32 GT/s)和链路宽度上协商。对端(主机/交换芯片/真实设备)只接受标准速率,原型给非标速率就停在 Polling 永远进不了 L0。
- **均衡与模拟前端按速率标定。**TX/RX 预加重、CTLE/DFE 等是针对目标速率信道的模拟参数,速率变了均衡全错,误码率飙升。
- **协议定时器与超时是真实时间。**LTSSM 各状态超时、ack/重传、流控更新(flow control update 周期)按真实时间设定。慢原型若直接参与这些,会因响应太慢被对端判链路故障。
**结论:串行物理层必须在标准速率、真实时间上运行;能降速的只有 DUT 的上层数字逻辑,二者之间必须有一个运行在不同时间基上的桥。**这与 32 DDR/存储接入原型 真实DRAM/降速模型/容量墙的结论同源,只是 SerDes 连"降频训练"的余地更小。
二、两条现实路径
2.1 路径一:FPGA 内置收发器硬核 + 异步桥
现代大容量 FPGA 都集成硬 SerDes(收发器)和 PCIe 硬核/硬 IP(集成 block,含 PCS/物理层,部分带数据链路层)。做法:
- 用 FPGA 硬核在标准速率上跑物理层/部分数据链路层,直接(或经很短的高质量走线/子卡)连到真实端点;
- DUT 的 PCIe 控制器(用户 RTL,若芯片是自研控制器)跑在降频系统时钟域,二者之间通过异步 FIFO + 位宽/协议桥连接:硬核侧呈现一个宽位宽、高频的 PIPE/AXI-Stream 风格接口,桥把它收窄/重定时到 DUT 能承受的慢速接口,反之亦然;
- 若 DUT 本就用硬控制器(芯片 PCIe 用第三方硬核 IP),则替换为 FPGA 厂商对应硬核(11 ASIC→FPGA 等价单元替换 SRAM/时钟/IO/PHY),上层寄存器/配置接口保持兼容,软件不感知。

优点:链路真实、可在标准速率完成训练和枚举、成本低(用片内硬核);适合 DUT PCIe 控制器功能与软件验证。
难点/限制:
- 桥的缓冲要吸收速率差和 TDM 停顿(31 速率适配器 Speed Adapter 弹性FIFO/两种范式),尤其 DMA 大块流式传输;
- DUT 控制器若深度依赖精确周期时序(自定义非标准特性、紧耦合信用逻辑),异步桥会改变时序,可能暴露不了或扭曲某些边界行为;
- 硬核代际支持的最高速率可能低于目标芯片(用 FPGA 上的 Gen3 硬核代 Gen5 设计时,只能降代验证功能,带宽/电气无从谈起);
- 板级信号完整性:硬核到连接器的走线、参考时钟质量必须满足该速率,这是板级硬件门槛(39 板级 SI/PI)。
2.2 路径二:专用 PCIe 速率适配子卡(协议感知桥)
商用原型生态提供专门的 PCIe co-simulation / speed-bridge 子卡:子卡上有独立控制器和物理层,靠真实端点一侧完整跑标准 PCIe(自己完成 LTSSM、枚举所需链路层),靠原型一侧用慢速、宽松时序的事务接口与 DUT 通信,中间在事务/TLP 层做缓冲与重放,而不只是搬字节。
- 优点:对 DUT 降频和 TDM 最宽容(桥在 TLP 层解耦,能吸收大停顿),训练完全由子卡保证、最稳定,常支持把原型侧呈现为不同角色(root complex / endpoint),便于接主机或接设备两个方向验证;
- 代价:成本高、按速率代际/端口数买卡;引入明显且可变的端到端延迟;本质是"协议感知的高速代理",不是目标 PHY。
2.3 路径选择
| 情形 | 选择 |
|---|---|
| DUT 用可替换的标准硬核控制器 | 路径一(替换硬核),最简 |
| 自研控制器、要验证其 TLP/流控逻辑、板级 SI 达标 | 路径一 + 异步桥 |
| DUT 频率很低/TDM 严重/要最稳的训练与枚举 | 路径二(专用子卡) |
| 要做 root-port 接真实设备或 endpoint 接主机灵活切换 | 路径二(子卡常支持角色切换) |
| 要验目标速率的 BER/眼图/电气 | 都不行,属 ASIC PHY 签核范畴 |
三、参考时钟、复位与训练:反复失败的三大件
PCIe 链路 bring-up 的故障高度集中在物理层启动阶段,按下面三点排查能解决大半:
**1) 参考时钟 refclk。**100 MHz 参考时钟(common clock 或 separate clock 架构)必须频率准确、抖动达标、在两端都稳定后才开始训练。原型常见错:refclk 由 FPGA 逻辑分频产生(抖动过大,CDR/SSC 不接受)、refclk 频率档与硬核配置不一致、common-clock 假设与实际供电不符(SSC 扩频时钟是否同源影响 L0s 退出和随机掉线)。要用干净的板载晶振/时钟缓冲给硬核和对端供同源时钟,复位前时钟先稳。
**2) PERST# 复位与上电时序。**PERST#(基本复位)的释放必须晚于电源稳定和 refclk 稳定,并满足 PERST# 断言期间 refclk 已稳定的时序窗口(规范有 power-up timing 要求)。原型上若由手动/另一控制器控制 PERST#,很容易释放太早(硬核还没准备好→卡在检测)或复位不同步(端点和根侧状态不一致→反复重训练)。多 FPGA/多端口时所有相关复位要统一编排(28 处理器 JTAG/调试口上原型 GDB/trace/失真)。
3) LTSSM 推进与降级。链路可能在 Polling.Active(TS1 收不到,查时钟/极性/通道映射)、Polling.Compliance(收到 EIEOS 但对端异常)、Configuration(lane-to-lane 去偏移、宽度协商失败,查 lane 翻转/极性反转/lane 映射)卡住。系统设计上应允许速率降代与宽度降配(Gen3 协商不下来退 Gen1,x8 退 x4/x1)作为 bring-up 手段——先在 Gen1 x1 把训练和枚举打通,再逐代逐宽提升,能快速隔离是物理层还是控制器问题。极性反转(polarity inversion)和 lane 反转(lane reversal)硬核通常可配置,要按实际板级连接设对。
**通道映射(lane mapping)。**多 FPGA/子卡转接最容易把 lane 顺序接乱。硬核配置里的 RX/TX lane 映射、极性要和物理走线一致;bring-up 先用硬核的眼图/DRP 状态、PRBS 回环(loopback:近端 PCS loopback、远端 loopback)逐 lane 验证物理连通,再开协议训练。
四、控制器与硬核/桥之间的适配
DUT 的 PCIe 控制器与 FPGA 硬核/子卡之间,除了时钟域(31 速率适配器 Speed Adapter 弹性FIFO/两种范式)还要处理:
- 位宽与频率换算:硬核 PIPE/AXIS 接口通常宽(如 256/512 bit)且高频,DUT 内部接口窄而慢,桥做串并转换与异步缓冲,保证吞吐量在两侧匹配(慢侧平均吞吐仍是天花板)。
- PIPE 信号语义:若自研控制器直接接硬核 PIPE,需对齐 power-down、signal detect、receiver detect、电气空闲等握手时序;降频后这些模拟相关握手要保持由硬核侧按真实时间驱动,DUT 不能凭慢时钟臆测。
- 复位/时钟/电源管理的处理:ASPM L0s/L1、L1 substates 依赖精确时序,原型上常先禁用 ASPM 把功能跑通,再单独评估;软件/驱动要能在原型配置里关闭这些特性(DTB/配置),否则会出现"进低功耗后唤不醒"的伪问题。
- 多 master/多端口仲裁:多个 DUT 发起者汇聚到同一桥/硬核时按 TLP/信用仲裁,缓冲深度按最大 TLP(含最大读请求 completion)和慢侧停供时间估。
五、枚举、配置空间与 DMA:慢原型上的时序偏差
物理链路起来后进入软件可观测阶段,这里的问题大多带"慢"字:
**1) 枚举与配置空间。**主机侧(或 DUT 作 root port 时 DUT 侧)要在复位后规定窗口内完成配置读、读 vendor/device ID、分配 BAR。若 DUT 是慢侧 root port、响应配置请求太慢,主机可能枚举失败/重试。子卡路径下枚举由子卡代理,较稳;硬核直连路径要确保配置请求在对端超时前被响应,必要时放宽主机枚举等待、或让桥自动响应标准配置事务。BAR 大小、能力链(capability chain)、MSI/MSI-X capability 必须与真实设计一致,否则驱动走错分支——替换硬核时要把这些配置空间字段补齐成与芯片一致。
**2) 中断。**MSI/MSI-X 是内存写 TLP,经桥/硬核要保证写到达内存控制器的顺序与内存属性正确;原型上中断延迟被桥和 TDM 放大,驱动里紧耦合的"触发-等待中断"窗口要留裕量(呼应 29 固件 shift-left RTL 冻结前 bring-up/驱动开发)。
**3) DMA 数据通路。**这是 PCIe 原型验证最有价值的部分:描述符环、scatter-gather、cache 一致性(29 固件 shift-left RTL 冻结前 bring-up/驱动开发)、大块吞吐在真实链路层上跑通。但:
- 延迟不可信:单次 DMA read completion 往返在原型上被桥缓冲+跨片拉长几十~几百倍,依赖低延迟完成的算法表现会异常差,这是原型失真不是芯片缺陷;
- 峰值带宽测到的是短板:慢侧/DMA 引擎/桥/硬核/对端中最慢的一段,Gen3 链路在 Gen3 速率但 DUT 喂不满,测出来远低于线速,不能当芯片带宽;
- 流控与重传可功能验证:credit 耗尽、TLP 重传、完成超时(completion timeout)这类逻辑在真实链路行为下能被有意义地触发,但超时阈值要按原型延迟调整,避免用真芯片阈值误触发。
**4) 角色要明确。**DUT 作 endpoint 接真实主机,或 DUT 作 root complex 接真实设备(NVMe/网卡),两种方向对桥/子卡能力要求不同,bring-up 前先定角色,接线和配置完全不同。
六、可信结论与验收清单
可信:TLP/事务层功能、配置空间与枚举、BAR/能力链、驱动与软件栈、MSI/MSI-X 传递、DMA 数据正确性与 cache 一致性、真实链路层下的错误恢复(在调宽阈值后)。
不可信/需谨慎:目标速率 BER 与眼图(FPGA 硬核/子卡 PHY ≠ 目标工艺 PHY)、真实端到端 DMA 延迟与线速带宽(混桥/跨片)、ASPM 电气空闲与精确低功耗时序(常先禁用)、对 completion timeout 等绝对时间阈值的边界结论(按原型标定)。
验收清单:①refclk 同源/抖动/频率档正确,先于复位稳定;②PERST# 上电时序与多端口复位统一;③PRBS/近端远端 loopback 逐 lane 通、lane 映射/极性正确;④从 Gen1 x1 起步训练,再逐代逐宽提升,记录协商速率/宽度;⑤配置空间字段与真实设计一致、枚举稳定(反复复位/上下电);⑥DMA 正确性、cache 同步、中断顺序与长稳;⑦测并记录桥引入的延迟,供性能外推扣除;⑧ASPM 等时序敏感特性显式开关;⑨比特流、硬核配置、子卡固件版本纳入 manifest(20 比特流烧录与四方版本一致 manifest/门禁)。
七、bring-up 顺序与一个完整的故障定位案例
PCIe 上原型最大的风险是"链路不通时可怀疑的东西太多":硬核配置、参考时钟、复位、引脚/AC 耦合、电源、子卡、主机 BIOS、DUT 配置空间逻辑。用分层递进的 bring-up 顺序把空间一分为二,每一层只引入一个新变量:
- 硬核裸眼测试(BFT)比特流:不挂任何 DUT,只例化硬核+最简单测试设计,读硬核状态寄存器、跑内部环回(PIPE loopback)。这一层过了,说明硬核 IP、供电、refclk、下载与配置基本正常——别跳过它直接上完整设计。
- 硬核到连接器的电环回:近端环回(硬核到封装)、远端环回(经子卡/连接器回环)逐级打开 PRBS,确认收发器到连接器的物理通道、AC 耦合电容、子卡插槽没问题。
- 接主机、只验枚举:BFT 设计里手填一个最小配置空间(vendor/device ID、BAR),接真实主机,看
lspci -vvv能否枚举、LTSSM 到 L0、链路速率/宽度是否为协商值。这一层把"物理+硬核+主机侧"闭环。 - 挂最小 DUT 配置空间:换成 DUT 真实配置/初始化逻辑,仍不碰 DMA,核对主机读到的每个配置寄存器与规格一致(MSI-X table、BAR 类型/大小、expansion ROM 等)。
- PIO 单事务:主机经 BAR 发起单次读写,ILA 抓硬核用户侧接口,确认请求-完成事务的地址、字节使能、完成码正确。
- DMA 小流量→大流量:先一个描述符、单块 buffer,核对源/目的数据逐字节;再上多描述符、并发队列、长时间冲刷,此时才进入"DMA 可信度边界"内的功能验证。
- 错误注入与恢复:触发 completion timeout、bad TLP、链路断开重连,验证 AER 计数与 LTSSM 恢复(属可信范围内的控制路径验证)。
**一个简化案例(多团队会遇到的典型形态)。**现象:主机偶发枚举不到卡,冷启动有时有、复位后常没有。按上面分层:第 1、2 层全绿;第 3 层发现复位后 LTSSM 停在 Polling.Active 而不到 L0。因为裸 BFT 也复现,排除 DUT 逻辑;量复位时序发现子卡 PERST# 撤销时主机参考时钟还没稳定——PERST# 与 refclk 的先后关系违反 PCIe CEM 要求(时钟稳定后才允许撤 PERST#)。在原型时钟/复位编排(27 在电路仿真 ICE 与协同加速模式 接线/时钟纪律)里把 PERST# 改成由时钟锁定信号控制后稳定复现消失。教训:这种问题与 DUT 毫无关系,但没有分层 bring-up,很容易被当成"你们的 PCIe 控制器有 bug"查进 RTL 里好几天。
**主机侧的配合事项也要前置。**很多主机 BIOS 默认关闭 Above 4G Decoding、Resizable BAR、SR-IOV,或对枚举失败的卡做快速降级;调试期准备一台 BIOS 选项开放、能挂第二张显卡做控制台的主机,并关掉该口的电源管理(ASPM),避免主机自己进省电把现象搞复杂。
与系列及现有篇目的链接
- 速率适配母版:31 速率适配器 Speed Adapter 弹性FIFO/两种范式
- PCIe/DMA 协议本身:04 PCIe 接口深水区、05 PCIe DMA 架构、XDMA 用法 intermediate/15
- SerDes 与板级 SI:01 SerDes 收发器、23 收发器信号完整性、39 FPGA SI/PI 板级
- 单元替换/复位/软件:11 ASIC→FPGA 等价单元替换 SRAM/时钟/IO/PHY、28 处理器 JTAG/调试口上原型 GDB/trace/失真、29 固件 shift-left RTL 冻结前 bring-up/驱动开发
- 两种模式与版本:27 在电路仿真 ICE 与协同加速模式 接线/时钟纪律、20 比特流烧录与四方版本一致 manifest/门禁
总结
一句话总结:PCIe/SerDes 上原型的铁律是串行物理层不能跟着 DUT 一起降频——CDR 只在标称速率锁、LTSSM 只在标准速率(2.5/5/8/16/32 GT/s)协商、均衡按速率标定、链路定时器按真实时间,所以只能让物理层全速、让上层逻辑降频、中间用桥解耦;两条现实路径,一是用 FPGA 内置 SerDes/PCIe 硬核在标准速率跑物理层、自研或替换的控制器经异步 FIFO/位宽桥接到降频 DUT(成本低、链路真,但要处理 PIPE 语义、位宽频率换算、板级 SI 且硬核代际可能低于目标速率),二是用协议感知的 PCIe 速率适配子卡在 TLP 层做缓冲重放、自己完成真实训练(对 TDM 最宽容、训练最稳、可灵活切换 root/endpoint 角色,但贵且引入大延迟);bring-up 故障高度集中在三件套——同源干净的 100MHz refclk 必须先于 PERST# 稳定、PERST# 释放满足上电时序且多端口统一、LTSSM 卡顿时按 Polling/Configuration 各子状态查 lane 映射/极性/去偏移,并用 PRBS 和近端远端 loopback 先逐 lane 验证物理、再从 Gen1 x1 起逐代逐宽提升;链路起来后枚举、能力链、BAR、MSI/MSI-X 必须配得与真芯片一致,DMA 数据通路、cache 一致性和错误恢复是原型最有价值的可验项,但单次 DMA 往返延迟被桥和跨片放大数十上百倍、峰值带宽只反映系统短板、目标 BER/眼图/电气与 ASPM 精确时序根本不可信,超时阈值要按原型调、延迟要标定后在外推时扣除,并把硬核配置/子卡固件随 build_id 锁定——功能、枚举、驱动、DMA 正确性在原型上可信,目标速率的电气与线速性能永远不在这里签字。