3、电源树与电压域:SoC电源域划分,DVFS与AVS基础,典型电源树案例分析

好,咱们今天聊聊电源树和电压域。这玩意儿,说白了就是SoC的“供电地图”。你想想看,一个芯片里几十亿个晶体管,有的要跑2GHz,有的常年休眠,怎么可能用同一路电压供着?那太浪费了。

我刚开始做功耗优化那会儿,就吃过这个亏。当时觉得只要把主频降下来就行,结果漏电流还是大得吓人。后来才明白,电压域划分才是功耗管理的根基。你连哪块电路该吃多少电都没搞清楚,谈何优化?

3.1 SoC电源域划分:把芯片切成“独立供电区”

电源域(Power Domain),就是一组可以独立控制供电的电路模块。每个域有自己的供电网络,可以单独开关、单独调压。

典型的划分方式是这样的:

  • Always-on Domain:永远带电的区域。比如RTC、唤醒逻辑、一部分SRAM。我见过有的方案连这个域都敢关,结果手机闹钟不响了……嗯,这属于设计事故。
  • CPU Cluster Domain:CPU核心的供电区。大核、小核通常分开,因为电压需求不一样。
  • GPU Domain:图形处理单元,功耗大户,单独供电。
  • Media Domain:视频编解码、ISP、显示控制器。这些模块工作时有突发电流,需要独立稳压。
  • IO Domain:各种外设接口,比如USB、UART、I2C。电压域通常和SoC核心域隔离,因为IO电压可能是1.8V或3.3V。

核心原则:每个电源域都应该有独立的电压调节器(VR)或电源管理IC(PMIC)供电。共用VR的域,其实不算真正的独立域。

为什么要这么分?说白了就两个原因:省电隔离噪声。省电好理解,不用的模块直接断电。隔离噪声呢?GPU全速运行时,电压纹波能到几十毫伏,如果不隔离,CPU那边可能就跟着“抖”起来,导致时序违例。

3.2 DVFS与AVS基础:动态调频调压的艺术

DVFS(Dynamic Voltage and Frequency Scaling),动态电压频率调整。这名字听着高大上,其实原理很简单:活儿多的时候跑快点,活儿少的时候跑慢点

但这里有个坑——电压和频率不是线性关系。频率越高,需要的电压就越高。而且这个关系是二次方的:

P ∝ C × V² × f

你看,电压是平方项。所以降一点电压,省电效果比降频率明显得多。我个人的习惯是:先降电压,再降频率。但前提是芯片得撑得住。

这就引出了AVS(Adaptive Voltage Scaling),自适应电压调节。DVFS是根据性能需求调压,AVS是根据芯片体质调压。

什么意思呢?同一批芯片,有的体质好,1.0V就能跑1.5GHz;有的体质差,得1.1V才行。如果统一按1.1V供电,体质好的芯片就白白浪费了功耗。AVS就是给每颗芯片“量身定做”一个最低工作电压。

实战技巧:我在项目中遇到过,某款芯片的AVS校准值在出厂时没烧录好,结果量产机全部跑在保守电压上,续航比竞品短了15%。后来我们加了一个开机自校准流程,每次启动时跑一小段测试程序,动态调整电压。虽然开机慢了0.5秒,但续航回来了。

3.3 典型电源树案例分析

咱们来看一个真实的电源树结构。这是某款中端手机SoC的供电方案:

电源域 供电来源 典型电压 最大电流 备注
VDD_CORE PMIC Buck1 0.7V - 1.1V 5A CPU+GPU共用,动态调压
VDD_MEM PMIC Buck2 1.1V 3A DDR控制器,固定电压
VDD_IO PMIC LDO1 1.8V 500mA 外设IO,低噪声要求
VDD_ALIVE PMIC LDO2 1.0V 50mA Always-on域,常开
VDD_PLL PMIC LDO3 1.2V 200mA 模拟PLL,超低纹波

你看这个设计,有几个值得注意的地方:

  • CPU和GPU共用一路Buck:这其实是个妥协。好处是节省PMIC通道,坏处是两者不能独立调压。玩游戏时GPU需要高电压,CPU也跟着“沾光”,白白浪费电。我建议如果成本允许,尽量分开。
  • VDD_MEM用固定电压:DDR控制器对电压稳定性要求极高,动态调压容易导致数据出错。所以干脆固定,省心。
  • VDD_PLL用LDO:PLL对电源噪声极其敏感,Buck的开关噪声会直接影响时钟抖动。所以必须用低噪声的LDO供电。

注意:电源树设计中最容易犯的错误是“压降估算不足”。我曾经遇到过,VDD_CORE在PCB走线上压降了50mV,结果芯片在高频下频繁复位。后来在PMIC输出端加了远程采样(Remote Sense)才解决。记住,芯片引脚上的电压才是真正的电压,不是PMIC输出的电压。

3.4 调试中的常见陷阱

嗯,这里再分享几个我踩过的坑:

  1. 电压域之间的电平转换:不同电压域之间通信,必须加电平转换器(Level Shifter)。我见过有人忘了加,结果1.8V域的信号直接灌进0.7V域,芯片当场烧了。
  2. 电源域上电顺序:有些域必须先上电,有些必须后上电。比如VDD_CORE必须在VDD_IO之前上电,否则IO引脚可能处于不确定状态,导致漏电。这个顺序在PMIC的寄存器里配好,别偷懒。
  3. DVFS的瞬态响应:电压切换不是瞬间完成的。从0.7V升到1.1V,Buck需要几十微秒。如果频率在这期间突然升高,芯片可能因为电压不足而崩溃。所以DVFS驱动里一定要加电压稳定等待

最后说一句,电源树设计没有标准答案。每款芯片、每个产品都有自己的取舍。但记住一个原则:能关的域尽量关,能降的压尽量降,能分开的供电尽量分开。做到这三点,你的功耗至少能优化30%。

下一章咱们聊聊PMU的寄存器配置和调试工具,到时候带你们看几个真实的trace日志。