JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

电源完整性与低功耗

一颗芯片可能通过了每一项时序检查,却在你给它上电的那一刻就死掉——因为没人确认过是否真有足够干净的电流能抵达晶体管,也没人确认承载电流的金属线能不能撑过它本该工作的那些年。电源是一项独立的签核(signoff),有自己的通过/不通过门槛。本指南走一遍这项签核的四件事——送进足够的电流、别让电压塌陷、别让金属线磨损报废、别烧掉超过你所需的功耗——最后再介绍那些把瓦数省回来的低功耗手法(时钟门控、电源门控、multi-Vt、DVFS、UPF)。

电源是一等公民级的签核

到现在为止,你已经看着一个设计走过了 布局布线、在每一个 工艺角 上收敛了 时序,并通过了 DRCLVS。你很容易以为最难的部分已经过去了。但一颗逻辑上完美、时序上干净的芯片,仍然可能一上电就报废——因为没人检查过是否真有足够干净的电流能抵达所有那些晶体管,也没人检查承载电流的金属能不能撑过它本该工作的那些年。

标志一名后端工程师的思维转变正在于此:电源不是你到最后顺手收拾的副产物——它本身就是一项签核,有自己的通过/不通过门槛,与时序和物理验证并行进行。把你的芯片想成一座城市。时序签核问的是交通能不能按时到达每个地方;而电源签核问的是供电公司的那些问题:发电站够不够大?变电站在负载下会不会塌陷?电缆会不会过热失效?整个电网是不是在浪费根本不必要的电?

电源传输网络

芯片上的每个晶体管都需要被喂两样东西:一个稳定的供电电压(叫它 VDD)和一条回到地的路径(VSS)。把电流从封装引脚送进来、向下穿过各层 金属层、再送进每一个 标准单元 的那套“管路”,就是 电源传输网络,即 PDN。说白了,它就是你这颗芯片的供电电网。

把它想象成一套层层分级的供水主管网,跟城市里的一模一样。最粗的管道——铺在最顶层、最厚的金属层上的宽金属条(strap)——把电流从封装引进来。它们供给一张用通孔(via)缝合起来的、规则纵横交错的电源网格(power grid,或称 power mesh)。这张网格逐层向下贯穿整个金属叠层,直到在最底层,细细的电源轨(power rail)就沿着一排排标准单元铺过去,逐一接到每个单元的 VDD 和 VSS 引脚。顶上是粗干管,底下是细毛细管——和动脉一路分叉成毛细血管是同一个形状。

这正是为什么 PDN 要最先搭建,在任何一根信号线被布线之前就织进 布局规划(floorplan) 里。电网会提前在高层金属上圈下自己的地盘;信号 布线 之后再从剩下的空间里穿行。电网建得太薄,逻辑就会“吃不饱”;建得太厚,你就白白烧掉了布线轨道、平白加重了 拥塞。给 PDN 定尺寸,是你要做的第一个真正的功耗权衡。

IR drop:电压塌陷

PDN 的金属线是极好的导体,但并不完美——每一根金属条、每一个通孔、每一根电源轨都带有那么一点点电阻。而这里有一条躲不掉的铁律:电流 I 一旦流过电阻 R,这段电阻两端的电压就会下降 I 乘以 R。所以等 VDD 从封装引脚出发、穿过电网、一路降到埋在芯片正中央的某个单元时,它抵达时已经比出发时了一点。这个塌陷就叫 IR drop

V_drop = I * R          // voltage lost across PDN resistance
V_cell = VDD_pin - V_drop   // what the cell actually sees
// Example: 0.10 A through 50 milliohm of PDN = 5 mV sag
//          on a 0.75 V supply, that's a 0.7% droop
欧姆定律,电源完整性里最重要的一条方程。电阻由你画下的金属决定、是固定的;电流则随活动而起伏——所以最严重的塌陷发生在一个大模块同时翻转的那一刻。

