4. L1 入口条件详解:链路空闲条件、电气空闲有序集(EIOS)的发送、接收端确认机制
PCIe 链路从 L0 状态进入 L1 低功耗状态,必须满足严格的入口条件。这些条件涉及物理层(PHY)的电气状态、数据链路层的协议交互以及接收端的确认机制。本章将详细拆解 L1 入口的三个核心环节:链路空闲条件、电气空闲有序集(EIOS)的发送以及接收端确认机制。
4.1 链路空闲条件:进入 L1 的前提
在发送任何电源管理请求(如 PM_Enter_L1)之前,链路必须首先满足物理层的“空闲”条件。这不仅是逻辑上的无数据发送,更是电气上的特定状态。
核心原则: 链路空闲条件是进入 L1 的“门闩”。只有链路处于电气空闲状态,接收端才能安全地关闭其接收器,而不会误判信号。
4.1.1 电气空闲(Electrical Idle)的定义
电气空闲是指差分信号对(D+ / D-)上的电压摆幅低于特定阈值,且持续一段时间。在 PCIe 规范中,这通常意味着发送端将差分电压驱动到共模电压附近,并保持稳定。
| 参数 | 描述 | 典型值(Gen3/Gen4) |
|---|---|---|
| 差分输出电压 | 进入电气空闲时,发送端将差分电压降至接近 0 mV | < 20 mV (峰峰值) |
| 共模电压 | 维持在接收端可识别的共模范围内 | 0 V ± 100 mV |
| 电气空闲退出检测阈值 | 接收端检测到差分电压超过此值,认为退出电气空闲 | ~ 100 mV (差模) |
4.1.2 链路空闲的判定流程
链路空闲并非瞬间完成,而是遵循一个有序的降功率过程:
- 数据发送完成:发送端完成所有待发送的 TLP(事务层包)和 DLLP(数据链路层包)。
- 发送 EIOS:发送端在最后一个数据包或有序集之后,发送电气空闲有序集(EIOS),通知接收端即将进入电气空闲。
- 进入电气空闲:发送端在发送完 EIOS 后,将发送器置于高阻抗状态,差分电压降至共模电平。
- 接收端确认:接收端检测到电气空闲状态,并准备进入 L1。
设计要点: 在进入电气空闲前,发送端必须确保最后一个数据包的 CRC 校验已经通过,且接收端已正确接收。否则,链路不会进入空闲状态。
4.2 电气空闲有序集(EIOS)的发送机制
EIOS 是物理层用于宣告“即将进入电气空闲”的特殊有序集。它由一组特定的符号序列组成,接收端通过识别 EIOS 来准备进入低功耗状态。
4.2.1 EIOS 的符号组成
EIOS 由 4 个符号组成,在 8b/10b 编码(Gen1/Gen2)或 128b/130b 编码(Gen3/Gen4/Gen5)下,其编码模式是固定的:
- Gen1/Gen2 (8b/10b): 由 4 个 COM 符号(K28.5)组成,但最后一个 COM 符号的运行不一致性(RD)被强制为负(RD-),以标识 EIOS 的结束。
- Gen3/Gen4/Gen5 (128b/130b): 由 4 个 EIE(Electrical Idle Exit)有序集块组成,每个块包含特定的同步头和扰码数据。
| PCIe 代际 | 编码方式 | EIOS 符号序列 | 关键特征 |
|---|---|---|---|
| Gen1 / Gen2 | 8b/10b | COM, COM, COM, COM (RD-) | 最后一个 COM 符号的 RD 极性为负 |
| Gen3 / Gen4 / Gen5 | 128b/130b | EIE, EIE, EIE, EIE | 每个 EIE 块包含 2 位同步头 + 128 位数据 |
4.2.2 EIOS 的发送时序
发送端在发送 EIOS 时,必须遵循严格的时序要求,以确保接收端能够正确识别:
- 连续发送:EIOS 必须连续发送 4 个符号,中间不能插入其他数据。
- 发送后立即进入电气空闲:在发送完最后一个 EIOS 符号后,发送端必须在 1 个 UI(单位间隔) 内将发送器置于电气空闲状态。
- 最小电气空闲持续时间:链路必须保持电气空闲状态至少 50 ns,以确保接收端完成检测。
常见错误: 如果发送端在发送 EIOS 后未能及时进入电气空闲,或者电气空闲持续时间不足,接收端可能无法正确识别,导致链路状态机进入错误状态。
4.3 接收端确认机制:从电气空闲到 L1 状态
接收端在检测到电气空闲后,需要完成一系列确认步骤,才能将链路状态从 L0 迁移到 L1。这个过程涉及物理层和数据链路层的协同。
4.3.1 接收端电气空闲检测
接收端通过内置的电气空闲检测器(Electrical Idle Detector)来监控差分信号。检测器通常基于以下两种机制之一:
- 幅度检测:检测差分电压是否低于阈值(如 20 mV),并持续一段时间(如 10 ns)。
- 边沿检测:检测信号是否在指定时间内没有发生跳变(即无数据翻转)。
4.3.2 接收端确认流程
一旦接收端检测到电气空闲,它会执行以下操作:
- 锁定 EIOS 序列:接收端确认收到的 4 个符号是有效的 EIOS,而不是噪声或数据。
- 停止时钟恢复:接收端关闭其时钟数据恢复(CDR)电路,因为不再有数据需要采样。
- 关闭接收器:接收端将模拟前端(AFE)置于低功耗模式,关闭差分放大器等电路。
- 通知数据链路层:物理层向数据链路层发送“电气空闲已建立”的指示。
- 进入 L1 状态:数据链路层确认链路空闲后,将 LTSSM(链路训练和状态机)迁移到 L1 状态。
协同设计: ASPM(主动电源管理)在 L1 入口中扮演“决策者”角色。ASPM 定时器超时后,会触发数据链路层发送 PM_Enter_L1 DLLP,而物理层则负责执行 EIOS 发送和电气空闲检测。两者必须紧密配合,才能实现低延迟、低功耗的 L1 入口。
4.4 L1 入口条件完整流程 SVG 图
下图展示了从链路空闲条件到 EIOS 发送,再到接收端确认的完整 L1 入口流程:
4.5 入口条件对比总结
下表总结了 L1 入口条件中,发送端和接收端各自承担的角色和关键动作:
| 角色 | 关键动作 | 时序要求 | 失败后果 |
|---|---|---|---|
| 发送端 | 发送 EIOS → 进入电气空闲 | EIOS 后 1 UI 内进入空闲 | 接收端无法识别,链路状态机卡死 |
| 接收端 | 检测 EIOS → 锁定 → 停止 CDR → 关闭接收器 | 电气空闲持续 > 50 ns | 误判电气空闲,导致数据丢失 |
| 数据链路层 | 接收物理层指示 → 迁移 LTSSM 到 L1 | 在电气空闲建立后立即执行 | 链路无法进入低功耗状态 |
避坑指南: 在实际设计中,常见的 L1 入口失败原因包括:
1. EIOS 发送后,发送端未能在 1 UI 内进入电气空闲(驱动电路响应慢)。
2. 接收端的电气空闲检测器阈值设置不当,导致误触发或漏检。
3. 链路中存在噪声,导致接收端将噪声误判为 EIOS 或数据。
1. EIOS 发送后,发送端未能在 1 UI 内进入电气空闲(驱动电路响应慢)。
2. 接收端的电气空闲检测器阈值设置不当,导致误触发或漏检。
3. 链路中存在噪声,导致接收端将噪声误判为 EIOS 或数据。