第3章 DDR时序基础:Setup/Hold、tDS、tDH、时序裕度

做DDR信号完整性,时序是最绕不开的坎儿。刚开始学DDR的同学,总觉得时序就是一堆数字:建立时间、保持时间、tDS、tDH……其实说白了,这些参数决定了你的数据能不能被接收端正确地“咬住”。

我入行那会儿,第一次调DDR3的板子,眼图看着挺好的,但跑memtest就是报错。找了三天,最后发现是时序裕度只有20ps,温度一上来直接翻车。从那以后,我对时序这根弦就绷得特别紧。

3.1 Setup/Hold:数据采样的“两扇门”

任何一个数字接收器,在时钟边沿到来时,数据必须稳定在一定的时间窗口内。这个窗口由两个关键参数定义:

  • 建立时间 (Setup Time, tS):在时钟有效沿到来之前,数据必须保持稳定的最短时间。
  • 保持时间 (Hold Time, tH):在时钟有效沿到来之后,数据必须保持稳定的最长时间。

你可以把采样过程想象成拍一张照片——快门按下(时钟边沿)时,物体(数据信号)不能动。tS是快门按下前你必须摆好pose的时间,tH是快门关闭后物体还要保持姿势的时间。

我的经验: 对于DDR4/5这种高速接口,保持时间往往比建立时间更难满足。因为时钟到数据之间的skew、反射、串扰,首先吃掉的就是保持裕度。布局布线时,我习惯先算一把hold slack,再调setup。

3.2 tDS与tDH:DDR控制器/颗粒的时序规格

在JEDEC标准中,DDR接口会给出两个具体参数来约束信号质量:

  • tDS (DQS to DQ Setup Time):数据相对于DQS(数据选通信号)的建立时间。
  • tDH (DQS to DQ Hold Time):数据相对于DQS的保持时间。

注意,DDR的数据和DQS是源同步的,也就是说控制器在发送数据的同时,一起发送DQS给颗粒。颗粒用这个DQS来采样数据。所以tDS/tDH描述的是颗粒内部DQS与DQ之间的相对时序要求,而不是系统级的时间。

参数含义典型值(DDR4-2400)
tDS (base)DQ 在 DQS 边沿前需稳定的时间0.12 ~ 0.25 UI
tDH (base)DQ 在 DQS 边沿后需稳定的时间0.12 ~ 0.25 UI
tDS (with derating)考虑信号斜率降额后的值可增至 0.35 UI
避坑指南: 我曾经在一个项目中只看base值,觉得裕度足够。结果颗粒数据手册有一个小字注释:当信号上升时间超过1V/ns时,tDS/tDH要进行降额(derating)。最后算下来实际裕度只剩15ps。所以一定要把derating表看懂。

降额的原理很简单——信号越缓,接收器内部比较器判断高低的窗口就越模糊,所以需要更长的建立/保持时间。JEDEC的 derating 表是一个二维矩阵,依赖信号斜率(Slew Rate)和负载条件。每个颗粒供应商会给出自己的降额系数,但通常可以参考JEDEC标准表。

3.3 时序裕度:到底够不够用?

时序裕度(Timing Margin)就是实际可用的时间减去要求的最小时间。对于建立时间裕度和保持时间裕度:

Setup Margin = T_clk_q + T_flight - tS - T_settle
关键点: 公式里的每一项都不是固定值——芯片的PVT(工艺、电压、温度)变化,PCB走线的延时波动,参考时钟抖动,所有这些都会吃掉你的裕度。我通常会在仿真结果上再留出 20% 的余量,否则量产时很可能翻车。
Hold Margin = T_hold - (T_clk_q + T_flight_min)

保持时间计算中,走线的最小飞行时间(T_flight_min)是关键。因为如果数据走线比时钟走线短太多,数据提前到达,保持时间就会被破坏。所以DDR拓扑中经常要求数据与DQS严格等长,就是这个道理。

我的经验: 在做DDR3/4的“5-10-5”规则时,数据组内等长控制在±50mil,数据到DQS等长控制在±100mil。但实际项目上我遇到过因为过孔stub导致走线实际延时差远大于标称长度差的情况。所以光看长度不够,有时需要用仿真提取精确的T_flight。

3.4 裕度计算的完整流程

下面是一张我整理的DDR时序裕度计算流程图,把整个分析逻辑串起来:

DDR 时序裕度分析流程 1. 获取芯片时序规格 2. 提取走线延时 3. 计算总skew 4. 降额修正tDS/tDH 5. 计算setup slack 6. 计算hold slack 7. slack > 20% 裕度? 否 → 优化拓扑 是 → 验证通过

你看这个流程,不是简单地套公式就完事。实际工程中,走线延时你可能用仿真软件提取,也可以用经验公式估算(例如FR-4介质,信号速度约 60ps/inch)。但skew计算时别忘了时钟树的抖动(jitter)和板级Vref噪声——这些都会间接体现在setup/hold的采样窗口上。

3.5 实际案例分析

记得有一次我调试一块DDR4 SODIMM的参考板,信号完整性仿真显示setup slack有15ps,hold slack有35ps,看着都正。但温度循环到85°C时,随机出现读写错误。

排查后发现两个问题:

  1. 参考电压Vref有10mV的纹波,叠加在接收端造成了等效的抖动,等效到时序上吃掉了约8ps的setup margin。
  2. DQS信号在远端有一个阻抗不连续的反射,导致DQS过零点位置偏移,进一步减少了建立窗口。

解决办法:增加Vref滤波电容,并在颗粒端加一个RTT终端到VTT。调整后slack都超过30ps了,问题解决。

重要提醒: 时序裕度不是越大越好,太大的裕度往往意味着布局布线走线过长或过保守,可能增加成本或影响信号质量。目标是在5%~25%的裕度之间,平衡可靠性与设计效率。我个人习惯达到15%以上就不纠结了,但一定会把最差PVT组合跑一遍。
本章核心总结:
  • Setup/Hold是采样窗口的基本约束,tDS/tDH是DDR颗粒给出的具体要求。
  • 时序裕度必须考虑降额、抖动、噪声、温度变化等因素。
  • 计算流程:获取规格 → 提取延时 → 计算skew → 降额修正 → 求slack → 判断。
  • 实际调试中,眼图好不一定裕度够,必须做时序分析。