DQS与CK的时序关系详解
好,咱们接着聊。上回我把Write Leveling的整体框架搭完了,这一章咱们得扎进去看最核心的东西——DQS和CK到底怎么对齐。
做DDR接口设计的兄弟都知道,Write Leveling说白了就是让DQS的边沿找到CK的上升沿,然后乖乖待在那个窗口里。可实际跑起来,这两根线的关系比谈恋爱还复杂。嗯,我来拆开说。
1. 为什么非要对齐CK?
DDR内存颗粒内部,所有命令和地址都是
在CK的上升沿采样的。而你发送的写数据(DQ)
是跟着DQS走的。如果你DQS跟CK差得太远,
颗粒根本不知道你什么时候送的数据。
所以,Write Leveling的第一步,就是让颗粒看到的DQS和CK之间的相位差落在规定的“调平窗口”内。你想想看,这个窗口有多窄?
2. 核心时序参数一览
我这列个表,咱们对照着看,这些参数在JEDEC规范里都有明确定义:
| 参数 | 全称含义 | DDR4典型值 | 设计意义 |
|---|---|---|---|
| tDQSS | DQS上升沿到CK上升沿的建立时间 | ±0.25 tCK | DQS必须在这个范围内驱动 |
| tDSS | DQS到CK的建立时间(写调平) | +0.2 tCK | DQS不能晚于这个值 |
| tDSH | DQS到CK的保持时间(写调平) | +0.2 tCK | DQS不能早于这个值 |
| tDQSL | DQS低电平脉冲宽度 | 0.4~0.6 tCK | 保证Preamble宽度 |
| tDQSH | DQS高电平脉冲宽度 | 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
5. 来个直观的图:DQS与CK相位对齐示意图
说了这么多,不如直接画张图把关键点串起来。我画的是DQS(蓝色)和CK(红色)在Write Leveling过程中的相位关系,包含抖动边界和调平窗口:
这个图把整个流程说清楚了:
- 上方蓝色的一排是CK的上升沿,间隔一个tCK。
- 红色半透明的DQS1是初始位置,离最近的CK太远,不在tDQSS窗口内。
- 延迟调整后,DQS2(绿色)落在了CK上升沿附近,且考虑了抖动边界(橙色虚线)。
- 紫色虚线框是调平窗口±0.25tCK,调平后的DQS要待在里面。
- 下方的数据眼示意:DQS找到位置后,DQ才能在正确的眼中心被采样。
6. 个人常用的避坑清单
经验说多了都是泪,直接上干货:
- 先用示波器看裸眼:我习惯在设计验证阶段,直接拿示波器抓颗粒脚的DQS和CK。眼睛看到的才是真的,仿真经常过于理想。
- 写调平不能只过一次:温度变化、电压变化都会改变PLL延迟,所以量产测试需要在高温和低温各做一次Write Leveling校准。
- 注意DQS的Preamble:DQS在写操作前需要拉低至少一个tCK作为前导符。有些控制器在调平时忽略了Preamble,结果读到的FIFO状态全是错的。
- 颗粒之间的skew:同一片DDR颗粒内不同byte-lane的延迟可能差几十ps,不能只调一个DQS就完事,要每条lane独立调。