[FPGA 实现及PCIe IP 核知识点] Equalization的4个phase,你真的了解吗

(本文介绍了PCIe 8.0GT/s 和更高Data rate时的Link Equalization的过程)

如果你已经了解了以下问题,你可以skip下面的内容。
我们为什么需要做Link Equalization?
Link Equalization主要的工作内容是什么?
在什么情况下我们需要启动Link Equalization的过程?
Link Equalization是纯硬件触发还是软件也可以控制?
PCIe设备需要调节哪些设置,从而能够提升链路的信号质量?
Link Equalization是如何调节设置的?
信号质量调节的目标是什么?
不同的速率是不是有不同的设置?
哪些lane将会被调节?

带着这些问题我们继续。
Link Equalization主要的工作内容是通过调节PCIe设备的发送端和接收端每条lane的设置,从而最终提升信号质量的过程。LTSSM管辖范围内的所有lane都将参与调节过程,既包括目前正在工作中的Lane,也包括那些有可能在未来将被使用到的Lane。
当PCIe链路的速率第一次进入8.0GT/s或者更高的速率,都要求经过Link Equalization来调节链路质量,除非双方设备通过广播均同意不做Link Equalization。例如链路双方设备均支持32.0GT/s的速率,通过协商,在进入32.0GT/s的运行速率后,允许双方采用之前保存的Link Equalization的结果,或者是根本不需要进行Link Equalization。一种比较容易想到的场景就是两颗die在同一个Package内部通过PCIe链路进行连接。此时,链路长度短,损耗低,即使不调节发送端或者接收端的设置,链路质量也不会有太大的问题。
作为发送端的设置,要求在进入到正常工作模式的时候能够根据当前的Link速率,以及其他可能影响的条件,包括可能已知的Link长度,拓扑等信息,选择出相对合适的设置。
对于接收端,只要不影响整个链路的稳定性或者被迫进入Recovery Mode,协议允许接收端在Link Equalization结束后,也可以适当调节接收端方向的设置。
Equalization的过程通常是硬件自动触发的,此时软件扮演的角色仅仅是确定一下触发策略。除此之外,协议也允许整个过程通过软件进行触发。此时,硬件会通过寄存器预留好软件接口,软件通过控制相应的寄存器进行触发。但是无论是哪种方式,当策略要求必须进行Link Equalization的时候,在进入目标速率后过程必须被触发。

通常来说,在完成更高速率的Equalization流程前,需要完成所有低速率的流程。因为2.5GT/s和5.0GT/s是不需要进行Equalization流程,所以需要做Equalization的最低速率是8.0GT/s。举例说明,在进行32.0GT/s速率的Equalization流程前,我们需要成功完成8.0GT/s和16.0GT/s速率的流程。但是也有例外,目前协议规定允许越过低速率的流程,仅仅做32.0GT/s速率的Equalization。但在这种情况下,没有通过Equalization流程的速率将不能作为工作速率。例如Link双方均广播自己支持的最高速率为32.0GT/s,同时双方均同意不做8.0GT/s和16.0GT/s的Equalization,这种情况下,Link首先进入2.5GT/s的L0,然后进入Recovery切换速率到32.0GT/s,并触发Equalization流程。如果流程成功,那么Link可工作速率为2.5GT/s,5.0GT/s和32.0GT/s。如果流程失败,Downstream Port必须停止广播Equalization bypass to highest rate support同时将link速率切换回2.5GT/s或者是5.0GT/s。这个时候,整个流程将按照正规流程走。即从低速率到高速率完成Equalization。

除了bypass低速率流程直接进行最高速率流程外,另一个例外是直接进入最高速率并且不做Equalization。此时,也需要链路双方均同意No Equalization Needed方式。设备可以通过恢复之前的Equalization流程中存储下来的设置,也可以根据实际情况根本不做Equalization。

这两种例外分别由TS1/TS2 Symbol 5 Enhanced Link Behavior Control来控制。如果链路一方广播No Equalization Needed,但另一方广播Equalization bypass to highest rate support,那么最后整个链路会按照Equalization bypass to highest rate support来操作。因为No Equalization Needed也意味着需要越过低速率的Equalization,而直接进入最高速率。所以协议也规定了如果某个设备支持No Equalization Needed,也必须支持Equalization bypass to highest rate support。该信息除了在TS1/TS2中表示外,在Modified TS1/TS2中采用了两个独立bit来表示。这个时候如果你是做芯片设计的工程师要特别注意这两个bit之间的关系。即如果你将No Equalization Needed bit置1了,就一定要把Equalization bypass to highest rate support同时置1。

