ASPM 基础概念:链路到底怎么省电?

大家可能觉得奇怪,讲 Equalization 和 ASPM 的交互,为什么先要花一章讲 ASPM?

我个人的经验是:如果你不懂 ASPM 那几个状态机到底在干嘛,遇到 Equalization 失败时,你根本猜不到是 ASPM 在背后捣鬼。
说白了,ASPM 就是 PCIe 链路为了省电搞的一套“睡眠-唤醒”机制。

ASPM 是什么?

Active State Power Management,主动状态电源管理。名字挺长,但核心就一句话:
链路空闲时降低功耗,有数据要传时快速恢复。

嗯,它和咱们平时说的“休眠”不太一样。ASPM 是由硬件自动控制的,不需要软件干预。你想想看,如果是软件去管电源状态,那延迟得多大?
所以 ASPM 是硬线逻辑,每个 PCIe 端口里都有一个状态机在跑。

ASPM 核心思想
特性说明
控制方式硬件自动,不依赖软件
目标空闲时省电,传输时低延迟恢复
粒度逐链路(Link)级别
标准依据PCIe Base Spec 5.0/6.0 相关章节
小提示: 我之前碰到一个案子,某款 NVMe SSD 在特定主板上间歇性掉盘。
查了三天,最后发现是这块 SSD 对 ASPM L1 的退出时间要求比标准更严格。
你看,不懂 ASPM,连问题定位都无从下手。

链路电源状态:从 L0 到 L2

我习惯把 ASPM 的状态机想象成一条“睡眠阶梯”。
越往下越省电,但恢复时间也越长。咱们来看这几个关键状态:

L0 —— 全速工作模式

说白了就是链路满血状态。
TX/RX 差分信号正常发送,Equalization 已完成,数据哗哗地传。
功耗最大,但性能也最好。

L0s —— 快速浅睡

这是 PCIe 1.x 时代引入的“小睡”。
链路空闲一段时间(可配置的 Idle 计数),发送端可以把 TX 部分关掉。
特点:退出超快,几十个 ns 就能恢复。
但省电效果有限,毕竟只有一半电路在休息。

注意: L0s 只针对单个 Direction。
也就是说,上行可以进 L0s,下行还在 L0。
这在 Equalization 交互中有个大坑 —— 我后面会详细讲。

L1 —— 深度睡眠

这才是真正的省电模式。
链路两端的 TX 和 RX 都进入低功耗状态。
通常几 μs 到几十 μs 才能退出。
ASPM L1 有两种子类型:

  • ASPM L1 —— 由硬件空闲计数器触发
  • L1 PM Substates(L1SS) —— 更深的省电,甚至可以把主 PLL 关掉

嗯,L1SS 退出时间更长,对 Equalization 的影响也更明显。

L2 —— 几乎断电

这个状态基本只用在“热移除”场景。
主电源都断了,只有辅助电源维持少量逻辑。
恢复需要完整的链路训练,包括 Equalization 重做。

所以我说,Equalization 故障最怕的不是 L2,而是 L0s 和 L1 的不当切换。

状态典型功耗退出延迟是否影响 Equalization
L0最高(~1W+ per lane)无(已在工作)不需要
L0s中等(约 L0 的 60-70%)几十 ns轻度影响
L1低(约 L0 的 10-20%)几 μs中等影响
L1SS极低(可 < 1mW)几十 μs 到百 μs严重影响
L2几乎为 0毫秒级(需重训练)完全重新训练

状态转换条件

这里才是 ASPM 和 Equalization 真正“打架”的地方。
我给大家梳理一下转换的铁律:

  • L0 → L0s:链路空闲且空闲定时器到期。但注意,如果链路正在 Equalization 阶段(Recovery/Configuration 状态),禁止进 L0s。
  • L0 → L1:链路空闲一段时间后,且双方都同意。
    这玩意儿有个协调机制 —— 通过 TS1/TS2 序列里的“ASPM 支持”位来协商。
  • L1 → L0:任何一端检测到链路活动(比如 TX 要发数据),立刻发起唤醒。
    唤醒过程要走 Recovery 状态 —— 这也是 Equalization 最容易被“打断”的环节。
  • L0s → L0:直接退出,不走 Recovery,非常快。
    但 L0s 状态下退出时的电气特性不一定维持 Equalization 的设定值,所以在某些 NIC 上会丢包。
核心冲突点:
ASPM 的 L1 退出需要进入 Recovery 状态,而 Recovery 阶段会触发重新 Equalization 或至少部分系数重协商。
如果你的 ASPM 退出频率很高(比如每几个 μs 就进出一次 L1),Equalization 就被频繁打断,系统性能会严重下降。

ASPM 与 Equalization 的第一次“握手”

大家可能想问:它们俩到底怎么交互的?
我画了一张图来说明这个关系:

ASPM 状态机与 Equalization 交互图 L0 (全速工作) L0s (浅睡) 单向省电 L1 (深度睡眠) 双向省电 Recovery / Equalization 空闲定时器超时 空闲 + 双方协商 快速退出 唤醒 → Recovery Equalization完成 关键冲突: L1 退出必走 Recovery(虚线框),而 Recovery 阶段会重新触发 Equalization。 如果频繁进出 L1,Equalization 无法稳定,链路性能会骤降。

这张图我画得比较直白了。你看,从 L1 到 L0 必须经过 Recovery。
Recovery 里有什么?有 Equalization!
所以,ASPM 的 L1 进出频率直接决定了 Equalization 被执行的次数。
如果这个频率过高(比如每次空闲几百 ns 就进 L1),Equalization 就成了一个“一直在跑、从未完成”的过程。

避坑指南: 我曾经调一个 FPGA 加速卡项目,Gen4 x16 链路死活跑不到 16GT/s。
链路训练每次都卡在 Speed Change 阶段,但偶尔能稳定在 8GT/s。
调试器一看,ASPM L1 退出计数器每秒钟跳几千次。
关闭 ASPM 后,链路秒切 16GT/s。
所以,你怀疑 Equalization 有问题时,第一件事就是去看 ASPM 是不是在捣乱。

小结一下

ASPM 不是坏东西,它确实能省电。但是:

  • L0s 退出快,但影响链路电气稳定性
  • L1 退出必须走 Recovery,触发 Equalization
  • 频繁的 L1 切换等于让 Equalization 永远跑不完

所以,在调试 Equalization 故障时,先把 ASPM 关掉,确认链路能工作在 L0 频率和电压上。
然后再逐步打开 ASPM,观察什么时候出现退化。这是我多年来的标准套路。