4. 初始化与训练流程:MR寄存器配置、ZQ校准序列、Read/Write Leveling训练
显存初始化,说白了就是让GPU和GDDR6颗粒「对上话」。我刚开始接触GDDR6时,总觉得这步就是写几个寄存器的事。直到有一次板卡上电后死活跑不起来,示波器一抓,DQS和CK的相位完全是乱的……嗯,从那以后我再也不敢轻视初始化流程了。
今天咱们就把GDDR6初始化的三个核心环节拆开揉碎讲清楚:MR寄存器配置、ZQ校准、Read/Write Leveling训练。这三步走不对,后面性能调优全是白搭。
核心观点:GDDR6初始化不是简单的「写寄存器」,而是一个闭环训练过程。MR配置定基调,ZQ校准稳阻抗,Leveling训练对齐时序。三步缺一不可。
4.1 MR寄存器配置——打好地基
GDDR6有8个模式寄存器(MR0~MR7),每个寄存器8位。上电后第一件事就是通过MRS命令把这些寄存器配好。我个人习惯按这个顺序来:
- MR0:设置CAS延迟(CL)、写入延迟(WL)、突发长度(BL8/BL16)。GDDR6默认BL16,但有些场景需要BL8,注意别搞混。
- MR1:驱动强度(Drive Strength)和ODT(片上端接)。这里有个坑——驱动强度不是越大越好,我见过有人为了「信号强」把驱动调到最大,结果反射噪声反而更严重。
- MR2~MR3:时序参数,比如tCCD、tRRD、tFAW。这些参数跟频率强相关,别照搬参考设计,一定要根据实际跑频来算。
- MR4~MR7:训练相关配置,包括ZQ校准周期、Leveling使能等。
我的经验:写MR寄存器时,建议每写完一个寄存器就回读校验一次。GDDR6的MRS命令没有ACK响应,不回读你根本不知道写没写进去。我曾经因为PCB走线过长导致MRS命令时序违规,查了整整两天才定位到问题。
4.2 ZQ校准序列——阻抗匹配的艺术
ZQ校准说白了就是让DDR颗粒内部的输出驱动器和ODT电阻的阻抗稳定在目标值(通常是240Ω)。GDDR6支持两种校准命令:
| 命令 | 全称 | 校准时间 | 使用场景 |
|---|---|---|---|
| ZQCL | ZQ Calibration Long | ~512 tCK | 上电初始化、温度变化超过10°C |
| ZQCS | ZQ Calibration Short | ~64 tCK | 正常工作时的周期性校准 |
为什么会分长短两种?你想想看,ZQCL做一次完整校准,内部比较器要逐次逼近,耗时较长。而ZQCS只做微调,速度快但精度有限。我建议初始化时做一次ZQCL,之后每1~2ms做一次ZQCS就够了。
注意:ZQ校准期间,颗粒不能响应读写命令。如果你在ZQ校准过程中发了读写请求,颗粒会直接忽略。我曾经在调试时发现数据偶尔出错,抓了半天波形才发现是ZQ校准和读操作冲突了。
ZQ校准的流程大致如下:
// 伪代码:ZQ校准序列
1. 上电后等待 tINIT(至少 500μs)
2. 发送 ZQCL 命令
3. 等待 tZQCL(最长 512 tCK)
4. 读取 MR4 的 ZQ 状态位,确认校准完成
5. 进入正常工作模式,周期性发送 ZQCS
6. 每次 ZQCS 后等待 tZQCS(最长 64 tCK)
4.3 Read Leveling——让读数据不再「漂移」
Read Leveling的目的是调整DQS和CK之间的相位关系,确保读数据时DQS能正确选通数据。GDDR6的Read Leveling分两步:
- 粗调:通过调整DQS的延迟链,把DQS的上升沿对齐到CK的上升沿。这一步通常以1/4 tCK为步进。
- 微调:在粗调基础上,进一步调整DQS的相位,找到最佳采样窗口。这一步需要结合眼图测试。
我个人的调试习惯是:先用Read Leveling训练找到DQS的初始相位,然后在这个基础上±1/8 tCK扫描,看哪个相位下数据眼图张开最大。别迷信训练结果,训练算法找的是「能工作」的点,不一定是最优的点。
关键指标:Read Leveling完成后,DQS与CK的相位差应小于 ±0.1 tCK。如果偏差超过0.2 tCK,说明PCB走线长度匹配有问题,需要检查layout。
4.4 Write Leveling——写数据也要「对齐」
Write Leveling和Read Leveling类似,但方向相反——它调整的是控制器发出的DQS与颗粒内部CK的相位关系。GDDR6的Write Leveling训练过程:
- 控制器发送连续的DQS脉冲
- 颗粒在内部CK的上升沿采样DQS
- 控制器调整DQS的延迟,直到采样结果稳定在0→1的跳变点
- 锁定延迟值,写入MR寄存器
这里有个容易忽略的点:Write Leveling训练时,颗粒会忽略所有写数据,只关注DQS的相位。所以训练完成后,一定要发一个写命令验证一下,确保数据能正确写入。
避坑指南:我曾经在Write Leveling训练时发现DQS延迟值跳变很大,每次训练结果都不一样。后来发现是颗粒的供电纹波太大,导致内部PLL抖动。加了去耦电容后,训练结果就稳定了。所以,Leveling训练不稳定时,先查电源质量。
4.5 训练完成后的验证
初始化训练完成后,别急着跑性能测试。先做几个基本验证:
- 读写校验:写一组已知数据(比如0xA5A5A5A5),读回来对比。多试几个地址,覆盖不同Bank和Row。
- 压力测试:连续读写1000次,看有没有偶发错误。我一般用March C算法做内存测试。
- 温度漂移测试:给颗粒加热(比如用热风枪吹到85°C),看训练结果是否还能保持稳定。
嗯,初始化训练这块内容比较多,但每一步都绕不开。你只要把MR配置、ZQ校准、Read/Write Leveling这三个环节吃透了,GDDR6的调试就算入门了。后面咱们再聊更深入的性能调优——比如如何通过调整时序参数来压榨带宽。
一句话总结:初始化训练是GDDR6稳定工作的基石。MR配置定规矩,ZQ校准稳阻抗,Leveling训练对齐时序。三步走完,才能谈性能。
公众号:蓝海资料掘金营,微信deep3321