区区几毫伏为什么要紧?因为晶体管在电压更低时翻转得更慢——给一个门更少的 VDD,它翻转就要花更长时间。于是 IR drop 悄悄地把塌陷区域里每一个门的延迟都拉长了,而你在标称电压下精心收敛好的时序,等真实的、已经塌陷的电压一出现,就可能突然失败。这正是回扣上一篇指南的深层联系:IR drop 和 时序 是同一个问题戴着两顶帽子。现代签核是电压感知(voltage-aware)的——时序引擎会被告知每个单元处实际塌陷后的电压,这样两项检查的结论才一致。

它有两种形态。静态 IR drop 是平均电流造成的稳态塌陷——靠更粗壮的电网或更多封装引脚来解决。动态 IR drop 才是难缠的那种:当一大片逻辑在同一个时钟沿上一起翻转、从电网里猛地抽走一个电流尖峰时出现的瞬态下陷。经典的解法是去耦电容(decoupling capacitance,decap)——在“嘴馋”的逻辑附近撒下的一些小蓄水池电容,在尖峰来临的那一瞬间就地把电荷倒出来,就像水塔在主管网赶上来之前先把早高峰的用水削平。

电迁移:金属线会磨损报废

这是一种和逻辑毫无关系、却和时间累积出来的物理效应息息相关的失效模式。往一根细金属线里灌进足够多的电流,流动的电子就真的会开始把金属原子一颗颗往下游撞,就像河流慢慢把砾石沿着河床往下拖一样。日积月累、年复一年,原子在某些地方堆积、在另一些地方变稀,直到金属线长出一个空洞而断路(open)——或者长出一根金属须搭到邻线上而短路(short)。这种缓慢的侵蚀就是 电迁移,即 EM,它正是为什么一颗芯片第一天能通过所有测试,却在现场用了两年后失效。

关键的直觉是:EM 由电流密度驱动——也就是塞进一个极小截面里的安培数——而不是电流的绝对大小。同样大小的电流,穿过一根发丝般细的线,要比穿过一根宽金属条危险得多,因为电子被挤得更密。这正是为什么 EM 咬得最狠的地方恰恰是电流最集中之处:PDN 的金属条、电源通孔,以及时钟网络——它们都承载着沉重而无休止的电流。

EM 签核会给每一根金属线设一个电流密度上限——这是制造厂给出的规则,规定某个金属宽度在工作温度下、在芯片额定寿命内能安全承载多大的电流(芯片跑得越热,EM 加速得越快)。工具会标出任何超限的线,而你通过加宽这根线、把电流分摊到并联的多条路径上、或者多打几个通孔(这样就没有哪一个通孔被过载)来修掉这个违例。这是规模庞大到惊人的“记账”活——但只要你跳过它,你交付的就是一颗带着保质期的芯片。

功耗都花在了哪里(动态 vs 漏电)

把电送进去只是故事的一半。另一半是别浪费它——芯片烧掉的每一瓦,都会变成你必须排掉的热、必须耗掉的电池。要把功耗花得明智,你得先知道它都去了哪里,而在一颗 CMOS 芯片里,它分成两个非常不同的大类。

第一类是动态功耗(dynamic power)——这是真正*做事*的代价,每当一个信号翻转、对一根线上那点小小的电容充电或放电时就被烧掉。它遵循芯片设计里最常被引用的公式之一:

P_dynamic = alpha * C * V^2 * f
// alpha = activity factor (fraction of nodes switching per cycle)
// C     = capacitance being switched
// V     = supply voltage
// f     = clock frequency
把它读成四个旋钮。注意 V 是**平方**的——把电压减半,动态功耗就降到四分之一,这就是为什么电压是你手上最有力的那根杠杆。alpha 是时钟门控所攻击的目标;而 f 和 V 是 DVFS 往下调的两个量。

第二大类是漏电(静态)功耗(leakage / static power)——即便什么都没在翻转,电流仍会涓涓地从晶体管里渗漏出去。现代晶体管是个并不完美的开关;“关断”状态下它还是会漏掉一点点,而在数十亿个晶体管上累加起来,这点涓流就汇成一笔实实在在、始终在线的税,只要电路通着电,无论它闲不闲,你都得交。和动态功耗不同,漏电根本不在乎你的时钟——只要这个模块还带着电压,它就 7×24 小时不停地流。

