DQS与CK的时序关系详解

好,咱们接着聊。上回我把Write Leveling的整体框架搭完了,这一章咱们得扎进去看最核心的东西——DQS和CK到底怎么对齐。

做DDR接口设计的兄弟都知道,Write Leveling说白了就是让DQS的边沿找到CK的上升沿,然后乖乖待在那个窗口里。可实际跑起来,这两根线的关系比谈恋爱还复杂。嗯,我来拆开说。

1. 为什么非要对齐CK?

DDR内存颗粒内部,所有命令和地址都是
在CK的上升沿采样的。而你发送的写数据(DQ)
是跟着DQS走的。如果你DQS跟CK差得太远,
颗粒根本不知道你什么时候送的数据。

⚠ 我曾经在这里踩过一个坑: 某次测试发现写数据偶尔成功偶尔失败,排查了三天,最后发现DQS和CK之间在PLL输出端就有几十ps的静态偏移。因为我在PCB布局时没做等长处理,结果Write Leveling调了半天也没把窗口找到。

所以,Write Leveling的第一步,就是让颗粒看到的DQS和CK之间的相位差落在规定的“调平窗口”内。你想想看,这个窗口有多窄?

2. 核心时序参数一览

我这列个表,咱们对照着看,这些参数在JEDEC规范里都有明确定义:

参数全称含义DDR4典型值设计意义
tDQSSDQS上升沿到CK上升沿的建立时间±0.25 tCKDQS必须在这个范围内驱动
tDSSDQS到CK的建立时间(写调平)+0.2 tCKDQS不能晚于这个值
tDSHDQS到CK的保持时间(写调平)+0.2 tCKDQS不能早于这个值
tDQSLDQS低电平脉冲宽度0.4~0.6 tCK保证Preamble宽度
tDQSHDQS高电平脉冲宽度0.4~0.6 tCK保证Postamble宽度

你看这里最关键的其实是tDQSS。它规定DQS的上升沿必须落在CK上升沿±0.25个时钟周期内。咱们做Write Leveling时,就是通过调整每个颗粒的DQS延迟,让所有颗粒的DQS都挤进这个窗口。

3. 抖动的麻烦

说到窗口,就不能不提抖动(jitter)。CK和DQS不是理想方波,它们身上都背着随机抖动和确定性抖动。我曾经在高速示波器上抓过DQS的边沿,发现它的抖动直方图能把窗口吃掉一半。

总结一下抖动的来源:

  • PLL噪声:锁相环的相位噪声会直接跑到CK和DQS上,两者相关抖动(与PLL相关)能对消一部分,但非相关部分不行。
  • 电源噪声:我见过最头疼的问题就是DDR PHY的供电纹波,低频纹波让DQS的延迟产生周期性变化,Write Leveling的校准结果可能一秒钟就变了。
  • ISI(码间干扰):当DQS走长线时,前一个边沿的反射会影响当前边沿的判决电平,造成确定性抖动。
  • 串扰:DQS旁边跑的DQ信号,会因为容性耦合给DQS带来微小的时间偏移。

所以在做Write Leveling时序窗口优化时,咱们不能只看静态的采样点,还得留足抖动预算。我个人习惯留出至少0.1 tCK的margin(余量),否则稳定性堪忧。

4. 实际调平过程:从粗调到细调

写一下DDR控制器里常用的调平算法流程(伪代码示意),你读完就知道了:

// Write Leveling 粗调 —— 扫描DQS延迟
for each byte-lane:
    set DQS delay = 0
    send write leveling pattern (2CK低电平)
    for delay_step = 1 to 512:
        increment DQS delay by 1/32 tCK
        read back FIFO status
        if FIFO empty: 
            记录第一次出现空的位置 A
        if FIFO full:  
            记录第一次变满的位置 B
    t_wl_window = B - A
    set target_delay = (A + B) / 2   // 取窗口中心

// 细调 —— 加一比特延迟微调
for each bit within byte-lane:
    adjust per-bit DQS skew using DQ-DQS phase detector
💡 我的实战建议: 粗调阶段一定要扫完整个可能的延迟范围。有些芯片号称支持512个step,但实际可能只有300步有效,扫到底你才知道真实窗口在哪。

5. 来个直观的图:DQS与CK相位对齐示意图

说了这么多,不如直接画张图把关键点串起来。我画的是DQS(蓝色)和CK(红色)在Write Leveling过程中的相位关系,包含抖动边界和调平窗口:

Write Leveling 中 DQS 与 CK 的相位对齐关系 CK n n+1 n+2 n+3 n+4 n+5 DQS1 (初始) 延迟调整 DQS2 (调平后) 抖动边界 ±0.1tCK 调平窗口 ±0.25 tCK 关键观测点 ● A点:FIFO从空变满 ● B点:FIFO从满变空 ● 中心 = (A+B)/2 数据有效窗口(Data Eye) DQ采样点 DQ采样点

这个图把整个流程说清楚了:

  1. 上方蓝色的一排是CK的上升沿,间隔一个tCK。
  2. 红色半透明的DQS1是初始位置,离最近的CK太远,不在tDQSS窗口内。
  3. 延迟调整后,DQS2(绿色)落在了CK上升沿附近,且考虑了抖动边界(橙色虚线)。
  4. 紫色虚线框是调平窗口±0.25tCK,调平后的DQS要待在里面。
  5. 下方的数据眼示意:DQS找到位置后,DQ才能在正确的眼中心被采样。

6. 个人常用的避坑清单

经验说多了都是泪,直接上干货:

  • 先用示波器看裸眼:我习惯在设计验证阶段,直接拿示波器抓颗粒脚的DQS和CK。眼睛看到的才是真的,仿真经常过于理想。
  • 写调平不能只过一次:温度变化、电压变化都会改变PLL延迟,所以量产测试需要在高温和低温各做一次Write Leveling校准。
  • 注意DQS的Preamble:DQS在写操作前需要拉低至少一个tCK作为前导符。有些控制器在调平时忽略了Preamble,结果读到的FIFO状态全是错的。
  • 颗粒之间的skew:同一片DDR颗粒内不同byte-lane的延迟可能差几十ps,不能只调一个DQS就完事,要每条lane独立调。
✨ 一句话总结: DQS与CK的对齐不是找一个点,而是在一个存在抖动和skew的窗口里找最稳的中心点。留足余量,扫全范围,然后相信你的FIFO读数。