2. 功耗分析与建模基础
在低功耗数字芯片实现中,功耗分析不是“跑一个工具看数字”,而是先要建立对功耗来源的物理认识,再把这些认识映射到工具能够读取的模型与约束上。数字CMOS电路的功耗通常拆成三类:动态功耗(开关功耗)、短路功耗(内部功耗的一部分)和静态功耗(漏电功耗)。三者物理来源不同,对电压、频率、阈值电压、温度、工艺角的敏感度也不同,因此优化手段往往互相牵制。
一、三类功耗的物理机制
动态功耗来自对负载电容的充放电。一个CMOS门翻转时,输出节点从0充到VDD,电源通过PMOS向负载电容注入电荷;从VDD放到0时,电荷经NMOS泄放到地。每完成一次完整的0→1→0翻转,从电源取走的能量为 C_L · VDD²,其中一半存储在电容中、一半在晶体管沟道中以热的形式耗散。若翻转活动率为α(单位时间内等效翻转次数与时钟频率的比值),则平均动态功耗为:
P_dynamic = α · C_L · VDD² · f_clk
这个式子说明三件事:功耗与VDD是平方关系,降压收益最大;与频率线性相关;与等效开关电容和活动率线性相关。因此时钟门控(降低α)、操作数隔离(降低无效翻转)、多阈值/尺寸优化(降低C_L)都是直接作用于动态功耗的手段。
短路功耗发生在输入信号跳变期间。当输入电平处于 VTH_n < Vin < VDD − |VTH_p| 的过渡区时,NMOS和PMOS会同时导通,电源到地之间形成一条短暂直流通路。短路功耗可近似写成:
P_short = t_sc · VDD · I_peak · f · α
其中 t_sc 是短路电流持续时间,I_peak 是峰值短路电流。它与输入转换时间(slew)强相关:slew越慢,过渡区停留越久,短路功耗越大。所以在Liberty中,cell_rise/cell_fall、rise_transition/fall_transition 这些时序表不仅影响时序,也直接影响内部功耗的查表结果。工程上通常把短路功耗与内部充放电损耗合并,统称为“内部功耗(internal power)”,由Liberty的 internal_power 组描述。
静态功耗是电路不翻转时仍然存在的漏电。主要来源包括:亚阈值漏电(弱反型区源漏之间的扩散电流)、栅氧隧穿漏电、栅致漏极泄漏(GIDL)和结反偏漏电。亚阈值漏电对阈值电压呈指数敏感:
I_sub ∝ exp( (VGS − VTH) / (n·kT/q) ) · (1 − exp(−VDS/(kT/q)))
因此降低VTH会指数级抬高漏电,这也是高性能工艺中“漏电墙”的根源。静态功耗还与温度正反馈:温度升高→漏电增大→功耗增大→温度进一步升高,形成热失控风险。多阈值单元(HVT/SVT/LVT)、电源门控(power gating)、体偏置(body bias)是控制静态功耗的主要手段。
二、Liberty:单元级功耗与时序的查表模型
Liberty文件是标准单元库的“数据字典”,功耗分析工具首先读它。与功耗直接相关的组包括:
leakage_power:给出单元在特定输入状态、温度、电压下的漏电值,通常按when条件列出多组,工具根据实际输入状态选择。internal_power:以二维查表形式给出rise_power/fall_power,索引是输入转换时间(input transition)和输出负载电容(output capacitance)。这正是短路功耗与内部充放电损耗的合并建模。cell_rise/cell_fall:时序延迟表,与功耗表共享同样的索引变量,因此slew和load既影响时序也影响功耗。
一个典型的内部功耗查表片段如下(数值为示例):
internal_power() {
rise_power(energy_template_7x7) {
index_1 ("0.01, 0.05, 0.12, 0.25, 0.50, 0.80, 1.20"); /* input transition (ns) */
index_2 ("0.001, 0.005, 0.02, 0.05, 0.10, 0.20, 0.40"); /* output load (pF) */
values ( \
"0.0021, 0.0023, 0.0028, 0.0035, 0.0048, 0.0072, 0.0120", \
"0.0025, 0.0027, 0.0032, 0.0040, 0.0054, 0.0080, 0.0132", \
... );
}
}
工具在分析时,根据每个实例的实际输入slew和输出load,在表中做双线性插值,得到该次翻转的内部能量,再乘以翻转次数得到平均内部功耗。因此,如果约束或布局导致slew变差,功耗会同步上升——这是时序与功耗耦合的典型体现。
三、UPF与CPF:系统级低功耗意图
Liberty只描述单个单元,无法表达“这个模块在待机时断电”“这个信号跨电源域需要隔离”这类系统级意图。UPF(IEEE 1801)和CPF(Cadence Power Format)就是用来描述这些意图的格式。两者概念相近,语法不同,UPF是IEEE标准,CPF是Cadence早期主推格式,现代流程以UPF为主。
以UPF为例,一个电源域和电源开关的典型描述为:
create_power_domain PD_CPU -elements {u_cpu}
create_power_switch sw_cpu \
-domain PD_CPU \
-input_supply_port {vin VDD} \
-output_supply_port {vout VDD_CPU} \
-control_port {sleep pwr_en} \
-on_state {on_state vin {!sleep}}
set_isolation iso_cpu \
-domain PD_CPU \
-isolation_supply VDD \
-clamp_value 0 \
-applies_to outputs
set_retention ret_cpu \
-domain PD_CPU \
-retention_supply VDD \
-save_signal {save_ff posedge clk}
这段描述告诉工具:u_cpu属于PD_CPU域;该域由sw_cpu开关控制,当sleep为低时导通;域输出需要隔离,隔离时钳位到0;域内部分寄存器需要保持,保存信号为save_ff。功耗分析工具读取UPF后,才能正确判断哪些模块在待机时漏电被切断、哪些信号在断电域与常开域之间需要特殊处理。
四、从物理机制到分析流程的对应关系
把三类功耗与建模格式对应起来,可以形成一条清晰的分析链:动态功耗和短路功耗依赖活动率与slew/load,因此需要VCD/SAIF反标和Liberty内部功耗表;静态功耗依赖输入状态、温度和VTH,因此需要Liberty漏电表和工艺角设置;系统级断电、隔离、保持行为则由UPF/CPF描述。三者缺一,功耗数字就不可信。
例如,若只读Liberty而不反标活动率,工具只能用默认活动率(如0.1或0.2)估算动态功耗,结果可能与实际相差数倍;若UPF中漏写了隔离单元,断电域的输出可能浮空,导致常开域输入级短路功耗异常增大,甚至功能错误。因此,功耗分析的第一步不是看报告,而是检查输入是否完整:库、网表、约束、活动率、UPF/CPF、工艺角是否一致。
理解这三类功耗的物理机制,并清楚Liberty、UPF、CPF各自描述什么、不描述什么,是后续所有低功耗实现与验证工作的基础。只有模型与意图都正确,工具给出的功耗数字才具有工程参考价值。