S02 —— 为什么 DRAM 需要”刷新”?SRAM 和 DRAM 的本质区别

金句:SRAM 靠晶体管锁死数据,DRAM 靠电容保存数据——一个只要不断电就永远记得,一个必须周期性”回血”才能记得。


1. DRAM 刷新问题的本质

1.1 电容漏电的物理机制

上篇(S01)讲到 DRAM Cell 是一个电容 + NMOS 晶体管。电容的电荷会慢慢泄漏:

Bash
电容漏电的物理原因:

  - 电容两个极板之间隔着绝缘层(SiO₂ 或 high-k 材料)
  - 绝缘层不是完美的隔离层,总有微量隧穿电流(quantum tunneling)
  - 温度越高,载流子动能越大,隧穿概率越高
  - 25°C:数据保持时间约 64ms
  - 60°C:漏电速度加快约 4 倍,保持时间降到 ~16ms

电容电压的衰减过程:
  - 充满电(存"1")→ VDD ≈ 1.2V
  - 漏电 → 电压缓慢下降
  - 降到 Sense Amplifier 的判定阈值(~0.6V = VDD/2)以下
  → "1" 被误判为"0" → 数据损坏

结论:必须在电容电压降到阈值之前,把数据读出来再写回去
  → 这就是"刷新"(Refresh)

1.2 刷新操作的具体过程

Bash
刷新不是简单的"读一遍"——而是按行(Row)进行的精确操作:

