LJgibbs · 2023年01月03日

PCI Express Technology 3.0 链路初始化与训练 节8 Recovery

image.png

14.8 Recovery State // 恢复状态

如果一切如预期一样顺利,那么链路可以在不进入 Recovery 状态的情况下,直接被训练进入 L0 状态,这一正常工作状态。但我们之前讨论过,在两种情况下一定需要进入 Recovery 状态。

首先一种情况,如果在 Configuration.Idle 状态中没能成功接收到正确的链路符号,那么 LTSSM 会进入 Recovery 状态,尝试纠正链路中的信号质量问题,比如通过调整均衡参数的方式。

第二种情况,在链路以 2.5GT/s 速率训练完成,进入 L0 状态后,如果双方都支持更高的速率,那么 LTSSM 会进入 Recovery 状态,将速率调整为双方同时支持或者通告的最高速率。这种情况下,LTSSM 必须重新进行比特锁定和符号或者块锁定,以及链路间的去除偏斜操作。

链路编号以及通道编号正常情况下需要保持不变,除非需要改变链路宽度。这种情况下 LTSSM 进入 Configuration 状态,重新进行链路宽度协商。

注意:简洁起见,本章后续中使用锁定(Lock)一词表示已经完成了比特锁定和 8b/10b 编码的符号锁定、或者 128b/130b 编码的块锁定。接收端必须首先完成比特和符号或者块的锁定操作之后,才能在链路上识别出有效的符号、序列以及报文。

14.8.1 几个进入 Recovery 状态的理由

  • 从 L1 状态退出时,必须进入 Recovery 状态重新训练,因为协议中,退出 L1没有任何快速重训练选项。(比如发送 FTS 序列等方法)
  • 从 L0s 状态退出时,如果接收方在规定的时间内,没能依靠 FTS 序列完成同步,那么也必须进入 Recovery 状态重新训练。
  • 在 L0 状态中,这些情况下需要进入 Recovery 状态:
  • 在初次训练完成后,打算将链路训练为更高的速率。
  • 链路被上层逻辑要求改变速度或者宽度。(可能是因为功耗管理的需求,或者是因为链路无法在当前速率或者宽度下稳定工作)
  • 软件通过写链路控制寄存器(Link Control Register )中的重训练字段(Retrain Link bit),(可见原文 644 页图 14‐71),触发链路重训练以尝试修复一些传输问题。
  • 因为 Ack/Nak 协议出现诸如重放计数器翻转等错误事件,数据链路层自动控制物理层重新训练链路。
  • 接收端在完成配置的链路上接收到 TS1,TS2 序列,从而获知到对端已经进入 Recovery 状态。
  • 接收端在完成配置的链路上,在没有接收到 EIOS (Electrical Idle Ordered Set)序列的情况下检测到了电气空闲状态。

14.8.2 初始化 Recovery 状态

链路中的任意一方都可以通过向对端发送 TS1 序列来发起进入 Recovery 状态的请求。当一个 PCIe 端口接收到 TS1 时,他便获知对端已经进入了 Recovery 状态,随后其跟随对端进入 Recovery 状态。进入 Recovery 状态之后,本方端口也开始向对方回复 TS1 序列。双方接收端都通过对方的 TS1 序列完成锁定(如果有需要的话),然后按照需求进入各个次状态。Recovery 各个次状态如原文 573 页图 14-27 所示,本节后续将详细讨论各个次状态中都进行了哪些操作。

图 14-27 Recovery 状态机

14.8.3 Recovery 状态各次状态详细讨论

Recovery.RcvrLock 状态期间

在 Recovery.RcvrLock 状态期间,无论链路的速率为多少,发送方总是在所有已配置通道上发送 TS1 序列,TS1 序列中的链路以及通道编号,和在 Configuration 状态期间设置的数值相同。如果进入 Recovery 状态的目的是切换速率,那么发起方发送的 TS1 序列中的,数据速率识别符号(Data Rate Identifier Symbol)中的 speed\_change 比特会被设置为 1,并将内部变量 directed\_speed\_change 也设置为 1。在对端设备接收到 speed\_change 比特为 1 的 TS1 序列后,也会同样将其内部变量 directed\_speed\_change 设置为 1。此外,一旦进入 Recovery.RcvrLock 状态后,另一个内部变量 successful\_speed\_negotiation 会清除,设置为 0。

在 Recovery.RcvrLock 状态中,面向上游端口(USP)可以指定面向下游端口(DSP)在 5GT/s 速率下使用的去加重等级系数(de‐emphasis level)。USP 通过 TS1 序列中的可选去加重等级(Selectable de‐emphasis leve)比特,来指定 DSP 的数值设置。但是 DSP 有可能会因为链路上的比特错误,无法接收到 USP 发送的这一信息,所以 USP 可以在因为速率切换进入 Recovery 状态后,再次指定 DSP 的去加重等级。如果 DSP 打算采用 USP 所要求的的数值,那么 DSP 必须在 Recovery.RcvrLock 状态中记录接收到的可选去加重等级比特的数值。

在进入 Recovery.RcvrLock 状态时,TS1 序列接收方也可以被指定新的发送电压数值。接收方会在进入该状态时采样一次链路控制寄存器2( Link Control 2 register)中的 Transmit Margin 比特,并且保持该数值有效,直到下一次从 L0, L0s, 或者 L1 进入到 Recovery 状态,采样到新的数值为止。

DSP 如果想将速率切换到 8GT/s 并且重新进行均衡的话,需要发送 speed\_change 比特置为 1,并且速率声明为 8GT/s 的 EQ TS1 序列。如果一个 USP 连续接收到 8 个 speed\_change 比特置为 1,并且速率声明支持 8GT/s 的EQ TS1 或者 EQ TS2 序列后,USP 也会宣告支持使用 8GT/s 速率,除非 USP 确认在该速率下存在可靠性问题,并且无法靠均衡解决。值得注意的是,任意端口可以在进入 Recovery 状态时,改变其通告支持的速率,但需要确保自身可以稳定可靠地支持这一速率。除了上述这种情形外,端口在 Recovery.RcvrLock 状态,Recovery.RcvrCfg 状态以及 Recovery.Equalization 状态中,不得改变自己通告的支持速率。

转移至 Recovery.RcvrCfg 状态

Recovery.RcvrLock 状态满足下述条件后,转移至 Recovery.RcvrCfg 状态。如果双方接收到 8 个连续的 TS1 或者 TS2 序列,其中链路与通道编号与发送的数值一致,并且序列中的 speed\_change 比特与本地变量 directed\_speed\_change 一致,并且 EC 域数值为 00b (8 GT/s 速率下,译注:即无需进行均衡训练)。

  • 如果设置了 Extended Synch 比特,那么在进入 Recovery.RcvrCfg 状态之前,必须最少发送 1024 个连续的 TS1 序列。
  • 如果原先是从 Recovery.Equalization 状态进入当前次状态,那么 USP 需要比较所有通道上接收的均衡参数或者 preset,将他们和均衡的 Phase2 中所接收的最终参数集(final set of coefficient)或者 preset 进行比较。如果他们数值不一致,那么 USP 会将其发送的 TS2 序列中的 Request Equalization 比特设置为 1。

转移至 Recovery.Equalization 状态

