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 Leveling | Read Leveling |
|---|---|---|
| 对齐对象 | DQS 与 CK | DQ 与 DQS |
| 训练方向 | 控制器 → DRAM | DRAM → 控制器 |
| 核心指标 | 相位延迟值(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 流程
- 控制器进入 Write Leveling 模式(置位 MRW 中的 WL enable)。
- DRAM 在 WL 模式下,把写 DQS 输入直接反馈到写 DQ 输出上。
- 控制器发送 DQS 脉冲,同时采样 DRAM 返回的 DQ 电平。
- 比较 DQ 返回的相位与 CK 的相位关系。
- 调整控制器内部的 DQS 延迟,直到 DQ 的翻转边沿对齐 CK 边沿。
- 保存延迟值,退出 WL 模式。
关键点:这个过程中 DRAM 是“被动反馈”模式,它不主动调整任何东西,纯粹把输入的 DQS 原样映射到 DQ 上。控制器需要做精细的相位扫描。
4.2.2 Read Leveling 流程
- 控制器发送 MRR 指令,让 DRAM 输出已知的数据模式(通常为 0101...)。
- DRAM 发送 DQS 和 DQ 信号,控制器采样。
- 控制器比较采到的数据与预期模式,计算每位 DQ 的眼图中心位置。
- 调整读 DQS 门控延迟(读 DQS 的相位偏移),使采样窗口对准。
- 调整每 bit 读 DQ 的独立延迟,补偿走线不等长或芯片内部 skew。
- 重复步骤 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 Leveling | Read 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 图把两者的差异整理成流程对比,方便你一眼看出全貌。
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 的区别就说到这里。你只要记住那张对比表和流程图,以后在项目中遇到任何一个训练失败,都能快速定位是哪个环节出了问题。