接下来我们看看硬件触发Equalization的普通流程:
链路双方通过2.5GT/s的速率开始进行链路初始化,通过一系列的链路状态最终进入到2.5GT/s的L0 state。
在进入L0之前,链路双方需要广播自己支持的速率,如果双方均支持8.0GT/s以上的速率。在本例子中,双方均支持最高16.0GT/s的速率。接下来由Downstream Port负责启动Link Equalization。
假如链路双方支持的最高速率是16.0GT/s,Downstream Port需要使链路进入Recovery状态并广播最高支持8.0GT/s的速率。这一步的目的是首先进行8.0GT/s Equalization流程。
当8.0GT/s的Equalization流程成功完成后,链路将从Recovery状态切回到8.0GT/s速率的L0 state。这个时候,Downstream Port需要立即使链路再次进入Recovery状态,并广播最高支持16.0GT/s的速率。
接下来,链路速率由8.0GT/s切换到16.0GT/s,并完成16.0GT/s速率下的Equalization流程。
链路从Recovery状态切回到16.0GT/s的L0 State,然后Downstream Port可以发送DLLP开始进行Flow Control的初始化流程。Upstream Port不允许在接收到Downstream Port的DLLP前发送任何的DLLP。

如果在进行8.0GT/s Equalization流程的过程中,Downstream Port侦测到问题,或者Upstream Port要求重新做Equalization。这个时候,Downstream Port可以选择重做8.0GT/s的Equalization,也可以选择继续16.0GT/s的Equalization。重做Equalization的次数由具体设计实现规定,但必须是有限的。如果最终该速率下的Equalization无法成功完成,那么整个链路需要退回到之前的低速率。

上面我们简要的阐述了硬件触发Equalization的流程,如果采用软件触发,步骤是怎样的呢?
链路双方通过2.5GT/s的速率开始进行链路初始化,通过一系列的链路状态最终进入到2.5GT/s的L0 state。

在进入L0之前,Downstream Port广播只支持2.5GT/s的速率。

链路进入2.5GT/s L0 state,并完成PCIe Bus和资源枚举。

软件访问双方的Link Capabilities Register的Max Link Speed。

软件根据双方的Max Link Speed制定Equalization策略,本例子与前面的例子一致,假设双方支持的速率为2.5GT/s,5.0GT/s,8.0GT/s和16.0GT/s。

软件首先进行8.0GT/s的Equalization流程。设置Link Control 3寄存器的Perform Equalization bit为1,Link Control 2寄存器的Target Link Speed为0011b(8.0GT/s)

然后,软件对Downstream Port的Link Control寄存器,Retrain Link bit写1b。这个时候,整个链路会进入Recovery状态,并且切速到8.0GT/s以及尝试完成Link Equalization流程。

当Link Equalization流程完成后,Upstream Port必须在Recovery.RcvrLock State检测目前的设置是否存在问题。当然,协议也允许Downstream和Upstream Port利用其他手段在任何时刻检测设置问题。如果一个完成设置的Port侦测到了问题,硬件则需要设置相应速率的Link Equalization Request bit(8.0GT/s在Link Status2寄存器,16.0GT/s和32.0GT/s在相应速率的Status寄存器中)。如果是Upstream Port侦测到的问题,Upstream Port可以主动进入Recovery状态,然后在Recovery.RcvrCfg子状态中,通过TS2的Request Equalization bit通知DownstreamPort需要做某个速率下的Link Equalization。

作为Downstream来说,如果它在Recovery.RcvrCfg子状态下收到了连续8笔TS2带RequestEqualization bit设置成1,它必须在1ms内完成相应速率的Link Equalization流程,或是也去把相应速率下的Link Equalization Request bit置1b。

下面,我们举几个例子来说明各种情况:
如果Downstream Port希望重做16.0GT/s的Equalization并且不支持bypass equalization,当前链路速率是2.5GT/s或5.0GT/s。Downstream Port会首先将速率切换到8.0GT/s,然后判断是否需要做8.0GT/s的Equalization,如果之前已经成功完成,则只需要切换速率到16.0GT/s,再做该速率下的Equalization即可。
如果当前速率是2.5GT/s或者5.0GT/s,需要重做Equalization的速率是8.0GT/s,那么Downstream Port会在Recovery.RcvrCfg子状态中,通过EQTS2和Upstream Port沟通发送端和接收端preset的设置,然后进行切速操作。Upstream Port在切到8.0GT/s的速率后,需要通过TS1告诉Downstream Port它目前使用的preset设置时多少。Downstream Port也会通过相同的方式告诉对方它目前使用的preset设置,然后完成Link Equalization。
如果当前速率是8.0GT/s,需要重做16.0GT/s或者32.0GT/s的Equalization,这个时候,Downstream Port也同样会在Recovery.RcvrCfg子状态时沟通Upstream Port的设置,只不过沟通的仅仅是发送端的preset值。当链路进入到目标速率后,Upstream Port会通过TS1告知它接收到的preset的设置。而对于Downstream Port来说,如果在切速前,它没有接收到Upstream Port发送过来的preset,那么它可以使用自己寄存器中相应速率的preset设置。
如果当前速率是2.5GT/s或者5.0GT/s,需要重做32.0GT/s的Equalization,这种情况下,Downstream仍然会通过EQTS2来沟通32.0GT/s下的Upstream Port的发送端preset,这个与上面例子中的内容一致,只不过放在了TS2中不同的Symbol,有兴趣的同学可以翻看以下TS2的定义。其他的过程与例3一致,这里不再重复。
当前速率与重做Equalization速率相同。这种情况下不涉及到切速,preset的设置与上次切速前沟通的设置一致即可。