当数据速率为 8 GT/s 时,数据通道必须采取合适的均衡参数,以获得良好的信号完整性。本节的内容并不适用于更低速的速率。对于运行在 8GT/s 速率的链路来说,他们并不是每次进入 Recovery 状态时,都需要经过 Recovery.Equalization 次状态。链路只会在满足下述情况时,才会进入 Recovery.Equalization 状态:

如果内部变量 start\_equalization\_w\_preset 设置为 1,那么:

a)USP 需要在转为 8.0 GT/s 速率之前,采样其接收的连续 8 个 TS2 中的 preset 数值。USP 必须采用其中的发送端 preset,可以选择是否采用其中的接收端 preset。

b)DSP 进入 8.0 GT/s 速率后,必须采用其通道均衡控制寄存器( Lane Equalization Control register )中的发送端 preset,可以选择是否采用其中的接收端 preset。

否则(即该变量不为 1),发送端必须采用在上一次均衡过程中协商一致的参数(coefficient)设置。

a)如果 USP 接收到 8 个连续的 TS1 序列,其中链路与通道编号与发送的数值一致,并且序列中的 speed\_change 比特为 0,但是 EC 域数值不为零时,下一个状态为 Recovery.Equalization。因为接收到上述 TS1 序列表示 DSP 希望重新进行均衡中的部分流程。协议中提到,DSP 可以在上层软件要求,或者其他具体实现决定的情况下,发起该请求。当然,DSP 必须保证进行该操作的时间,不能导致该传输超时,也就是说,DSP 需要保证发起该请求前,链路上没有正在进行中的传输。

b)在上层协议要求后,DSP 即进入 Recovery.Equalization 状态,但是不能由 Configuration.Idle 或者 Recovery.Idle 状态直接进入 Recovery.Equalization 状态。(译注:需要通过 Recovery.RcvrLock 次状态进入)协议规定在 DSP 通过发送 EC 不为 0 的 TS1 要求对端重新进行均衡过程之前,不能发送超过两个 EC=00b 的 TS1 序列。

如果上述情况都没有满足,在 24ms 超时后:

转移至 Recovery.RcvrCfg 状态

如果同时满足下述两个条件,那么接下来转为 Recovery.RcvrCfg 状态:

  • 接收到 8 个连续的 TS1 或者 TS2 序列,其中链路与通道编号与发送的数值一致,并且序列中的 speed\_change 比特为 1。
  • 当前速率高于 2.5 GT/s,或者 TS1/TS2 中表示还支持至少一种更高的速率设置。

转移至 Recovery.Speed 状态

如果满足下述两个条件中的一个,那么接下来转为 Recovery.Speed 状态:

  • 如果当前速率设置高于 2.5 GT/s,但是自从进入 Recovery 状态后,从来没能在该速率下正常工作过,(变量 changed\_speed\_recovery 被清除为 0 揭示了这种现象)。此时,待离开 Recovery.Speed 状态后,速率会重新降低为 2.5 GT/s。
  • 如果变量 changed\_speed\_recovery 被设置为 1,表示某个高于 2.5 GT/s 的速率已经能够正常工作,但是在切换到新的协商速率后,链路不能工作,这种情况下速率会被恢复为由 L0 或者 L1 进入 Recovery 状态前的数值。

转移至 Configuration 状态

如果没有发起速率改变请求,(即 directed\_speed\_change 变量为 0,并且 TS1/2 中的 speed\_change 比特也为 0),或者双方协商后发现彼此同时支持的最高速率只是 2.5 GT/s,此时 LTSSM 会转移至 Configuration 状态。

转移至 Detect 状态

如果上述条件都没能满足,那么接下来转移至 Detect 状态。

14.8.4 一次速率变换示例

在 Recovery 状态的章节中,协议提供了一个速率变换过程的示例。示例中两个链路上的伙伴(设备 A 和设备 B)同时从复位状态中释放,并且都支持 5.0 GT/s 和 8.0 GT/s 速率。

首先,链路会以 2.5 GT/s 的速率自动训练为 L0 状态。(这一行为很大概率会在后续的协议版本中保留,因为后续协议将提供和先前设备的后向兼容性。)

在这个示例中,两个设备都支持更高的速率,并通过训练过程中发送的 TS 有序集中的速率标识符字段通知了对方这一情况。两者都明白对方支持更高速率,并且它们其中的一个(比如设备 A)会首先将内部变量 directed\_speed\_change 设置为 1。此时,设备 A 会进入 Recovery.RcvrLock 状态并且发送 speed\_change 比特置为 1 的 TS1 序列。如果目标速率为 8.0 GT/s,且链路之前从未达到过该速率,那么设备间会交换 EQ TS1 来传达 TX 均衡使用的 preset,而不是交换普通的 TS1。

设备 B 在接收到 TS1 序列后,也转移到 Recovery.RcvrLock 状态。当其识别到连续 8 个接收 TS1 中的 speed\_change 比特都为 1 时,设备 B 通过将其发送 TS1 中的 speed\_change 比特也置为 1 作为回应,并进入 Recovery.Speed 状态。设备 A 等待设备 B 做出回应后,当其也接收到 8 个 speed\_change 比特置为 1 的 TS1 后,设备 A 经由 Recovery.RcvrCfg 状态进入 Recovery.Speed 状态。在 Recovery.Speed 状态中,发送端被置于电气空闲状态中,链路速率被设置为双方都支持的最高速率,变量 directed\_speed\_change 的值随即被清除为零。

在等待一段时间后,双方重返 Recovery.RcvrLock 状态,以新速率重新激活发送端(本例中是 8 GT/s)。此后,双方重新交换 TS1,此时 TS1 中的 speed\_change 比特数值已经被清除为 0b。如果链路在新速率下工作正常,那么双方会经由 Recovery.RcvrCfg 状态返回 L0 状态。然而,如果设备 B 出现了一些状况,比如无法实现比特锁定,这会造成该次状态中的逻辑超时,并且返回 Recovery.Speed 状态。此时,设备 A 可能已经正常进入了 Recovery.RcvrCfg 状态,不过当其在链路上检测到对端重新进入电气空闲状态时,这表示对端重新回到了 Recovery.Speed 状态,设备 A 也会返回该状态。重回 Recovery.Speed 状态使双方设备间恢复到进入 Recovery 状态前的速率(本例中是 2.5 GT/s),并返回 Recovery.RcvrLock 状态。

面对这种情况,设备 A 可能重新将内部变量 directed\_speed\_change 设置为 1,并且第二次尝试速率变换流程。如果第二次速率切换仍然失败,设备 A 可能会选择将 8.0 GT/s 移出其通告的支持速率列表,并以新的支持速率列表重新开始速率切换。此时,双方共同支持的最高速率变成了 5.0 GT/s。如果之后还是不能正常工作,那么设备 A 可能会放弃向更高速率的切换。设备如何以及何时选择更新其通告的支持速率列表,以及放弃切换到更高速率的尝试,协议中都没有具体定义,都取决于具体的实现细节。

14.8.5 链路均衡概览

本节是对链路均衡过程一个概括性的介绍,如果读者对均衡过程中的状态机具体行为感兴趣的话,可以阅读本节以了解这方面的知识。

