存储器低功耗:让占比最大的那块「用时快、闲时睡、冷时关」
更新时间:2026-09-15。本文是「集成电路大类 · 低功耗设计与验证」进阶层第 05 篇(进阶层新写第 3 篇)。入门篇存储器功耗直觉建立了「SRAM 是耗电大户、有休眠和保持模式」的概念,这一篇讲怎么真正把存储器子系统做省电:一次访问的能量花在哪、有哪几档电源模式、怎么分 bank、怎么少翻位线,以及 DRAM 的自刷新。系统地图见低功耗导读。
一、先拆账:一次 SRAM 访问的能量花在哪
SRAM 位单元本身很小,但一次读写要驱动和感测的「外围」很大,能量大致拆成:
| 组成 | 在干什么 | 省电抓手 |
|---|---|---|
| 位线预充电 | 读前把两条大电容位线预充到高电平 | 位线是大电容负载,是动态能量主项之一 |
| 字线驱动 | 选中一行,拉高一整行所有单元的字线 | 只选中必要 bank/行;门控未访问块 |
| 灵敏放大器 SA | 把位线上的微小压差放大成 0/1 | 降低位线摆幅、只在真读时使能 SA |
| 译码/控制 | 行列译码、时序产生 | 空闲时停时钟、关使能 |
| 列 MUX/输出锁存 | 选列、驱动输出 | 窄访问、门控输出 |
| 保持漏电 | 6T 单元只要供电就有漏电 | retention 降压、shutdown 断电 |
直觉要点:
- 位线又长又宽、挂着整列单元的漏端电容,每次读都先预充再做小摆幅放电,这部分能量 ∝ 开关位线数 × 位线电容 × 摆幅²。容量越大,位线越深,单次访问能量越高。
- 一次读即使只要 1 bit,也要预充并打开对应字线牵动一整行,所以宽字 SRAM 的「按字读」存在天然浪费,分 bank、分字宽才有意义。
- 漏电随容量近似线性增长:几百万个 6T 单元即使不访问,在先进工艺也会漏出可观静态电流。
二、SRAM 电源模式阶梯:快、睡、保持、关
存储器编译器生成的 SRAM 宏通常提供多档模式,本质是「状态保留程度」与「唤醒代价」的交换,和待机睡眠模式同构:
| 模式 | 供电 | 数据 | 电流量级(相对) | 进出延迟 | 适用 |
|---|---|---|---|---|---|
| Active(读/写) | 标称 VDD | 可读可写 | 最高 | 0 | 正在访问 |
| Light sleep | VDD,部分外围停 | 保持 | 中低 | 1~数拍 | 很短的空闲(间歇访问) |
| Deep sleep | 外围更多断电 | 保持 | 低 | 数~十几拍 | 中等空闲 |
| Retention(保持) | 降到 V_ret/VDR | 保持(最低保持电压) | 很低 | 唤醒要升压+稳定,几十拍以上 | 长空闲但要留数据 |
| Shutdown | 完全断电 | 丢失 | ≈0(只余电源网络漏电) | 重新初始化,最慢 | 超长空闲/可重建数据 |
要点:
- retention 的核心是数据保持电压 V_ret(也称 VDR, data retention voltage):6T 单元只要供电高于某个较低电压就能维持存储值,不必维持标称 VDD。把阵列电压降到 V_ret,漏电压低一大截;但此电压下不能读写,唤醒需要先恢复 VDD 并等待稳定。
- shutdown 最省但丢数据:只适合内容可从别处重建的缓存/临时缓冲。要保留关键小状态又想关整块大 SRAM,常见做法是把必要上下文搬到一小块常开 retention RAM/触发器,再 shutdown 大块,见 SoC 电源架构。
- 模式选择由空闲时长决定,和系统电源态一样要算「进出能量 vs 省下能量」的盈亏平衡点。
三、空闲多久值得睡:盈亏平衡算例
设 SRAM active 外围+阵列相关电流额外部分为 I_active,deep sleep 为 I_sleep,进出 sleep 的能量折合为 E_wk(预充恢复、状态机、等待)。则当空闲时长 T 满足
(I_active − I_sleep)· V · T > E_wk
时,进 sleep 才划算。给一个教学数字:某 SRAM active 额外电流 1.0mA、deep sleep 0.05mA、V=0.8V,进出一次折合能量 E_wk=0.5µJ,则差额电流 0.95mA 对应差额功率 0.76mW,盈亏时间 T≈0.5µJ / 0.76mW ≈ 0.66ms。即空闲超过约 0.7ms 才值得 deep sleep;更重的 retention 升压/降压器件还有更长阈值。这个阈值要写进 SRAM 控制状态机,而不是软件拍脑袋决定。
四、分 bank:让「不相关的访问」不牵动整块
把一块大 SRAM 拆成多个可独立控制的 bank,是存储器低功耗的主力结构手段:

