3. DRAM刷新机制与功耗:刷新命令(REF)、刷新间隔tREFI、温度补偿刷新(TCR)、自刷新(Self-Refresh)模式

DRAM的刷新机制,说白了就是一场与时间的赛跑。你想想看,DRAM里的电容会漏电,数据存着存着就丢了。所以我们必须定期给这些电容"充电",这就是刷新的本质。

我个人习惯把刷新看作是DRAM的"呼吸"。它必须规律地进行,否则数据就会"窒息"。但每次呼吸都要消耗能量,这就是我们今天要聊的核心矛盾——如何在保证数据不丢的前提下,把刷新功耗压到最低。

3.1 刷新命令(REF)—— 刷新的基本动作

刷新命令(REF)是DRAM控制器发给内存的最基本指令。它告诉DRAM:"嘿,该给某一行电容充电了。"

具体来说,每次REF命令会刷新一行(Row)。DRAM内部有一个刷新地址计数器,它会自动记录下一次该刷哪一行。你不需要手动指定地址,控制器只管发命令就行。

关键点:一次REF命令只刷新一行。要刷新整个DRAM,需要发N次REF命令,N等于行数。

我在项目中遇到过一个问题:有同事以为REF命令可以一次刷新多行,结果在时序仿真时发现数据丢失。嗯,这里要注意,不同厂商的DRAM可能支持不同的刷新粒度,但标准做法就是一行一行来。

3.2 刷新间隔tREFI —— 刷新的节奏

tREFI(Refresh Interval)是两次刷新命令之间的时间间隔。这个参数非常关键,它直接决定了刷新功耗的高低。

标准JEDEC规范里,tREFI通常是7.8μs(微秒)。也就是说,每7.8微秒你必须发一次REF命令。对于DDR4来说,64ms内要完成所有行的刷新,换算下来就是8192次刷新(64ms / 7.8μs ≈ 8192)。

DRAM类型 tREFI(典型值) 刷新周期 行数
DDR3 7.8 μs 64 ms 8192
DDR4 7.8 μs 64 ms 8192
LPDDR4 3.9 μs 32 ms 8192

为什么会这样?因为温度越高,漏电越快。LPDDR4的tREFI更短,就是为了应对移动设备里更高的温度环境。

实战技巧:我建议你在设计控制器时,不要把tREFI卡得太死。留一点余量,比如设成7.5μs而不是7.8μs。这样即使时钟有抖动,也不会错过刷新窗口。

3.3 温度补偿刷新(TCR)—— 聪明的刷新策略

温度补偿刷新(Temperature Compensated Refresh,TCR)是我个人最喜欢的一个低功耗特性。它的核心思想很简单:温度低的时候,漏电慢,可以少刷新;温度高的时候,漏电快,必须多刷新。

你想想看,如果不管温度高低都按最坏情况来刷新,那在低温下就白白浪费了功耗。TCR就是来解决这个问题的。

具体实现上,DRAM内部有一个温度传感器。它会实时监测芯片温度,然后调整刷新频率:

  • 低温(< 45°C):刷新周期可以延长到128ms甚至256ms
  • 常温(45°C ~ 85°C):标准64ms刷新周期
  • 高温(> 85°C):缩短到32ms甚至16ms

注意:我曾经在一个项目中忽略了TCR的温度滞后效应。温度在阈值附近来回跳动时,刷新频率也跟着频繁切换,导致功耗反而增加了。解决方案是加入迟滞电路,比如45°C升到48°C才切换,降到42°C才切回来。

TCR的好处是显而易见的。在手机这种设备里,大部分时间DRAM都处于低温状态。用TCR可以把刷新功耗降低30%~50%。

3.4 自刷新模式(Self-Refresh)—— 让DRAM自己管自己

自刷新模式(Self-Refresh)是DRAM进入低功耗状态时的刷新方式。当系统进入休眠或待机状态时,内存控制器可以告诉DRAM:"我要睡了,你自己看着办。"

进入自刷新模式后,DRAM内部会自己产生刷新命令,不需要外部控制器干预。这时候,你可以把内存控制器和时钟都关掉,省下不少功耗。

自刷新模式有几个关键参数:

  • tCKESR:进入自刷新模式需要保持CKE为低电平的时间
  • tXSR:退出自刷新模式后,需要等待的时间才能访问内存
  • tRFC:自刷新模式下的刷新周期时间

核心要点:自刷新模式下,DRAM的功耗可以降到正常工作的1%以下。但代价是退出时需要一定的唤醒时间(tXSR),通常在几百纳秒到几微秒之间。

我记得有一次做低功耗设计,系统要求待机功耗低于1mW。我们用了自刷新模式,配合TCR,最终把DRAM功耗降到了0.3mW。嗯,这个数字让我印象很深。

3.5 刷新功耗的计算与优化

刷新功耗的计算其实不复杂。核心公式是:

P_refresh = (N_rows / tREFI) × E_ref_per_row

其中:

  • N_rows:总行数
  • tREFI:刷新间隔
  • E_ref_per_row:每行刷新消耗的能量

举个例子,一个8Gb的DDR4芯片,有65536行,tREFI=7.8μs,每行刷新消耗约0.5nJ:

P_refresh = (65536 / 7.8μs) × 0.5nJ
          ≈ 4.2 mW

这个功耗看起来不大,但在低功耗场景下,4.2mW已经相当可观了。

优化刷新功耗的几个方向:

  1. 用TCR:低温下延长tREFI,直接降低刷新频率
  2. 用自刷新:系统空闲时进入自刷新模式
  3. 用部分阵列自刷新(PASR):只刷新正在使用的bank,其他bank休眠
  4. 用细粒度刷新:有些新标准支持按需刷新,不是所有行都刷

我的经验:在实际项目中,我通常会把TCR和自刷新结合起来用。系统活跃时用TCR降低刷新频率,系统空闲时切到自刷新。这样能省下60%~70%的刷新功耗。

3.6 知识体系图

下面这张图展示了DRAM刷新机制的核心逻辑和它们之间的关系:

DRAM刷新机制与功耗知识体系 DRAM刷新机制 REF命令 tREFI刷新间隔 温度补偿刷新TCR 自刷新模式 一次刷新一行 自动地址计数 DDR4: 7.8μs 64ms刷新周期 低温少刷新 高温多刷新 内部自主刷新 功耗<1% 核心目标:保证数据完整性 + 最小化刷新功耗 TCR + 自刷新 + PASR 组合使用效果最佳

这张图把刷新机制的四个核心要素串起来了。REF命令是基础动作,tREFI决定了刷新的节奏,TCR让刷新变得智能,自刷新模式则是在系统休眠时的最佳选择。

在实际项目中,我建议你把这四个要素当作一个整体来考虑。不要孤立地优化某一个参数,而是找到它们之间的平衡点。比如,用了TCR之后,tREFI可以动态调整,自刷新模式下的功耗也能进一步降低。

最后提醒一句:别为了省功耗把刷新间隔拉得太长。数据丢了,省再多功耗也没意义。我曾经见过一个团队把tREFI设成15μs,结果高温下数据全丢了,流片回来直接报废。嗯,这个教训挺贵的。


公众号:蓝海资料掘金营,微信deep3321