功耗基础:CMOS电路功耗来源与移动设备功耗预算

各位同学,今天我们来聊聊功耗的基础。说实话,功耗这个话题,在移动端GPU设计里,比性能还让人头疼。我做了十几年低功耗设计,见过太多芯片因为功耗问题翻车。咱们今天就把功耗的底裤扒干净。

CMOS电路的三大功耗来源

CMOS电路的功耗,说白了就三块:动态功耗、静态功耗、短路功耗。咱们一个一个说。

1. 动态功耗:你干活就得吃饭

动态功耗是芯片工作时最主要的功耗来源。它的公式很简单:

P_dynamic = α × C_load × Vdd² × f

这里α是翻转率,C_load是负载电容,Vdd是供电电压,f是时钟频率。

嗯,这里要注意,电压是平方项。这意味着什么?你电压降10%,功耗能降19%。我当年做第一代移动GPU时,为了降这0.1V电压,团队熬了三个月。但效果确实明显,整颗芯片功耗直接降了15%。

动态功耗的本质,就是给电容充放电。你想想看,每个时钟周期,成千上万个晶体管在翻转,每个翻转都要给寄生电容充放电。这能量消耗,就像你吃饭一样,干活就得吃。

关键点:动态功耗与电压的平方成正比,与频率成正比。这是功耗优化的主战场。

2. 静态功耗:躺着也在耗电

静态功耗,也叫漏电流功耗。芯片不干活的时候,电流照样在漏。这就像你睡觉时,身体还在消耗能量。

静态功耗的主要来源:

  • 亚阈值漏电流:晶体管关不干净,电流从源极漏到漏极
  • 栅极漏电流:栅氧化层太薄,电子直接隧穿过去
  • PN结漏电流:源漏与衬底之间的PN结反向漏电

我记得在28nm工艺节点时,静态功耗占比还不到10%。到了7nm,静态功耗能占到30%以上。为什么会这样?因为工艺越先进,晶体管尺寸越小,漏电流就越严重。这就像水管越细,水越容易渗出来。

避坑指南:我曾经遇到过一个项目,芯片在低负载场景下功耗异常高。查了两个月,最后发现是某个模块的电源没关干净,静态漏电流把整个功耗预算吃掉了。从那以后,我设计任何芯片都会先检查电源门控的完整性。

3. 短路功耗:开关瞬间的浪费

短路功耗,也叫直通功耗。发生在CMOS反相器翻转的瞬间,PMOS和NMOS同时导通的那一刹那。

你想想看,理想情况下,PMOS导通时NMOS关断,NMOS导通时PMOS关断。但实际翻转需要时间,在这段时间里,两个管子都处于半导通状态,电源到地之间就形成了直流通路。

短路功耗一般占总功耗的10%-20%。虽然占比不大,但在高速设计中不能忽视。我见过一些高频设计,短路功耗能占到30%。

功耗与性能的权衡:PPA三角

做芯片设计,永远绕不开PPA:Performance(性能)、Power(功耗)、Area(面积)。这三者就像三角形的三个角,你动一个,另外两个跟着变。

优化方向 对性能的影响 对功耗的影响 对面积的影响
提高电压 ↑ 频率提升 ↑↑ 动态功耗平方增长 — 无影响
降低电压 ↓ 频率受限 ↓↓ 功耗大幅下降 — 无影响
增加并行度 ↑ 吞吐量提升 ↑ 面积增加导致功耗增加 ↑ 面积增大
使用低阈值单元 ↑ 速度更快 ↑ 静态功耗增加 — 基本不变
电源门控 ↓ 唤醒延迟 ↓↓ 静态功耗大幅降低 ↑ 增加控制逻辑

我个人习惯,在做架构设计时,先定功耗预算,再谈性能目标。为什么?因为功耗是硬约束,超了就是超了,散热解决不了。性能嘛,可以降频、可以调调度策略。

举个例子,我参与过的一个移动GPU项目,目标性能是1GHz,但功耗预算只有2W。算下来,1GHz下动态功耗就要3.5W,根本不可能。最后我们做了个折中:把频率降到800MHz,但通过架构优化,把每时钟周期的指令数提升了30%。最终性能差不多,功耗控制在1.8W。

经验之谈:做PPA权衡时,我建议先做功耗预算分解。把总功耗分配到每个模块,然后每个模块的设计师自己想办法。这样责任明确,不会出现最后谁都不认账的情况。

移动设备功耗预算

移动设备的功耗预算,说白了就是电池能撑多久。一台手机,电池容量大概3000-5000mAh,电压3.7V,总能量也就11-18Wh。

这些能量要分给:

  • 屏幕:通常占30%-40%,OLED屏幕在显示黑色时省电
  • CPU/GPU:占20%-30%,游戏场景下GPU是耗电大户
  • 通信模块:占10%-20%,4G/5G/WiFi
  • 其他:传感器、内存、存储等

GPU的功耗预算,通常只有1-3W。你想想看,一个桌面GPU动辄200-300W,移动端只有它的百分之一。这就是为什么移动GPU设计这么难——要在极低的功耗下,跑出尽可能高的性能。

我记得有一次,客户要求GPU在1.5W功耗下跑出60fps的帧率。我们算了算,每帧的处理时间只有16.7ms,功耗预算每帧只有25mJ。这意味着每个像素的操作都要精打细算,多一个没必要的计算,功耗就超了。

核心观点:移动端功耗预算,不是你能不能做得到的问题,而是你愿不愿意做取舍的问题。每个晶体管、每个时钟周期、每个电压摆幅,都在消耗你的功耗预算。

最后说一句,功耗设计不是事后补救,而是从一开始就要考虑。我见过太多团队,先把功能做出来,再回头优化功耗。结果呢?改架构、换工艺、降电压,折腾一圈,性能还缩水了。所以,做移动GPU,功耗意识要刻在骨子里。