4. PCIe均衡化流程(Gen3):Request/Response机制,Phase 1/2/3,TS1/TS2序列

好了,从这一章开始,我们就真正进入Gen3均衡化的核心执行流程了。

很多工程师第一次看Gen3均衡化,会觉得它就是个「握手」过程。说白了就是发TS1、收TS1、再发TS2、再收TS2,然后完事。但实际做过调试的人都知道,这个「握手」的规矩多得很,每一步都要核对很多细节。

我个人习惯,把Gen3均衡化比作两个人在黑夜里相互摸索着确认位置。你喊一声,我回一句,你觉得听清了,我再调一下音量。整个过程分为三个明确的阶段——Phase 1、Phase 2、Phase 3。

4.1 Request/Response 基础机制

Gen3均衡化里,所有参数调整都靠请求(Request)和响应(Response)来完成。谁发请求?谁响应?

  • Downstream Port(RC端):通常是主动发起均衡化的一方。它先发送带有均衡化请求的TS1序列。
  • Upstream Port(Endpoint端):收到请求后,解析参数,然后通过回应TS1序列来告诉对方「我收到了」或者「我需要你调整」。我

这个机制和咱们平常说的Master/Slave不太一样。它更像一个循环反馈:A提出调整,B回应是否接受,A再根据回应继续微调。

小技巧: 我在项目里经常发现,某些Endpoint的均衡化实现有bug,它不回Response直接卡住。嗯,这时候别急着怀疑链路,先抓TS1序列看它有没有回应Preset/Hint的变化。

4.2 Phase 1:Preset 交换与初始确认

Phase 1 是整个均衡化流程的启动阶段。目标是什么?目标很简单:先互相告诉对方「我支持哪些Preset」,然后选一个作为起点。

具体流程:

  1. Downstream Port发送包含Preset Request(请求预设值)的TS1序列。我建议把这个阶段叫「亮牌」。
  2. Upstream Port收到后,回复自己的Preset Request值。
  3. 双方通过比较,选定一个共同的、双方都支持的Preset值作为第一步调整的基础。
  4. Phase 1 结束时,双方确认了这个初始预设,并准备进入更精细的调整。

你想想看,如果两个端口支持的Preset集合没有交集,那Phase 1就会失败,链路会直接回退到Gen2或更低速率。我曾经在一次debug中遇到过这种情况,端点芯片的Preset列表只支持很小的一个范围,而RC侧选择的刚好不在里面,结果整个均衡化就卡住了。

注意: Phase 1 必须在收到对方的TS1之后,才能确认。不能着急往前跳。链路如果太快进入Phase 2却发现Phase 1没完成,那后面所有的Cx都是错的。

4.3 Phase 2:去加重(De-emphasis)的微调

Phase 1选好了初始Preset,Phase 2就在这个基础上,对去加重进行进一步调整。

为什么要调去加重?因为在Gen3的8 GT/s这么高的速率下,信号通过PCB和连接器后,高频分量衰减得很厉害。去加重可以补偿这种衰减,确保接收端能正确判断0和1。

Phase 2 里,主要动作是:

  • Downstream Port:根据Received Preset和内部算法,计算出新的去加重值,并把它编码进后续的TS1序列里发送出去。
  • Upstream Port:同样的过程,它也会把自己的去加重调整告知对方。

这个阶段有点像在拍毕业照,双方不断微调相机对焦,直到对方表示「清晰了」为止。调整的动作是通过TS1里的具体参数位(Cx, Dx等)来传递的。

关键点: 在Phase 2里,不要去修改Coefficient(系数)值。Phase 2只能调整去加重值。如果硬件设计里允许在Phase 2修改系数,那可能会引发意想不到的问题,导致均衡化失败。

4.4 Phase 3:最终系数(Coefficient)锁定

Phase 3 是最终阶段,也是最关键的一步。这里开始调整发送端系数(Tx Coefficient),包括前驱(Pre-cursor)、主驱(Main-cursor)、后驱(Post-cursor)。