时钟门控与电源门控

先从最便宜、最通用的那笔收益开始:时钟门控时钟本身是芯片上最忙、最耗电的那根网线——它每一个周期、在每一个地方都翻转,而每一次翻转都在给电容充电、烧掉动态功耗。但其中很大一部分翻转是毫无意义的:一个寄存器明明这个周期里值不会变,却照样被时钟驱动、翻转了自己的内部节点、白白烧掉功耗却没干一件有用的事。

时钟门控的想法极其简单:如果一个模块这个周期没活干,就别给它送时钟沿。一个小小的门挡在寄存器的时钟前面,把它关掉——就像把空房间的灯关掉,而不是整晚点亮整栋楼。没有时钟沿就没有翻转,没有翻转就没有动态功耗,而又因为它打的是最忙的那根网线,省下来的量很大、又几乎不花成本。综合工具会自动插入它,但写出*能让*门控生效的 RTL(给你的寄存器配上干净的使能信号)则是你要慢慢练就的本事。

电源门控是更重的那把锤子,它瞄准的是*另一个*大类——漏电。它不只是暂停时钟,而是把供电电压从一个要闲置一段时间的整块逻辑上切掉,做法是在它的 VDD 上串联一个大大的休眠晶体管(sleep transistor,又称电源开关 power switch)。没有电压就没有漏电——你是把城市的那一片直接拔掉了电源插头,而不只是把灯调暗。

Multi-Vt、DVFS 与 UPF(先瞥一眼)

还有三根杠杆把这套低功耗工具箱补齐。第一根就藏在标准单元自己内部:multi-Vt(多阈值电压)。同一个逻辑门会提供好几种阈值电压不同的“口味”——低 Vt(low-Vt)单元快,但漏电很多;高 Vt(high-Vt)单元慢,但几乎不怎么漏电。工具把这一点用得漂亮:只在真正需要速度的 关键路径 上用那些又快又漏的单元,其余有 时序裕量(slack) 富余的地方,统统换上抠门的高 Vt 单元。功能一模一样,漏电却只剩零头——只不过是逐个门挑对了口味而已。

第二根是 DVFS——动态电压频率调节(dynamic voltage and frequency scaling)。还记得动态功耗公式里那个 V 的平方吗?DVFS 把它用到了极致:当一个模块不需要全速时,就把它的时钟频率*和*电压一起往下调。把电压减半,动态功耗大约降到四分之一——这是一笔巨大的收益——这也正是为什么你在看东西时,手机会让它的核心又慢又凉地跑,只有当你启动一个游戏时,才把电压和时钟一起拉上去。

# UPF (Unified Power Format) — power intent, kept SEPARATE from the RTL
create_power_domain PD_CPU  -elements {cpu_core}
create_supply_net   VDD_CPU -domain PD_CPU
# a switchable supply: this domain can be powered down
create_power_switch  sw_cpu -domain PD_CPU \
    -input_supply_port  {vin VDD}  -output_supply_port {vout VDD_CPU} \
    -control_port {sleep cpu_sleep}
UPF 描述的是电源**意图(intent)**——电源域、可切换供电、隔离、保持——它写在一个与 RTL 并列的文件里,而不是埋进 RTL 之中。同一份 Verilog 只要换一份 UPF,就能面向不同的电源架构。

刚才那段代码已经透露了第三块拼图:一旦有了多个电压域、可切换供电、隔离和保持,电源架构就复杂到没法靠手工去追踪了。于是这份意图被放进一个单独的文件里——UPF(Unified Power Format,统一电源格式),一项 IEEE 标准。UPF 给各个电源域命名、说明哪些可以被关断、以及隔离和保持单元该放在哪里。流程里的每一个工具——综合、布局布线、验证、签核——读的都是*同一份* UPF,于是电源意图从 RTL 一路到 流片(tapeout) 都保持一致。它就是电源的唯一可信源(single source of truth),正如网表之于逻辑。