4. 训练序列与LT帧结构:SoC与Retimer的生成与解析差异
各位做FRL的兄弟,聊到训练序列这块,我知道很多人在SoC和Retimer之间摔过跟头。Link Training帧结构说白了就是握手信号,但SoC和Retimer“握手”的方式完全不同。我最早调FRL的时候,因为一个TS2的SKP符号位置不对,卡了整两周。今天咱们就把这个坑填上。
4.1 训练序列的基本结构
回头看一眼FRL Link Training的帧结构,它主要由三种序列组成:
- TS1 – 初始对齐序列,用于符号锁定和通道绑定
- TS2 – 配置协商序列,携带LTSSM状态机状态
- SKP / SLC – 时钟补偿和符号间距调整
每个序列又包含若干有序符号集(Ordered Set)。比如TS1由16个符号组成:1个COM + 3个TS1 Identifier + 12个Data/控制符号。我见过一些SoC设计为了节省gate counts,把TS1重复次数从8次减到4次,结果和某些Retimer死活对不上。
4.2 SoC如何生成训练序列
SoC作为Link Training的发起方,它脑子里有一张表:该发TS1还是TS2,重复几次,中间插不插SKP。以我调过的某主流SoC为例,它的LT控制器是这样工作的:
| 阶段 | SoC行为 | 符号序列 |
|---|---|---|
| Polling | 发送TS1(重复8次) | COM + TS1_Identify + 参数 |
| Config | 检测到对端TS1后切换为TS2 | COM + TS2_Identify + LTSSM状态 |
| L0 | 插入SKP进行速率协商 | SKP有序集(每5000UI插一次) |
注意SoC的TS1/TS2完全由本地时钟域产生,它的符号序列是完整的——每个符号都带着原始的训练参数。我曾见过一个SoC把TS1的“Number of lanes”字段写错了,Retimer直接拒绝转换。
4.3 Retimer的转发与重生成机制
Retimer的角色就好比一个“翻译官”。它收到SoC发来的训练序列,不会直接穿过。它会:
- 符号检测:先从串行数据流中恢复时钟,做符号对齐。这里有个坑:如果SoC发的符号间距不均匀(比如因为PLL抖动),Retimer可能误判COM位置。
- 帧解析:识别TS1/TS2中的字段,比如LTSSM状态、链路宽度。但Retimer不像SoC那样校验每个字段的合法性,它更关注“这个序列是否允许我进入下一状态”。
- 重生成:用自己的PLL重新生成符号序列。注意,重生成的序列中,所有参数都会被Retimer的本地策略覆盖。比如SoC在TS2里告诉对端“我支持4条lane”,Retimer可能因为它的内部限制,只转发“我支持2条lane”。
4.4 解析差异的核心矛盾
SoC和Retimer在解析训练序列时,最大的差异在于容忍粒度不同。
- SoC解析:严格按Spec走。TS1必须包含连续4个准确的TS1 Identifier,否则报错。
- Retimer解析:更灵活。允许丢一两个符号,甚至允许TS1和TS2之间的边界模糊。为什么?因为Retimer内部是“连续重生成”,它不需要像SoC那样精确的状态机边界。
举个例子:标准FRL要求TS1序列内不得出现SKP符号。我测试时发现某SoC在一个TS1序列中间意外插入了一个SKP(因为其PLL校准周期干扰)。SoC自己无所谓,因为它的LT控制器是软状态机,但在Retimer端,这个SKP会被当作“前一个序列结束”的标志,导致Retimer提前结束TS1阶段,进入错误状态。
4.5 一张图讲清整个流程
为了帮你快速建立印象,我画了个简化流程图。你可以从这张图里看到SoC生成→Retimer截获→重生成→对端SoC接收的完整链路。
4.6 真实项目中容易忽略的细节
- SKP插入时机:SoC通常在TS2完成后才插入SKP,但Retimer可能为了自身PLL收敛,在转发TS2时就加SKP。调试时要区分是SoC主动插入还是Retimer插入。
- TS1重复次数:有些SoC只重复4次,但某些Retimer的LTSSM期望至少8次。我见过一个案子,SoC为省时间只发了6次,Retimer没完成符号锁定就不承认TS1完成。
- 参数覆盖:Retimer重生成时,会把“Lane count”、“Max speed”等字段替换成自己预设的值。如果你的SoC和Retimer预设值不同,Rx端会收到矛盾的信息。
① 抓取Retimer入口和出口的训练序列波形,对比长度和关键字段。
② 强制SoC主动控制加速/减速插入SKP,观察Retimer是否还能保持锁定。
③ 如果SoC支持,开启“Retimer compatibility mode”,让LT控制器跳过一些严格检查。
4.7 小结
训练序列这块,说白了就是SoC和Retimer之间信息不对称。SoC觉得自己在发标准帧,Retimer觉得它在帮你“优化”。当你发现链路建不起来时,不要只怪Retimer兼容性差,先查查SoC的序列结构是否符合Spec。我个人习惯在仿真阶段就加入Retimer行为模型,跑一遍LT序列比对。毕竟,等板子上再抓波形,那可真是拿烙铁头烫手指。