Step 1:内存控制器发送 REF 命令
  → 指定目标 Bank(REF# Bank)

Step 2:Bank 内部行解码器选通某一行(Row)
  → 该行所有 Cell(1024~8192 个)同时接入 Bit Line

Step 3:Sense Amplifier 读取整行数据
  → 放大每个 Cell 的微弱电压变化到完整电平
  → 判断每个 Cell 是"1"还是"0"

Step 4:立即写回(Restore)
  → 放大后的数据直接对电容充电
  → 电容恢复到 VDD("1")或 GND("0")

Step 5:Precharge(预充电)
  → 关闭该行,准备下一个刷新周期

注意:刷新期间,该 Bank 无法响应正常的读写请求。

2. 刷新时序和频率

2.1 JEDEC 刷新规范(DDR4)

Bash
DDR4 刷新参数(JEDEC JESD79-4B):

刷新周期(tREFI,Refresh Interval):
  → 标准值:7.8125µs(典型刷新间隔)
  → 64ms / 7.8125µs = 8192 次刷新/64ms
  → 每 7.8µs 必须发起一次刷新命令

刷新时间(tRFC,Refresh Cycle Time):
  → 刷新一行需要约 350ns(DDR4-8Gb)
  → 刷新 8192 行的总时间 ≈ 8192 × 350ns ≈ 2.87ms
  → 占空比 = 2.87ms / 64ms ≈ 4.5%

这 4.5% 的时间 DRAM 不可访问,是 DRAM 的固有开销。

Bash
刷新频率的三个档位(JEDEC DDR4):

1x 刷新(标准):
  - 每 64ms 刷新所有行一次
  - tREFI = 7.8125µs
  - 用于:室温(< 85°C)环境

2x 刷新(高温补偿):
  - 每 64ms 刷新所有行两次(间隔减半)
  - tREFI = 3.9µs
  - 用于:高温环境(85°C ~ 105°C)
  - DDR4 颗粒内部自动切换,不需要软件干预

4x 刷新(极端高温):
  - 每 64ms 刷新所有行四次
  - tREFI = 1.95µs
  - 用于:持续高温(> 105°C)或数据可靠性要求极高场景

手机/汽车级 DRAM 还会用更密集的刷新(8x)。

2.2 刷新对内存带宽的影响

Bash
刷新期间 Bank 被阻塞,导致有效带宽下降:

场景:GPU 持续访问显存(高带宽需求)

DDR4-32004.5% 刷新开销:
  - 标称带宽 = 25.6 GB/s(64-bit 通道)
  - 实际可用带宽 ≈ 25.6 × (1 - 4.5%) ≈ 24.4 GB/s
  - 损失约 1.2 GB/s

刷新还会导致延迟抖动(Latency Spike):
  - 刷新期间访问请求被挂起(排队)
  - 刷新完成后,一次性处理积压的请求
  - 造成周期性延迟峰值

对延迟敏感的应用(如数据库索引):
  - 刷新导致的周期性暂停会影响 QPS
  - 解决方案:使用 ECC 内存 + 纠错,或提高刷新频率降低单次影响

3. DDR5 的 Same Bank Refresh(SBR)改进

3.1 传统 DDR4 刷新的问题

Bash
All Bank Refresh(所有 Bank 同时刷新):

  Bank 0 ──── REF ──── 刷新中(不可访问)
  Bank 1 ──── REF ──── 刷新中(不可访问)
  Bank 2 ──── REF ──── 刷新中(不可访问)
  Bank 3 ──── REF ──── 刷新中(不可访问)
  ...(所有 Bank 同时阻塞)

问题:刷新期间整个 DRAM 完全不可访问
  → 带宽损失集中爆发
  → 延迟抖动更明显

3.2 SBR 的工作原理

Bash
Same Bank Refresh(DDR5 新特性):

  Bank 0 ──── REF ──── 刷新中(不可访问)
  Bank 1 ──── READ ──→ 正常访问 ✓
  Bank 2 ──── WRITE ─→ 正常访问 ✓
  Bank 3 ──── IDLE ──→ 等待
  ...(其他 Bank 继续工作)

工作方式:
  - 每次只刷新一个 Bank(而非所有 Bank)
  - 被刷新的 Bank 暂停,其他 Bank 继续服务读写请求
  - 刷新完成后,该 Bank 立即恢复工作

SBR 的效果:
  - 刷新期间可用带宽比例:~99.5%(vs DDR4 的 ~95.5%)
  - 延迟抖动大幅降低
  - 游戏帧时间稳定性提升约 15~20%

DDR5 还支持 Same Bank Group Refresh(SBGR):
  - 以 Bank Group 为单位刷新
  - 同一 Bank Group 内的多个 Bank 不能同时访问
  - 但不同 Bank Group 之间可以完全并行

4. Self-Refresh(自刷新模式)

4.1 什么是 Self-Refresh

Bash
Self-Refresh:DRAM 自己管理刷新,不需要外部控制器。

工作原理:
  - DRAM 芯片内部有刷新计时器(Refresh Timer)
  - 超时后自动执行刷新操作
  - 内存控制器全程不参与

使用场景:
  - 笔记本进入睡眠(S3/Suspend to RAM)
  - 手机屏幕关闭进入低功耗模式
  - 系统完全空闲,内存控制器可以断电

功耗对比(DDR4-8Gb,典型值):
  - Active(持续读写):~500mW
  - Active Idle(Bank 开放,无访问):~100mW
  - Precharge Power-Down:~20mW
  - Self-Refresh(自刷新模式):~1~2mW

Self-Refresh 的功耗差距:
  - 从 Active 到 Self-Refresh:功耗降低约 250~500 倍
  - 这就是笔记本待机可以坚持很多小时的原因

4.2 Self-Refresh 的进入和退出

Bash
进入 Self-Refresh 的条件:

  1. 内存控制器发送 MRW 命令设置 MR16[0] = 1
     → 启用 Self-Refresh 模式

  2. 内存控制器发送 SRE(Self-Refresh Enter)命令
     → DRAM 内部接管刷新计时器
     → 外部时钟可以停止(降低 PLL 功耗)

  3. DRAM 进入低功耗状态
     → 只有自刷新电路和计时器工作
     → 数据保持在 Cell 中(理论上可以保持数年)

退出 Self-Refresh:

  1. 时钟恢复(CKE 信号拉高)
  2. DRAM 检测到时钟,重新同步
  3. 内存控制器发送 SRX(Self-Refresh Exit)命令
  4. DRAM 恢复正常工作模式
  5. 延迟:tXS(Self-Refresh Exit Latency)≈ 200ns

移动设备优化:
  - 屏幕熄灭 → 进入 Self-Refresh(功耗从 500mW 降到 1~2mW)
  - 屏幕点亮 → 退出 Self-Refresh(延迟 < 1µs)
  - 用户完全感知不到待机唤醒的延迟

5. SRAM 和 DRAM 的本质对比

5.1 SRAM 的结构和工作原理

Bash
SRAM Cell(6T Cell)—— 6 个晶体管组成的双稳态锁存器:

        VDD
         │
      ┌──┴──┐
      │ T1  │ T2    ← 交叉耦合的反相器
      └──┬──┘
         ↕(正反馈)
      ┌──┬──┐
      │ T3  │ T4   ← 访问晶体管
      └──┬──┘
         │
        GND

两个稳定状态:
  状态 A:T1 导通,T2 截止 → Q=1, Q̅=0
  状态 B:T1 截止,T2 导通 → Q=0, Q̅=1

"双稳态"的物理意义:
  → 正反馈:只要电源不断,一进入某个状态就会永远保持
  → 打破状态需要外部信号强制覆盖(写入)
  → 不需要刷新

读操作:
  1. Word Line(WL)拉高 → T3/T4 导通
  2. Q 和 Q̅ 通过 BL/BLB 连接到 Sense Amplifier
  3. 放大器检测电压差,判断存储的值
  → 读操作不破坏数据(非破坏性读)

写操作:
  1. WL 拉高
  2. 外部强制驱动 BL/BLB 到目标值
  3. 交叉耦合反相器被覆盖,稳定到新状态
  → 写入能力由驱动强度决定

5.2 6T SRAM Cell 的面积

Bash
SRAM Cell 面积(6 个晶体管):

  每个晶体管(NMOS/PMOS)占用约 6F²(F = 最小特征尺寸)
  6T Cell ≈ 120F²(实际包含连线,标准单元库数据)

DRAM Cell 面积(1 个晶体管 + 1 个电容):

  NMOS:~6F²
  电容:需要足够面积来维持容值(~20F² 最小)
  总计:~6F²(不含电容面积开销)

密度对比:
  DRAM 密度是 SRAM 的约 6~8 倍
  → 这就是为什么主存(GB~TB)用 DRAM
  → 而 CPU Cache(KB~MB)用 SRAM

5.3 全面对比表

Bash
对比维度              SRAM                    DRAM
────────────────────────────────────────────────────────────────
结构                  6 个晶体管              1 个 NMOS + 1 个电容

密度                  1x(低密度)            6~8x(高密度)

成本/GB               高(~50x DRAM)         低

速度                  快(0.5~2ns)          慢(40~100ns)

功耗                  高(静态电流)          低(刷新时才高)

数据保持              只要供电就保持          必须周期性刷新

刷新需求              不需要                  每 64ms 刷新所有行

读操作                非破坏性(直接读)      破坏性(读后需 Restore)

应用                  CPU Cache(L1/L2/L3)   主内存(DDR SDRAM)

单元面积              ~120F²                 ~6~15F²

漏电特性              低(关断电流 nA 级)    电容漏电(µA 级)

制造工艺              标准 CMOS Logic         专用 DRAM 工艺(embedded DRAM 除外)

温度敏感性            低                      高(高温加速漏电)

软错误率              低(SRAM cell 稳定)    较高(电容电荷少,易受辐射影响)

6. CPU Cache 为什么用 SRAM

Bash
L1 Cache 的要求:
  - 延迟必须极低(~1ns,对应 3~4 个 CPU 时钟周期)
  - 每次 CPU 访问必须命中(或快速降级到 L2)
  - 数据必须始终正确(不能因刷新而不可访问)

SRAM 满足这些要求:
  ✓ 0.5~2ns 访问延迟(比 DRAM 快 20~50 倍)
  ✓ 非破坏性读(不需要读后写回)
  ✓ 不需要刷新(数据始终有效,CPU 随时可以访问)
  ✓ 与 CPU 逻辑工艺兼容(同厂,same die)

代价:
  ✗ 密度低(6T/cell),面积大
  ✗ 成本高(相同容量,SRAM 成本是 DRAM 的 50 倍以上)
  ✗ 静态功耗高(反相器有漏电流)

所以 CPU Cache 是性能和成本的权衡:
  - L1/L2/L3 用 SRAM(速度优先)
  - 主存用 DRAM(容量优先)

7. 刷新相关的其他 DRAM 特性

7.1 可变刷新频率(Variable Refresh Rate)

Bash
移动 DRAM(LPDDR)支持可变刷新频率:

正常模式(Full Speed):
  - 刷新频率:标准 tREFI
  - 用于:系统正常运行

省电模式(Reduced Refresh):
  - 刷新频率降低一半(tREFI 翻倍)
  - 用于:轻度负载,降低功耗
  - 代价:数据保持时间缩短,只适合短期空闲

激进模式(Aggressive Sleep):
  - 刷新频率降到 1/4(tREFI × 4)
  - 只用于:屏幕熄灭后的极低功耗状态
  - 唤醒后立即恢复正常刷新

DDR5 的精细刷新控制:
  - 可以只刷新"热行"(频繁访问的行)
  - "冷行"(长期不访问的行)刷新频率降低
  - 节省约 20~30% 的刷新功耗
  - 需要内存控制器配合分析访问模式

7.2 刷新期间的访问请求处理

Bash
刷新期间,内存控制器如何处理新的读写请求?

方案 1:排队(Queuing)
  - 刷新期间到来的请求进入队列
  - 刷新完成后,按序处理队列中的请求
  - 简单,但会导致请求延迟累积

方案 2:Bank 交错(Bank Interleaving)
  - 内存控制器在不同 Bank 之间交错发起请求
  - 刷新 Bank 0 时,服务 Bank 1/2/3 的请求
  - 利用多 Bank 并行隐藏刷新延迟
  - 现代 DRAM 控制器普遍采用

方案 3:刷新与访问并行(SBR,DDR5)
  - 刷新 Bank N 时,其他 Bank 正常提供访问
  - 刷新开销分散到时间轴上,而非集中
  - 延迟抖动大幅降低

刷新对延迟敏感型应用的影响:
  - 数据库索引访问:刷新时延迟跳升 3~5 倍
  - 音视频播放:刷新导致帧间隔抖动
  - 实时控制系统:刷新时响应延迟不确定

8. 总结

  • 刷新原因:DRAM Cell 电容漏电,室温下 64ms 内电荷衰减到阈值以下,数据损坏
  • 刷新过程:按行(Row)激活 → Sense Amplifier 读取 → 立即写回(Restore)→ Precharge 关闭
  • 刷新代价:每 64ms 刷新所有行,约 4.5% 的带宽损失;DDR5 SBR 降至 <0.5%
  • Self-Refresh:空闲时 DRAM 自己刷新,功耗从 500mW 降到 1~2mW,用于笔记本/手机待机
  • SRAM vs DRAM:SRAM(6T 双稳态锁存器,无需刷新,速度快面积大)vs DRAM(1T+1C,需刷新,密度高成本低)
  • 应用分工:SRAM 用于 CPU Cache(速度优先,容量小),DRAM 用于主存(容量优先,速度慢)

下篇预告(S03):为什么有了 DRAM 主存,CPU 还需要 Cache?Cache 的工作原理是什么?L1/L2/L3 多级 Cache 是怎么配合的?


关注公众号「AI不着急」,回复”资料”获取内存学习路线图。

最后修改: 2024年3月2日

作者

评论

发表评论

您的邮箱地址不会被公开。