4、链路训练状态机(LTSSM)概览
好,咱们今天聊聊LTSSM。这玩意儿,说白了就是PCIe链路训练的“总导演”。我刚开始接触PCIe的时候,看着这11个状态来回跳,头都大了。后来在项目里调了几个月,才慢慢摸清楚它的脾气。
LTSSM的全称是Link Training and Status State Machine。它负责管理链路的初始化、恢复和电源管理。你想想看,两个PCIe设备刚上电,互相不认识,怎么建立连接?就是靠LTSSM一步步引导的。
4.1 LTSSM的11个状态
LTSSM一共有11个状态。我习惯把它们分成三组:
- 初始训练组:Detect、Polling、Configuration
- 链路恢复组:Recovery、Hot Reset、Disable
- 电源管理组:L0、L0s、L1、L2、L3
嗯,这里要注意,L0是正常工作状态,其他都是省电或异常状态。我在一个项目中遇到过,设备老是莫名其妙掉到L1状态,查了半天才发现是驱动里电源管理策略配错了。
4.2 状态转换图
状态转换其实不复杂。我画个简化的流程给你看:
Detect → Polling → Configuration → L0
↑ ↑ ↑
└──────────┴────────────┘
(Recovery状态可回到任意前序状态)
为什么会这样设计?说白了,就是为了容错。链路训练过程中,任何一步出错,都可以回退重来。我个人觉得,这是PCIe协议最聪明的地方之一。
4.3 训练的目的
链路训练要干五件事。我按顺序给你捋一遍:
| 训练目标 | 对应状态 | 我的经验 |
|---|---|---|
| 位锁定 | Detect | 检测到接收器有信号就行,不要求数据正确 |
| 符号锁定 | Polling | 找到8b/10b编码的边界,我踩过坑,时钟抖动大会导致锁定失败 |
| 块锁定 | Configuration | 针对Gen3及以上,找到128b/130b的块边界 |
| 链路宽度协商 | Configuration | 双方商量用x1还是x16,我曾经遇到过金手指氧化导致宽度降级 |
| 速率协商 | Recovery | 从Gen1开始,逐步升到Gen3/Gen4 |
4.4 位锁定
位锁定是最基础的。说白了,就是接收器能检测到电信号了。在Detect状态,发送端发TS1序列,接收端只要看到信号电平翻转,就算锁定。
我曾经在一个项目中,PCB走线太长,信号衰减严重,Detect状态死活过不去。后来加了预加重才搞定。嗯,这里要注意,位锁定不关心数据对不对,只关心有没有信号。
4.5 符号锁定
符号锁定就有点技术含量了。在Polling状态,设备要找到8b/10b编码的逗号字符(K28.5)。这个逗号字符是唯一的,找到它就能确定符号边界。
我建议你在调试时,用逻辑分析仪抓一下Polling阶段的TS1序列。如果看到连续的K28.5,说明发送端没问题;如果K28.5断断续续,那多半是接收端时钟恢复有问题。
避坑指南:我曾经遇到一个案例,板子上电后Polling状态反复失败。查了三天,最后发现是参考时钟的PPM偏差超标了。PCIe要求±300ppm以内,我那板子跑到了500ppm,符号锁定自然不稳定。
4.6 块锁定
块锁定是Gen3及以上才有的。因为Gen3用了128b/130b编码,没有逗号字符了。那怎么锁定?靠的是同步头(Sync Header)。
每个128b/130b块的开头有2个比特的同步头。接收端通过检测同步头模式(01或10)来确定块边界。你想想看,这比8b/10b的符号锁定要复杂得多。
小技巧:调试块锁定问题时,我习惯先降速到Gen2,确认符号锁定没问题,再升到Gen3。这样能快速定位问题是出在块锁定还是其他环节。
4.7 链路宽度协商
宽度协商在Configuration状态完成。双方通过交换TS1和TS2序列,告诉对方自己支持多少条lane。比如一个x16的插槽,插了个x1的卡,那最终就协商成x1。
我记得有一次,客户反馈说他们的设备只能跑x4,明明设计是x8。我让他们用示波器量了量lane的耦合电容,发现有两路电容虚焊了。嗯,硬件问题往往比软件问题更隐蔽。
4.8 速率协商
速率协商是在Recovery状态完成的。PCIe设备从Gen1开始训练,然后逐步升速。升速过程是这样的:
- 双方都同意升速
- 发送端改变速率
- 接收端重新做位锁定和符号/块锁定
- 确认锁定成功,进入L0
如果升速失败,设备会回退到Gen1。我曾经在Gen4的板子上调试,发现升到Gen4就掉链子,最后发现是PCB的阻抗控制没做好,回波损耗太大。
重要提醒:速率协商不是一次性的。链路在运行过程中,如果误码率太高,也会触发Recovery状态重新协商速率。所以你在做信号完整性设计时,一定要留够裕量。
好了,LTSSM的概览就讲到这里。下一章我们会深入每个状态的细节,包括状态机跳转的条件和超时处理。到时候我会拿实际项目的波形图来分析,保证让你看得明明白白。