UFS PHY 发送端参数(Tx EQ、预加重、去加重)

发送端参数的调优,是整个链路调试的起点。很多人一上来就死磕接收端均衡,其实信号质量好不好,源头先得干净。我做过好几个项目,最后发现接收端怎么调都调不好,回头一看,是发送端预加重根本没开对。嗯,先花点时间把发送端理清楚,后面会省很多事。

预加重(Pre-emphasis)与去加重(De-emphasis)

这两个概念经常被搞混。说白了,它们都是针对高频分量的补偿。高速信号在传输线上衰减,高频成分丢得更多,所以我们要预先“抬”一下高频,或者“压”一下低频。

  • 预加重:在信号跳变沿(高频分量)处,增加幅度,让高频能量更大。参数一般是增益倍数(如 +3dB、+6dB)。
  • 去加重:保持跳变沿幅度不变,降低非跳变沿(平稳段)的幅度。相当于相对突出高频。参数一般是衰减量(如 -3dB、-6dB)。

我个人的习惯:如果链路比较短(比如板内走线 < 5cm),预加重和去加重可以不开,或者只给很小一档。如果走线超过10cm或者经过连接器,基本必须开。记得有个项目,信号眼图始终不张开,我试着把去加重从 -3dB 调到 -6dB,眼高立刻提升了 30%。

参数 原理 常用范围 适用场景
预加重 提升跳变沿幅度 +3dB ~ +9dB 链路衰减中等,高频损失明显
去加重 降低非跳变沿幅度 -3dB ~ -12dB 链路衰减较大,或接收端均衡能力弱

核心经验:预加重和去加重本质是同一件事的两种实现方式。硬件实现上,很多 PHY 只支持一种,或者通过同一组寄存器映射。调试时先看芯片手册,别做无用功。

Tx 均衡器(Tx Equalizer)

Tx EQ 是更通用的说法。它通常包含一个有限冲激响应(FIR)滤波器。通过多个抽头(tap)来预补偿信道的频率响应。最简单的 Tx EQ 有 3 个抽头:前标(pre-cursor)、主标(main cursor)、后标(post-cursor)。

  • Pre-cursor:调节当前符号之前那个符号的影响,通常用于消除码间串扰(ISI)的前沿部分。
  • Main cursor:主抽头,决定信号幅度,一般归一化为 1,调节范围很小。
  • Post-cursor:调节当前符号之后那个符号的影响,补偿通道的后沿拖尾。

实际调试中,我一般先固定 main cursor = 1,然后扫 post-cursor 系数(从 -0.1 到 -0.4 左右),再微调 pre-cursor。曾经有一块板子,跑 UFS 3.0,死活过不了一致性测试。我试了十几种组合,最后发现是 post-cursor 给得太大了,导致眼图中心塌陷。降到 -0.15 之后,一切正常。

调试技巧:如果手头有示波器,先看眼图。如果眼高不够,加大预加重或去加重;如果眼宽不够,减小后标系数。别同时动好几个参数,一步一步来。

发送端参数联合调优流程

你想想看,发送端这几个参数其实是连在一起的。预加重/去加重和 Tx EQ 的抽头系数,最终都会影响驱动器的输出波形。下面这张图是我自己整理的调试流程,比较实用。

发送端参数联合调优流程 1. 确定信道损耗 & 目标速率 2. 选择预加重 or 去加重模式 3. 设置 Main cursor = 1 4. 扫 Post-cursor(-0.05 ~ -0.4) 5. 眼图评估 → 合格? 调整参数 各参数影响 预加重 ↑ → 眼高 ↑ 去加重 ↑ → 眼宽 ↑ Post-cursor ↑ → 眼宽 ↓ Pre-cursor ↑ → 抖动 ↓ Main cursor ↓ → 幅度 ↓

曾经踩过的坑:有次我调 UFS 2.1 的发送端,把去加重和 post-cursor 同时开得很大,结果信号出现过冲,烧了接收端输入保护二极管。硬件同事差点要打我。后来我才明白,预加重/去加重和 Tx EQ 的后标抽头在频率补偿上是重叠的,不能简单叠加。建议先只开一类,另一种保留默认或关掉。

参数设置示例(寄存器配置)

以某款 UFS PHY 为例,发送端参数通常通过 MIPI MPHY 的配置寄存器访问。下面是一段伪代码,展示如何设置 3-tap Tx EQ:

// 伪代码:配置 UFS PHY 发送端 3-tap 均衡器
// 目标:主抽头 = 1.0,前标 = -0.08,后标 = -0.20

UFS_PHY_Write(TX_EQ_CTRL, 0x01);   // 使能 Tx EQ 模块

// 设置各抽头系数(假设有符号 Q8 格式)
UFS_PHY_Write(TX_PRE_CURSOR,  0xF8); // -0.08 的十六进制补码
UFS_PHY_Write(TX_MAIN_CURSOR, 0x80); // 1.0
UFS_PHY_Write(TX_POST_CURSOR, 0xE0); // -0.20

// 设置预加重模式(如果芯片支持)
UFS_PHY_Write(TX_PREEMPHASIS, 0x03); // +6dB

注意不同厂家的寄存器位宽和量化方式不同。我一般先读回默认值,确定是补码格式还是偏移二进制格式,写错一位数,可能眼图就关掉了。

调试中的常见误区

  1. 预加重和去加重同时开到最大——信号会过冲,甚至产生负电压,引发接收端损坏。
  2. 只调发送端不调接收端——发送端只是起点,接收端的 CTLE 和 DFE 同样重要,后面章节再细说。
  3. 盲目参考参考设计的寄存器值——不同 PCB 板材、走线长度、连接器品牌,最佳值差异很大。我习惯在目标板上做 scan,而不是复制粘贴。
  4. 忽略温度变化——高温下铜损增大,预加重可能需要提一档。要是产测只在室温做,到了客户机房可能就误码了。

调试时准备一份参数表格,记录每组系数对应的眼图高度、眼图宽度、抖动 RMS。数据多了,规律自然就出来了。我自己的表格里还会加上温度和电压,方便复现问题。