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。在初始化阶段,这个时间是可以接受的。但如果是在运行中重新校准(比如温度变化后),就得考虑实时性了。

表1:写均衡时序参数示例(DDR4-2400)
参数 符号 典型值 说明
时钟周期 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 校准流程:从初始化到锁定

写均衡的完整流程,可以分为下面几个步骤。我习惯把它画成一个状态机,这样比较好理解。

  1. 进入写均衡模式:控制器通过MRW(模式寄存器写)命令,设置MR1寄存器,把写均衡使能位(WL_en)拉高。
  2. 发送DQS脉冲:控制器开始连续发送DQS toggle信号。注意,在写均衡模式下,DQS必须连续翻转,不能有间隙。
  3. 等待采样结果:颗粒内部用CK的上升沿采样DQS,结果通过DQ线输出。这个结果在写均衡模式下是实时更新的。
  4. 调整DQS相位:控制器读取DQ线上的结果。如果结果是1(超前),就增加DQS的相位延迟;如果结果是0(滞后),就减少延迟。
  5. 重复步骤2-4:直到采样结果发生跳变(从1变0,或从0变1)。记录下此时的DQS延迟值。
  6. 锁定最佳相位:在跳变点附近,再微调几步,找到最稳定的位置。通常选择跳变点往后延迟1-2个步进,避免噪声误判。
  7. 退出写均衡模式:设置MR1寄存器,关闭写均衡使能位。保存的DQS延迟值用于后续的正常写操作。

避坑指南:我曾经遇到过颗粒一直返回0或者一直返回1,死循环调不下去。原因是DQS和CK的初始相位差太大,超过了控制器的调整范围(2 tCK)。这种情况下,需要先做一次粗略的延迟补偿,比如在PCB设计时就加入固定的延迟线。

3.5 知识结构图:写均衡核心逻辑

下图总结了写均衡的核心逻辑。你可以看到,从控制器发起到颗粒响应,再到相位闭环,整个是一个反馈系统。

写均衡核心逻辑:DQS与CK相位对齐闭环 DDR控制器 发送DQS脉冲 读取DQ反馈 PCB互连 CK/DQS差分对 Fly-by vs 点对点 DDR4颗粒 CK上升沿采样 返回DQ采样结果 相位调整逻辑 步进:1/128 ~ 1/256 tCK 跳变判决 1→0 或 0→1 DQ反馈 调整DQS延迟 关键说明 • 控制器发送DQS → 颗粒用CK采样 → 返回DQ结果 → 控制器调整相位 • 重复直到采样结果发生跳变,锁定最佳相位 • 跳变点往后再加1~2步进,留出噪声余量

3.6 写均衡与读均衡的区别

很多人容易把写均衡和读均衡搞混。我简单说一下区别。

  • 写均衡:对齐DQS和CK的上升沿,保证写数据能被正确采样。调整的是控制器的DQS输出相位。
  • 读均衡:对齐DQS和CK的相位,但目的是让颗粒输出的读DQS与系统时钟对齐。调整的是颗粒的DQS输出相位(通过MPC命令设置)。

读均衡的流程和写均衡类似,但调节对象不同。在实际调试中,我会先搞定写均衡,再做读均衡。写均衡是基础,它不准,后面的都白搭。

实战小贴士:在写均衡阶段,如果你用逻辑分析仪看到DQ线上的跳变边缘很陡峭,没有毛刺,那说明颗粒的采样窗口很干净。如果边缘有抖动,可能需要在PCB层面检查CK和DQS的走线等长,或者在软件里增加滤波次数。