链路的速率越高,相比低速率会受到更多的信号干扰。为了补偿这方面的信号质量损失,并且最大程度上降低系统设计的成本和精力,PCIe 3.0 协议增加了对发送端均衡的需求。与低速率采取的固定去加重系数方法不同,去加重本身是发送均衡的简化版本,发送均衡采取了一种通过主动握手流程,将发送端与当前信号实际传输环境相适配。握手时,接收端每个通道上都会评估输入信号的质量,并根据信号质量,建议链路伙伴为满足信号质量需求,应当采取何种发送均衡参数。

链路均衡过程在首次达到 8.0 GT/s 速率后进行,尽管不是强制要求,但是协议强烈建议由硬件自动开始均衡过程。如果不支持硬件自动均衡机制,那么该设计则必须配备基于软件的均衡机制。如果任意一方端口无法通过均衡过程达到预期的信号质量,LTSSM 会认为该速率下链路无法正常工作,返回 Recovery.Speed 状态,并要求降低速率。

整个均衡过程包括四个阶段,将在下文中详细讨论。一旦速率改变为 8.0 GT/s 后,当前所处的均衡阶段由接收的 TS1 中的 EC(Equalization Control)字段通知,如图 14-28 所示。

图 14-28 8.0 GT/s 速率 TS1/2 中的 EC 字段示意

14.8.5.1 Phase 0

当 DSP 准备好从低速率转换到 8.0 GT/s 时,DSP 进入 Recovery.RcvrCfg 次状态,通过 EQ TS2 向 USP 发送 Tx Presets 以及 Rx Hints,具体帧格式如原文 510 页 ”TS1 和 TS2 有序集“ 一节所述。(需要注意的是,如果链路已经工作在 8.0 GT/s 速率,那么将跳过这个步骤。)DSP 发送的 Tx Preset 值来自于均衡控制寄存器(Equalization Control register)的内容,如原文 579 页图 14-29 所示。有一点值得强调的是,各个通道的均衡值可能不同。DSP 会应用寄存器中的 DSP 端数值给本地发送端使用,并可选的将在本地接收端应用 DSP 数值。在转为更高速率时,DSP 会将寄存器中的 USP 数值发送给 USP 使用。

图 14-29 均衡控制寄存器示意图

表 14-8 Tx Preset 编码方式

表 14-9 Rx Preset Hint 编码方式'

一旦进入速率切换流程,DSP 会进入均衡阶段 1(Phase 1),并且发送 EC = 01b 的 TS1,接下来就等待 USP 回应 EC 数值相同的 TS 了。

同时,USP 从均衡阶段 0 启动,如原文 581 页图 14-30 所示,开始通过发送 TS1 序列回复此前从 EQ TS1/2 中收到的 preset 数值。在支持这些数值的前提下,USP 会将其应用到到发送端,并可选地在接收端应用 Rx Hints。USP 被允许在评估输入信号质量之前等待 500ns,一旦 USP 能够识别出两个连续的 TS1 序列,那么就可以进入下一个阶段。这意味着信号质量满足了最低的 BER=10-4 需求(Bit Error Ratio,也就是每 10000 个比特的错误小于一个比特)。接下来,USP 将其发送的 TS1 中的 EC 数值改为 01b,并进入 Phase 1,将控制权转回给 DSP。

图 14-30 均衡过程:开始阶段

14.8.5.2 Phase 1

DSP 采取和 USP 一样的措施,通过检测背靠背连续的 TS1 来达到 10-4 的误码率。在此期间,DSP 与对端交流其 Tx presets 以及 FS (Full Swing)、LF (Low Frequency) 以及 Post‐cursor coefficient 数值,如原文 584 页图 14-32 所示。协议额外指定了参数 C-1/C0/C+1 必须满足的一些规则,它们包括:

  1. |C‐1| <= 下取整(FS/4)
  2. |C‐1| + C0 + |C+1 | = FS
  3. C0 ‐ |C‐1| ‐ |C+1 | >= LF

FS 代表最大电压,而 LF 则参与最小电压的定义,最小电压定义为 LF/FS。两者通知了接收端其可能接收到的电压数值,并使得双方能以整数形式交流电压的数值,而这些整数却可以表示小数精度的含义。

举一个例子,假设采用的是 Preset P7 中定义的参数。FS 数值是一个相对参考值,可以为大于 63 的任何值,但是这里为了计算简便,假定 FS 数值为 30。在 Preset P7 中,C-1 系数为 -0.1,因此在 TS1 中传递的表达 C-1 的数值即为 3,因为 3/30 = 0.1, 并且需要注意该数值会被视为负数。C+1 系数为 0.2,所以表达该系数的数值为 6,因为 6/30 = 0.2,并且也被视为负数。C0 为 0.7,所以代表该系数的数值为 21,因为 21/30 = 0.7。最后,LF 代表这最小可能的电压比例(最小电压与最大电压的比例),在 Preset 7 中该比例为 0.4,因此 LF 的数值为 12,因为 12/30 = 0.4。

根据上述计算结果,接下来让我们检查一下上述的三个 Preset7 的数值,是否符合协议的要求:

  1. 3 <= 下取整 (12/4), 符合要求。
  2. 3 + 21 + 6 = 30 , 符合要求。
  3. 21 ‐ 3 ‐ 6 >= 12 , 符合要求,所以 P7 的参数三项检查都符合要求。、

一旦 DSP 认为当前链路工作正常(即 DSP 接收到 EC = 01b 的输入 TS1),可以进入下一阶段时,DSP 结束当前阶段并发起进入 Phase2 的请求,通过把 TS1 中的 EC 比特设置为 10b,如原文 583 页图 14-31 所示,并将下一阶段的控制权交给 USP。当 USP 回复 EC 比特 = 10b 的 TS1 后,双方端口都进入 Phase 2。如果一切顺利的话,DSP 可能认为当前的信号质量已经足够好了,不需要更进一步的调整。在这种情况下,DSP 发送 EC=00b 的 TS1 以退出均衡过程。

图 14-31 均衡过程:开始阶段2

14.8.5.3 Phase 2

此时,信号质量足够链路双方从信号中读取出 TS1 序列,但是不足以维持长时间的运行。一旦双方端口都处于 Phase2,USP 被允许要求改变 DSP 的发送设置,并评估它们是否适合当前的环境,USP 不断迭代这个过程,直到链路达到当前环境下的最佳设置。发起改变请求时,USP 改变其发送的 TS1 中的均衡信息字段的数值。如原文 584 页图 14-32 所示,几个相关的字段如下:

  • Tx Preset: Tx Preset 是发送端的粗粒度调节,用于将发送端设置为当前信号环境下正确的大致范围内。USP 设置了 Tx Preset 的值,并将 Use Preset 比特(符号 6 的比特 7)位置 1,通知 DSP 发送端使用 USP 提供的 Tx Preset 值。如果 Use Preset 比特没有置位,那么 DSP 将会理解为:保持当前的 Preset 不变,而应该调整发送参数(coefficient)。发送参数是发送端的细粒度调节方法。
  • Coefficients: PCIe 协议采用的是三抽头的发送均衡器,因此定义了三个参数用于调整信号脉冲的电压,用于补偿传输介质带来的信号干扰和失真,如原文 585 页图 14-33 所示。在本书第十三章《Physical Layer -Electrical》的 ”Solution for 8.0 GT/s ‐ Transmitter Equalization“ 介绍了更多细节,位于原文 474 页。
  • Pre-Cursor 参数: 用于乘以采样点前一时刻信号值的系数,可以按照需求增强或者减弱前一时刻信号的影响。
  • Cursor 参数: 用于乘以采样点时刻信号值的系数,该值始终为正。
  • Post-Cursor 参数: 用于乘以采样点后一时刻信号值的系数,可以按照需求增强或者减弱后一时刻信号的影响。
  • 一旦信号达到了信号质量标准的需求,USP 会通过将 EC 比特设置为 11b,表示其已经准备好进入下一均衡阶段。

