我们最近工程师简单讲了一下电脑开机时候的底层PCIe链路初始化的大概过程,也就是LTSSM (link training status state machine),我们根据下面的大概17分钟的视频讲述的顺序整理了一下文本,尽量保留了“工程师边看 Trace 边讲解”的现场感,希望对于这方面感兴趣的朋友有帮助,有时间的可以直接看视频!
这段视频主要演示了如何使用 SerialTek 的 BusXpert 软件分析一段 PCIe Trace,并借助其中的 LTSSM 视图观察 PCIe 链路从上电、检测、训练,到最终进入高速 L0 状态的完整过程。讲解重点不是单纯介绍 PCIe 规范,而是结合真实抓到的 Trace,说明每一个状态大概发生了什么、为什么会这样跳转,以及在调试链路训练问题时应该重点看哪些信息。
视频一开始先打开了一段 BusXpert 抓到的 PCIe Trace。整个 Trace 覆盖了从设备上电、复位、链路训练,到后面开始出现数据交互的一段过程。
在最前面,可以看到链路处于 Electrical Idle 状态。这个阶段通常意味着设备可能还没有真正开始工作,比如尚未上电、复位还没有释放,或者链路双方还没有进入有效训练过程。
继续往后看,Trace 中开始出现 DLP 相关内容,这说明链路已经不再只是物理层的空闲状态,而是逐步进入到数据链路层活动阶段。也就是说,在 Electrical Idle 和后面 DLP 活动之间,中间那一段就是本次分析真正关注的核心:PCIe LTSSM 建链过程。
随后,视频将 Trace 放大,能够看到黄色的 Training 区域,以及上下游方向的信号变化。这里已经可以初步判断,链路开始进入 PCIe 训练阶段。
在 Training 区域继续放大之后,可以看到 Trace 中出现大量 TS1 Ordered Set。这说明链路已经进入 Polling 相关阶段。
视频中特别提到,中间还可以看到一些黑色的小段,进一步放大后发现是 SKP4,也就是 Skip Ordered Set。这个内容在 PCIe 链路中非常常见,它主要用于补偿链路两端时钟之间的微小差异。
PCIe 两端的收发时钟并不是绝对同步的,接收端通常需要从数据流中恢复时钟。为了避免弹性缓冲区因为两边时钟差异而发生溢出或欠载,就需要周期性插入 SKP Ordered Set 来做补偿。
随后还能看到 TS2 Ordered Set,这说明链路已经从早期 Polling 阶段继续往后走,进入到 Configuration 相关阶段。视频里强调,BusXpert 不只是能看到一个粗略波形,还可以在下面查看任意时间点附近到底发送了哪些 Ordered Set,例如 TS1、TS2、SKP 等。
为了更清楚地分析链路训练过程,视频中打开了 BusXpert 里的 LTSSM Widget。这个视图可以把底层 Trace 中的状态机变化单独提取出来,便于观察链路从 Detect、Polling、Configuration、L0、Recovery 等状态之间如何跳转。
在 LTSSM 视图里,前面仍然可以看到没有上电或刚上电时的阶段。随后链路进入 Detect 状态,再往后出现 Polling Active,最后进入绿色的稳定链接状态。
这个视图的价值在于:如果只看原始 Trace,可能会看到很多 Ordered Set、Electrical Idle、DLP 等内容,信息比较杂;而 LTSSM Widget 可以直接把状态变化抽出来,让工程师快速判断链路训练卡在哪一步、有没有异常回退、有没有反复 Recovery 等。
视频接着回到更早的位置,专门找 Detect 是什么时候开始跳转的。
Detect 阶段非常短,但它很关键。设备刚上电、复位释放之后,链路首先进入 Detect.Quiet。在这个阶段,Root Port 或上游端会尝试判断对端是否真的插了设备。
检测方式不是一开始就发送正常 PCIe 数据,而是通过 TX 端发出 Detect 脉冲,观察对端的电气响应。如果对端有设备存在,通常 RX 端会有对地 50Ω 终端阻抗,中间 TX/RX 之间还有 AC 耦合电容,这样就形成了一个阻容网络。Detect 脉冲经过这个网络后,波形会发生变化,发送端就能据此判断:对面确实有设备插入。
一旦确认对端存在,状态就会从 Detect.Quiet 很快跳到 Detect.Active,再进入 Polling 阶段。
这一段对于调试非常重要。如果链路长期卡在 Detect,通常就要优先怀疑设备没有被电气检测到,例如连接器、线缆、转接板、AC 耦合、电源、PERST#、终端阻抗等问题。
进入 Polling 后,双方开始发送 TS1 Ordered Set。视频里解释,TS1 大约由 16 个 symbol 组成。PCIe 早期链路训练阶段,symbol 是非常基础的数据单位。
TS1 的第一个 symbol 通常是 K28.5 / COM,可以理解为 Ordered Set 的起始标识。后面还会包含 Link Number、Lane Number、速率能力等字段。
不过,在最早的 Polling 阶段,很多字段还没有真正协商出来,例如 Link Number、Lane Number 等,因此这些位置会先填入 PAD。也就是说,这时候双方只是先把基本训练序列发起来,还没有完成完整链路编号、lane 编号、极性等细节确认。
视频中还提到,规范要求会发送大量 TS1,比如约 1024 个 Ordered Set,目的就是给对端足够的接收和锁定时间。对端只要连续收到一定数量的有效 TS1,比如连续 8 个 TS1,就可以继续往 Polling.Configuration 阶段推进。
在 Polling.Active 之后,链路进入 Polling.Configuration。这一阶段仍然以 TS1 交互为主,但内容开始变得更有意义。
视频中特别补充了一点:TS1 里面也会包含速率相关信息。由于 PCIe 链路刚开始上电训练时,通常是从最低速率开始,也就是 Gen1 2.5GT/s,因此一开始 TS1 里的速率字段会先标识为 Gen1。
这一步可以理解为双方先用最稳妥的基础速率把链路拉起来。等基础链路建立成功后,再通过 Recovery 等机制逐步切换到更高速度。
在 Polling 后期,Trace 中开始出现 TS2。TS2 的出现通常意味着链路训练已经进一步推进,准备进入 Configuration 阶段。
进入 Configuration 阶段之后,链路继续发送 TS1 和 TS2,但此时 TS2 中已经不再只是 PAD,而是开始携带更明确的链路信息。
视频里重点提到,TS2 会带有 Link Number 和相关链路编号信息。每个 Link 都有自己的编号,每条 lane 也有对应的 lane number。双方通过这些信息判断当前连接关系是否正常。
这里还涉及一些非常实际的调试问题,例如:
视频举了一个例子:如果一端认为自己发的是 lane 0,而对端看到的却类似 lane 7,那么双方就可以据此判断可能存在 lane reversal,需要进行对应处理。
这一段对工程调试很有价值。很多链路不是完全不起来,而是由于 lane mapping、极性翻转、线序设计、转接板布线等问题导致训练异常。通过 TS1/TS2 中的字段,可以看到双方到底是如何认识这条链路的。
当 Configuration 阶段的协商完成后,链路就会进入 L0。
不过,视频中特别说明,这时候的 L0 还只是最基础的 L0,也就是 Gen1 2.5GT/s 速率下的 L0。它的意义是:链路双方已经确认基本连接没有问题,链路可以正常建立,数据链路层也可以开始工作。
进入 L0 后,可以看到 Trace 中开始出现数据链路层相关内容,同时也会继续看到一些 SKP Ordered Set。此时链路已经“通了”,但还没有达到最终目标速率。
视频观察到,这一段 L0 维持在 2.5G,也就是 Gen1 速率。后面如果设备和系统都支持更高速率,链路会继续通过 Recovery 状态进行速率切换。
链路在 Gen1 L0 稳定以后,双方完成一些基础交互,例如 credit 相关信息之后,会再次进入 Recovery。
Recovery 并不一定代表链路异常。很多时候,PCIe 链路从低速切到高速,本来就要经过 Recovery 相关子状态。
视频中看到链路进入 Recovery.Speed,开始进行 speed change。也就是说,链路先在 Gen1 下建立起来,然后再逐步切换到更高的速率。
随后,Trace 中可以看到链路先从 2.5GT/s 切到 8GT/s,也就是 Gen3 速率。进入 8G 后,中间会出现一段空闲或 unknown 状态,随后继续观察后面的状态变化。
视频继续往后看,发现链路从 8G 后面又跳到了 16GT/s。在切换到 16G 的过程中,双方仍然会交互 TS2,也会出现 Electrical Idle 相关序列。
这里可以看到一些典型过程,例如:
随后链路继续切换到 32GT/s,也就是 PCIe Gen5 速率。
这一段体现了 PCIe 高速链路训练的基本思路:不是一上来就直接跑最终速率,而是先在低速下建立可靠连接,再通过 Recovery 逐级切换,最终达到双方共同支持的最高速率。
切换到 32G 后,链路会进入一些 Recovery 子状态。视频中提到其中一个关键状态是 Recovery.Lock。
Recovery.Lock 可以理解为在目标高速率下完成锁定。此时链路已经在 32GT/s 下完成必要的同步和锁定动作。期间双方仍然可能会交互 TS1、TS2,也会出现 Electrical Idle、Exit Electrical Idle Ordered Set 等内容。
等这些交互都没有问题后,链路进入 Recovery.Idle,再最终跳入 32G L0。
这意味着链路训练过程真正完成:不仅基础链路已经建立,而且高速速率也已经成功切换并稳定运行。
视频最后看到链路进入 32G L0。这代表该 PCIe Gen5 链路已经以 32GT/s 的速率进入正常工作状态。
整个训练过程可以概括为:
Electrical Idle / Detect → Polling.Active → Polling.Configuration → Configuration → Gen1 L0 → Recovery.Speed → 8G → 16G → 32G → Recovery.Lock → Recovery.Idle → 32G L0
这个过程说明,PCIe 链路训练不是一个简单的“插上就通”的动作,而是双方在电气检测、Ordered Set 交互、速率协商、lane/link 编号确认、极性/翻转判断、低速建链、高速切换等多个步骤中逐步完成的。
这段视频最大的价值,是把 PCIe LTSSM 从规范里的状态图,拉回到了真实 Trace 里。
在实际调试中,如果一条 PCIe 链路不能正常起来,仅仅看系统是否识别设备是不够的。通过 BusXpert 这类协议分析工具,可以进一步判断问题到底发生在哪个阶段:
如果卡在 Detect,要优先检查对端设备是否被电气检测到,包括连接器、线缆、终端、电源、复位等。
如果卡在 Polling,要重点看 TS1 是否正常发送和接收,链路双方是否能完成基础训练。
如果卡在 Configuration,就要关注 TS1/TS2 里的 Link Number、Lane Number、lane reversal、polarity inversion 等协商信息。
如果能进 Gen1 L0,但不能升到 Gen4/Gen5,就要重点观察 Recovery、Speed Change、Electrical Idle、Equalization 以及高速信号完整性相关问题。
如果反复进入 Recovery,则可能说明链路高速状态不稳定,或者在速率切换、均衡、时钟、retimer、线缆、转接板等环节存在问题。
更多PCIe5&6.0, CXL, NVMe SSD, SAS/SATA, NVMe over Fabric (NVMoF), NAND,新型存储技术NVM(RRAM/ReRAM, FRAM/FeRAM, MRAM, PCM, 3D-NOR, SRAM/DRAM等) DDR5/LPDDR5以及UFS测试方面的问题想咨询,可以查看Saniffer公司2026.2.24最新更新的测试工具白皮书15.1版本,我们已经整理收录在Saniffer公众号的【白皮书】菜单中。
欢迎关注Saniffe公众号,点击底部菜单栏即可免费获取。如有任何技术问题,也可直接在公众号内留言交流。