4. Write Leveling 与 Read Leveling 的区别

写训练(Write Leveling)和读训练(Read Leveling)虽然都叫训练,但解决的是完全不同的问题。很多刚接触 LPDDR4 的工程师容易把这两者搞混,其实只要记住一句话:Write Leveling 是对齐 DQS 与 CK,Read Leveling 是对齐 DQ 与 DQS。嗯,这俩目标不同,流程自然也不一样。

我先说个自己踩过的坑。有一次调试一块四通道 LPDDR4,Write Leveling 怎么都过不去,结果发现是 Read Leveling 的参数设错了。为什么?因为我的上层工具自动把 Write 和 Read 的训练顺序搞反了。从那以后,我习惯在代码里明确区分两个阶段的寄存器配置。

4.1 核心目标差异

直接看这张对比表,你就明白它们各自在干什么。

对比项Write LevelingRead Leveling
对齐对象DQS 与 CKDQ 与 DQS
训练方向控制器 → DRAMDRAM → 控制器
核心指标相位延迟值(tWL)数据眼中心偏移
关键寄存器DFI 接口的写延迟调整读 DQS 门控延迟 + 读 DQ 偏移
信号频率CK 与 DQS 同频(双边沿)DQS 与 DQ 同频(源同步)
物理层影响PCB 走线不等长 + 片上延迟内部 DLL 漂移 + I/O 驱动差异

说白了,Write Leveling 是让控制器发送的 DQS 和 DRAM 接收的 CK 对齐,保证写入时数据能正确锁存。Read Leveling 是让 DRAM 返回的 DQS 和 DQ 在控制器内部对齐,保证读回来的数据不会出错。

4.2 流程步骤对比

两个训练流程的步骤数量和交互方式完全不同。我分别跑一遍,你感受下。

4.2.1 Write Leveling 流程

  1. 控制器进入 Write Leveling 模式(置位 MRW 中的 WL enable)。
  2. DRAM 在 WL 模式下,把写 DQS 输入直接反馈到写 DQ 输出上。
  3. 控制器发送 DQS 脉冲,同时采样 DRAM 返回的 DQ 电平。
  4. 比较 DQ 返回的相位与 CK 的相位关系。
  5. 调整控制器内部的 DQS 延迟,直到 DQ 的翻转边沿对齐 CK 边沿。
  6. 保存延迟值,退出 WL 模式。

关键点:这个过程中 DRAM 是“被动反馈”模式,它不主动调整任何东西,纯粹把输入的 DQS 原样映射到 DQ 上。控制器需要做精细的相位扫描。

4.2.2 Read Leveling 流程

  1. 控制器发送 MRR 指令,让 DRAM 输出已知的数据模式(通常为 0101...)。
  2. DRAM 发送 DQS 和 DQ 信号,控制器采样。
  3. 控制器比较采到的数据与预期模式,计算每位 DQ 的眼图中心位置。
  4. 调整读 DQS 门控延迟(读 DQS 的相位偏移),使采样窗口对准。
  5. 调整每 bit 读 DQ 的独立延迟,补偿走线不等长或芯片内部 skew。
  6. 重复步骤 2-5,直到所有 byte lane 通过。

看到了吧?Write Leveling 只调一个全局的 DQS 延迟,而 Read Leveling 要调 DQS 门控 + 每 bit DQ 偏移,精细度完全不同。

我个人的经验参考: Write Leveling 的延迟值通常在一个 CK 周期内(0~1 个 UI),而 Read Leveling 的延迟可能横跨 2~3 个 CK 周期,因为还要补偿芯片内部 PLL 的相位差。

4.3 信号交互差异

另一个容易忽略的点:两个训练过程中,总线上的信号行为也不同。

  • Write Leveling 时: DRAM 不发送 DQS,只输出 DQ,而且 DQ 上的数据就是 DQS 的“回声”。控制器需要同时盯着自己发出的 DQS 和回来的 DQ。
  • Read Leveling 时: DRAM 既发 DQS 也发 DQ,DQS 是边沿对齐的,DQ 是中心对齐的。控制器要同时采样这两路信号。