图 14-32:均衡参数交换示意图

图 14-33 三抽头发送均衡器示意图

图 14-34 均衡过程:Phase 2 阶段的调整

14.8.5.4 Phase 3

DSP 发送 EC = 11b 的 TS1 作为对 USP 进入 Phase 3 的回应,此时可以对 UPS 发送端进行同样的信号评估过程。同样地,DSP 发送 TS1 要求 USP 应用一组新的发送端设置:如果 Use Preset 比特置起,则 DSP 定义了一组新的 presets,否则就是 DSP 提供新的参数。新的发送端设置将连续发送 1us,或者此次发送端设置改变申请的结果已经评估完毕后停止。评估必须等待 500ns 加上信号在发送逻辑和接收逻辑之间的来回时间。DSP 可以尝试不同的均衡设置,直到发现其中某个设置取得了预期中的信号质量。此时,DSP 通过发送 EC = 00b,表示退出均衡状态。

图 14-35 均衡过程:Phase 3 阶段的调整

14.8.5.5 均衡过程中的注意事项

此节整理了协议中和均衡过程相关的其他事项,如下:

  • 所有通道都需要参与到均衡过程中,即使是那些只在 upconfig 事件后才会变成激活状态的通道。
  • 组件评估输入信号的算法,以及建议链路伙伴应该使用何种均衡值的算法不在协议描述范围内,由具体实现决定。
  • 均衡设置改变可以任用于任意数量的通道,并且不同通道可以使用不同的均衡设置。
  • 在细粒度调节步骤结束时(UPS 的 Phase 2,DSP 的 Phase 3),各组件需要确保发送设置调节能使其满足协议要求。(原文: each component is responsible for ensuring that the Transmitter settings cause it to meet the spec requirements.)
  • 组件必须评估并响应对端的发送设置改变请求,对于合理请求,组件必须采纳对方提供的发送设置,并在发送的 TS1 中反应自身所使用的发送设置。
  • 一次参数改变的请求可能因为新的参数不满足规则而被拒绝。被拒绝的参数仍然会反应在发送的 TS1 中,只是参数值拒绝(Reject Coefficient Values)比特会被置起。
  • 组件有必要储存 8 GT/s 速率均衡阶段取得的均衡数值。协议并没有明确要求这一点,但是本文作者认为,如果存储下这些均衡结果,那么即使切换到低速率后,再切换回 8 GT/s 速率时,可以直接使用存储的结果。这一点是有意义的,不然的话,此时会花费大量的时间重新进行均衡,却有可能获得相同的均衡结果,因为此时相比于彼时的电气环境并没有变化。
  • 组件可以随时调整它们接收端的细粒度设置,只要这不会导致链路进入不稳定状态或者进入 Recovery 状态。

14.8.6 均衡次状态详览

本节将详细讨论链路均衡时涉及的状态。

14.8.6.1 Recovery.Equalization

Recovery.Equalization 是用于在 8 GT/s 及以上速率进行链路均衡过程的次状态。更低的速率无需使用均衡功能, LTSSM 状态机也不会进入该次状态。因为均衡是 PCIe 一个新的,并且复杂的话题,所以在上一节 ”14.8.5 链路均衡概览“ 中,从更抽象的层次描述了整个均衡过程。接下来,让我们通过遍历每个次状态来看整个均衡的详细过程。

面向下游通道// Downstream Lanes

DSP 从 Phase 1 开始整个均衡过程。在开始时,一些寄存器状态比特标志位需要被清除,包括链路状态寄存器 2 (Link Status 2 register,原文 588 页 图 14-36)中的以下比特,都会在进入该状态后被清除:

  • Equalization Phase 1 Successful
  • Equalization Phase 2 Successful
  • Equalization Phase 3 Successful
  • Link Equalization Request
  • Equalization Complete

链路控制 3 寄存器(Link Control 3 register)的 Perform Equalization 比特和内部变量 start\_equalization\_w\_preset 也会被清除为 0b。变量 equalization\_done\_8GT\_data\_rate 置位为 1b。

图 14-36 链路状态 2 寄存器示意图

图 14-37 链路控制 3 寄存器示意图

Phase 1 Downstream

DSP 发送 EC = 01b 的 TS1 序列,其中均衡相关字段填充通道均衡控制寄存器( Lane Equalization Control register)中的 Tx Preset,以及 Preset 对应的 FS、LF 以及 Post-cursor 参数。如果 DSP 需要时间等待接收信号稳定,那么在评估输入信号之前,允许等待 500ns。

转换至 ”Phase 2 Downstream“ 状态

当 DSP 接收到两个连续的 EC = 01b 的 TS1 序列,并且 DSP 想要继续均衡过程,那么 DSP 进入 Phase 2。此时,端口会将均衡 Phase 1 成功完成( Equalization Phase 1 Successful) 比特置为 1,并存储接收到的 LF 以及 FS 数值用于 Phase 3 使用(如果 DSP 打算调整 USP 的发送参数的话)。

转换至具体的 Recovery 次状态

如果 DSP 不打算进行 Phase 2 以及 Phase 3 的话,那么 DSP 会将所有状态比特设置为 1b(比如 Equalization Phase 1 Successful,Equalization Phase 2 Successful,Equalization Phase 3 Successful 以及 Eq.Complete)DSP 这么做可能的原因是当前的输入信号质量已经足够好了,所以不再需要后续的阶段。

转换至 “Recovery.Speed” 状态

如果直到 24ms 超时,都没有接收到 TS1,那么接下来转入 Recovery.Speed 状态,successful\_speed\_negotiation 标志清除为 0b,并将均衡完成状态比特设置为 1b。

Phase 2 Downstream

DSP 发送 EC = 10b 的 TS1 序列,各通道根据以下情况独立设置参数:

  • 如果首次接收到两个连续的 EC = 10b 的 TS1(代表 USP 已经进入 Phase 2),或者此次参数或 Preset 相比上次有所变化,如果对方所要求的参数是合法、受支持的,那么 DSP 会在接收到 TS1 的 500ns 内应用这些发送参数,并在 DSP 发送给 USP 的 TS1 中反映这些变化,TS1 中的参数拒绝(Reject Coefficient)数值比特被清除为 0b。值得注意的是,参数的改变不能导致超过 1ns 的非法电压或者发送端参数。
  • 如果接收到的参数请求非法,或者不被支持,那么 DSP 不会改变发送设置,但是仍然将会在发送返回的 TS1 中反映这些数值,但是参数拒绝比特的数值会设置为 1b。(详情参见原文 590 页的图 14-38)
  • 如果没有接收到过两个连续的 TS1,那么保持当前的 Tx preset 以及参数数值不变。

转换至 ”Phase 3 Downstream“ 状态

