4. DQS 信号训练:门控、漂移与延迟链

DQS 信号,说白了就是 DDR 的节拍器。它本身不传数据,但数据读写的节奏全靠它来对齐。这一节我们聊聊 DQS 训练里三个最让人头疼的问题:门控不准、漂移没拦住、还有抖动这个幽灵。

个人习惯:我检查 DQS 训练结果时,从来不看单个窗口有多大。我更关心窗口的左右边界余量。如果左右余量不对称,我会先怀疑延迟链的初始相位设偏了。

4.1 DQS 门控与 DQS 漂移

DQS 门控,英文叫 DQS Gating。它是一道时间闸门,告诉控制器:现在 DQS 信号要来了,准备接收。闸门开早了,读到的是噪声;闸门开晚了,数据的前几个 bit 就丢了。

我在一个项目里遇到过整批 0x00 读回全是 0xFF 的怪事。排查到最后,发现就是 DQS 门控的开启时间点跑到了有效数据窗口外面去。当时我们用的是一颗边缘工艺的颗粒,温度一上去,DQS 的到达时间就飘了。

为什么会漂移? 主要原因就两个:

  • 电压变化:VDDQ 波动会改变 I/O 缓冲区延迟,DQS 的传输路径长度等效变化。
  • 温度变化:PCB 走线和封装内的信号传播速度随温度改变,每 °C 影响约 5-10 ps。

你想想看,DQS 和 DQ 虽然在物理上走线等长,但芯片内部 buffer 的延迟特性并不完全相同。温度一跑,两个信号之间就有了相位差。这个相位差就是 DQS 漂移的源头。

DQS 门控窗口的生存法则:训练出的门控窗口必须在芯片全温度范围内、全电压范围内都不出界。我曾经见过一颗内存颗粒,常温下窗口有 150 ps 余量,到 85°C 时窗口直接缩到 20 ps。那批板子只通过了低温测试,高温段全挂。后来我们不得不重新优化了 Gate Training 的搜索算法。

DQS 门控窗口漂移逻辑图 理想 DQS 门控窗口 左边界 + 右边界 对称 温度上升 DQS 延迟增加 ~8 ps/°C 电压下降 Buffer 延迟增大 漂移方向 → 右移 门控窗口整体向右迁移 后果 读到噪声 / 丢失前几个 bit 避坑 高温+低压 组合最差

曾经遇到过:一个量产批次中,大约 3% 的模组在老化测试后出现读数据错误。我们回溯发现问题出在 DQS 门控漂移。

当时采用的是一次性训练(即只在制造时做 Gating Training)。经过分析发现,这批模组选用的 PCB 板材介电常数(Dk)比标准值偏差 2%,温度变化引发的 DQS 延迟波动幅度超过了门控窗口余量。解决办法是把门控训练改成了 开机自校正 模式,每次上电重新计算门控的位置。从那以后,我就坚持:DQS 门控不能一刀切。

4.2 DQS 延迟链调试

DQS 延迟链,是一串可编程的延迟缓冲器,用来精细微调 DQS 信号的相位。控制器抓到 DQS 边沿后,通过延迟链把这个边沿移动到数据眼图的中间采样位置。

调试延迟链,说白了就干两件事:找相位中心点,量余量宽度。我是这么做的:

  1. 扫描延迟步进:把 DQS 延迟链的码字从最小值走到最大值,每个码字下读取一段测试数据(比如 DQ 全 0、全 1 或者 PRBS)。
  2. 记录通过/失败的码字范围:数据正确读回的码字记作 Pass,错误的记作 Fail。
  3. 计算中心码值:Pass 范围的中点就是对应当前温度和电压的最佳延迟值。
  4. 计算窗口宽度:Pass 范围的总步数 × 每步的延迟分辨率,就是可用的延迟窗口。

下面是一个典型的扫描结果汇总表格:

延迟码字 理论延迟 (ps) 数据状态 观察现象
0 - 10 0 - 100 Fail DQS 太早,采样到前一 BIT
11 - 38 110 - 380 Pass 正确眼图中心区域
39 - 63 390 - 630 Fail DQS 太晚,采样到下一 BIT

上表中,Pass 范围覆盖了 28 个码字。如果每步延迟分辨率为 10 ps,那么可用的 DQS 延迟窗口宽度就是 28 × 10 ps = 280 ps。

我建议:不要把中心码字卡在极限值。如果中心码字是 25,我会把训练目标定在 23-33 之间留下冗余。原因很简单——延迟链在高低温下的步进误差可能不同,中心留有余地就是系统留有余地。

调试中有个常见的坑:延迟链的单调性。我见过一款控制器 IP,它的 DQS 延迟链在码字 42 到 44 之间延迟不增反降。这种非单调行为会让传统的二分搜素算法失效。如果你发现连续三个码字之间 Pass/Fail 跳跃,别急着调阈值,先检查延迟链的 MC 仿真数据,确认它的步进单调性表。

4.3 抖动对训练的影响

抖动是个隐藏的破坏者。普通的 DQS 抖动可以分成两种:

  • 随机抖动(RJ):来自热噪声、1/f 噪声,服从高斯分布,无法消除只能统计管理。
  • 确定性抖动(DJ):来自电源噪声、串扰、码间干扰(ISI),有规律性,可通过 PDN 设计和 layout 优化来降低。

在训练阶段,抖动最直接的体现就是:同一个码字下,连续读 100 次,结果可能 99 次 Pass、1 次 Fail。这就引出一个问题——到底该把那个码字判为 Pass 还是 Fail?

我的做法是:标准步进扫描 + 多次采样判决。具体来说:

  1. 每个码字下读 32 次(或者 64 次、128 次,看系统的 BER 目标)。
  2. 记录错误次数。如果错误次数 > 阈值(比如超过 5%),判该码字为 Fail;否则判 Pass。
  3. 用统计结果重新计算 Pass 窗口。

一个小经验:统计采样次数不要设得太少。只读 8 次就做判决,抖动容易把窗口边界拉得很宽——其实是假窗口。我一般设 64 次,兼顾训练时间和判决质量。

抖动对 DQS 门控窗口的侵蚀尤其明显。假定门控采样窗口原本有 200 ps 的可用宽度,加上 50 ps 的峰峰值抖动,有效窗口就只有 150 ps 了。如果你的裕量本来就不足,抖动一次就能让整个系统垮掉。

要判断抖动是不是罪魁祸首,可以用一个很简单的方法:读 DQ 眼图。把 DQS 延迟链固定在最优点,然后微调 DQ 的采样点位置,看眼图的水平和垂直张开度。如果眼图开口明显不对称或者边缘毛刺多,基本可以确定抖动的贡献分量较大。这时候再去优化 PDN 的退耦电容布局或者调整 DLL 的带宽设置,往往比死磕 DQS 延迟链更有效。

我曾经 误判过一次:有个平台在高温下频繁出现 DQS 门控训练失败,我花了整整两天改延迟链参数、换训练算法,结果一无所获。后来用示波器点上去一看,原来板上的开关电源纹波在 2 MHz 附近有一个 40 mV 的尖峰,这个噪声通过 VDDQ 直接调制了 DQ 缓冲区的延迟,引入了近 30 ps 的确定性抖动。解决办法就是给那个电源轨加了一颗 100 nF + 1 μF 的组合电容。

从那以后,我养成了一个习惯:在调 DQS 延迟链之前,先看一眼电源纹波。