Phase 3 的典型步骤:

  1. Downstream Port在TS1里发送Coefficient Request(请求特定系数)。
  2. Upstream Port接收到后,调整自己的系数,然后回应TS1表示调整完毕。
  3. Downstream Port检查回应,如果Still not good,就继续调整,发送新的Coefficient Request。如此循环。
  4. 当Downstream Port认为接收到的信号质量足够好(通常通过Link训练状态机里的RxLocked状态确认),就发送TS1里的EIEOS Exit,结束均衡化,链路进入L0状态。

Phase 3 设计上没有固定的调整次数,理论上可以无限微调,直到双方满意为止。但我一般不建议超过8次循环,否则说明初始Preset选择有问题,应该回退到Phase 1重新选。

踩坑提醒: 我曾遇到一个案例,Downstream Port在Phase 3里一直请求一个很大的Post-cursor(后驱),而Endpoint芯片的Post-cursor最大只能调到某个值。结果链路一直卡在Phase 3,无法退出。最终发现是RC侧的PCB上信号反射严重,错误地认为需要极高的后驱值来补偿。所以,Phase 3 卡住时,别只盯着端口寄存器,要去看实际信号质量。

4.5 TS1与TS2序列的角色

说了这么多,其实所有参数调整都靠两个序列来实现:TS1 和 TS2。

你可能要问了:为什么要两个序列?它们不都是用来传输均衡化参数的吗?

确实,两者结构类似,但有区别:

特性 TS1序列 TS2序列
主要用途 均衡化请求与调整(Phase 1/2/3) 均衡化最终确认与锁定
包含参数 Preset, Hint, Coefficient Request, 去加重值 最终确认的系数值(锁定阶段)
行为 多用于协商与迭代 多用于最终确认与状态锁定
退出 不能直接退出均衡化 看到连续的TS2后,链路切换状态

我个人习惯,在调试时先抓TS1序列,因为它包含的信息最丰富。等看到连续多个TS2序列出现时,就说明Phase 3即将结束,均衡化快要成功了。

实战建议: 如果你在协议分析仪里看到连续三个相同的TS2序列,基本可以认为Phase 3已经完成,就差一个EIEOS来进入L0了。如果这一对TS2后面没有紧跟着EIEOS,或者链路又回到了TS1,那就说明最终系数没谈拢,Phase 3有残留问题。

4.6 知识结构图:Gen3均衡化全流程

为了帮助你更直观地理解三个Phase和TS1/TS2的关系,我画了一张流程图。

PCIe Gen3均衡化流程(Phase 1/2/3 与 TS1/TS2序列) PCIe Gen3 均衡化流程 链路训练开始 Phase 1:Preset交换与初始确认 发送/接收 TS1 序列,交换 Preset Request 选中共同支持的预设值 Preset一致?继续→ Phase 2:去加重微调 通过TS1序列,调整De-emphasis值 仅调整去加重,不修改系数 Phase 3:最终系数锁定 发送TS1中的Coefficient Request 接收TS2序列 → 锁定 → 进入L0 序列说明 TS1:请求与调整 TS2:确认与锁定

这张图展示了Gen3均衡化从链路训练开始,经过Phase 1的Preset确定、Phase 2的去加重微调、再到Phase 3的系数锁定的完整过程。你看看左边的流程,重点记住:每个Phase都靠TS1序列来传递调整请求,而最终锁定阶段则会看到连续的TS2序列。

最后补充一点:TS1和TS2的序列结构是相同的,都是8个字节的特定格式。区别在于控制符号位。我建议你如果手头有协议分析仪手册,可以直接查对照表,很直观。

个人记忆法: 我把TS1联想为「谈判阶段(T-S-1)」,TS2联想为「签字盖章(T-S-2)」。这样在调试中看到序列类型,就能快速知道当前在哪个阶段,非常实用。