当 USP 对更新后的 DSP 发送信号质量满意后,USP 开始发送 EC = 11b 的 TS1 序列,表示希望切换到 Phase 3。当 DSP 接收到连续两个这样的 TS1 之后,将 Eq. Phase 2 Successful 状态比特设置为 1b,并转换到 Phase 3。

转换至 “Recovery.Speed” 状态

如果直到 32ms 超时,仍然没能转换到 Phase 3,那么接下来转入 Recovery.Speed 状态,successful\_speed\_negotiation 标志清除为 0b,并将均衡完成(Equalization Complete)状态比特设置为 1b。

图 14-38 参数拒绝数值域示意图

Phase 3 Downstream

DSP 发送 EC = 11b 的 TS1序列,为每个通道开始单独的面向上游(Upstream)发送设置评估的过程。

在发送的 TS1 序列中,DSP 可以通过将 Use Preset 比特设置为 1b,以及在 Tx Preset 域填入预期的数值,要求一次 Preset 设置变更。也可以通过将 Use Preset 比特设置为 0b,以及在 Pre‐cursor, Cursor, 以及 Post‐Cursor Coefficient 域填入预期数值,要求一次参数变更。任意一种变更,DSP 都必须持续进行至少 1us,直至信号评估完成。如果要采用新的 Preset 或者参数,那么必须同时在所有通道上发送它们。然而,如果某个通道想要保持其 Preset 或者参数不变,那么该通道无需发起变更要求。

DSP 需要等待足够长的时间以确保 USP 发送端有机会应用所要求的设置更新,(500ns 加上信号的往返延迟),然后重新完成块对齐并评估接收到的 TS1 序列。因为在等待期间,DSP 预期 USP 不会发送任何有效的信号,甚至可能会发送一些非法信号,所以可能需要在等待足够长的时间之后,再进行块对齐操作。

如果接收到两个连续的 TS1 序列,并且其中的 Preset 或者参数数值和所要求的相同,并且拒绝参数数值比特不为 1b,这代表对端接收了请求的设置,并且已经应用到发送信号中,DSP 此时可以进行评估操作。如果参数相同,但是拒绝参数数值比特为 1b,那么代表 USP 拒绝请求了设置,并且不会应用它们。这种情况下,协议建议 DSP 用不同的数值重新再试一次。但这并不是必须的,DSP 也可以选择直接退出当前阶段。

从发送请求开始算起,直到信号评估完成,整个 Preset 或者参数请求过程的总用时不能超过 2ms。协议允许一种例外情况,那就是某些设计在最后阶段的优化中需要更多时间,但是在该 Phase 中的总用时不能超过 24ms,并且这种例外情况只能出现至多两次。如果接收方不能分辨出任何有效的 TS1,那么其可能假定其所要求的设置在该通道上并不能正常工作。

转换至具体的 Recovery 次状态

当所有已配置的通道都完成了设置优化,那么下一个状态是 Recovery.RcvrLock,此时将均衡 Phase 3 成功完成(Equalization Phase 3 Successful)以及均衡完成(Equalization Complete)状态比特设置为 1b。

转换至 “Recovery.Speed” 状态

如果直到 24ms 超时(可以容忍 -0 或者 2ms 的偏差),仍然没能完成均衡过程,那么接下来转入 Recovery.Speed 状态,successful\_speed\_negotiation 标志清除为 0b,并将均衡完成(Equalization Complete)状态比特设置为 1b。

面向上游通道// Upstream Lanes

USP 从 Phase 0 开始整个均衡过程。在开始时,一些寄存器状态比特标志位需要被清除,包括链路状态寄存器 2 (Link Status 2 register,原文 588 页 图 14-36)中的以下比特,都会在进入该状态后被清除:

  • Equalization Phase 1 Successful
  • Equalization Phase 2 Successful
  • Equalization Phase 3 Successful
  • Link Equalization Request
  • Equalization Complete

链路控制 3 寄存器(Link Control 3 register)的 Perform Equalization 比特和内部变量 start\_equalization\_w\_preset 也会被清除为 0b。变量 equalization\_done\_8GT\_data\_rate 置位为 1b。

Phase 0 Upstream

USP 发送 EC = 00b 的 TS1 序列,此时使用的是进入该状态前 DSP 通过 EQ TS2 传递的发送 Preset。发送的 TS1 中的均衡信息域中填充了实际使用的 Preset 值,以及 Preset 对应的 Pre-cursor,Cursor,以及 Post-cursor 参数值。值得注意的是,当通道在 EQ TS2 中接收到颠倒的,或者不支持的 Preset 数值时,或者干脆没有接收到 EQ TS2 时,此时 USP 使用的 Tx Preset 和相应参数由通道的具体实现决定。

转换至 ”Phase 1 Upstream“ 状态

当所有的已配置通道接收到两个连续的,EC = 01b 的 TS1 序列后,代表 USP 能够正确识别出 DSP 发送的 TS1 序列,之后 USP 进入 Phase 1 阶段。DSP 总是从 Phase 1 阶段开始,因此 EC 也总是 = 01b。

如果 USP 想后续调整 DSP 的发送参数,那么此时 USP 需要记录 TS1 中接收到的 LF 以及 FS 数值,以在 Phase 2 阶段使用。

USP 在进入 Phase 0 后(译注:此处似乎应为 Phase 1),在评估输入的 TS1 数据之前可能需要等待 500ns,用于接收端稳定地接收信号。

转换至 “Recovery.Speed” 状态

如果直到 12ms 超时,仍然没能识别接收到的 TS1 序列,那么接下来转入 Recovery.Speed 状态,successful\_speed\_negotiation 标志清除为 0b,并将均衡完成(Equalization Complete)状态比特设置为 1b。

Phase 1 Upstream

USP 发送 EC = 01b 的 TS1 序列,使用 Phase 0 中决定的发送设置,并在发送的 TS1 序列中反映正在使用的 FS、LF 以及 Post-cursor 等参数。

转换至 ”Phase 2 Upstream“ 状态

如果所有已配置通道上都接收到了两个连续的,EC = 10b 的 TS1,这代表 DSP 希望进入 Phase 2,那么 USP 在此之后进入 Phase 2 阶段,并将均衡阶段 1 成功(Equalization Phase 1 Successful)状态比特置为 1b。

转换至具体的 Recovery 次状态

如果所有已配置通道上都接收到了两个连续的,EC = 00b 的 TS1,这代表 DSP 认为均衡过程已经完成,希望跳过之后的均衡阶段。这种情况下,USP 的下一个跳转状态是 Recovery.RcvrLock,并将均衡阶段 1 成功(Equalization Phase 1 Successful)状态比特和均衡完成(Equalization Complete)状态比特置为 1b。

转换至 “Recovery.Speed” 状态

如果直到 12ms 超时,上述两个条件仍然没有满足,那么接下来转入 Recovery.Speed 状态,successful\_speed\_negotiation 标志清除为 0b,并将均衡完成(Equalization Complete)状态比特设置为 1b。

Phase 2 Upstream

在该阶段,UPS 发送 EC = 10b 的 TS1,开始调优 DSP 发送设置的过程。正如前文所述 DSP 的相关过程,此时的调整是每个通道分别进行的。具体过程如下:

