3. L0 状态详解:L0 状态定义、正常数据传输模式、链路宽度与速率协商
L0 是 PCIe 链路所有物理层状态中唯一能够进行正常数据包收发的工作状态。在 L0 下,发送端(Tx)与接收端(Rx)的时钟、PLL、串行器/解串器(SerDes)以及差分信号通道全部处于全速激活状态。本章将深入剖析 L0 状态的定义、正常数据传输模式以及链路宽度与速率的协商机制,为后续分析 L0 异常退出与恢复奠定基础。
3.1 L0 状态定义与进入条件
L0 状态是 PCIe 链路的基本工作状态,也是链路管理状态机(LTSSM)中唯一允许 TLP(事务层包)和 DLLP(数据链路层包)传输的状态。从其他状态进入 L0 必须满足以下条件:
- 从 Detect/ Polling/ Configuration 状态:完成链路训练,成功建立位锁定、符号锁定、块锁定,并完成链路宽度与速率协商。
- 从 L0s / L1 / L2 等低功耗状态:通过退出序列(如电气空闲退出、TS1/TS2 有序集交换)重新建立链路同步。
- 从 Recovery 状态:完成比特锁定重训练或速率/宽度变更后,链路重新进入 L0。
3.2 正常数据传输模式
在 L0 状态下,PCIe 链路的正常数据传输遵循严格的分层协议栈模型。数据从设备核心(Device Core)出发,依次经过事务层(TL)、数据链路层(DLL)和物理层(PHY),最终通过差分信号对发送到对端。
3.2.1 数据包类型与传输流程
| 层次 | 数据单元 | 主要功能 | 典型包类型 |
|---|---|---|---|
| 事务层(TL) | TLP | 发起/完成内存、I/O、配置、消息事务 | MRd、MWr、Cpl、Msg |
| 数据链路层(DLL) | DLLP | 链路管理、流量控制、ACK/NAK 重传 | ACK、NAK、InitFC1、UpdateFC |
| 物理层(PHY) | 有序集(Ordered Set) | 符号同步、链路训练、电气空闲退出 | TS1、TS2、SKP、EIEOS |
正常数据传输模式下,TLP 和 DLLP 通过时分复用(TDM)方式共享物理层通道。物理层在每个符号时间内发送一个 8b/10b(Gen1/Gen2)或 128b/130b(Gen3+)编码的符号。发送端必须保证连续的数据流,当没有 TLP/DLLP 需要发送时,物理层会自动插入 逻辑空闲(Logical Idle) 或 SKP 有序集 来维持链路同步。
3.2.2 数据流控制与信用机制
PCIe 使用基于信用的流控制(Credit-Based Flow Control)来防止接收端缓冲区溢出。发送端必须跟踪接收端发布的信用额度(Credits),包括:
- Posted 信用(P):用于内存写请求(MWr)和消息(Msg)。
- Non-Posted 信用(NP):用于内存读请求(MRd)、I/O 请求、配置请求。
- Completion 信用(Cpl):用于完成包(Cpl、CplD)。
每个信用类别又细分为 头信用(Hdr) 和 数据信用(Data)。发送端只有在拥有足够信用时才能发送对应的 TLP,否则必须等待接收端通过 UpdateFC DLLP 返回新的信用。
3.3 链路宽度与速率协商
链路宽度(Link Width)和链路速率(Link Speed)的协商发生在 Configuration 状态 和 Recovery 状态 中,但协商结果直接影响 L0 状态下的数据传输能力。协商过程遵循“先宽度后速率”的原则,且支持 链路宽度降级(Link Width Degradation) 和 速率降级(Speed Degradation) 机制。
3.3.1 链路宽度协商
宽度协商通过 TS1 有序集中的 Lane Number 和 Lane Reversal 字段完成。每个 Lane 在训练过程中会声明自己的 Lane 编号,接收端通过比较所有 Lane 的编号来确定最终的链路宽度。
| 协商阶段 | 动作 | 关键字段 | 结果 |
|---|---|---|---|
| Polling.Active | 发送 TS1,Lane 编号从 0 开始递增 | Lane Number (4-bit) | 确定物理 Lane 到逻辑 Lane 的映射 |
| Configuration.Linkwidth | 交换 TS2,确认 Lane 对齐 | Link Number (5-bit) | 确定链路宽度(x1/x2/x4/x8/x16) |
| Configuration.Lanenum | 验证 Lane 顺序,处理 Lane Reversal | Lane Reversal (1-bit) | 支持 PCB 布线反转,无需软件干预 |
3.3.2 链路速率协商
速率协商在宽度协商完成后进行,通过 Speed Change 流程实现。PCIe 支持多种速率,从 Gen1 (2.5 GT/s) 到 Gen6 (64.0 GT/s),每次速率变更都需要经过 Recovery 状态。
- 发起速率变更:上游端口(Upstream Port)或下游端口(Downstream Port)在 L0 状态下通过发送 TS1 有序集 并设置 Speed Change 位来发起速率变更请求。
- 进入 Recovery:链路从 L0 进入 Recovery.RcvrLock 状态,重新进行位锁定和符号锁定。
- 速率切换:在 Recovery.RcvrCfg 状态下,发送端和接收端同时切换到新的速率,并重新发送 TS1/TS2 有序集。
- 返回 L0:完成速率切换后,链路重新进入 L0 状态,开始以新速率传输数据。
3.3.3 协商过程示意图
3.4 L0 状态下的链路保持机制
为了在 L0 状态下维持稳定的数据传输,PCIe 物理层实现了多种保持机制:
- SKP 有序集插入:每 1000~2000 个符号插入一个 SKP 有序集,用于补偿发送端和接收端之间的时钟频率差异(Clock Tolerance Compensation)。
- 电气空闲退出序列(EIEOS):当链路从电气空闲状态恢复时,发送端必须发送 EIEOS 来唤醒接收端的 SerDes。
- 周期性 TS1/TS2 交换:在 L0 状态下,链路会定期(约每 1ms)交换 TS1 或 TS2 有序集,以验证链路同步状态。如果连续多次未收到预期的有序集,链路会进入 Recovery 状态进行重训练。
3.5 小结
L0 状态是 PCIe 链路性能的核心体现。正常数据传输模式下,TLP/DLLP 通过信用流控制机制高效传输,物理层通过 SKP 插入和周期性有序集交换维持同步。链路宽度与速率的协商在 Configuration 和 Recovery 状态中完成,支持自动降级和 Lane Reversal。理解 L0 状态的这些细节,是分析 L0 异常退出原因(如电气空闲误检测、时钟失锁、信号完整性恶化等)的前提。