十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PCIe 6.0链路训练:LTSSM、均衡与调试实战

PCIe 6.0链路训练:LTSSM、均衡与调试实战 做服务器、网卡、加速卡或者国产芯片底层软件的同学最近大概率会遇到一个高频词PCIe 6.0。带宽翻倍到 64 GT/s 之后真正决定系统能不能稳定跑起来的往往不是芯片主频而是链路训练Link Training。很多项目里出现的“PCIe 卡识别不到”“速率协商只有 32 GT/s”“开机反复重启”之类的问题根源都出在 training 环节。这篇文章以 PCIe 6.0 的 training 机制为主线讲清楚四件事PCIe 6.0 相比前代在编码、信号、纠错上的变化如何影响训练LTSSM 状态机与 TS0TS4 训练序列怎么配合64 GT/s 下的均衡训练Equalization为什么比 5.0 更复杂以及日常调试中如何定位训练失败。内容同样适合想了解 DDR training 与 PCIe training 区别的读者两者都叫“training”但训练对象、触发时机和排查手段完全不同。1. 背景PCIe 6.0 的 training 为什么值得单独讲1.1 先理解 PCIe 6.0 的几个关键变化PCIe 6.0 是 PCI-SIG 在 2022 年正式发布的 PCIe 规范大版本。它最直观的变化是把单通道数据速率从 PCIe 5.0 的 32 GT/s 提升到 64 GT/sx16 链路单向带宽达到 128 GB/s。为了实现这个速率PCIe 6.0 没有继续沿用 NRZ 编码而是切换到 PAM4 信号每个符号携带 2 bit 数据。同时编码层从 128b/130b 改成 FLITFlow control unit流控单元传输并引入前向纠错FEC用来对抗 PAM4 带来的更高误码率。很多同学会问这些改动和 training 有什么关系关系非常大。训练的本质是让发送端和接收端在物理层“对齐”包括符号同步、链路宽度协商、均衡参数收敛。PCIe 6.0 换了一套信号和编码体系训练序列的格式、LTSSM 的转移条件、均衡收敛的判定标准都要跟着改这就让 training 成了 PCIe 6.0 上最容易出问题、也最值得单独研究的环节。1.2 为什么 training 是 PCIe 6.0 的“第一道门槛”Training 在 PCIe 体系里不是可选项。物理链路从电气上连通到两端能协商出速率、通道数再到接收端均衡收敛全部由 LTSSMLink Training and Status State Machine链路训练与状态机完成。在 PCIe 6.0 里training 的难度明显上升PAM4 只有约 1/3 的 NRZ 眼图高度加上更严苛的信噪比代价均衡训练的系数更多加上 FLIT 与 FEC 对训练时序有额外约束任何一方收敛不好链路就会降速或者训练失败。这也是本文把 PCIe 6.0 和 training 放在一起讲的原因。了解了 LTSSM 和训练序列的工作方式再看链路故障时就不会只停留在“是不是接触不良”这种表面判断上而是能顺着状态机和均衡过程一步步定位到具体环节。2. PCIe 6.0 的高速率基础PAM4、FLIT 与 FEC2.1 PAM4 信号训练对象变了在 NRZ 信号比如 PCIe 5.0里每个符号只有两个电平接收端恢复出一个“眼图”。而 PAM4 使用四个电平每个符号可以表示 2 bit接收端看到的是上、中、下三个堆叠的眼图。中间的限图受发送端线性度影响最大通常也最差因此均衡训练必须同时关心电压方向和抖动方向上的裕量接收端适配的程度直接决定能不能在 64 GT/s 下稳定工作。这里有一个容易混淆的点PAM4 并不是把速率翻倍的同时让信号质量也翻倍。实际上在同样误码率要求下PAM4 相比 NRZ 大约有 9.5 dB 的信噪比代价。也就是说PCIe 6.0 虽然通过 PAM4 把带宽提上去了但链路的噪声预算反而更紧。训练算法必须把发送端预加重和接收端均衡能力都发挥出来才能真正“打开”三个眼。2.2 FLIT 与 FEC 对训练的约束PCIe 6.0 把传输数据组织成 256 字节的 FLITTLP 和 DLLP 都被封装在 FLIT 里链路上不再是以前那种一个个单独处理的包格式。为了控制误码率PCIe 6.0 在物理层加入轻量级前向纠错 FEC并配合 FEC 重复机制把端到端残余误码率指标定在 1e-23 级别。否则以 PAM4 的原始误码率上层协议根本无法接受。对 training 来说FLIT 边界和 FEC 需要和 LTSSM 的电平转移严格对齐。训练序列的发送节奏、重试计数、从训练状态进入 L0 的时机都要考虑 FEC 的纠错延迟和 FLIT 的对齐要求。这也是为什么有些平台在 PCIe 6.0 模式下开机变量训练时间变长——训练不仅要完成传统意义上的链路收敛还要完成 FLIT/FEC 相关配置的确认。2.3 一张表看懂 5.0 和 6.0 的差异对比项PCIe 5.0PCIe 6.0线路速率32 GT/s64 GT/s信号调制NRZPAM4编码方式128b/130bFLIT256 字节前向纠错无FEC FEC 重复单 lane 毛带宽32 Gb/s64 Gb/s均衡训练复杂度中高训练时间预算较短更长需为均衡收敛预留余量这张表可以当作项目选型和排错时的快速参考。凡是看到“速率上不去”“训练时间过长”的问题先回到这张表想一下是不是 PAM4 和 FEC 带来的新约束没有满足。3. LTSSM 状态机training 是怎么一步步完成的3.1 LTSSM 是什么LTSSM 是 PCIe 物理层里的一个硬件状态机每个 PCIe 端口都有一个。它负责链路的上电训练、低功耗管理、错误恢复和速率切换。对操作系统和驱动程序来说LTSSM 几乎是透明的软件只能看到训练完成后的结果比如当前速率、链路宽度、是否有 AER 错误。在 PCIe 6.0 中LTSSM 的总体框架没有推倒重来但状态内部的转移条件、使用的训练序列类型、均衡相关的请求机制都做了调整。理解 LTSSM 最好的方式是把它拆成几个关键阶段Detect、Polling、Configuration、L0以及负责恢复和降速的 Recovery。3.2 从 Detect 到 L0 的关键阶段Detect 阶段发送端检测对端是否存在接收端电阻确认物理链路是否“有人”。如果根本没有设备插入训练会一直停留在 Detect 或反复检测。这个阶段不涉及训练序列主要靠物理层的 receiver detection 电路完成。Polling 阶段两端开始发送训练序列目标是建立 bit lock位同步和 symbol lock符号同步并处理极性反转lane polarity。在 PCIe 6.0 中Polling 阶段使用 TS0 训练序列这点和前几代用 TS1 的习惯不同抓协议分析仪时要注意区分。Configuration 阶段两端协商链路宽度和通道编号完成 lane reversal 处理并进行必要的高速均衡初始化。这个阶段主要使用 TS1 和 TS2 训练序列序列里携带链路号、通道号、FTS 计数、热复位/禁用等控制位以及均衡请求字段。L0 状态训练完成链路进入正常数据传输状态。PCIe 6.0 下进入 L0 后数据以 FLIT 形式传输同时 FEC 开始工作。如果后续链路质量恶化或者需要速率切换LTSSM 会进入 Recovery 状态重新训练。3.3 PCIe 6.0 的训练序列TS0TS4训练序列Ordered Set是 LTSSM 在链路上交互信息和完成同步的最小单位。PCIe 6.0 把训练序列重新梳理为 TS0TS4TS0用于 Polling 阶段的符号/块同步建立。TS1用于 Configuration 阶段完成链路号、通道号、宽度协商也携带均衡请求。TS2用于 Configuration 阶段对协商结果进行确认和收尾。TS3/TS4用于低延迟恢复场景让链路在 Recovery 或从低功耗状态回到 L0 时更快地重新同步。TS1/TS2 的基本格式仍然以 COM 符号起始后面跟着链路号、通道号、FTS 计数等字段。到了 PCIe 6.0为了让训练在 PAM4 下可靠传输训练序列的格式、字段长度和解析规则都有调整。尤其是均衡相关字段位宽和含义都比前代更丰富这也是后面要单独讲均衡训练的原因。4. 均衡训练PCIe 6.0 真正难的部分4.1 为什么高速链路需要均衡信号在 PCB 上传输时高频分量衰减远大于低频分量速率越高越明显。到了 64 GT/s通道插入损耗可能达到几十 dB接收端看到的眼图往往是闭合的。只靠接收端的固定增益补偿远远不够必须由发送端做预加重pre-emphasis由接收端做连续时间线性均衡CTLE和判决反馈均衡DFE才能把眼图“重新打开”。PCIe 规范定义了一套链路均衡流程Link Equalization Procedure主要分两个阶段Phase 1Preset发送端按照预设的均衡系数组合发送信号接收端评估接收质量选择效果最好的 preset。Phase 2Coefficient Update在选定 preset 的基础上接收端通过训练序列请求发送端微调主光标main cursor、预光标pre-cursor、后光标post-cursor的系数逐步逼近最优眼图。均衡过程的每一次请求和确认都是通过 TS1/TS2 训练序列中的专用字段来传递的。软件层面通常只能看到均衡是否成功看不到中间过程因此调试时要靠协议分析仪或芯片内部的 LTSSM 寄存器。4.2 PCIe 6.0 均衡训练的差异PAM4 对均衡训练提出了三个新要求三个眼都要收敛NRZ 只需要关注一个眼PAM4 需要同时关注上、中、下三个眼。中间眼的线性度最差往往是均衡的瓶颈。接收端适配更关键64 GT/s 下 DFE 等接收端均衡是必需的而不只是可选优化。训练流程里需要显式完成接收端 tap 参数的收敛这对训练算法的收敛速度和稳定性要求更高。系数范围和精度更大PCIe 6.0 的均衡系数范围和调整精度都比 5.0 扩展了训练参数空间更大收敛所需的时间也更长。如果把均衡训练理解成一个自动调节的闭环控制那么 PCIe 6.0 相当于把系统从“单变量简单调节”升级成了“多变量联合寻优”难度和调试成本都上了一个台阶。4.3 均衡没有收敛会怎样均衡训练如果不收敛LTSSM 不会直接进入 L0而是会按照策略重试训练、降低速率或者停留在 Recovery/Loopback 状态等待超时。实际项目中常见的现象是链路能协商到 64 GT/s但均衡 Phase 2 反复失败最后 LTSSM 自动回退到 32 GT/s甚至回退到 16 GT/s 才能稳定工作。这个时候不能只怪“板子布线不好”而要具体看是哪个环节没收敛。是 preset 选择范围不够是接收端 DFE 参数收敛太慢还是 TS1/TS2 上的均衡请求传递有问题这些都需要靠观测数据来判断而不是盲目换元器件或者改速率。5. PCIe training 与 DDR training 的到底有什么区别5.1 都叫 training训练对象完全不同“DDR training”是内存控制器在 DRAM 初始化阶段做的一组校准流程典型内容包括 ZQ 校准阻抗校准、写平衡Write Leveling、读写数据眼训练、命令地址训练、Vref 训练等。到了 DDR5速率提升后还引入了 DFE 等接收端均衡手段训练算法和参数复杂度进一步上升。PCIe training 则是 LTSSM 驱动的链路训练目标是完成串行差分链路的速率协商、宽度协商和均衡收敛。两者虽然都叫 training都涉及“眼图”“裕量”“校准”这些词汇但训练对象、执行者、失败表现完全不同。把这两个概念放在一起对比能避免在项目沟通里把“PCIe 训练不过”和“DDR 内存训练不过”混为一谈。5.2 PCIe training 与 DDR training 对比表对比项PCIe trainingDDR training训练时机上电、复位、速率切换、Recovery内存初始化、reset、低功耗唤醒后执行主体物理层硬件状态机 LTSSM内存控制器 固件MRC/BIOS训练对象串行差分链路lane并行数据总线 DQ/DQS 等信号类型PAM46.0/ NRZ单端 NRZDDR5部分独显显存用 PAM4主要校准项速率、通道数、均衡系数ZQ、写平衡、读写眼、Vref、DFE失败表现链路降速、link down、AER 报错BIOS 卡 training、开机循环、内存容量减少调试手段lspci、协议分析仪、LTSSM 寄存器MRC 训练日志、调试串口、波形抓取5.3 为什么 DDR training 最近被频繁提起DDR5 把标准速率一路推到 6400 MT/s 以上并向 8000 MT/s 演进内存总线也开始面临和 PCIe 高速链路类似的信号完整性问题。内存控制器不再像 DDR3/DDR4 初期那样简单做一次写平衡就能稳定而是需要更细致的每通道、每字节通道校准甚至要在接收端做 DFE 训练。某种程度上DDR training 和 PCIe training 是在同一个趋势下的两个分支速率越高训练越复杂。很多芯片验证团队会同时负责 PCIe 和 DDR 的物理层调试理解两者的共性和差异可以少走很多弯路。6. 实战如何观察 PCIe 训练结果6.1 Linux 下查看链路状态在 Linux 里查看 PCIe 链路状态最常用的命令是 lspci。先找到设备的 BDF 地址再用-vvv参数查看链路能力与当前状态lspci -vvv -s 01:00.0示例输出中关注 LnkCap 和 LnkSta 两行LnkCap: Port #0, Speed 64GT/s, Width x16, ASPM L0s L1 LnkSta: Speed 64GT/s, Width x16LnkCap 表示端口支持的最大能力LnkSta 表示当前实际协商结果。如果 LnkSta 里的 Speed 低于 LnkCap说明训练过程发生了降速需要进一步排查均衡或信号完整性。也可以直接读取 sysfs 文件适合脚本化监控cat /sys/bus/pci/devices/0000:01:00.0/current_link_speed cat /sys/bus/pci/devices/0000:01:00.0/max_link_speed cat /sys/bus/pci/devices/0000:01:00.0/current_link_width示例输出64.0 GT/s PCIe 64.0 GT/s PCIe 16不同内核版本的 sysfs 输出格式可能有细微差别但字段含义基本一致。如果current_link_speed显示低于预期基本可以断定训练没有达到最高速率。
返回列表