- 按需唤醒:一次访问只让命中的 bank 处于 active,其余 sleep/retention,字线、位线、SA 的开关能量只发生在一个 bank。
- bank 粒度权衡:bank 越细,未访问部分越能睡,但译码、控制、电源开关、布线面积越大;要按访问局部性和数据宽度选。
- bank 交织(interleave):顺序访问时在 bank 间轮转可提高吞吐、隐藏预充延迟;但跨 bank 的随机访问会频繁唤醒不同 bank,需配合访问局部性,否则反而多付唤醒能量。
- 命中率视角:缓存类存储还可以关掉空 way/cache line(way shutdown、line gating),上电时不全量使能。
五、访问侧:让每次访问少翻位线
结构分块之外,降低「单次访问能量」同样重要:
- 窄位写/bit-write:只写真正变化的位,配合 write mask,避免整行整字重写。读改写(read-modify-write)在只改 1 bit 时很浪费,能直接位写就别整字读改写。
- 降低位线摆幅:灵敏放大器本就能识别小压差,位线不需要全摆幅充放电;更低摆幅直接降位线能量,代价是对 SA 失调和噪声更敏感,需工艺/库支持。
- 门控时钟与使能:SRAM 的 clk/clk-en 只在访问周期有效,未访问时拉低使能进 sleep;很多「SRAM 功耗高」其实是使能接成恒有效、每拍都在做内部预充。
- 数据编码/压缩:总线和存储里翻转少的编码(如减少 0→1 跳变的编码、局部置反 bus invert 思想)、压缩后少存少搬,间接省位线和总线能量。
- 用触发器/小缓存替代大 SRAM 放热点数据:访问极频繁的少量数据,放一组寄存器或很小的单口 RAM,避免反复唤醒大阵列。
判断这些手段的依据仍是真实活动:用 SAIF/访问统计看每块 SRAM 的访问率、读写比、空闲间隔分布,没有访问画像就分 bank 很可能分错。
六、架构层:按数据「温度」决定它住哪
最省电的存储优化往往在架构层,把数据按访问温度分层放置:
- 热数据(正在用的工作集):放 active SRAM,保证速度;
- 温数据(短期不用但要快速回来):放 retention SRAM 或可快速唤醒的 bank;
- 冷数据/可重建:移到低速存储或可关电源域,SRAM shutdown;
- 系统睡眠时,只把必须保存的上下文搬进小型 retention 存储,而让大阵列断电——这正是 retention/isolation 在存储上的落地(直觉见保持与隔离)。
这套「温度分层」和缓存层级思想一致,只是优化目标从性能换成能量;和电源域划分、低功耗 RTL要一起规划。
七、DRAM 这条线:刷新是躲不掉的常驻账
片外/片上 DRAM(DDR、LPDDR)的能量结构与 SRAM 不同,重点在:
- active/precharge:打开/关闭行(行缓冲命中可省重复激活),行激活是 DRAM 单次操作的大头;
- refresh / self-refresh:电容存储必须周期刷新,刷新电流随容量和温度上升(高温漏得快、要刷得更勤,LPDDR 有温度补偿刷新 TCSR);
- 自刷新(self-refresh)/掉电(power-down):空闲时进 self-refresh,DRAM 自己用内部振荡器维持刷新、关掉大部分接口时钟,电流大降但唤醒有延迟;更深的深自刷新功耗更低、唤醒更慢。
移动 SoC 待机时,DRAM 自刷新电流往往是系统底电流的重要组成;省电手段包括提高行缓冲命中、聚合访问以延长空闲窗口、及时进/出 self-refresh(同样要算盈亏时间)、以及 LPDDR 的多种低功耗模式。这部分与 PMIC、外设功耗共同决定整机底电流。
七补二、看懂 SRAM 宏的接口,才能控住模式
存储器编译器给的 SRAM 宏有一组固定控制脚,低功耗设计的关键动作几乎都落在正确驱动这些脚上:CLK(或 CEN 时钟使能)、CEN(chip enable,低有效,关它即进入休眠/保持外围不动)、WEN(写使能)、地址、数据、BWEN/byte mask(字节/位写屏蔽)、以及深睡/保持专用脚(部分宏提供 RETEN/sleep 控制和独立的保持电源)。常见错误是把 CEN 接成恒有效,导致 SRAM 每个时钟沿都在做内部预充和译码,哪怕地址/数据无意义。正确用法是:
- 无访问周期拉低有效使能(CEN=1):立刻停掉该拍的预充/译码/灵敏放大,进入最轻的 sleep;
- 连续空闲达到阈值:再断言深睡/retention 控制,关更多外围或降阵列电压;
- 只用 byte mask 写变化字节:避免整块写和读改写;
- 读不修改时不发起读改写:明确区分读、写、位写,别用一条「读回-改-写回」路径处理所有访问。
配合控制器里的「访问类型 + 空闲计时」状态机,可以让宏在 active / light sleep / deep sleep / retention / shutdown 之间自动迁移,软件只需申请访问,硬件负责唤醒并在访问前等待唤醒延迟。访问接口侧还要避免一个隐性浪费:为了等一个可能到来的访问而长期把 SRAM 留在 active。更好的策略是接受首次访问的唤醒代价,用「唤醒-突发访问-立刻睡」的 burst 模式,把多次小访问攒成一批,延长连续空闲窗口——这和外设功耗讲的事件聚合是同一个思想。
访问能量算例(教学量级):设某 SRAM 单次 32-bit 读能量 E_acc≈8pJ,retention 漏电折合 P_ret≈2µW,深睡唤醒延迟内额外能量 E_wk≈30pJ。一个任务每 1ms 突发读 16 次:每秒 1000 次突发、16000 次访问,访问能量≈16000×8pJ=128µJ/s=128µW;若控制器做得好、99% 时间在 retention,则保留能量≈0.99×2µW≈2µW。合计约 130µW。反过来若 SRAM 被恒置 active、外围常开支路假设额外 150µW,则即使访问完全相同,总功耗也翻倍以上。这个对比说明:在访问稀疏的 IoT 场景,决定存储平均功耗的常常不是单次访问能量,而是你让它在无访问时处于什么模式。 这也是为什么要先用性能计数器统计访问率/空闲分布,再决定分多少 bank、用多深的睡眠档。
再补一个容量选择上的连带结论:分 bank 的收益不仅是省电,还影响功耗-面积的整体最优。为了保证速度,单块 SRAM 做太大时位线加深、字线负载变重,单次访问能量和访问延迟都上升;拆成多块后,每块更快更省,但总单元面积因外围复制而增加。编译器提供的「同容量不同 bank 数/不同列数」宏就是这组权衡的现成选项,低功耗项目应在面积、频率目标、访问局部性三者之间实测对比几版宏,而不是默认选单块最大容量。选定后再把 bank 睡眠控制接进系统电源状态机,让浅睡/深睡/保持/关断与待机睡眠模式的分级一一对应,软件进哪个系统态就由硬件把各存储块带到相应模式,避免软件知道要睡、存储却还醒着的脱节。
八、改造走查:一个 SRAM 子系统
- 测量基线:统计每块 SRAM 的访问率和空闲间隔,发现一块大缓存 90% 时间无访问,却 clk 恒有效、始终 active。
- 先治使能:接入 clk-en,无访问即进 light sleep——零结构改动先拿下外围预充能量。
- 再分 bank:按访问热点拆 4 个 bank,命中才 active,其余 sleep;长空闲 bank 进 retention。
- 位写与宽度:控制寄存器改窄位写,避免整字读改写;宽数据用 burst 减少预充次数。
- 冷数据外迁:上电初始化数据、查找表改为用时再从只读存储加载,主 SRAM 可整体 shutdown。
- 加状态机与阈值:控制器按空闲时长自动在 light/deep/retention/shutdown 间切换,阈值用上一节的盈亏公式标定。
- 对账:门级+存储器模型功耗分析,对比访问能量、保持漏电、唤醒开销三条线,确认典型场景净收益,并在硅后用电流曲线核对(见功耗怎么测)。
九、常见误区
- SRAM clk/en 恒有效:外围每拍预充,最常见也最容易修的浪费。
- 只看访问能量不看漏电:大容量 SRAM 待机漏电可能比偶发访问更费电。
- 不分场景一律 retention:进出要升压/稳定,短空闲可能亏本。
- bank 乱拆导致频繁唤醒:没有访问局部性分析,分 bank 反而更费。
- 整字读改写 1 bit:位线全摆幅动一遍,浪费大。
- 忽视 DRAM 高温刷新:底电流随温度涨,热设计和刷新策略要联动(见功耗与热的耦合)。
结语
存储器低功耗是一门「让对的容量在对的时刻处于对的模式」的艺术:用分 bank 和访问门控压低单次访问能量,用 deep sleep/retention/shutdown 的模式阶梯按空闲时长压低保持漏电,用数据温度分层让该快的快、该关的关,再在 DRAM 侧管好刷新与自刷新。它的每一步都要拿访问画像和盈亏时间说话,这也是它区别于「插上就省」的时钟门控、更偏架构权衡的原因。
一句话收口:存储省电=少访问(分 bank、位写、局部性)+ 浅保持(V_ret)+ 敢断电(冷数据外迁),而决定用哪一档的,永远是访问频率和空闲时长这两本账。 下一篇讲电压这条平方杠杆怎么落地:DVFS 实现。
总结
存储器省电先要认清单次访问的能量大头在外围:位线预充、整行字线、灵敏放大与摆幅,哪怕只读 1 bit 也要牵动一整行,而几百万个 6T 单元的保持漏电随容量和温度线性上涨;模式阶梯 active→light/deep sleep→retention(降到高于 VDR 的 V_ret,漏电大降但不能读写)→shutdown(最省但丢数据),进哪一档由空闲时长对盈亏阈值决定。主力结构是分 bank 让访问只唤醒命中块、用 CEN/byte mask 避免无效预充和整字读改写、按数据温度分层外迁冷数据,DRAM 侧则要管好随温度加码的刷新与自刷新。