上面我们简要阐述了Link Equalization的触发方式与策略,下面我们来看看具体的Equalization的过程。整个Equalization的过程分为4个阶段(phase),分别是Phase 0,Phase 1,Phase 2和Phase 3。

链路初始化的时候会采用2.5GT/s的速率进行沟通,在Configuration状态中,双方会广播自己支持的所有的速率。进入到2.5GT/s的L0后,Downstream Port根据双方支持的最高速率,以及其他的一些条件决定执行Equalization的策略。比较简单的例子是双方最高支持的速率是8.0GT/s。这个时候Downstream Port会主导整个链路进入Reovery状态进行切速。在进入到Recovery.Speed之前,链路状态机会经过Reovery.RcvrLock和Reovery.RcvCfg子状态。在Recovery.RcvCfg子状态,Downstream Port会通过EQTS2沟通Upstream的Preset设置。然后进行速率切换。当链路来到8.0GT/s的速率的时候,因为提前沟通了大家的preset设置,此时,大家都可以按照之前沟通的设置结果发送Ordered Set。根据Equalization策略,状态机将进入Recovery.Equalization。

下面我们看看在Recovery.Equalization子状态下Downstream Port和Upstream Port是如何交互的。

1.png

Upstream Phase 0
在不同的速率的情况下,Upstream的发送端需要使用不同的preset设置。这些设置都是从之前的低速率的EQ TS2沟通而来的。然后进入Phase 1的时间点需要根据什么时候能够收到两个连续的TS1带EC=01b。Phase 0阶段相对时间比较少,因为Downstream Port进入到Recovery.Equalization后第一个Phase就是Phase 1。

Downstream Phase 1

Downstream Port进入到Recovery.Equalization后第一个Phase就是Phase 1。进入后,Downstream Port的发送端需要发送TS1带EC=01b,告诉对方自己已经在Phase 1的阶段。同时自己的发送端会采用之前沟通的Preset设置,同时TS1中会携带Downstream Port的FS(Full Swing),LF(Low Frequency)和Post-Cursor的信息。
如果Downstream Port接收到两个连续的TS1带EC=01b,那么Downstream Port将进入Phase 2。

Upstream Phase 1
Upstream Port继续沿用Phase 0的发送端设置,并且通过TS1携带EC=01b,告知对方自己也进入了Phase 1状态,并且通过TS1携带自身的FS(Full Swing),LF(Low Frequency)和Post-Cursor的信息。
与Downstream Port一样,当Upstream Port接收到两个连续的TS1带EC=01b,那么Downstream Port将进入Phase 2。

Phase 2
当Downstream和Upstream Port都进入了Phase 2后,退出的发起端由Upstream Port决定。本阶段的主要任务是Upstream Port通过侦测自身RX的接收质量,发送TS1来调节Downstream Port的发送端Equalization设置。当然在整个过程中,UpstreamPort可以随时调整自身RX的设置。需要注意的是Upstream Port的调节是逐Lane的,即每对Lane都可以通过Upstream Port发送TS1调节Downstream Port的TX Equalization参数。当Upstream Port认为对方发送的信号质量符合自己需求的时候,最后一次请求的TX参数将会成为最终Downstream Port TX使用的参数。然后Upstream Port率先进入到Phase3,即Upstream Port发送的TS1带EC=11b。此时,如果Downstream Port接收到连续两个TS1带EC=11b,Downstream Port也将进入到Phase 3。

Phase 3
Upstream Port会首先进入到Phase 3,之后Downstream Port也将进入到Phase 3。根据Spec的规定,在Phase 3阶段,由Downstream Port的RX负责侦测和判断,根据需要以及结合之前接收到的对方的FS(Full Swing)和LF(Low Frequence)能力进行请求。Upstream Port负责根据Downstream Port的请求调节其TX的Equalization参数。当Downstream Port的RX认为调节符合需求后,其请求的最后一组参数将作为最终Upstream Port TX的Equalization参数。此时,Downstream Port会率先通过设置TS1中的EC=00b退出Phase 3。Upstream Port在收到连续两个TS1带EC=00b后也将退出Phase 3。

Reference:
PCI Express® Base Specification Revision 5.0 Version 1.0

编辑 重设标签(回车键确认) 标为违禁 关闭 合并 删除
匿名用户

匿名