在发送的 TS1 序列中,USP 可以将 Tx Preset 域设置为预期的数值,要求一次 Preset 设置变更,通过将 Use Preset 比特设置为 1b 通知 DSP 开始使用新的 Preset。或者,通过将 Use Preset 比特设置为 0b,以及在 Pre‐cursor, Cursor, 以及 Post‐Cursor Coefficient 域设置预期数值,要求一次参数变更。DSP 会采用新的参数,而不是读取 Preset 域的数值。一旦开始要求变更,USP 都必须持续进行至少 1us,直至信号评估完成。如果要采用新的 Preset 或者参数,那么必须同时在所有通道上发送它们。然而,如果某个通道想要保持其 Preset 或者参数不变,那么该通道上无需发起变更请求。

USP 需要等待足够长的时间以确保 DSP 发送端有机会应用所要求的设置更新,(500ns 加上信号的往返延迟),然后重新完成块对齐并评估接收到的 TS1 序列。在等待期间,USP 预期 DSP 不会发送任何有效的信号,甚至可能会发送一些非法信号,这就是为什么需要在等待足够长的时间之后,再进行块对齐操作的原因。

如果接收到两个连续的 TS1 序列,其中的 Preset 或者参数数值和所要求的相同,并且拒绝参数数值比特不为 1b,这代表对端接收了请求的设置,并且已经应用到发送信号中,USP 此时可以评估对方发送的信号。如果参数相同,但是拒绝参数数值比特为 1b,那么代表 DSP 拒绝请求了设置,并且不会应用它们。这种情况下,协议建议 USP 用不同的数值重新再试一次。但这并不是必须的。

整个 Preset 或者参数请求过程的总用时不能超过 2ms,从发送请求开始算起,直到信号评估完成。协议允许一种例外情况,那就是某些设计在最后阶段的优化中需要更多时间,但是在该 Phase 中的总用时不能超过 24ms,并且这种例外情况只能出现至多两次。如果接收方不能分辨出任何有效的 TS1,那么其可能假定其所要求的设置在该通道上并不能正常工作。

转换至 ”Phase 3 Upstream“ 状态

如果所有已配置通道上都已经将对端发送设置调整为最优,那么 USP 在此之后进入 Phase 3 阶段,并将均衡阶段 2 成功(Equalization Phase 2 Successful)状态比特置为 1b。

转换至 “Recovery.Speed” 状态

如果直到 24ms 超时(可以容忍 -0 或者 2ms 的偏差),仍然没能完成均衡过程,那么接下来转入 Recovery.Speed 状态,successful\_speed\_negotiation 标志清除为 0b,并将均衡完成(Equalization Complete)状态比特设置为 1b。

Phase 3 Upstream

USP 发送 EC = 11b 的 TS1序列,开始响应 DSP 所要求的发送设置更改请求。

如果没有接收到两个连续的 TS1,那么保持当前的 Tx preset 以及参数数值不变。但如果首次接收到两个连续的 EC = 11b 的 TS1(代表 DSP 已经进入 Phase 3),或者此次参数或 Preset 相比上次有所变化,如果所要求的参数是合法、被支持的,那么 USP 会在接收到 TS1 的 500ns 内应用这些发送参数,并在发送给 DSP 的 TS1 中反映这一参数的变化,TS1 中的参数拒绝(Reject Coefficient)数值比特被清除为 0b。值得注意的是,参数的改变不能导致超过 1ns 的非法电压或者发送端参数。

  • 如果接收到的参数请求非法,或者不被支持,那么 USP 不会改变发送设置,但是仍然将会在发送返回的 TS1 中反应这一数值,但是参数拒绝比特的数值会设置为 1b。(详情参见原文 590 页的图 14-38)

转换至具体的 Recovery 次状态

如果 DSP 对更新后的信号质量满意,那么 DSP 开始发送 EC = 00b 的 TS1 序列,表示希望结束均衡过程。当 USP 接收到连续两个这样的 TS1 之后,USP 转入 Recovery 具体次状态,将均衡 Phase 3 成功( Eq. Phase 3 Successful )状态比特设置为 1b,并将均衡完成(Equalization Complete)状态比特设置为 1b。

转换至 “Recovery.Speed” 状态

如果直到 32ms 超时,仍然没能满足上述条件,那么接下来转入 Recovery.Speed 状态,successful\_speed\_negotiation 标志清除为 0b,并将均衡完成(Equalization Complete)状态比特设置为 1b。

14.8.6.2 Recovery.Speed

当进入该次状态时,设备发送端必须进入电气空闲状态,然后等待其接收端也进入电气空闲状态。之后,如果速率转换是成功的(successful\_speed\_negotiation = 1b),那么在此至少等待 800ns,如果速率转换不成功(successful\_speed\_negotiation = 0b),那么至少在此等待 6us,但是等待的时间都不要超过额外的 1ms。

如果链路速率是 2.5GT/s 或者 8GT/s,那么在进入该次状态前必须发送一个 EIOS,如果速率是 5GT/s,那么必须发送两个。所谓进入电气空闲状态是指在链路上看到一些 EIOS,或者检测到,或者推断出当前正处于电气空闲状态(详见原文 736 页 ”Elecitrical Idle“ 节)。

只有当接收端也进入电气空闲状态后,才能进行链路运行速率改变。如果链路已经工作于双方所能支持的最高速率,那么进入该次状态也不会改变运行速率。

如果双方协商的新速率是 5GT/s,那么去加重水平必须基于当前内部变量 select\_deemphasis 的数值来决定。如果变量数值为 0b,那么采用 -6dB 的去加重水平,如果变量为 1b,那么转而采用 -3.5dB 的去加重水平。

令人好奇的一点是,协议中并没有要求链路双方在该次状态必须保持共模电压在协议规定的电压范围内。

如果链路是在一次成功的速率协商(successful\_speed\_negotiation = 1b)后进入的本次状态,那么可以按照原文 596 页的表 14-10 中的相关表格中的条件来推断电气空闲状态。协议指出该条件是为了覆盖链路双方都能够识别出对方发送的 TS1 和 TS2 的情况,这种情况下,链路上不存在 TS 序列时,就可以被认为当前已经进入了电气空闲状态。

如果链路是在一次不成功的速率协商(successful\_speed\_negotiation = 0b)之后进入该次状态,那么通过没有在任何已配置通道上看到退出电气空闲状态序列,来推断出当前链路处于电气空闲状态。这项规则是为了覆盖链路双方中至少一方无法识别对方的 TS 序列的情况,此时如果一段时间间隔后,仍然没有看到电气空闲状态退出序列时,链路可以被认为进入了电气空闲状态。

表 14-10 推断电气空闲状态的条件

状态

2.5 GT/s

5 GT/s

8 GT/s

L0

128us 窗口内没有见到流控更新 DLLP 或者 SoS

128us 窗口内没有见到流控更新 DLLP 或者 SoS

128us 窗口内没有见到流控更新 DLLP 或者 SoS

Recovery.RcvrCfg

1280 UI 内没有见到 TS1/2

1280 UI 内没有见到 TS1/2

4ms 内没有见到 TS1/2

Recovery.Speed (successful\_speed\_negotiation = 1b)

1280 UI 内没有见到 TS1/2

1280 UI 内没有见到 TS1/2

4680UI 内没有见到 TS1/2

Recovery.Speed (successful\_speed\_negotiation = 0b)

2000UI 内没有见到电气空闲退出序列

16000UI 内没有见到电气空闲退出序列

