1. 内存与功耗基础概念

各位同学,咱们这门课叫《内存占用与功耗平衡策略》。第一节课,得先把地基打牢。说白了,就是搞清楚内存到底是怎么耗电的,以及我们为什么要在这上面花心思。

我个人习惯,讲任何技术问题之前,先画一张全景图。这样你心里有个谱,知道今天聊的东西在整个系统里处于什么位置。

核心观点: 内存功耗不是单一指标,它是“类型 × 工作状态 × 系统负载”三者交织的结果。不理解基础,后面谈优化就是空中楼阁。

内存类型与功耗组成全景图 内存类型 SRAM 静态随机存取存储器 DRAM 动态随机存取存储器 Flash 闪存(非易失) 功耗组成 动态功耗 P_dyn = α·C·V²·f 静态功耗 P_sta = I_leak · V 短路过冲功耗 开关瞬间的额外开销 权衡策略 性能优先 高频率·高功耗 功耗优先 低频率·低功耗 动态平衡 DVFS·时钟门控 注:箭头方向表示“类型决定功耗特征 → 功耗特征影响权衡策略”

1.1 三种主流内存类型

先聊聊内存类型。做嵌入式或者芯片设计,你绕不开这三种:SRAM、DRAM、Flash。它们各有各的脾气,功耗特征也完全不同。

特性 SRAM DRAM Flash
存储单元 6个晶体管(锁存器) 1个晶体管 + 1个电容 浮栅晶体管
速度 极快(~1ns) 较快(~10ns) 慢(~100μs 写)
密度 低(6T/bit) 高(1T1C/bit) 极高(1T/bit)
易失性 易失(掉电丢失) 易失(需刷新) 非易失
静态功耗 较高(漏电大) 中等(刷新电流) 极低(接近0)
动态功耗 高(每次访问全摆幅) 中等(行激活开销大) 高(写操作需高压)

嗯,这里要注意。SRAM 虽然快,但 6 个晶体管存 1 个 bit,面积大、漏电也大。我在项目中遇到过,有些团队为了追求极致性能,把整个 L2 Cache 都用 SRAM 怼,结果芯片静态功耗直接爆表,散热压不住。

DRAM 呢?密度高,但需要周期性刷新。你想想看,一个 8Gb 的 DDR4 芯片,每秒要刷几千次,这本身就是一笔不小的功耗开销。

Flash 最省电,但写一次要擦除整个块,速度慢得让人抓狂。我建议,代码存 Flash,运行时数据放 SRAM 或 DRAM,别混着用。

1.2 功耗组成:动态 vs 静态

功耗这东西,拆开来看就两大部分:动态功耗和静态功耗。还有一个短路过冲功耗,算是动态的“附加项”。

动态功耗

动态功耗,说白了就是电路翻转时消耗的能量。公式很简单:

P_dynamic = α · C · V² · f
  • α:翻转活动因子(0~1,表示平均每周期翻转的概率)
  • C:负载电容(跟电路规模和工艺有关)
  • V:供电电压
  • f:工作频率

你看,电压是平方项,影响最大。频率是线性项。所以降电压比降频率划算得多。我做过一个项目,把核心电压从 1.1V 降到 0.9V,动态功耗直接砍了 33%。代价是什么?时序裕量变紧了,容易出 setup 违例。

实战技巧: 动态功耗优化,优先降电压,其次降频率。但降电压前一定要做全 PVT 角度的时序分析,别为了省电把芯片搞废了。

静态功耗

静态功耗,就是电路啥也不干时也在漏电。公式:

P_static = I_leak · V

漏电流 I_leak 主要来自亚阈值漏电和栅极漏电。工艺越先进,漏电越严重。28nm 以下,静态功耗占比能到 40%~50%。

我曾经踩过一个坑。有一款低功耗 IoT 芯片,待机时 SRAM 没做电源门控,结果静态功耗占了整机功耗的 70%。后来加了 retention 和 power gating,待机电流从 200μA 降到了 5μA。嗯,这个教训挺深刻的。

短路过冲功耗

这个好理解。CMOS 电路翻转时,PMOS 和 NMOS 会短暂同时导通,形成从 VDD 到 GND 的直流通路。虽然时间短,但频率高了,累积起来也不容忽视。

1.3 功耗与性能的权衡

做系统设计,最头疼的就是这个权衡。要性能,就得堆频率、堆电压,功耗跟着涨。要省电,就得降频、降压,性能又不够用。

我个人习惯,把权衡分成三个层次:

  1. 静态权衡:设计阶段就定死。比如选 SRAM 还是 DRAM,用多少位宽,这些改不了。
  2. 动态权衡:运行时调整。比如 DVFS(动态电压频率调整)、时钟门控、电源门控。
  3. 自适应权衡:根据负载实时切换。比如 big.LITTLE 架构,重负载上大核,轻负载上小核。

避坑指南: 我曾经见过一个团队,为了省电把 CPU 频率降得太低,结果任务跑不完,反而因为长时间处于活跃状态,总功耗更高。权衡不是一味降频,要看“功耗 × 时间”的积分。

你想想看,一个典型的权衡场景:视频播放。解码需要 200MHz 的算力,你给 400MHz 当然流畅,但功耗翻倍。给 100MHz 呢?卡顿,用户骂娘。所以,找到那个“刚好够用”的点,才是高手。

好了,这一章的基础概念就聊到这儿。记住三件事:内存类型决定功耗基线,动态/静态功耗是优化对象,权衡是系统工程。后面我们会一步步深入,把这些概念变成可落地的策略。