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状态机之间的微小差异。
训练状态机状态转移图
状态跳转的关键触发条件
实际项目中,状态机的跳转条件往往藏在PHY的内部寄存器里。举个例子,从INIT到Cap Discovery,Link层通常会检查PHY的PHY_STATUS.RxLocked信号。这个信号由PHY的CDR模块产生——如果CDR没锁定,Link层会反复重试INIT,而不是直接超时报错。
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的FRL训练模块架构,核心就两块:PHY做模拟,Link做协议。你只有把这两层的职责和握手接口吃透,才能理解Retimer为什么有时候能正常训练、有时候却失败。我个人的经验是:遇到训练问题,先扒PHY的寄存器,看CDR有没有锁,再扒Link的状态机寄存器,看卡在哪一步。耐心对照两张日志,90%的问题都能在半小时内定位出来。