1. DDR SDRAM 概述与基本工作原理
大家好,我是你们的时序验证讲师。这一章我们先聊聊 DDR SDRAM 的基本原理——别急着翻 datasheet,把根扎稳了,后面做 Self-Refresh 保持时间验证才不会晕头转向。
DDR SDRAM 全称是 Double Data Rate Synchronous Dynamic Random Access Memory。名字很长,拆开看就三件事:
- 动态随机存取(DRAM)——电容存数据,需要定期刷新。
- 同步(Synchronous)——所有操作跟时钟沿对齐。
- 双倍数据速率(Double Data Rate)——时钟上升沿和下降沿各传一次数据。
说白了一个 DDR 颗粒,就是个靠电容阵列存数的大仓库。每次读/写都要先激活一行(Row Activation),再对列寻址。我早期做 STA 时踩过一个坑:以为 DRAM 时序跟 SRAM 差不多,结果仿真跑出来 setup 全红。后来才明白,DRAM 内部有刷新和预充电这些“家务活”,它们会吃掉时序裕量。
1.1 为什么要学 Self-Refresh 保持时间?
这个问题很关键。DDR 在工作状态(Active)下,时钟一直跑,控制器定期发送刷新命令。但设备进入低功耗模式时,时钟可能停了,这时候颗粒必须自己定时刷新——这就是 Self-Refresh。
Self-Refresh 保持时间(tCKSRX / tCKSRE 等参数)决定了时钟停摆后,颗粒内部还能维持数据多久。你要是没验好,芯片可能在待机时就把数据丢了。我在某款 IoT 项目中碰到过——低功耗模式唤醒后读出来全是乱码,查了三天才发现是 Self-Refresh 进入/退出时序违规。
| 参数 | 定义 | 典型值(DDR3-1600) |
|---|---|---|
| tCKSRX | 最后一个有效时钟沿到 Self-Refresh 进入命令的保持时间 | 1 tCK(时钟周期) |
| tCKSRE | Self-Refresh 退出命令到第一个有效时钟沿的建立时间 | 1 tCK |
| tXSR | Self-Refresh 退出后到下一次激活命令的最小延迟 | 多数 DDR3 为 512 ns |
1.2 DDR 内部架构速览
我画了一张图帮你理清 DDR 颗粒内部的关键模块。注意看刷新控制器的位置——Self-Refresh 是由它负责的。
图中刷新控制器和时钟 DLL 是 Self-Refresh 的关键。进入 Self-Refresh 时,时钟 DLL 可能被关掉以省电,但刷新控制器必须继续工作——这就引出保持时间问题了。
1.3 基本操作流程——激活、读、写、预充电、刷新
DDR 的操作步骤比较固定。我个人习惯记成五步曲:
- 激活(ACTIVATE):选中 Bank 和行地址,打开那一行。这时对应的行缓冲开始工作。
- 读/写(READ/WRITE):列地址选中,数据从 I/O 线上过来或出去。注意写操作有写延迟(WL),读操作有读延迟(RL)。
- 预充电(PRECHARGE):关闭当前行,准备下一次激活。预充电时间 tRP 必须遵守,否则数据冲突。
- 自动刷新(AUTO REFRESH):正常运行时,控制器定期发 REF 命令,颗粒自己完成行刷新。典型周期是 7.8 µs 刷新 8192 行(DDR3)。
- Self-Refresh:时钟停掉后,颗粒内部定时器接管刷新。退出时需要重建 DLL 锁定,这段恢复时间就是 tXSR。
关键点: Self-Refresh 进入/退出时的时钟相位关系必须满足 JEDEC 时序。我在验证中发现很多工程师只检查了正常操作时序,忽略了时钟停摆那一下的建立/保持。结果就是——芯片功能仿真 pass,样机却随机性报数据错误。
1.4 时序参数速查
下面这张表是我做 DDR 时序验证时最常查的几个参数。记不住没关系,但得知道它们在哪里定义、怎么用。
| 参数 | 全称 | 与 Self-Refresh 的关系 |
|---|---|---|
| tREFI | Average Refresh Interval | 两次刷新之间的平均间隔,通常 7.8 µs |
| tRFC | Refresh Cycle Time | 完成一次刷新操作的最小周期 |
| tCKSRX | Clock to Self-Refresh Exit Hold Time | 进入 SR 前最后一个时钟沿的保持时间 |
| tCKSRE | Clock to Self-Refresh Entry Setup Time | 退出 SR 后第一个时钟沿的建立时间 |
| tXSR | Self-Refresh Exit to Active | 退出 SR 后才能激活新行,要等 DLL 稳定 |
注意: 不同 DDR 版本(DDR2、DDR3、DDR4、LPDDR4)的 Self-Refresh 时序差异很大。举例来说,DDR3 允许在进入 Self-Refresh 后立即关闭时钟,但 DDR4 要求时钟在 SR 进入后额外保持两拍。这个坑我在 LPDDR4 项目中栽过,工程师手册上写的不一样,最终以 JEDEC spec 为准。
1.5 为什么要单独讲 Self-Refresh 保持时间?
你可能在想:不就是个保持时间吗,像普通寄存器一样检查不就完了?
没那么简单。DDR 的时钟域比较复杂——片内 DLL 锁定时钟沿,但进入 Self-Refresh 后 DLL 可能 shut down,退出后重建锁定需要时间。在这个过程中,DDR 颗粒对时钟沿的采样窗口会变化。如果 tCKSRX 不满足,颗粒可能错误地采样到 Self-Refresh 退出命令的前一个沿,从而导致状态机紊乱。
我在一次芯片 bring-up 中遇到的现象是:进入待机模式后,CPU 读到的数据全是 0xDEAD—那是 DDR 初始化默认值,说明颗粒根本没正常退出 Self-Refresh。查到最后,就是 tCKSRX 差了 50 ps。从此我养成了习惯:对任何跨时钟域的保持时间验证,都加上 ±15% 的 guard band。
好了,这一章我们把 DDR 的背景和 Self-Refresh 的概念讲清楚了。接下来的章节会一步步深入时序约束、STA 脚本、仿真检查,你准备好跟着我踩坑了吗?