2. DDR4/DDR5协议基础:读写命令时序,DQ与DQS的关系,Fly-by拓扑结构
做Write Leveling校准,你得先搞懂DDR协议里那些最基本的读写动作。说白了,就是CPU怎么告诉内存“我要读/写”,以及数据是怎么从颗粒里掏出来的。
我记得刚入行那会儿,总觉得时序图太抽象,密密麻麻的波形看得头疼。后来在实验室里抓了几次波形,才真正明白——这些时序不是纸上谈兵,错一个周期,系统就崩给你看。
2.1 读写命令时序
DDR4和DDR5在命令格式上大同小异。命令是通过CS_n(片选)、ACT_n(激活)、RAS_n、CAS_n、WE_n这些信号组合来编码的。我习惯把这组信号叫做“命令总线”。
一个典型的读操作流程是这样的:
- Activate(激活):先发激活命令,打开指定Bank的某一行。这步是“开路”,把存储单元准备好。
- Read(读):等tRCD(RAS-to-CAS Delay)时间过后,发读命令,带上列地址。
- CAS Latency(CL):读命令发出后,要等CL个时钟周期,数据才会出现在DQ总线上。CL是个关键参数,Write Leveling就是为了让DQS和CK对齐,从而精确控制这个延迟。
- Burst(突发):DDR4一次传8个数据(BL8),DDR5一次传16个(BL16,但拆成两个8-beat)。
写操作稍微不同:
- 同样先Activate。
- 发写命令,带上列地址和写数据。注意,写数据是跟写命令一起送出去的,不需要等CL。
- 但是DQS相对于CK要有一定的建立/保持时间。这就是Write Leveling要校准的核心——让DQS的上升沿正好落在CK的低电平中间区域。
2.2 DQ与DQS的关系
这是个重点。DQ是数据线,DQS是数据选通信号。你可以把DQS想象成“时钟”,它告诉接收端:“嘿,DQ上的数据现在可以拿了!”
核心关系:
- 读操作:DQS由DDR颗粒产生,边沿对齐于DQ。也就是说,DQS的每个跳变沿(上升沿和下降沿)都正好在DQ数据的中间。接收端用DQS的边沿来采样DQ。
- 写操作:DQS由控制器产生,中心对齐于DQ。DQS的边沿正好在DQ数据的边界上。所以,在DQ数据有效窗口的中间,DQS的电平是稳定的(高或低)。
你想想看,如果写操作时DQS和CK没对齐,那DQS的边沿就会歪到DQ数据窗口里,采到错的数据。这就是Write Leveling要解决的问题。
我在一个DDR5项目中遇到过一个问题:颗粒在高温下频繁报CRC错误。排查到最后,发现是DQS的duty cycle失真了,导致采样窗口偏移。后来通过Write Leveling调整了相位,问题解决。
2.3 Fly-by拓扑结构
Fly-by,也叫菊花链。它跟T型(Tree)拓扑是DDR布线的两大流派。DDR3以后,Fly-by就成了主流。为什么?说白了,T型拓扑在高频下阻抗匹配太难做,走线分支太多,信号反射严重。
Fly-by的特点:
- 地址、命令、控制信号和时钟(CK)从一个颗粒串到下一个颗粒,像链条一样。
- 每个颗粒的CK到达时间不一样。离控制器最近的颗粒最先收到CK,最远的最后收到。
- 这种时延差叫做“Fly-by skew”。
对Write Leveling来说,Fly-by skew是必须补偿的。因为每个颗粒的CK相位不同,它们需要的DQS相位也就不同。Write Leveling就是给每个颗粒独立设置DQS的延迟,让DQS和它自己的CK对齐。
| 特性 | T型拓扑 | Fly-by拓扑 |
|---|---|---|
| 走线结构 | 所有分支等长 | 串行链式 |
| CK到达时间 | 所有颗粒同时到达 | 依次时延 |
| 信号完整性 | 高频下差(反射多) | 高频下好(单负载) |
| Write Leveling需求 | 所有颗粒统一延迟 | 每个颗粒独立延迟 |
| 主流应用 | DDR2、低速DDR3 | DDR3/DDR4/DDR5 |
嗯,这张表很重要。我在做DDR4设计时,用仿真工具跑过两种拓扑的眼图。Fly-by的电压裕量比T型至少多了15%。这就是大家为什么都用它。
2.4 本章知识结构
下面这张图把这三个概念串起来了。读命令、写命令、DQ/DQS关系、Fly-by拓扑,它们怎么相互作用,一目了然。
从图上你看得清楚:Fly-by拓扑造成了CK相位差,而Write Leveling的终极目标,就是给每个颗粒“打补丁”——把DQS延迟到和它自己的CK对齐。只有这一步做对了,后面的CL、tRCD这些时序参数才有意义。