2. 训练时序基础概念:训练的目的、初始化流程归纳总结
好,我们正式开始聊训练时序。很多刚接触 LPDDR4 的同学,一上来就被「训练」(Training)这个词搞懵了。说白了,训练就是让 DRAM 和控制器之间「对好表」—— 对齐时钟相位、校准电压参考、补偿 PCB 走线延迟。没有这步,你板子上的颗粒根本没法正常工作。
我记得刚入行那会儿,有个项目就是跳过了一部分训练流程,结果板子在实验室里跑得好好的,一到客户那边高温老化就频繁报错。查了整整两周,最后发现是 ZQ 校准没做完。从那以后,我对训练流程再也不敢马虎。
2.1 为什么要做训练?
LPDDR4 的速率动辄 3200 Mbps 甚至更高。信号在 PCB 上走 1 厘米,延迟就有 50 ps 左右。同一组 DQ 线如果长度差 5 mm,时序偏差就有 25 ps。你想想看,一个 UI(单位间隔)在 3200 Mbps 下只有 312.5 ps。25 ps 的偏差已经占到 8% 的时序预算。
所以训练的核心目的就三个:
- 消除静态偏差:PCB 走线不等长、芯片封装内的延迟差异、电压温度漂移。
- 建立正确的采样窗口:让 DQS 的边沿正好落在 DQ 数据的中间位置。
- 补偿 PVT 变化:不同批次、不同温度、不同电压下,内部延迟都会变。训练是动态调整的过程。
一句话总结:训练是用硬件在初始化阶段自动完成的「自适应时序对准」。不做训练,高频下 DQ 和 DQS 的关系就是乱的,读出来的数据大概率是错的。
2.2 LPDDR4 初始化流程全景
先看整体流程。我习惯把 LPDDR4 的初始化分成三个阶段:上电与复位 → 寄存器和模式配置 → 训练序列。下面这张图你存着,后续每个章节都会对应到这里面的一块。
个人习惯:我每次布局 phase 2 和 phase 3 之间的时序关系时,都会在仿真里多留出 200 ns 的裕量。因为某些颗粒在 MRW 之后需要额外 tMRD 才能进入训练状态,这个值不同厂家的 datasheet 给得不一样。
2.3 初始化流程的关键时序参数
上表中的参数你必须要熟记,特别是 tINIT3 和 tINIT5。我曾经在一个项目中因为 tINIT5 少给了 100 ns,导致颗粒在低温启动时 CKE 始终无法拉高,以为是焊接问题,最后用示波器一抓才发现是时序不够。
| 阶段 | 参数 | 典型值(3200 Mbps) | 说明 |
|---|---|---|---|
| 上电复位 | tINIT1 | ≥ 200 μs | RESET_n 拉低后保持低电平的最小时间 |
| tINIT2 | ≥ 2 ms | CKE 拉高前,等待时钟稳定和内部初始化完成 | |
| 寄存器配置 | tMRD | ≥ 8 nCK | MRW 命令到下一个命令的间隔 |
| tMRW | ≥ 8 nCK | 多寄存器写入时,每笔之间的间隔 | |
| 训练序列 | tZQINIT | ≥ 1024 nCK | ZQ 校准初始化的最长持续时间 |
| tZQCS | ≥ 128 nCK | ZQ 校准短命令的持续时间 | |
| tDQSAL | ≥ 32 tCK | Write Leveling 进入后 DQS 自动对齐的延迟 |
避坑提醒:别以为 datasheet 里给的 tINIT2 = 2 ms 就完事了。如果你的电源上电斜率很慢,或者 VDD1/VDD2 之间有大的去耦电容,实际稳定时间可能远超 2 ms。我建议在硬件设计中留出 5 ms 以上的 CKE 等待时间,并配合电源监控信号做握手。不然就是卡死在等待状态。
2.4 训练子步骤之间的依赖关系
训练子步骤不是随便排的。你看图里的箭头也能猜到,ZQ 校准必须在前面,因为后面的 CA 训练和 Leveling 都需要知道准确的输出阻抗。写 Leveling 又依赖 CA 训练完成后的命令通路是否正确。
我把常见的依赖关系整理成列表,这样你查起来方便:
- ZQ 校准 → 为所有输出驱动器和 ODT 提供参考阻抗。必须先做。
- CA 训练 → 调整命令/地址总线的建立保持时间。需要在 ZQ 校准之后,且 MR 寄存器中使能 CA 训练。
- Write Leveling → 调整 DQS 相对于 CK 的相位,确保写操作时 DQS 边沿对齐 CK。依赖 CA 训练完成。
- Read DQS 门控训练 → 精确控制 DQS 接收窗口的开始/结束位置,防止读取时采样到空闲状态。依赖 Write Leveling。
- 眼图训练(可选) → 针对读写数据眼图中心的精细微调,常见于高速率下。排在最后。
这里有个容易忽略的点:有些控制器把「Read DQS 门控训练」和「Read 眼图训练」合并成一步,但两者的物理实现不同。门控训练是找 DQS 的前沿和后沿,眼图训练是找 DQ 采样的最佳相位。如果合并做,你可能无法单独 debug 门控失败的问题。
我的做法:在开发阶段把每个子步骤拆成独立的函数,每个步骤都返回成功/失败标志,并打印出最终调整的延迟步进值。这样如果后续量产时某个工位出现训练失败,可以直接定位到是哪个 step 出了问题。
2.5 训练失败后的重试机制
理论上,训练一次就能成功。但实际中,由于噪声、电源毛刺、温度瞬变,偶尔会卡在某个步骤。LPDDR4 标准允许控制器重试训练,但重试前必须满足一些条件:
- 重试前要先将相关 MR 寄存器恢复为初始值(比如 ZQ 校准配置)
- 连续重试次数建议不超过 3 次,否则可能在 RTL 里出现死循环
- 重试间隔至少留出 50 个 tCK,让 DRAM 内部状态复位
我见过最离谱的 case 是:某平台在 -40°C 下 ZQ 校准一直超时,连续重试了 16 次,最后把 PMIC 的电流都拉爆了。后来发现是 ZQ 电阻的 PCB 布局离颗粒太远,寄生电容太大导致校准时间变慢。解决方案是把 tZQINIT 的值从 1024 nCK 改成 2048 nCK,一次就过了。
经验值:如果你在量产时发现某个温度点训练失败率高,先把相关的训练延时参数放大 1.5 倍试试。这是最便宜的容差手段。但注意,别放得太大,否则会影响初始化时间。
2.6 小结一下
这一章我们梳理了 LPDDR4 训练的基础:为什么要做、整个初始化流程长什么样、各阶段的关键参数,以及子步骤之间的依赖。训练时序本质上是在跟硬件特性博弈 —— 你的 PCB 走线、电源完整性、温度范围,都会影响哪个步骤需要多长的时间。
后面我们会一个步骤一个步骤地深入。你先把这张流程图画在脑子里,遇到 training 问题的时候,先问自己:我目前走到哪一步了?这一步的参数给够了没有?