SoC中FRL训练模块架构

PHY与Link层的划分

做FRL训练适配,第一步就是要搞清楚SoC内部谁干了什么。说白了,PHY和Link层的划分是芯片设计里最基础、也最容易出问题的地方。我个人习惯把PHY层看作“搬运工”,Link层则是“指挥员”。

PHY层负责最底层的信号收发、时钟恢复、通道均衡。你想想看,几十Gbps的差分信号在PCB上走一截,能不掉眼图?PHY就是在这里做CTLE、DFE、时钟数据恢复(CDR)。而Link层管理的是协议层面的事情:训练序列的组帧、状态机跳转、链路能力协商。这两层之间通常通过PIPE接口(PCIe PHY Interface for Express)或者类似的内部总线通信。

我在项目中遇到过一个问题:某个SoC的PHY和Link之间握手时序不匹配。PHY已经锁住CDR了,但Link还在等训练序列超时。查了好久才发现,PIPE接口的RxValid信号上升沿比Link期待的晚了几个UI。后来我们把PHY的延迟参数调整到对齐,训练就通了。所以你看,理解这个划分能帮你快速定位类似问题。

PHY与Link的职责对比

层次职责关键模块与Retimer的交互点
PHY模拟信号处理、CDR、通道均衡CTLE、DFE、PLL、Deskew接收Retimer恢复的时钟/数据,发送时进行预加重
Link链路训练状态机、扰码、符号映射TSM、FSM、LTSSM、16b/18b编解码通过训练序列协商FRL速度与信道数

为什么要把这两层分开?说白了是为了复用。同一个Link层可以对接不同代际的PHY,比如从HDMI 2.0的6Gbps PHY升级到HDMI 2.1的12Gbps PHY,只需要换PHY,Link的状态机逻辑基本不变。嗯,这里要注意:Retimer虽然插在中间,但它其实要同时模拟PHY和部分Link的行为。所以调试时,你既要看SoC的PHY-Link内部握手,也要看Retimer两端的PIPE状态。

训练状态机(Training State Machine)概览

FRL的训练是一个多阶段握手过程。SoC内部的训练状态机通常有三个主要状态:初始化、链路能力探测、链路锁定。每个状态又细分子状态。

  • Init:SoC上电或热插拔后,PHY先做阻抗校准和PLL锁定。Link层等待PHY上报Ready。
  • Capability Discovery:发送训练序列(Training Patterns),比如TP1/TP2/TP3。双方交换支持的FRL速率、信道数量、是否支持FEC等信息。
  • Lock & Adapt:PHY根据训练结果调整均衡系数,Link层完成符号对齐和通道去偏斜。最后进入正常数据传送状态。

我记忆很深的一次调试:某个HDMI 2.1源端SoC总是训练到6Gbps就停了,上不去12Gbps。看状态机日志,发现Capability Discovery阶段始终收不到接收端的TP3应答。后来用示波器抓Retimer两端,原来Retimer在转发TP3时把前导码搞掉了一个UI。SoC的Link层如果严格检查前导码长度,就会认为训练失败,降级到6Gbps。这就属于Retimer与SoC状态机之间的微小差异。

核心要点:SoC的FRL训练状态机是“自治”的——它不会等待Retimer的确认,而是通过PHY上报的链路状态来做判断。所以Retimer必须能“伪装”成对端设备的状态机行为,否则训练就会异常。

训练状态机状态转移图

FRL训练状态机概览 IDLE INIT Cap Discovery TP1/TP2/TP3 Lock & Adapt EQ + Deskew Data Flow ERROR 超时/失败 断开/重新训练 训练状态机由Link层主导,但PHY的锁定状态是状态转移的关键条件。 Retimer必须正确处理每一个训练模式,否则SoC的状态机可能卡在中间状态。

状态跳转的关键触发条件

实际项目中,状态机的跳转条件往往藏在PHY的内部寄存器里。举个例子,从INIT到Cap Discovery,Link层通常会检查PHY的PHY_STATUS.RxLocked信号。这个信号由PHY的CDR模块产生——如果CDR没锁定,Link层会反复重试INIT,而不是直接超时报错。

个人经验:我建议你们做Retimer测试时,一定要监控SoC的Training Status寄存器。很多SoC会提供LTSSM_STATE或者FRL_TRAINING_STATE字段。把这些值加上时间戳打印出来,跟Retimer内部的状态机日志对照,就能很快定位是哪一层出了问题。

PHY与Link层的握手接口

常见的内部接口信号包括:

  • TxClk / RxClk:PHY输出的参考时钟,用于Link层同步。
  • RxValid:PHY指示CDR已锁定且数据有效。
  • RxElecIdle:PHY检测线路空闲,Link层据此触发重新训练。
  • TxDeemph / TxSwing:Link层控制PHY的输出幅度与预加重。

每个SoC厂商对这些信号的时序要求都不一样。我曾经碰过一个案子:某SoC要求RxValid必须在CDR锁定后1个us内被Link层采样到,否则Link会认为PHY未准备好。而Retimer为了做时钟净化,把RxValid延迟了2个us。结果就是训练永远卡在INIT阶段。后来我们在Retimer的配置里加了一个“RxValid超前释放”的选项,才解决了问题。

避坑指南:千万不要默认所有SoC的PHY-Link接口都遵守标准的PCIe PIPE规范。HDMI FRL通常使用自定义的PHY wrapper,时序参数、信号命名都可能不同。调试前先拿到SoC的PHY Datasheet,确认RxValid、RxLocked等信号的时序窗口。

小结

SoC的FRL训练模块架构,核心就两块:PHY做模拟,Link做协议。你只有把这两层的职责和握手接口吃透,才能理解Retimer为什么有时候能正常训练、有时候却失败。我个人的经验是:遇到训练问题,先扒PHY的寄存器,看CDR有没有锁,再扒Link的状态机寄存器,看卡在哪一步。耐心对照两张日志,90%的问题都能在半小时内定位出来。