FRL Retimer寄存器配置与链路故障调试 - 第3节
3.1 Retimer 到底在干什么?
很多工程师会把 Retimer 和 Repeater、Redriver 搞混。其实它们的差异很大。Retimer 不只是把信号放大,它要重新对齐时钟,把信号当成新的一样发出去。
你可以这么理解:
- Redriver:只是把信号放大,噪声也一起放大。
- Repeater:放大 + 部分均衡,但对时钟没处理。
- Retimer:收到信号后,先恢复时钟,再用这个时钟把数据重新发送出去。这才是真正的数字重生。
所以 Retimer 的内部一定有这三样东西:时钟数据恢复 (CDR)、均衡器 (Equalizer)、重定时器 (Retimer/Re-sampler)。
我的习惯:判断一个芯片是不是真 Retimer,我最先看它的数据表里有没有 CDR 锁定指示和参考时钟输入。没有这两个,大概率是 Redriver。
3.2 时钟数据恢复 (CDR)
3.2.1 CDR 的核心任务
CDR 的目标是在接收到的数据流中,提取出干净的时钟,并用这个时钟去重新“抓住”数据位。说白了,它要回答两个问题:
1. 这串数据,时钟频率到底是多少?(尽管标称 5.4Gbps,但实际会有 ppm 偏差)
2. 时钟的相位,应该对齐到哪个点上?
3.2.2 CDR 的工作流程
CDR 内部有一套锁相环结构。不过我一般分成三步来看:
- 频率检测:先粗略判断输入数据流的频率。
- 相位锁定:用鉴相器不断微调 VCO 相位,直到时钟边沿对准数据眼图的中心。
- 数据再生:用锁定的时钟去采样数据,输出干净的数据和时钟对。
在实际项目中,我发现一个最容易被忽略的问题:CDR 的锁定时间。有些 Retimer 在链路训练初期,如果参考时钟不准,可能锁住错误的频率甚至发生“谐波锁定”。我曾经在调试某个 6.0 Gbps FRL 项目时,因为参考时钟的精度只差了 50 ppm,CDR 就是锁不上,输出全是误码。后来换了高精度的晶振,问题瞬间消失。
重要概念:
- 锁定时间:CDR 从启动到稳定输出正确数据和时钟的时间。
- 捕捉范围:CDR 能容忍的输入频率偏差范围(比如 ±300 ppm)。
- 抖动传递:输入的抖动,有多少会跑到输出的时钟上。
这里我贴一段简化的 CDR 核心算法伪代码,大家体会一下:
// Pseudo: CDR Phase Lock Loop
while (!locked) {
phase_error = edge_detection(data_in) – vco_phase;
if (abs(phase_error) > threshold) {
vco_adj += phase_error * Kp; // 比例调整
vco_adj += integrate(phase_error) * Ki; // 积分调整
vco_phase += vco_adj * Kvco; // 调整 VCO 频率
} else {
locked = TRUE;
retimed_data = sample(data_in, vco_phase); // 采样数据
}
}
3.3 均衡器 (Equalizer)
均衡是 Retimer 对付长走线的武器。为什么需要它?因为高频信号在 PCB 上跑的时候,衰减非常大。眼图会闭合,如果不处理,后面的 CDR 根本没法判断 0 和 1。
3.3.1 均衡的种类
| 均衡类型 | 作用位置 | 主要任务 |
|---|---|---|
| CTLE | 接收端前端 | 固定或可调的高频增益补偿 |
| FFE | 发送端 | 预加重/去加重 |
| DFE | 接收端(CDR 后) | 消除码间干扰 (ISI) |
在我调试过的 SoC 项目中,CTLE 和 DFE 是配合使用的。CTLE 用来做一个粗调的“眼图睁眼”,DFE 则负责精细的矫正。但 DFE 有个麻烦——它对噪声敏感,而且一旦开始工作,收敛速度很慢。
我曾经踩的坑:在某次 Retimer 适配测试中,CTLE 增益设置偏大,导致 DFE 过驱动。结果 DFE 的 tap 值分配错误,反而把眼图弄得更差,完全锁定失败。
3.3.2 均衡如何配置?
现在大部分 Retimer 支持自动均衡。但作为调试者,你最好理解它背后的逻辑。
- 手动模式:通过 I2C 寄存器写死 CTLE 增益和 DFE 系数。
- 自适应模式:芯片根据误码率或眼高数据自动调整。我习惯先开自适应,然后读回系数。
我的建议:首次调试时,先用手动模式设一个保守的 CTLE 增益(比如 6dB),确认链路能通,再切自适应。这样可以避免 Retimer 在错误状态下反复自适应死循环。
3.4 重定时机制 (Re-timing)
CDR 恢复了时钟,均衡器去除了干扰。最后一步,就是把数据用恢复出的干净时钟重新采样发送。这就叫重定时。
为什么一定要重定时?因为经过 CDR 和均衡后的数据,虽然逻辑正确,但时钟相位可能还残留一些确定性抖动。如果不重新用本地时钟发送,下游设备还是要面对残留抖动。重定时,本质上是做一次“物理层的数据 reshape”。
在 FPGA 或 SoC 的 Retimer 模块里,重定时器通常就是一个时钟域切换的 FIFO + 一个输出驱动器。输入数据用恢复时钟写入 FIFO,输出数据用本地干净的参考时钟读出。
关键参数:
- FIFO 深度:通常 2~4 个数据位。
- 输出抖动 (Random Jitter):理想情况应小于 0.5 UI。
- 链路建立时间:从输入有效到输出有效,通常几十微秒。
你想想看,如果没有这个重定时步骤,信号经过长线再经过 Retimer 内部的均衡和 CDR 处理,再发出去时候,相位可能已经乱成一团了。重定时器就是为了保证输出时钟和输入时钟在相位上是解耦的。
3.5 整体流程与避坑指南
把以上三个机制串联起来,Retimer 内部的信号流程就是:
输入信号 → CTLE 均衡 → CDR 恢复时钟 & 数据 → DFE 细调 → 重定时 FIFO → 输出驱动器 → 输出信号
这张图是我经手过多个项目后确定的结构,你调试时按这个顺序排查,一定不会错:
重要警告:千万不要在链路建立过程中修改 CTLE/DFE 系数。我曾经遇到过调试时动态调整均衡参数导致 Retimer 内部的 CDR 失去锁定,整个链路掉了好几秒。务必在 Retimer 进入低功耗或旁路模式时进行配置更改。
好了,以上是 Retimer 核心机制的完整拆解。CDR、均衡与重定时,三者缺一不可。下一阶段你必须能自己判断,当一个信号链路出问题时,问题到底出在三个环节里的哪个。