3. CA训练基本原理:Write Leveling与Read Training

今天我们来聊聊CA训练里最核心的两个环节——Write Leveling和Read Training。说白了,它们是DDR4/LPDDR4颗粒和控制器之间建立正确读写关系的基础。我个人习惯把它们比作两个人握手:Write Leveling是搞清楚对方的手在哪里,Read Training是学会怎么清晰地听对方说话。

3.1 Write Leveling:对齐写入的相位

Write Leveling解决的是DQS和CK之间的相位关系。你想想看,控制器发出的写命令和数据选通信号(DQS),到达颗粒时,因为PCB走线长度、负载差异等原因,会引入固定的延时。颗粒内部需要用CK来采样DQS,如果相位不对,数据就写不进去。

基本原理是什么?

颗粒在Write Leveling模式下,会把DQS当作输入,CK当作参考。颗粒内部会反馈一个信号,告诉控制器当前的DQS和CK是否对齐。控制器会调整DQS的延时,直到找到正确的相位。

我在项目中遇到过一块板子,Write Leveling老是失败,最后发现是DQS和CK的布线长度差了快500 mil。嗯,这个偏差已经超过了DDR4规范允许的容限。后来通过调整控制器的DQS延时补偿,才算勉强搞定。

具体步骤可以归纳为:

  1. 控制器发送Write Leveling命令进入该模式。
  2. 颗粒持续输出反馈信号,指示DQS和CK的相位关系。
  3. 控制器调整DQS的延时(通过DQS2DQ或类似机制)。
  4. 找到相位对齐点后,控制器固定该延时值。

一个小技巧:通常在调试时,我会把Write Leveling的搜索范围设置得宽一些,比如±1个UI(Unit Interval),确认收敛后再缩小范围。这样可以避免因初始相位差太大导致无法锁定。

3.2 Read Training:优化读取的眼图

Read Training比Write Leveling复杂一点。它不光要解决相位问题,还要解决数据眼图(Data Eye)打开后怎么采到最稳定的点。

颗粒在读取数据时,DQS和DQ是边沿对齐的。控制器内部需要把DQS做90度或180度相移,才能采样到DQ中间。这个相移如果不准,DQ的眼图虽然开着,但采样点落在边沿或靠近边沿,就容易出错。

为什么需要Read Training?

因为温度和电压的变化,PCB上的传输延时也在变。刚上电时眼图可能很完美,跑了一个小时后,DQS的相位可能漂了半个UI。这就是为什么要定期做Read Training。我记得有一款LPDDR4颗粒对温度特别敏感,每隔几秒就得重新训练一次。

Read Training的常用方法是:

  • Margin-based Training:通过调整DQS的相移范围,找到眼图左右两侧的失效边界,然后取中间点。
  • VREF Training:调整DQ的参考电压,找到垂直方向上的最优眼高。

我曾经踩过一个坑:Read Training时只看单次采样的结果,忽略了对多个burst的统计。结果训练出来的相位,在小数据量下没问题,一跑大吞吐量就崩溃。后来我强制要求至少做连续64次采样取中间值,问题就解决了。

⚠️ 注意:Read Training的结果只能保证在当前温度电压下最优。如果系统工作环境变化剧烈,建议在空闲时重新执行Training,或者采用后台不间断的Training方式。

3.3 两者的核心差异

我整理了一张表,把Write Leveling和Read Training的关键区别列出来:

对比项 Write Leveling Read Training
目的 对齐DQS与CK的相位 优化DQ采样点在眼图中的位置
约束 主要受PCB走线长度影响 受温度、电压、频率、链路噪声影响
时钟域 CK与DQS(写方向) DQS(读方向)与内部时钟
执行时机 通常在初始化阶段完成 初始化时做,运行中可能需要重训练
结果 一个固定的延时补偿值 一个相移和VREF的组合

你想想看,如果没有Write Leveling,写入的数据时机都是乱的,后面的Read Training就更无从谈起。所以调试时,我会先把Write Leveling调稳了,再去看Read Training的余量。

3.4 两者的协作流程

下图展示的是CA训练中,Write Leveling和Read Training在系统初始化时的执行顺序和关系:

Write Leveling 与 Read Training 协作流程 训练启动 Write Leveling 对齐DQS与CK相位 是否通过? 调整延时 通过 Read Training 优化采样点和VREF 训练完成 DQS and DQ per-byte lane individual training

从图上可以看得很清楚:Write Leveling是前提条件,失败后需要不断调整延时重新尝试。等它过了,才进入Read Training。Read Training不只是做一次,根据颗粒特性和系统要求,它可能需要定期重做。

我个人的调试经验是,当系统出现CA训练失败时,优先检查Write Leveling的log。如果它都没过,Read Training的报错多半是假象。先把Write Leveling的延时值锁定好,再去看Read Training的margin,效率会高很多。

关键总结:

  • Write Leveling负责把DQS和CK搞对齐,保证数据能正确写入。
  • Read Training负责把采样点放在眼图正中间,保证数据能正确读出。
  • 两者有严格的先后依赖关系:Write Leveling失败则一切免谈。
  • 实际调试时,先用多burst统计看Read Training的稳定性,不要被单次成功迷惑。