2. 低功耗设计基础
在低功耗 SoC 的 PMU 状态机项目中,功耗优化并不是简单地“把电源关掉”,而是要先理解功耗从哪里来、哪些模块可以独立控制、以及用什么手段控制。只有把功耗来源、电源域、时钟门控和电源门控这四个基础概念串起来,后续状态机的状态定义、迁移条件和唤醒流程才有依据。
一、动态功耗与静态功耗的来源
CMOS 电路的功耗通常分为两大类:动态功耗和静态功耗。动态功耗是电路在翻转、充放电过程中产生的,静态功耗则是电路在保持状态、不翻转时仍然存在的漏电功耗。
动态功耗主要由三部分组成:
- 开关功耗:负载电容在 0/1 翻转时充放电,公式为 Psw = α·CL·VDD2·f。其中 α 是翻转活动因子,CL 是负载电容,VDD 是供电电压,f 是时钟频率。
- 短路功耗:输入翻转瞬间,PMOS 和 NMOS 同时导通,形成 VDD 到 GND 的短暂直通电流。
- 时钟树功耗:时钟网络翻转频率高、负载大,往往占据动态功耗的很大比例。
静态功耗主要来自:
- 亚阈值漏电:晶体管在关断状态下仍有微弱导通,随温度升高和阈值电压降低而增大。
- 栅氧漏电:栅极绝缘层变薄后,电子隧穿造成的漏电。
- 结漏电:反偏 PN 结的漏电流。
二、电源域划分:让“关电”成为可能
电源域(Power Domain)是指可以由同一个电源开关统一供电或断电的一组逻辑和存储单元。电源域划分的目标是:把可以独立关断的模块聚在一起,把必须常开的模块单独隔离,从而在待机时只保留最小供电范围。
常见的电源域类型包括:
- 常开域(Always-On):PMU 状态机、唤醒控制器、RTC、关键寄存器等,必须持续供电。
- 可关断域(Switchable):CPU 核、GPU、DSP、外设控制器等,可在空闲时断电。
- 可保持域(Retention):断电后仍需保留部分状态,使用 retention flip-flop 或备份寄存器。
- 可调压域(DVFS Domain):需要动态调频调压的模块,如 CPU 集群。
电源域划分时要注意隔离(Isolation)和电平转换(Level Shifter)。当一个域断电时,其输出信号可能浮空,必须用隔离单元钳位到确定电平,避免影响常开域。不同电压域之间通信时,还需要电平转换器保证信号正确。
三、时钟门控:不翻转就不耗动态功耗
时钟门控(Clock Gating)是最常用、最直接的动态功耗优化手段。它的核心思想是:当某个模块不需要工作时,把它的时钟关掉,使寄存器不翻转,从而消除开关功耗和时钟树功耗。
常见的时钟门控方式有两种:
- 组合逻辑门控:用与门直接控制时钟,但容易产生毛刺,实际中不推荐。
- 集成时钟门控单元(ICG):用锁存器在时钟低电平期间锁存使能信号,输出无毛刺的门控时钟,是标准做法。
// 典型 ICG 行为示意
always @(negedge clk or negedge rst_n) begin
if (!rst_n)
en_latch <= 1'b0;
else
en_latch <= en;
end
assign gclk = clk & en_latch;
// en_latch 在 clk 低电平期间更新,gclk 无毛刺
在 PMU 状态机项目中,时钟门控通常由状态机输出控制:当状态进入 IDLE 或 SLEEP 时,关闭 CPU、DSP、外设的时钟;当唤醒事件到来时,再逐级打开时钟。时钟门控的优点是唤醒快、状态不丢失,缺点是只能省动态功耗,不能省静态漏电。
四、电源门控:断电才能省静态功耗
电源门控(Power Gating)是通过电源开关(Power Switch)切断某个电源域的供电,使该域进入断电状态,从而消除静态漏电。电源门控通常与电源域划分配合使用:可关断域在空闲时断电,常开域保持供电。
电源门控的关键技术包括:
- 电源开关:通常用高阈值 PMOS 或 NMOS 作为开关,分布在电源网格上。
- 隔离单元:断电域输出在断电期间被钳位,防止浮空信号传播。
- 状态保持:需要保留的状态用 retention 寄存器或备份 SRAM 保存。
- 上电复位:重新上电后,断电域需要复位到确定状态。
- 唤醒时间:电源门控唤醒需要上电、复位、恢复状态,通常比时钟门控慢得多。
| 对比项 | 时钟门控 | 电源门控 |
|---|---|---|
| 优化功耗类型 | 动态功耗 | 静态功耗为主 |
| 状态保持 | 保持 | 丢失或需 retention |
| 唤醒速度 | 快,几个周期 | 慢,需上电复位 |
| 实现复杂度 | 低 | 高,需隔离、开关、复位 |
| 典型应用 | 空闲外设、CPU 空闲 | 深度睡眠、待机 |
五、案例与常见误区
假设一个低功耗 SoC 包含 CPU、DSP、显示控制器和常开 PMU。在待机场景中,PMU 状态机可以这样决策:
- CPU 空闲但需快速响应:关闭 CPU 时钟,保留电源,进入时钟门控。
- DSP 长时间无任务:关闭 DSP 电源域,输出隔离,进入电源门控。
- 显示控制器无刷新:关闭其时钟和电源,仅保留 PMU 和 RTC。
- 唤醒事件到来:先开电源、释放隔离、复位,再开时钟,最后恢复状态。
复盘时可以用三个问题检查设计:第一,这个模块不工作时,时钟是否真的关了?第二,这个模块不工作时,电源是否真的断了?第三,断电后,它的输出是否被隔离、状态是否需要保留?把这三个问题落实到 PMU 状态机的每个状态和迁移条件中,低功耗设计才真正落地。