第2章 Write Leveling 原理与目的

2.1 我们为什么要做 Write Leveling?

LPDDR4 的写操作,说白了就是要让 DQS 和 CK 对齐。你想想,芯片内部时钟树走线那么长,PCB 上信号传播也有延迟,DQS 和 CK 到达每个 DRAM 颗粒的时间肯定不一样。如果不做对齐,写数据时 DQ 跟 CK 的时序窗口就非常窄,甚至完全错开,数据就跑飞了。

我个人习惯把 Write Leveling 比作「找相位零点」。训练的目标就是让 DQS 的上升沿正好落在 CK 的上升沿附近,误差控制在几十皮秒内。这个精度,靠手工调是搞不定的,必须让控制器和 DRAM 自动训练。

核心目标:通过调整 DQS 输出延迟,使 DQS 与 CK 的边沿对准,为后续的 Write DQ 训练建立参考基准。

2.2 相位对准的底层机制

DQS 和 CK 相位对准分两步走。

  1. 粗调——DRAM 内部用 DLL 先将 DQS 锁定到 CK 的固定相位关系(比如 90° 或 180°)。
  2. 细调——控制器通过 Write Leveling 命令逐步微调 DQS 延迟,直到采样到正确的反馈值。

具体怎么微调?控制器会发送连续的 Write Leveling 请求。DRAM 在收到请求后,会把 CK 的边沿信息通过 DQ 反馈回来。控制器判断反馈是高还是低,就知道当前的 DQS 相位是超前还是滞后。然后像二分法搜索一样,调整延迟寄存器,最终收敛到最佳点。

我有个经验:第一次调 LPDDR4 时,我忽略了一个细节——DRAM 的 DLL 锁定时间很长,必须等 DLL 稳定后再开始 Write Leveling,否则反馈全是乱的。那次折腾了两天才发现是初始化时序顺序错了。

一个实用的检查点:在开始 Write Leveling 之前,先读一下 DRAM 的 MR3(模式寄存器),确认 DLL 已经锁定。如果锁定标志位没置起,千万别往下走。

2.3 关键时序参数对照表

Write Leveling 涉及几个 JEDEC 标准参数,我列在下面。调试时这几项必须逐条核对。

参数 描述 典型值 (LPDDR4-3200)
tDQSS DQS 上升沿到 CK 上升沿的时间差 ±0.25 tCK
tDSS DQS 到 CK 的建立时间 0.15 tCK
tDSH DQS 到 CK 的保持时间 0.15 tCK
tWLMRD Write Leveling 模式寄存器更新时间 40 ns
tWLDQSEN Write Leveling DQS 使能到第一个 DQS 脉冲的时间 25 ns

嗯,这里要注意:tDQSS 的窗口非常窄。如果板级走线延迟差异超过 50ps,直接就跑不到标称频率了。

2.4 Write Leveling 训练流程图

下面这张图是我画的标准训练流程,也是我调试时贴在工位上的参考。每一个菱形判断框都可能藏着坑。

Write Leveling 训练流程 初始化 DDR 控制器 发起 MRW 进入 WL 模式 控制器发送 DQS 脉冲 读取 DQ 反馈值 反馈跳变? 否 调整 DQS 延迟 是 锁定 DQS 延迟寄存器 WL 训练完成 注意 反馈状态为 0→1 或 1→0 的临界点即为最佳延迟

我曾经踩过的一个坑:流程图中“读取 DQ 反馈值”这一步,我漏掉了等待时间 tWLDQSEN。当时 DQS 脉冲发出去后马上就读 DQ,结果读到的全是上次训练残留的数据。加了 30ns 等待后,一切正常。

2.5 避坑指南:三个容易忽略的细节

  • DRAM 的 ODT 配置:Write Leveling 期间 ODT 必须关闭,否则反馈信号会被端接电阻拉偏。我见过一个案例,ODT 没关导致 DQ 反馈始终是中间电平,训练永远找不到跳变点。
  • 温度漂移:LPDDR4 的 DLL 延迟对温度很敏感。量产测试时,如果常温调好的参数拿到高温箱里跑,Write Leveling 可能直接失败。建议做全温度范围的余量测试。
  • 多 Die 堆叠的 LPDDR4:每个 Die 的 DQS 延迟可能不同。有些控制器只对 Rank 0 训练一次,然后全 Rank 复用同一个延迟值。我遇到过一个项目,Rank 1 的 DQS 需要额外加 50ps 补偿,不做单独训练就会冒泡。

我的调试小工具:我会在固件里把每个 Rank 的 DQS 延迟值打出来,格式化成表格,跟 SI 仿真结果对比。如果实测值偏离仿真超过 ±2 个 step,肯定有地方不对,不用犹豫,直接查走线或电源噪声。

2.6 训练结果验证

Write Leveling 完成后,一定要做目测验证。我习惯用示波器抓到 DQS 和 CK 的波形,用余辉显示模式看边沿抖动。如果两条边沿重合区域至少有 0.2 tCK 的窗口,那基本就稳了。

另一个快速验证方法:把控制器配置成写 DQ 固定 pattern(比如 0xAA/0x55),然后读回来对比。如果连续读写 1000 次不出错,说明 Write Leveling 的基准已经打好了。不过这只是入门检查,真正的压力测试要等后面 Write DQ 训练做完再跑。

说白了,Write Leveling 就是整个 LPDDR4 训练的基石。地基歪了,楼盖得再高也是危房。我在项目评审时一定会要求看 WL 的余量报告,没有这个文档,review 直接打回。