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再根据回应继续微调。
4.2 Phase 1:Preset 交换与初始确认
Phase 1 是整个均衡化流程的启动阶段。目标是什么?目标很简单:先互相告诉对方「我支持哪些Preset」,然后选一个作为起点。
具体流程:
- Downstream Port发送包含Preset Request(请求预设值)的TS1序列。我建议把这个阶段叫「亮牌」。
- Upstream Port收到后,回复自己的Preset Request值。
- 双方通过比较,选定一个共同的、双方都支持的Preset值作为第一步调整的基础。
- Phase 1 结束时,双方确认了这个初始预设,并准备进入更精细的调整。
你想想看,如果两个端口支持的Preset集合没有交集,那Phase 1就会失败,链路会直接回退到Gen2或更低速率。我曾经在一次debug中遇到过这种情况,端点芯片的Preset列表只支持很小的一个范围,而RC侧选择的刚好不在里面,结果整个均衡化就卡住了。
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等)来传递的。
4.4 Phase 3:最终系数(Coefficient)锁定
Phase 3 是最终阶段,也是最关键的一步。这里开始调整发送端系数(Tx Coefficient),包括前驱(Pre-cursor)、主驱(Main-cursor)、后驱(Post-cursor)。
Phase 3 的典型步骤:
- Downstream Port在TS1里发送Coefficient Request(请求特定系数)。
- Upstream Port接收到后,调整自己的系数,然后回应TS1表示调整完毕。
- Downstream Port检查回应,如果Still not good,就继续调整,发送新的Coefficient Request。如此循环。
- 当Downstream Port认为接收到的信号质量足够好(通常通过Link训练状态机里的RxLocked状态确认),就发送TS1里的EIEOS Exit,结束均衡化,链路进入L0状态。
Phase 3 设计上没有固定的调整次数,理论上可以无限微调,直到双方满意为止。但我一般不建议超过8次循环,否则说明初始Preset选择有问题,应该回退到Phase 1重新选。
4.5 TS1与TS2序列的角色
说了这么多,其实所有参数调整都靠两个序列来实现:TS1 和 TS2。
你可能要问了:为什么要两个序列?它们不都是用来传输均衡化参数的吗?
确实,两者结构类似,但有区别:
| 特性 | TS1序列 | TS2序列 |
|---|---|---|
| 主要用途 | 均衡化请求与调整(Phase 1/2/3) | 均衡化最终确认与锁定 |
| 包含参数 | Preset, Hint, Coefficient Request, 去加重值 | 最终确认的系数值(锁定阶段) |
| 行为 | 多用于协商与迭代 | 多用于最终确认与状态锁定 |
| 退出 | 不能直接退出均衡化 | 看到连续的TS2后,链路切换状态 |
我个人习惯,在调试时先抓TS1序列,因为它包含的信息最丰富。等看到连续多个TS2序列出现时,就说明Phase 3即将结束,均衡化快要成功了。
4.6 知识结构图:Gen3均衡化全流程
为了帮助你更直观地理解三个Phase和TS1/TS2的关系,我画了一张流程图。
这张图展示了Gen3均衡化从链路训练开始,经过Phase 1的Preset确定、Phase 2的去加重微调、再到Phase 3的系数锁定的完整过程。你看看左边的流程,重点记住:每个Phase都靠TS1序列来传递调整请求,而最终锁定阶段则会看到连续的TS2序列。
最后补充一点:TS1和TS2的序列结构是相同的,都是8个字节的特定格式。区别在于控制符号位。我建议你如果手头有协议分析仪手册,可以直接查对照表,很直观。