4、电源门控技术(Power Gating)
各位,咱们今天聊电源门控。说白了,就是给芯片里暂时不干活的功能模块“断电”。你想想看,一个SoC上那么多IP核,CPU在跑,GPU闲着,NPU也在睡大觉。如果所有模块都一直通着电,漏电流就像水管没关紧一样,哗哗地流。我早年做过一个IoT芯片,待机功耗怎么都压不下去,最后发现就是一个UART模块的漏电在作怪。从那以后,我对电源门控就特别上心。
核心思想: 在模块空闲时,用开关切断其电源轨,使漏电流趋近于零。代价是唤醒时需要额外的时间和能量来恢复供电与状态。
4.1 电源开关单元
电源门控的“开关”长什么样?它不是我们家里那种机械开关,而是一个由PMOS或NMOS构成的电源开关单元(Power Switch Cell)。
- Header Switch(头部开关): 用PMOS管接在VDD和虚拟VDDV之间。PMOS导通时,VDDV≈VDD;关断时,VDDV浮空或下拉到地。我习惯在标准单元库里选现成的Header Cell,省事。
- Footer Switch(尾部开关): 用NMOS管接在虚拟VSSV和真实VSS之间。NMOS导通时,VSSV≈0;关断时,VSSV上浮。Footer开关面积通常比Header小,但IR Drop控制要更小心。
| 类型 | 器件 | 连接位置 | 优点 | 缺点 |
|---|---|---|---|---|
| Header | PMOS | VDD → VDDV | 体效应小,噪声隔离好 | 面积较大,驱动能力弱 |
| Footer | NMOS | VSSV → VSS | 面积小,驱动能力强 | 体效应明显,地弹噪声 |
实际项目中,我一般把开关单元做成细长条,沿着电源域边界排布。每个开关的驱动能力要算好——太弱了IR Drop大,太强了浪费面积。我记得有一次,一个模块的开关尺寸算小了,结果唤醒时电压爬升太慢,导致状态保持单元数据全丢了。嗯,那教训挺深刻的。
4.2 休眠模式与唤醒策略
休眠模式不是简单地“啪”一下断电就完事。它分好几个等级:
- 浅休眠(Light Sleep): 只关时钟,不关电源。恢复快,但漏电还在。
- 深休眠(Deep Sleep): 关电源,但保留关键状态(靠状态保持寄存器)。
- 关断(Shutdown): 彻底断电,所有状态丢失。唤醒后需要重新初始化。
唤醒策略我总结了一个原则:先供电,再复位,后使能。具体步骤:
- 第一步:使能电源开关单元,让虚拟电源轨缓慢爬升。为什么要缓慢?因为瞬间大电流会造成电源塌陷,影响其他还在工作的域。
- 第二步:等待电压稳定。这个时间由RC常数决定,我一般留10~20个时钟周期。
- 第三步:释放隔离单元(Isolation Cell),让输出从钳位状态恢复正常。
- 第四步:释放状态保持寄存器(Retention Register)的保持信号。
- 第五步:释放复位信号,模块开始正常工作。
我的小技巧: 唤醒控制逻辑最好用常开域(Always-On Domain)的电源供电。别把唤醒控制器也放在被关断的域里,否则就成了“先有鸡还是先有蛋”的问题。
4.3 状态保持与电源域划分
有些关键状态,比如CPU的程序计数器、DMA的当前地址,断电后不能丢。怎么办?用状态保持寄存器(Retention Flip-Flop)。
这种寄存器有两个电源轨:一个主电源(可关断),一个备份电源(常开)。断电时,主电源被切断,但备份电源维持寄存器内部一个“影子锁存器”的数据。唤醒后,影子数据再恢复到主寄存器里。
我曾经在一个AI加速器项目里,把整个SRAM控制器都做了状态保持。结果发现备份电源的漏电加起来也不小。后来我学乖了——只保持控制状态,数据状态靠外部非易失存储恢复。你想想看,几百KB的寄存器都保持,那备份电源的漏电比主电源还大,得不偿失。
电源域划分是门控设计的第一步。我一般按以下原则来切:
- 功能独立性: 一个域内的模块最好有清晰的“开始/结束”边界。比如一个视频编解码器,编完一帧后可以完全空闲。
- 电压一致性: 同一个域内的标准单元必须使用相同的电压。别把1.0V和0.8V的单元混在一个域里。
- 物理连续性: 域的形状尽量规整,避免“飞地”或“长条”。否则后端布局布线会很难受。
注意: 跨域的信号必须加隔离单元(Isolation Cell)。否则,断电域的输出会浮空,导致接收域的逻辑产生短路电流。我见过一个案例,就是因为漏加隔离,芯片在休眠模式下整片电流飙升到正常工作的3倍。
4.4 MTCMOS技术
MTCMOS(Multi-Threshold CMOS)是电源门控的“黄金搭档”。它的思路很简单:
- 逻辑路径: 用低阈值(Low-Vt)晶体管。速度快,但漏电大。
- 电源开关: 用高阈值(High-Vt)晶体管。速度慢,但漏电极小。
这样一来,工作时逻辑路径跑得飞快,休眠时开关管把漏电死死卡住。我最早接触MTCMOS是在一个28nm的移动芯片上。当时工艺漏电已经大到不可忽视,不用MTCMOS根本过不了功耗预算。
下面这张图展示了MTCMOS的基本结构:
实际设计中,MTCMOS开关管的尺寸需要仔细权衡。我一般用电流密度法:先估算模块的最大工作电流,再除以每个开关管能安全通过的电流,得到并联数量。比如一个模块需要500mA,每个Header管能过10mA,那就并联50个。别忘了留20%的余量,因为IR Drop会随温度变化。
避坑指南: 我曾经在65nm工艺上犯过一个错——把MTCMOS开关管放在标准单元内部,而不是单独做成电源开关单元。结果导致布局布线时虚拟电源轨的电阻分布极不均匀,唤醒时有些区域电压先到,有些后到,造成了严重的时序混乱。后来我统一改用环状电源开关阵列,问题才解决。
好了,关于电源门控,核心就是这些。记住:开关单元选型、休眠唤醒时序、状态保持策略、MTCMOS搭配,这四个点缺一不可。下次你设计低功耗芯片时,不妨先从电源域划分开始,一步步把门控方案做扎实。