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死活对不上。

关键点: Retimer不像SoC那样直接生成原始TS1/TS2,它是在“转发”之前先“消化”再“重发”。这个重发过程中,符号序列的结构可能被“清洗”掉一部分信息。

4.2 SoC如何生成训练序列

SoC作为Link Training的发起方,它脑子里有一张表:该发TS1还是TS2,重复几次,中间插不插SKP。以我调过的某主流SoC为例,它的LT控制器是这样工作的:

阶段SoC行为符号序列
Polling发送TS1(重复8次)COM + TS1_Identify + 参数
Config检测到对端TS1后切换为TS2COM + TS2_Identify + LTSSM状态
L0插入SKP进行速率协商SKP有序集(每5000UI插一次)

注意SoC的TS1/TS2完全由本地时钟域产生,它的符号序列是完整的——每个符号都带着原始的训练参数。我曾见过一个SoC把TS1的“Number of lanes”字段写错了,Retimer直接拒绝转换。

4.3 Retimer的转发与重生成机制

Retimer的角色就好比一个“翻译官”。它收到SoC发来的训练序列,不会直接穿过。它会:

  1. 符号检测:先从串行数据流中恢复时钟,做符号对齐。这里有个坑:如果SoC发的符号间距不均匀(比如因为PLL抖动),Retimer可能误判COM位置。
  2. 帧解析:识别TS1/TS2中的字段,比如LTSSM状态、链路宽度。但Retimer不像SoC那样校验每个字段的合法性,它更关注“这个序列是否允许我进入下一状态”。
  3. 重生成:用自己的PLL重新生成符号序列。注意,重生成的序列中,所有参数都会被Retimer的本地策略覆盖。比如SoC在TS2里告诉对端“我支持4条lane”,Retimer可能因为它的内部限制,只转发“我支持2条lane”。
我踩过的坑: 某项目为了省功耗,把Retimer的转发延迟压到最小,结果重生成的TS1中COM符号位置被提前了1个UI,导致SoC端误判为符号错位。后来我们不得不在固件里加了“Retimer delay compensation”选项。

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阶段,进入错误状态。

小技巧: 如果你在调试Retimer兼容性问题,不妨先抓一下SoC发出的训练序列波形,用示波器看SKP插入的位置是否严格遵守Spec。很多时候问题出在SoC侧,而不是Retimer。

4.5 一张图讲清整个流程

为了帮你快速建立印象,我画了个简化流程图。你可以从这张图里看到SoC生成→Retimer截获→重生成→对端SoC接收的完整链路。

训练序列通过SoC与Retimer的转发路径 SoC 发送端 生成完整TS1/TS2 原始序列 Retimer处理 ① 符号检测 ② 帧解析 ③ 重生成(清洗参数) 重生成序列 SoC 接收端 严格按Spec解析 核心差异对比 生成端:SoC按Spec产生固定序列 转发端:Retimer按本地策略重写参数 接收端:Retimer更容忍符号错位 → 常见失败场景:SKP插入时机不同 → 调试方法:抓Retimer前的差分眼图 → 固件对策:允许Retimer延迟补偿 示例:SoC发送TS1(8次),Retimer检测到第6次后转发 但转发时“链路宽度”字段被Retimer从×4改为×2

4.6 真实项目中容易忽略的细节

  1. SKP插入时机:SoC通常在TS2完成后才插入SKP,但Retimer可能为了自身PLL收敛,在转发TS2时就加SKP。调试时要区分是SoC主动插入还是Retimer插入。
  2. TS1重复次数:有些SoC只重复4次,但某些Retimer的LTSSM期望至少8次。我见过一个案子,SoC为省时间只发了6次,Retimer没完成符号锁定就不承认TS1完成。
  3. 参数覆盖: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序列比对。毕竟,等板子上再抓波形,那可真是拿烙铁头烫手指。