16000UI 内没有见到电气空闲退出序列

Loopback.Active (slave)

128us 内没有见到电气空闲退出序列

N/A

N/A

此时,内部变量 directed\_speed\_change 会被清除为 0b,并且新的速率需要反映在链路状态寄存器( Link Status register)的当前链路速率(Current Link Speed)域中,如图 14-39 所示。

如果速率改变是由链路带宽改变引起的,那么:

  • 如果速率协商成功(successful\_speed\_negotiation = 1b),并且在连续的 8 个 TS2 中 Autonomous Change 比特都为 1b,或者速率改变是由 DSP 硬件自发的(而不是因为链路可靠性问题,或者软件设置链路重训练比特(Link Retrain bit)引起的),那么链路状态寄存器(Link Status register)中的链路自发带宽状态(Link Autonomous Bandwidth Status)比特设置为 1b。
  • 否则,链路带宽管理状态比特( Link Bandwidth Management Status bit)置为 1b。

图 14-39 链路状态寄存器

转换至具体的 Recovery 次状态

在超时触发后,下一个次状态是 Recovery.RcvrLock。

如果当前的次状态是从 Recovery.RcvrLock 状态进入的,并且速率转换成功,那么所有已配置通道改变为新的速率:也就是双方共同支持的最高速率,并把 changed\_speed\_recovery 变量置为 1b。

如果当前已经是自 L0 或者 L1 状态进入 Recovery 以来,第二次进入 Recovery.Speed 次状态了(通过内部变量 changed\_speed\_recovery = 1b 得知),新的速率会恢复成 LTSSM 进入 Recovery 状态之前使用的速率,此时 changed\_speed\_recovery 变量会被清除为 0b。

否则,新的速率会恢复为 2.5GT/s,并且 changed\_speed\_recovery 变量同样会保持为 0b。协议指出该情况对应于此前在 L0 状态中链路速率大于 2.5GT/s,但是链路一方不能在该速率正常运行,并在第一次的 Recovery.RcvrLock 状态中超时退出。

转换至 Detect状态

如果上述转换到 Recovery.RcvrLock 状态的条件都没有被满足,那么状态会转移为 Detect。协议指出在正常的流程中不会出现这种跳转情况,出现这种情况代表此时链路双方已经根本无法正常通信了。

14.8.6.3 Recovery.RcvrCfg

该状态只会从 Recovery.RcvrLock 状态跳转进来,当接收到至少 8 个带有与此前协商值一致的链路和通道编号的 TS1 或者 TS2 之后跳转。跳转进入本状态意味着在 Recovery.RcvrLock 状态中重新建立了比特和符号或者块锁定,此时端口需要决定在 Recovery 状态是否还有操作需要进行。如果进入 Recovery 状态的目的仅仅是在离开链路电源管理状态之后重新建立比特和符号锁定,那么在该状态只会在链路上交换 TS2 序列,然后跳转至下一个状态:Recovery.Idle。但是,如果进入 Recovery 状态还另有理由(比如出于改变链路速率或者宽度的需求),那么在该状态中会进行相应动作,随后跳转至适合的后续状态。

在本次状态中,发送方在所有已配置通道上发送 TS2,其中带有与先前协商结果一致的链路和通道编号。如果内部变量 directed\_speed\_change 设置为 1b,那么 TS2 中 speed\_change 比特也被置为 1b。TS2 中的 N\_FTS 变量也需要更新为与当前速率匹配的数值。在进入本次状态后,内部变量 start\_equalization\_w\_preset 清除为 0b。

在速率发生改变后,在 TS2 中应该也能看到不同的 N\_FTS 的数值,将来退出 L0s 低功耗状态时必须用到该数值。当采用 8b/10b 编码时,离开本次状态前,必须完成通道间的去偏斜操作。设备必须在其接收的 TS2 中,提取并保存对端所支持的速率标识符,并覆盖先前的采样值。当采用 128b/130b 编码时,设备必须记录 TS2 中的 Request Equalization 比特,用于后续使用。

值得注意的是在该次状态中,内部变量 successful\_speed\_negotiation 会被设置为 1b。如果 TS2 中的 speed\_change 比特为 1b,那么其携带的速率标识符会被记录下来,以备后续使用。如同在 Recovery.Speed 状态中,会从链路状态寄存器(Link Status register)中记录 Autonomous Change 比特的值一样。Recovery.Speed 状态中会将新速率设定为双方共同支持的最高速率。有趣的是,就算当前链路速率已经是最高的 8GT/s ,这种情况下仍然会进入 Recovery.Speed 状态,尽管此时速率不会发生任何变化。

如果速率即将被转换为 8GT/s,那么在本次状态中 DSP 需要发送 EQ TS2 (符号 6 的比特 7 置为 1b,表示这是一个 EQ 训练序列)序列。这种情况会在以下条件满足时发生:双方共同支持 8.0 GT/s ,并且双方在所有已配置通道上都接收到 8 个连续的,speed\_change 比特为 1 的 TS 1 或者 TS2 序列;或者内部变量 equalization\_done\_8GT\_data\_rate 设置为 0b 时;或者上层逻辑要求这么做时。UPS 可以使能 Request Equalization 比特,如果当前速率为 8GT/s,但是存在与均衡过程相关的问题时。链路双方任意端口都可以通过置位 Request Equalization 比特以及 Quiesce Guarantee 比特为 1b 要求再次进行均衡。

USP 基于接收到的 TS2 中的 Selectable Deemphasis 比特,更新它们的 select\_deemphasis 变量。如果接收到的 TS2 是 EQ TS2,那么 USP 会将内部变量 start\_equalization\_w\_preset 设置为 1b,并更新各通道的均衡寄存器数值(比如更新寄存器中的 USP 发送 Preset 和接收 Preset Hint 信息)。任何没有接收到 EQ TS2 的通道会基于具体实现选择它们用于 8GT/s 速率的 Preset 数值。当 DSP 的内部变量 equalization\_done\_8GT\_data\_rate 清除为 0b 或者上层逻辑要求这么做时,DSP 将变量 start\_equalization\_w\_preset 置为 1b。

最后,如果使用的是 128b/130b 编码,设备需要注意到接收的 Request Equalization 比特,如果该比特为 1b,那么连同该比特和 Quiesce Guarantee 比特都必须被记录下来,以供未来使用。

转换至 Recovery.Idle 状态

如果下述两个条件都得到满足,那么转移至 Recovery.Idle 状态:

  • 在所有已配置通道上接收到 8 个连续的 TS2 序列,其链路和通道编号、速率标识符都与发送的数值保持一致,并且
  • TS2 中的 speed\_change 比特已经被清除为 0b,或者
  • 双方没有高于 2.5GT/s 的共同支持速率
  • 在接收到 TS2 序列后,已经发送了 16 个 TS2 序列,并且没有被任何 EIEOS 打断。进入下个状态时,变量 changed\_speed\_recovery 和 directed\_speed\_change 已经被清除为 0b。

转换至 Recovery.Speed 状态

