### Retimer 芯片工作原理:深入 CDR、均衡与重定时机制 这一章,我们真正进入 Retimer 的核心地带。

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 内部有一套锁相环结构。不过我一般分成三步来看:

  1. 频率检测:先粗略判断输入数据流的频率。
  2. 相位锁定:用鉴相器不断微调 VCO 相位,直到时钟边沿对准数据眼图的中心。
  3. 数据再生:用锁定的时钟去采样数据,输出干净的数据和时钟对。

在实际项目中,我发现一个最容易被忽略的问题: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 → 输出驱动器 → 输出信号

这张图是我经手过多个项目后确定的结构,你调试时按这个顺序排查,一定不会错: Retimer 内部核心处理流程 CTLE 均衡 CDR 恢复 DFE 精调 重定时器 输出 重新发送 输入 原始信号 参考时钟域 (Reference Clock) 所有模块共享同一参考时钟源

重要警告:千万不要在链路建立过程中修改 CTLE/DFE 系数。我曾经遇到过调试时动态调整均衡参数导致 Retimer 内部的 CDR 失去锁定,整个链路掉了好几秒。务必在 Retimer 进入低功耗或旁路模式时进行配置更改。

好了,以上是 Retimer 核心机制的完整拆解。CDR、均衡与重定时,三者缺一不可。下一阶段你必须能自己判断,当一个信号链路出问题时,问题到底出在三个环节里的哪个。