电源门控(power gating)
时钟门控(clock gating)让一个模块「安静下来」,靠的是把它的时钟停住不动;可晶体管依然连在电源上,于是即便闲着不干活,它们也还在一点一点地漏掉电流。电源门控则做得更彻底:它把这个模块的电源开关整个「关掉」,就像不是只把灯关了,而是直接拉掉房子里那一整间空厢房的总闸。没有电源轨给它供电,闲置的逻辑就不再漏电——这正面打击的是漏电(静态)功耗:哪怕什么都没切换,只要晶体管通着电,就会有这股持续不断的电流流走,而在如今的先进节点上,它已经占到一颗芯片总功耗里很大的一块。
这个开关本身,是插在那条真正、始终通电的电源,和模块自己那条本地电源轨之间的一排大尺寸晶体管(版图里把这条本地轨叫做虚拟 VDD 或虚拟地)。头开关(header switch)是一颗 PMOS 器件,夹在 VDD 和模块的虚拟 VDD 之间;脚开关(footer switch)则是一颗 NMOS 器件,夹在模块的虚拟地和真正的地之间。当你拉起睡眠(sleep)信号,这些开关就关断,本地电源轨随之悬空,于是几乎没有电流再流过。要让这件事在实际中安全可靠,得靠两个搭档:隔离单元(isolation cell)把睡眠模块那些此刻悬空的输出钳位到一个确定的 0 或 1,免得周围的电路读到一堆乱码;保持寄存器(retention register,或者一套存储-恢复机制)则替你守住那少数几个绝不能丢的状态位——否则一断电,里面的东西就全没了。
电源门控只是低功耗工具箱里的一件工具。多阈值(multi-Vt)设计的做法,是在那些时序裕量还有富余的路径上,掺进一些高阈值的单元——它们漏电少得多(代价是切换稍微慢一点);而 DVFS(动态电压频率调节,dynamic voltage and frequency scaling)则是根据当前负载,把电源电压和时钟频率往上调或往下调,从而削减动态的、由切换带来的功耗。正因为这一切都在改变「芯片的哪些部分在什么时候通电」,设计的功耗意图(power intent)——电源域分布在哪里、由哪些开关供电、哪些要隔离、哪些要保持——会在一开始就写进一份 UPF(IEEE 1801)或 CPF 文件里,让整条后端流程——综合、布局、CTS、布线、验证——都去读取并照着执行。
为什么「关断电源」和「高 V_t 单元」两手都重要:漏电随电源电压成正比变化,却会随着晶体管阈值在更小节点上不断降低而急剧暴增——所以把 V_DD 砍到零(电源门控)或者抬高 V_t(多阈值),都能各自狠狠削掉那股静态电流。
电源门控不是白来的:那些开关晶体管要占面积,还会和模块串联着多出一小段 IR 压降;把一个电源域唤醒既要花时间,又会带来一阵浪涌电流(inrush current)的冲击;而且只有当模块睡得足够久、足以把这笔开销赚回来,你才算真正划算——所以它只留给那些确实存在闲置模式的模块,而不是给任何时刻都在不停翻转的电路用。