为什么会有这个差异?因为 Write Leveling 本质上是调整发射端的延迟,而 Read Leveling 是调整接收端的延迟。发射端和接收端的电路路径完全不同。

曾经有项目因为忽略了这个差异,导致 Read Leveling 训练过程中把 Write Leveling 的寄存器改乱了。 因为两者的延迟寄存器映射到同一个地址的相邻 bit 上,没有做好位掩码保护。嗯,这个坑我已经替你踩过了。

4.4 调试手段对比

我在实际调试中用的工具和方法也不太一样。

调试对象Write LevelingRead Leveling
示波器探头必须同时测 CK 和 DQS(差分探头)必须同时测 DQS 和 DQ(单端探头即可)
观察点DQS 上升沿与 CK 上升沿之间的距离DQ 数据眼相对于 DQS 边沿的位置
失败现象写数据全是 0 或全是 1(因为锁存不到正确边沿)读数据只有某些 bit 出错
补救手段增大 DQS 延迟步进,重新扫描增加 DQ 单 bit 延迟,或调整 DQS 门控相位
常见陷阱芯片内部 DQS 路径存在已知的固定延迟PCB 走线等长没做好导致个别 bit 需要特殊补偿

比如 Write Leveling 失败的时候,我最先做的不是调延迟,而是检查 DQS 和 CK 的走线有没有接反。这种事情真的发生过,样板打回来发现差分对极性反了……

4.5 知识体系结构图

下面这张 SVG 图把两者的差异整理成流程对比,方便你一眼看出全貌。

Write Leveling 与 Read Leveling 流程对比 Write Leveling vs Read Leveling 流程对比 Write Leveling ① 控制器置位 WL enable DRAM 进入反馈模式 ② 发送 DQS 脉冲 DRAM 通过 DQ 返回 DQS 电平 ③ 比较 DQ 与 CK 边沿 逐次逼近相位差 ④ 调整 DQS 延迟 写入 tWL 寄存器 ⑤ 退出 WL 模式 验证写入数据正确性 目标:DQS 边沿对齐 CK vs Read Leveling ① 发送 MRR 指令 DRAM 输出已知数据模式 ② 采样 DQS 与 DQ 控制器存储所有 bit 数据 ③ 定位数据眼中心 比较实际数据与预期模式 ④ 调整 DQS 门控 + DQ 延迟 每 bit 独立补偿 ⑤ 重复扫描直到通过 遍历所有 byte lane 目标:DQ 眼图对齐 DQS 注意:Write Leveling 是单次扫描,Read Leveling 是多次迭代 + 按 bit 独立补偿

4.6 实际调试经验总结

最后分享几个我习惯记住的要点,有时候项目急起来照着这个清单排查就行。

  • 先做 Write Leveling,再做 Read Leveling。 这个顺序不能乱。为什么?因为 Write Leveling 没做好,后面的 Read Leveling 数据都是错的。
  • Write Leveling 失败通常是因为 CK 和 DQS 的静态相位差太大。 我遇到过一块板子因为走线多绕了 1.5 英寸,导致需要 16 个延迟单元才追上。
  • Read Leveling 失败则多半是某根 DQ 走线过长或过短。 我曾经用 TDR 发现有一根 DQ 比同 group 的其他线长了 400mil,单独加了一级延迟就好了。
  • 两个训练过程的寄存器备份策略完全不同: Write Leveling 的值是一次性的,而 Read Leveling 的值需要按温度、电压重新校准。嗯,这个在后续的章节里还会细说。

小技巧: 如果你在调试工具里看到 Write Leveling 的 DQS 延迟值超过了 1 个 CK 周期(比如 DDR4-3200 下超过 625ps),大概率是初始化设置有问题,先检查 DLL 是否锁住。

好了,关于 Write Leveling 和 Read Leveling 的区别就说到这里。你只要记住那张对比表和流程图,以后在项目中遇到任何一个训练失败,都能快速定位是哪个环节出了问题。