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
小经验: 表格里的参数是 JEDEC 标准规定的最小值。实际芯片会留一点 margin,但你的验证必须 cover 最差 PVT corner。我习惯把 tCKSRX 和 tCKSRE 设成 1.5 tCK 来跑 STA 检查,留出裕量。

1.2 DDR 内部架构速览

我画了一张图帮你理清 DDR 颗粒内部的关键模块。注意看刷新控制器的位置——Self-Refresh 是由它负责的。

DDR SDRAM 内部结构框图 存储单元阵列 (Bank 0 ~ Bank N) 行地址 × 列地址 × 数据宽度 行译码器 列译码器 数据 I/O & 读写放大器 控制逻辑 命令译码 模式寄存器 刷新控制器 Self-Refresh / Auto-Refresh 时钟 DLL 说明 蓝色:存储核心 绿色:地址译码 红色:控制 + 刷新 青色:时钟延展

图中刷新控制器和时钟 DLL 是 Self-Refresh 的关键。进入 Self-Refresh 时,时钟 DLL 可能被关掉以省电,但刷新控制器必须继续工作——这就引出保持时间问题了。

1.3 基本操作流程——激活、读、写、预充电、刷新

DDR 的操作步骤比较固定。我个人习惯记成五步曲:

  1. 激活(ACTIVATE):选中 Bank 和行地址,打开那一行。这时对应的行缓冲开始工作。
  2. 读/写(READ/WRITE):列地址选中,数据从 I/O 线上过来或出去。注意写操作有写延迟(WL),读操作有读延迟(RL)。
  3. 预充电(PRECHARGE):关闭当前行,准备下一次激活。预充电时间 tRP 必须遵守,否则数据冲突。
  4. 自动刷新(AUTO REFRESH):正常运行时,控制器定期发 REF 命令,颗粒自己完成行刷新。典型周期是 7.8 µs 刷新 8192 行(DDR3)。
  5. 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 脚本、仿真检查,你准备好跟着我踩坑了吗?