3. 写均衡的工作原理:DQS与CK的对齐机制
说起写均衡,我刚开始接触DDR4的时候,也觉得这东西挺玄乎。说白了,它就是解决一个物理上的老大难问题——命令/地址(CA)信号和时钟(CK)从控制器飞到颗粒,走的是不同的路径,到达时间肯定不一样。
你想想看,DDR4频率动不动就上2400MT/s、3200MT/s,一个UI(单位间隔)才300多皮秒。CA信号要是晚到了半个时钟周期,那这写命令就废了。写均衡(Write Leveling)就是干这个的——它让DQS和CK在颗粒的管脚上对齐。嗯,我个人习惯叫它“相位调零”。
3.1 为什么要对齐?信号飞行时间的差异
在DDR4的拓扑结构里,CK信号是差分对,走的是Fly-by(飞越)拓扑,从控制器出发,经过每个颗粒,最后到终端电阻。而DQS信号是点对点的,直接从控制器拉到对应的颗粒。
这两种走线方式,长度不一样,延时自然也不一样。我在项目中遇到过一块板子,CK走线长了2000多mil,结果写操作时DQS比CK早到了半个周期,数据根本写不进去。
CK和DQS的到达时间差,主要来自这三部分:
- PCB走线长度差:Fly-by拓扑的CK绕来绕去,总比点对点的DQS长。
- 颗粒内部延迟:每个颗粒的输入缓冲、时钟树分配,都有差异。
- 温度/电压变化:PVT(工艺、电压、温度)波动会改变信号传播速度。
写均衡的目的,就是通过调整控制器发出的DQS相位,让它在每个颗粒的管脚上,跟CK的上升沿对齐。注意,是对齐在上升沿,不是下降沿。
核心要点:写均衡只调整DQS的相位,不变CK。CK是全局参考,DQS是跟着CK走的。
3.2 对齐机制:DQS相位步进与CK采样的博弈
具体是怎么对齐的?JEDEC(固态技术协会)定义了一套细细调整的机制。
首先,控制器会进入写均衡模式(通过MRW命令设置MR1寄存器)。然后,控制器持续发送特定的DQS脉冲——我记得标准里要求是连续的DQS toggle,不能有间隙。颗粒收到这个DQS后,内部用CK的上升沿去采样DQS。
如果DQS的上升沿比CK的上升沿来得早,颗粒采到的就是高电平(逻辑1)。如果DQS来得晚,采到的就是低电平(逻辑0)。颗粒把这个采样结果通过DQ引脚返回给控制器。
控制器根据反馈,就知道现在是超前还是滞后了。然后呢,它会调整DQS的相位延迟,一般是以1/128或1/256个tCK(时钟周期)为步进。重复这个过程,直到颗粒的采样结果从1跳变到0,或者从0跳变到1。
这个跳变点,就是DQS和CK对齐的位置。
我曾经调试过一款服务器主板,写均衡就是没通过。结果用逻辑分析仪抓了DQS和CK的波形,发现DQS的抖动太大,采样结果一直在0和1之间来回跳,根本找不到稳定的跳变点。后来发现是DQS的参考电压VrefDQ不稳,加了个去耦电容就好了。
实战小技巧:逻辑分析仪看写均衡的时候,别只看DQS和CK的边沿。把颗粒返回的DQ信号也抓上。DQ上的跳变模式,能直接告诉你当前的相位关系。
3.3 时间预算:每一步有多少时间可以挥霍
写均衡的时间预算,其实挺紧张的。我们来算一笔账。
假设DDR4跑在2400MT/s,tCK(时钟周期)大约是416ps。写均衡的步进一般是1/128 tCK,也就是约3.25ps。控制器的DQS相位调整范围,通常是0到2个tCK,也就是832ps。
那整个过程需要多少步?最多 2 tCK / (1/128 tCK) = 256步。每次调整后,还要等颗粒采样并返回结果,这个往返时间(round-trip delay)至少需要几个tCK。
所以,一次完整的写均衡校准,可能需要几百个tCK。在初始化阶段,这个时间是可以接受的。但如果是在运行中重新校准(比如温度变化后),就得考虑实时性了。
| 参数 | 符号 | 典型值 | 说明 |
|---|---|---|---|
| 时钟周期 | tCK | 416 ps | DDR4-2400的标称值 |
| 写均衡步进 | tWLS | 1/128 tCK | 约3.25 ps |
| 相位调整范围 | — | 0 ~ 2 tCK | 最大可调832 ps |
| 采样往返延迟 | tWL_RD | 5 ~ 10 tCK | 取决于颗粒和走线 |
嗯,这里要注意,tWLS(写均衡步进)不是每个颗粒都一样。我见过一些低成本内存条,tWLS的精度很差,有的步进甚至达到了1/64 tCK,这样对齐的精度就下降了。
3.4 校准流程:从初始化到锁定
写均衡的完整流程,可以分为下面几个步骤。我习惯把它画成一个状态机,这样比较好理解。
- 进入写均衡模式:控制器通过MRW(模式寄存器写)命令,设置MR1寄存器,把写均衡使能位(WL_en)拉高。
- 发送DQS脉冲:控制器开始连续发送DQS toggle信号。注意,在写均衡模式下,DQS必须连续翻转,不能有间隙。
- 等待采样结果:颗粒内部用CK的上升沿采样DQS,结果通过DQ线输出。这个结果在写均衡模式下是实时更新的。
- 调整DQS相位:控制器读取DQ线上的结果。如果结果是1(超前),就增加DQS的相位延迟;如果结果是0(滞后),就减少延迟。
- 重复步骤2-4:直到采样结果发生跳变(从1变0,或从0变1)。记录下此时的DQS延迟值。
- 锁定最佳相位:在跳变点附近,再微调几步,找到最稳定的位置。通常选择跳变点往后延迟1-2个步进,避免噪声误判。
- 退出写均衡模式:设置MR1寄存器,关闭写均衡使能位。保存的DQS延迟值用于后续的正常写操作。
避坑指南:我曾经遇到过颗粒一直返回0或者一直返回1,死循环调不下去。原因是DQS和CK的初始相位差太大,超过了控制器的调整范围(2 tCK)。这种情况下,需要先做一次粗略的延迟补偿,比如在PCB设计时就加入固定的延迟线。
3.5 知识结构图:写均衡核心逻辑
下图总结了写均衡的核心逻辑。你可以看到,从控制器发起到颗粒响应,再到相位闭环,整个是一个反馈系统。
3.6 写均衡与读均衡的区别
很多人容易把写均衡和读均衡搞混。我简单说一下区别。
- 写均衡:对齐DQS和CK的上升沿,保证写数据能被正确采样。调整的是控制器的DQS输出相位。
- 读均衡:对齐DQS和CK的相位,但目的是让颗粒输出的读DQS与系统时钟对齐。调整的是颗粒的DQS输出相位(通过MPC命令设置)。
读均衡的流程和写均衡类似,但调节对象不同。在实际调试中,我会先搞定写均衡,再做读均衡。写均衡是基础,它不准,后面的都白搭。
实战小贴士:在写均衡阶段,如果你用逻辑分析仪看到DQ线上的跳变边缘很陡峭,没有毛刺,那说明颗粒的采样窗口很干净。如果边缘有抖动,可能需要在PCB层面检查CK和DQS的走线等长,或者在软件里增加滤波次数。