LTSSM 会转移至 Recovery.Speed 状态,如果下述三个条件都得到满足:

  • 在所有已配置通道上接收到 8 个连续的 TS2 序列,其速率标识符以及符号 6 的数值都和发送数值保持一致,并且 speed\_change 比特为 1b,并且:
  • 该 TS2 为标准的 8b/10b TS2,或者
  • 该 TS2 为 EQ TS2,或者
  • 在任何已配置通道上接收到 8 个连续的 EQ TS2 后,已经过去了 1ms
  • 链路双方支持的共同最高速率高于 2.5GT/s,或者链路的速率已经高于 2.5GT/s。
  • 当采用 8b/10b 编码时,在接收到 speed\_change 比特为 1 的 TS2 序列后,已经在该通道上发送了至少 32 个 speed\_change 比特为 1 的 TS2 序列,并且没有被任何 EIEOS 打断。当采用 128b/130b 编码时,在接收到 speed\_change 比特为 1 的 TS2 序列后,已经在该通道上发送了至少 128 个 speed\_change 比特为 1 的 TS2 序列,并且没有被任何 EIEOS 打断。

LTSSM 跳转到 Recovery.Speed 状态也可能是这么一种情况:链路双方自从 L0 或者 L1 状态进入 Recovery 状态后,链路双方已经将链路速率协商为更高的速率(changed\_speed\_recovery = 1b)。但是在某个通道上接收到 EIOS 或者检测到电气空闲状态,并且在进入本状态后未接收到任何 TS2 序列。这代表链路双方尝试切换到更高的链路速率,但是链路对端伙伴表示因为某种原因,其在新的速率下无法正常工作。这种情况下,新的速率会返回到链路进入到 Recovery 状态之前的速率。

还有一种跳转到 Recovery.Speed 状态的情况是:链路双方自从 L0 或者 L1 状态进入 Recovery 状态后,链路双方_没能_将链路速率协商为更高的速率(changed\_speed\_recovery = 0b),不过此时链路的速率高于 2.5GT/s,但是在某个通道上接收到 EIOS 或者检测到电气空闲状态,并且在进入本状态后未接收到任何 TS2 序列。这种情况表示链路在当前速率下无法工作,解决的办法是把新的速率降低回到最低的 2.5GT/s。

转换至 Configuration状态

如果在任意已配置通道上,接收到 8 个连续的 TS1 序列,其链路编号或者通道编号和发送的数值不一致,并且 speed\_change 比特为 0b,或者不共同支持高于 2.5GT/s 的速率。

进入 Configuration 状态前,内部变量 changed\_speed\_recovery 和 directed\_speed\_change 会清除为 0b。如果 N\_FTS 变量有更新,那么更新后的数值必须用于后续的 L0s 状态。

转换至 Detect状态

如果 48ms 超时后,上述各种状态转换的条件都没有被满足,那么在 2.5GT/s 或者 5GT/s 速率时,状态会转移为 Detect。

如果速率为 8GT/s,那么还存在一种可能的状态转移行为,那就是虽然本次速率改变失败了,但是速率改变的可尝试次数还没有用完,这一点由变量 idle\_to\_rlock\_transitioned 的数值所反应。如果速率为 8GT/s 时,变量 idle\_to\_rlock\_transitioned 数值小于 FFh,那么新的状态会是 Recovery.Idle。在状态跳转后,变量 changed\_speed\_recovery 和 directed\_speed\_change 还是会被清除为 0b。然而,一旦变量 idle\_to\_rlock\_transitioned 数值达到 FFh,那么当 48ms 超时触发后,下一个状态将会是 Detect。

14.8.6.4 Recovery.Idle

正如名字体现地那样,发送端会在该次状态内发送 Idle 序列,作为进入正常工作 L0 状态之前的准备。当采用 8b/10b 编码时,会正常地在所有通道上发送 Idle 数据。当采用 128b/130b 编码时,会首先发送一个 SDS 序列来开始一段数据流,接下来才会在所有通道上发送 Idle 符号。

转换至 L0 状态

如果下述条件之一满足,那么下一个状态是 L0。在这两种情况下,如果自上次从 Recovery 状态或者 Configuration 状态进入 L0 状态后,曾经设置过链路重训练比特(Retrain Link bit),那么 DSP 会将链路带宽管理状态比特写为 1b(如原文 597 页图 14-39 所示)。

  • 当采用 8b/10b 编码时,当接收到连续 8 个周期空闲数据后,并且在接收到第一个空闲数据符号后,已经发送了 16 个空闲数据符号。
  • 当采用 128b/130b 编码时,当接收到连续 8 个周期空闲数据后,并且在接收到第一个空闲数据符号后,已经发送了 16 个空闲数据符号,并且注意到不能从 Recovery.RcvrCfg 状态直接进入 L0 状态。另外值得注意的是:空闲数据必须包括在数据块中,通道间去偏斜必须在数据流开始传输前完成,最后,在进入 L0 状态时,变量 idle\_to\_rlock\_transitioned 清除为 00h。

转换至 Configuration状态

如果以下条件之一满足,那么进入 Configuration 状态:

  • 端口受到上层逻辑的指令,可选地重新配置链路,比如改变链路宽度。
  • 任意已配置通道上,接收到两个连续的 TS1,其中通道编号为 PAD(如果对端进入 Configuration 状态以改变链路时,会在所有通道上发送通道编号为 PAD 的 TS1)。协议建议 LTSSM 此时直接转换进入 Configuration 状态改变链路宽度,以节约改变所需要的时间。

转换至 Disable 状态

如果以下条件之一满足,那么进入 Disable 状态:

  • 链路对端的 DSP 或者,可选支持的 crosslink 端口受到上层逻辑的指令,在所发送的 TS1/2 中使能链路关闭(Disable Link)比特。
  • USP 或者,可选支持的 crosslink 端口在任意已配置通道上接收到的连续两个 TS1 中的链路关闭(Disable Link)比特都为 1b。

转换至 Hot Reset状态

如果以下条件之一满足,那么进入 Hot Reset 状态:

  • 链路对端的 DSP 或者,可选支持的 crosslink 端口受到上层逻辑的指令,在所发送的 TS1/2 中使能 Hot Reset比特。
  • USP 或者,可选支持的 crosslink 端口在任意已配置通道上接收到的连续两个 TS1 中的 Hot Reset 比特都为 1b。

转换至 Loopback 状态

如果以下条件之一满足,那么进入Loopback 状态:

  • 发送端确定自己有成为 Loopback 主机的能力(细节由具体实现决定,协议没有提供具体的方式去验证这一点)并受到上层逻辑的指令,在所发送的 TS1/2 中使能 Loopback 比特。
  • USP 或者,可选支持的 crosslink 端口在任意已配置通道上接收到的连续两个 TS1 中的 Loopback 比特都为 1b。 接收方成为 Loopback 从机。

转换至 Detect 状态

如果上述条件都没有得到满足,那么在 2ms 超时触发后,转入 Detect 状态。除非 idle\_to\_rlock\_transitioned 变量数值小于 FFh,此时转入 Recovery 相关状态。当转入 Recovery.RcvrLock 状态时,如果数据速率为 8.0 GT/s 时,idle\_to\_rlock\_transitioned 变量值递增 1b,如果数据速率为 5.0 GT/s 或者 2.5 GT/s,那么该变量数值设置为 FFh。


原文: Mindshare
译者: LJGibbs
文章来源:https://zhuanlan.zhihu.com/p/595903309

《PCI Express Technology 3.0》翻译系列

更多IC设计技术干货请关注FPGA的逻辑技术专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
10614
内容数
577
FPGA Logic 二三事
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息