14.9 L0s State // L0s 状态
L0s 是一个低功耗链路状态,L0s 返回 L0 状态的退出延迟最短。设备通过硬件逻辑自动控制进出 L0s 状态的行为,无需软件参与。链路双方都可以单独地进入或者退出 L0s 状态。
14.9.1 L0s 发送端状态机
链路地发送端和接收端有不同的 L0s 次状态,首先讨论发送端的 L0s 各次状态。如原文 603 页地图 14-40 所示,L0s 状态的发送端状态机是一个非常简单的结构。
图 14-40 L0s 发送端状态机
14.9.1.1 Tx_L0s.Entry. 状态
发送端在上层逻辑的命令下进入 L0s 状态。协议没有具体规定发送端进入 L0s 状态的条件,但直观地说,发送端会在空闲状态持续一段时间后进入 L0s 状态:这段时间内没有发送过 TLP 或者 DLLP。为了进入 L0s 状态,发送端通过发送一个 EIOS (5GT/s 速率下发送两个 EIOS),进入电气空闲状态。然而,此时发送端还没有真正关闭,并且需要维持共模电压在协议规定的范围内。
转移至 Tx_L0s.Idle. 状态
在经过 T TX‐IDLE‐MIN (20ns)时长后,进入 Tx_L0s.Idle. 状态。这段延时是为了确保发送端已经进入了电气空闲状态。
14.9.1.2 Tx_L0s.Idle. 状态
在该次状态中,发送端继续保持电气空闲状态,直到有上层逻辑命令退出为止。因为这个方向的链路处于电气空闲状态,所以能够节约一些能耗,节能是 L0s 状态的主要作用。
转移至 Tx_L0s.FTS. 状态
在上层逻辑的命令下,状态机会转移至 Tx_L0s.FTS. 状态,比如上层需要恢复报文发送时。LTSSM 具体退出该状态的方式,由设计实现决定。
14.9.1.3 Tx_L0s.FTS. 状态
在该次状态中,发送端会开始不断发送 FTS 有序集,以训练链路对端的接收端。所发送的 FTS 有序集数量取自对方在上次进入 L0 状态的训练过程中,发送的 TS 训练中通告的 N_FTS 字段。协议中提到一点,如果对方响应超时,那么发送端可能会增加发送的 FTS 有序集数量,超过 Recovery 状态中对端通告的 N_FTS 数量。
如果 Extened Synch 比特置位(如原文 644 页图 14-71 所示),发送端必须发送 4096 个 FTS 有序集,而不是 N_FTS 个。该特性为同步外部测试和分析设备拓展了所需的同步时间,它们可能无法像正常的对端设备那样,在较短的时间内恢复比特锁定。
在任何速率下,不能在 FTS 序列之前发送 SOS 序列。然后,在 5GT/s 速率时,必须在 FTS 序列之前发送 4 到 8 个 EIE 符号。在 128b/130b 编码时,必须在 FTS 序列之前发送一个 EIEOS 序列。
转移至 L0 状态
发送端会在发送完所有必须的 FTS 序列后,并满足下述条件时,转移至 L0 状态:
a) 8b/10b: 在 FTS 序列发送之后,在所有已配置通道上发送过一个 SOS 序列。
b) 128b/130b: 首先发送一个 EIEOS 序列,其后是 SDS 序列以及数据流。
14.9.2 L0s 接收端状态机
原文 605 页图 14-41 展示了接收端 L0s 状态机示意图。如果接收端的 Link Capability 寄存器表示支持 ASPM 功能,那么接收端必须实现 L0s 状态功能。当然,即使不支持 ASPM 功能,接收端也可以实现 L0s 状态。
图 14-41 接收端 L0s 状态机
14.9.2.1 Rx_L0s.Entry. 状态
如果接收端接收端支持 L0s 状态,在不满足进入 L1 或者 L2 的条件的情况下,在收到 EIOS 后进入该状态。
转移至 Rx_L0s.Idle. 状态
在经过 T TX‐IDLE‐MIN (20ns)时长后,进入 Rx_L0s.Idle. 状态。
14.9.2.2 Rx_L0s.Idle. 状态
此时,接收端处于电气空闲状态,在条件满足后退出电气空闲状态。
这时候,说一点有关电气空闲状态的题外话,早期版本的 PCIe 协议中,电气空闲状态与否取决于 squelch-detect 电路对电压阈值的测量结果。后来,随着链路速度的提高,测量如此之小的电压差变得越来越困难。因此,在更新的协议中,允许通过链路的行为来推断电气空闲与否,而不是真的通过测量电路电压。然而,有一点需要注意,如果不是通过检测电路电压来判断链路进入电气空闲状态,那么也不能通过电路电压判断链路退出了电气空闲状态。为了解决这个问题,引入了一种新的有序符号集 EIEOS(Electrical Idle Exit Ordered Set)。EIEOS 由交替的全零和全一字节组成,在链路上创造了一种类似于低频时钟的信号。一旦接收方进入电气空闲状态后,其可以通过检测 EIEOS 有序集,来得知链路是否退出了电气空闲状态。
转移至 Rx_L0s.FTS. 状态
如果接收方如上所述,检测到了链路退出电气空闲状态,那么接下来链路进入 Rx_L0s.FTS. 状态。
14.9.2.3 Rx_L0s.FTS. 状态
在该次状态中,接收端已经检测到链路上退出电气空闲状态的信号,并正在尝试从输入的比特流中重建比特和符号(或块)锁定,此时的输入比特流其实就是对端发送的 FTS 有序集。
转移至 L0 状态
如果在所有已配置通道上接收到 SOS 有序集(8b/10b 编码),或者 SDS 有序集(128b/130b 编码),那么接收端退出至 L0 状态。接收端必须有能力在跳转后迅速接收有效数据,并且在状态转移之前,需要完成通道间的去偏斜操作(deskew)。
转移至 Recovery 状态
然后,如果 N_FTS 发送超时后,接收端仍然没能满足进入 L0 状态的条件,此时接收方进入 Recovery 状态。此时,发送端也需要进入 Recovery 状态,不过在此之前发送端可以先完成任意的在途 TLP 或者 DLLP。在超时发生后,协议建议发送端提高其 N_FTS 数值大小,来降低超时事件再次发生的机率。N_FTS 的定义如下:
8b/10b 编码时,最小超时数值为 40 * [N\_FTS +3] * UI,最大超时数值则是前者的两倍。因为每个符号传输需要 10bit,上述数值可以转换为 4*N_FTS + 12 符号(UI 代表 1bit 的传输时间)。额外的 12 个符号解释为:6 个符号是最大情况下的 SOS 有序集长度,4 个符号用于额外的 FTS,而剩下 2 个符号用于符号间的间隔(Symbol margin)。总体而言,最小超时时间是发送所需 FTS 数量的 FTS 加上额外 12 个符号所需的时间,而最大超时时间则是前者的两倍。
如果 extended synch 比特置位,那么最小超时时间是 2048 个 FTS,最大超时时间是 4096 个 FTS。如果是超过 2.5GT/s 的速率,那么接收端实际用到的超时时间还要加上 4 到 8 个 EIE 符号。
128b/130b 编码时,最小超时数值为 130 * [N_FTS +5 +12 + Floor(N_FTS/32) ] * UI,最大超时数值则是前者的两倍。数值 130 * UI 代表传输 130 比特的时间,也就是一个块,所以经过换算后就变成了:[N_FTS +5 +12 + Floor(N_FTS/32) ] 块。数值 5 + Floor(N_FTS/32) 代表需要发送 EIEOS 的间隔,Floor(N_FTS/32) 表示了需要每隔 32 个 FTS 发送一个 EIEOS。剩下的 5 个块分别代表:第一个 EIEOS,最后一个 EIEOS,SDS,周期性的 EIEOS 以及一个额外的 EIEOS,防止发送端选择在 SDS 后发送两个 EIEOS。最后,12 代表在 extended synch 比特置起时,需要发送的 12 个 SOS,该比特置起时,超时长度为 N\_FTS = 4096。
14.10 L1 State // L1 状态
L1 是一个相较于 L0s 状态更加激进地减少功耗的链路电源状态,作为代价,L1 会有更长的低功耗状态退出延迟。和 L0s 一样,L1 是 ASPM 可选支持的一项状态,也就是说设备可以在没有软件参与的情况下,由硬件自动进入或者退出低功耗状态。然而,和 L0s 不同的是,软件也可以直接命令 USP 发起链路进入 L1 状态的改变,通过将设备电源状态改变为更低功耗的状态(D1,D2,或者 D3)做到这一点。L1 状态和 L0s 状态的不同点还在于,L1 状态会影响链路双向的状态,而 L0s 只作用于链路单个方向。
图 14-42 L1 状态机
当设备在检测到链路进入电气空闲状态时,会认为链路伙伴希望将链路转为 L0s,L1 或者 L2 等低功耗状态,为了区分到底应该进入哪种低功耗状态,在进入 L1 状态之前,链路双方会首先达到一致。通过握手机制使链路双方明白对方已经准备就绪,此时可以安全地继续进入 L1 的流程。原文 733 页的 “链路电源状态管理介绍” (Introduction to Link Power Management)一节提供了这套机制更多的细节,有兴趣的读者可以参阅。原文 608 页的图 14-42 展示了 L1 状态相关的状态跳转关系,我们将在后一节中展开讨论。
14.10.1 L1 Entry 状态
当 USP 想要进入 L1 状态时,必须向链路伙伴发出请求进入 L1 的申请,得到对端可行的回复之后,才可以进入 L1 状态(进入 L1 状态的申请可能是 ASPM 或者软件发起的)。在接收到可以进入 L1 状态的回应后,USP 进入 L1.Entry 次状态。
DSP 进入 L1 状态需要满足以下条件,DSP 必须接收到 USP 发出的请求进入 L1 状态的申请,并给出肯定的答复。接下来,DSP 等待链路上出现电气空闲状态有序集(EIOS,Electrical Idle Ordered Set),并使接收到 EIOS 的通道进入电气空闲状态后,进入 L1.Entry 次状态。
L1 Entry 状态期间
所有已配置通道的发送端发送 EIOS 并进入电气空闲状态,此时需要保持合适的直流共模电压(DC common mode voltage)。
转移至 L1.Idle 状态
在等待 TTX‐IDLE‐MIN (20ns)后进入 L1.Idle 次状态。这段延时是为了确保发送端已经进入了电气空闲状态。
14.10.2 L1 Idle 状态
此时,发送端仍然保持电气空闲状态。
当速率超过 2.5GT/s 时,LTSSM 必须在该次状态至少停留 40ns。在协议中,该延迟被描述为 “用于给逻辑准备好电气空闲状态检测电路留出时间,防止出现链路进入 L1 又很快退出的情况(检测不到这次进出 L1 状态)”。
转移至 Recovery 状态
当发送端收到上层指令退出 L1 状态,或者接收端检测到链路退出电气空闲状态时,下一步转移至 Recovery 状态。退出 L1 状态的原因可能是发送端需要发送 DLLP 或者 TLP,或者希望改变链路的宽度或者速率。如果需要改变链路速率,允许端口将变量 directed_speed_change 设置为 1b,并且将变量 changed_speed_recovery 清除为 0b。可选的,端口可能从 L1 退出,通过将 directed_speed_change 设置为 1b 发起速率改变请求,直接进入 Recovery 状态,而不是像通常情况下,从 L0 进入 Recovery 状态。
14.11 L2 State // L2 状态
L2 状态是相比 L1 状态程度更深的低功耗模式,相应地,也需要更长的恢复时间。当设备处于 D3Cold 电源状态下,并完成相应的链路握手之后,在电源管理软件的命令下,USP 发起进入 L2 状态的请求(使链路两个方向上都进入 L2 状态)。
系统在一切就绪后会切断主电源。在主电源移除后,设备会进入 L2 或者 L3 状态,取决于备用电源 Vaux 是否可用。如果 Vaux 存在,那么链路进入 L2 状态,否则进入 L3 状态。
L2 状态的目的在于使用低功耗的 Vaux 给设备供电,在需要链路恢复电源的事件发生后唤醒系统。设备有两种标准方法通知系统该类事件的发生。一个是边带(side-band)信号 WAKE# 引脚,另一个是链路(in-band)信号 Beacon。WAKE# 信号对于 L2 来说不是必须的,但是如果使用可选的 Beacon,那么其是必须的。(译注:)协议中明确指出工作在 5.0 或者 8.0 GT/s 的设备,无需支持 Beacon 特性,所以看上去 Beacon 是一项过时(legacy)的特性,仅用于运行在 2.5 GT/s 的设备。关于链路唤醒选项的更多细节,可以参见原文 772 页的 “Waking Non-Communicating Links” 一节。
如果设备支持 Beacon,那么其实 Beacon 指的是一个链路上的低频信号(30 KHz ‐ 500 MHz),支持唤醒功能的 USP 至少能够在通道 0 上发送 Beacon 信号,而 DSP 则必须能够接收它。中继设备,比如交换机,如果在其 DSP 端口上接收到 Beacon,必须有能力将其转发给它的 USP 端口。Beacon 的最终目的地将会是 RC(Root Complex),因为 RC 是系统电源控制逻辑的所在之处。
当发送端进入电气空闲状态时,可能代表想将链路转为 L0s,L1 或者 L2 等低功耗状态中的其中一种,所以需要机制来区分到底发送端想进入哪种低功耗状态。在进入 L2 状态之前,链路双方会首先达到一致。通过握手机制使链路双方明白对方已经准备就绪。原文 733 页的 “链路电源状态管理介绍” (Introduction to Link Power Management)一节提供了这套机制更多的细节,有兴趣的读者可以参阅。原文 611 页的图 14-43 展示了 L2 状态相关的状态跳转关系,我们将在后一节中展开讨论。
图 14-43 L2 状态机示意图
14.11.1 L2.Idle 状态
进入该次状态前,所有必须的握手流程必须已经在链路上的两个端口之间完成,并且端口已经发送或者接收到所需的 EIOS 序列。
所有已配置发送端必须至少在电气空闲状态,等待 TTX‐IDLE‐MIN (20ns)。但是因为此时主电源已经被关闭,因此发送端无需将直流共模电压保持在协议规定的范围内。接收端则在最短 20ns 的延迟结束前,不会开始检测链路是否退出电气空闲状态。所有接收端必须打开终结(termination)功能,处于低阻抗模式。
转移至 L2.TransmitWake 状态
如果 USP 被上层命令开始发送 Beacon,那么接下来进入 L2.TransmitWake 状态(Beacon 会一直向上流发送,只以 RC 作为最终目的地)。
如果交换机的 DSP 接收到 Beacon,交换机必须使其 USP 退出至 L2.TransmitWake 状态,并开始继续向上游发送 Beacon。
转移至 Detect 状态
在主电源恢复后,转移至 Detect 状态。
在端口主电源恢复后,在任何预先定义的通道上检测到退出电气空闲状态后,意味着这些通道可以被协商为通道 0 (多通道链路必须至少有 2 个预先定义的通道),之后转入 Detect 状态。如果是交换机的 USP 经历了上述过程,那么其必须将其 DSP 状态转移为 Detect 状态。
14.11.2 L2.TransmitWake 状态
在该次状态,发送端会至少在通道 0 上发送 Beacon。注意该状态仅作用于 USP,因为只有 USP 可以发送 Beacon。
转移至 Detect 状态
如果 USP 的任意接收端检测到链路退出电气空闲状态后,转移为 Detect 状态。当然,此时双方设备的电源必须已经恢复,链路伙伴才能够退出电气空闲状态。
原文: Mindshare
译者: LJGibbs
校对:
欢迎参与 《Mindshare PCI Express Technology 3.0 一书的中文翻译计划》
作者:LogicJitterGibbs
文章来源:知乎
《PCI Express Technology 3.0》翻译系列
- [[持续演进]资料整理:可以学习 N 小时的 DDR](https://aijishu.com/a/1060000...)
- PCI Express Technology 3.0 链路初始化与训练 7 L0 状态
- PCI Express Technology 3.0 链路初始化与训练 Configuration
- PCI Express Technology 3.0: 链路初始化与训练 3-4 节
- PCI Express Technology 3.0 : 链路初始化与训练 1-2 节
- 《PCI Express Technology 3.0》Chapter 5
- PCI Express Technology 3.0:Chapter 1 Background/背景
- PCI Express Technology 3.0:PCIe体系结构概述 2.1 节
- PCI Express Technology 3.0:PCIe体系结构概述 2.2-2.3
更多IC设计技术干货请关注FPGA的逻辑技术专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。