Power Compiler:漏电功耗、内部功耗、切换功耗及其计算方式(NLPM)
相关阅读
Power Compilerhttps://blog.csdn.net/weixin_45791458/category_13013065.html?spm=1001.2014.3001.5482
本文将对Power Compiler功耗分析时考虑的三种功耗(漏电功耗、内部功耗、切换功耗),及它们的计算方式(NLPM)进行详细介绍。
功耗分类
电路中的功耗大致可分为两类:静态功耗(Static Power)和动态功耗(Dynamic Power)。
静态功耗
静态功耗是指当电路不在切换、即处于非活动或静态状态时产生的功耗。静态功耗由多个部分组成,其中最大比例来自源极到漏极的亚阈值漏电电流,这类漏电是由于降低的阈值电压使单元无法完全关闭而产生的,此外,当扩散层与衬底之间发生漏电时也会产生静态功耗。因此,静态功耗通常也被称为漏电功耗(Leakage Power)。
动态功耗
动态功耗是指当电路处于活动状态时产生的功耗。只要由于输入激励导致某个线网上的电压发生变化,电路就被视为是活动的。即使某个输入线网的电压发生变化但并未引起输出逻辑状态的变化,仍可能会产生动态功耗。动态功耗可继续细分为两类:内部功耗(Internal Power)和切换功耗(Switching Power)。
内部功耗
内部功耗是指在单元内部产生的所有功耗。在切换过程中,电路通过对单元内部的各种电容进行充放电产生内部功耗。内部功耗包括短路功耗(Short-Circuit Power),即在单元翻转时P型和N型晶体管之间暂时形成的短路电流,对于信号转换时间较快的电路,短路功耗较小,但对于转换时间较慢的电路,短路功耗可能占整个单元功耗的30%左右,短路功耗还受晶体管尺寸和输出负载电容的影响。在大多数简单的单元中,内部功耗主要来自短路功耗,而在较复杂的单元中,内部电容的充放电可能成为主要的内部功耗来源。
切换功耗
切换功耗是指驱动单元在其输出端对总负载电容充放电所产生的功耗,总负载电容包含了输出端的线网(互连)电容和被驱动单元的输入引脚电容。由于充放电过程源于逻辑状态的切换,因此切换功耗会随逻辑翻转次数的增加而增加。因此,切换功耗与输出总负载电容以及逻辑翻转率成正比。
图1显示了一个简单的单元,并说明了静态功耗和动态功耗的产生位置。
图1 功耗的组成
功耗计算
功耗分析是基于本节的公式进行计算和报告的。Power Compiler使用这些公式,并结合在逻辑库中的功耗信息,对设计的功耗进行评估。
静态功耗
Power Compiler通过对设计中所有单元的漏电功耗进行求和,来计算设计的总漏电功耗,其公式如下:
逻辑库种可以指定单元的漏电功耗,可分为状态无关的漏电功耗和状态相关的漏电功耗。
状态无关的漏电功耗
可以使用库属性default_cell_leakage_power或库单元属性cell_leakage_power(优先级高于库属性)指定单元的漏电功耗(默认情况下,单元的漏电功耗为0)。漏电功耗的单位由库属性leakage_power_unit决定。
状态相关的漏电功耗
使用leakage_power组即可通过布尔表达式来定义不同状态下的漏电功耗,状态相关的漏电功耗优先级高于状态无关的漏电功耗。对于每种状态,工具将其对应的功耗值乘以该状态所占的时间百分比(可以通过翻转活动性推导),并进行求和,得到该单元的总漏电功耗。如果某一状态在leakage_power组中未定义,则工具会使用库属性default_cell_leakage_power或库单元属性cell_leakage_power的值来估算该状态下的漏电功耗贡献。
下面展示了一个具体的状态相关的漏电功耗的计算过程。
// 逻辑库节选cell_leakage_power : 4934.853000;leakage_power() {when :"!A & !B";value : 4934.853000;}leakage_power() {when :"!A & B";value : 9903.773000;}leakage_power() {when :"A & !B";value : 8956.541000;}leakage_power() {when :"A & B";value : 8839.259000;}
图2 示意图
使用report_power_calculation即可查看具体功耗计算过程,如下所示。
dc_shell> report_power_calculation [get_cells u1] -verbose****************************************
Report : power_calculationu1-verbose
Design : AND
Version: W-2024.09-SP2
Date : Fri Jul 25 20:07:31 2025
****************************************================================================================================State Dependent Cell Leakage Power Calculationcell: u1state condition: A' B'State Dependent Leakage Power = 1234. cell leakage power = leakage power value * state probabilityLeakage Power Value = 4935. library model: scalarvalue = 4935. (no scaling since the library has no leakage power k-factors)State Probability = 0.2500 (estimated)--------------------------------------------------------------------------------State Dependent Cell Leakage Power Calculationcell: u1state condition: A' BState Dependent Leakage Power = 2476. cell leakage power = leakage power value * state probabilityLeakage Power Value = 9904. library model: scalarvalue = 9904. (no scaling since the library has no leakage power k-factors)State Probability = 0.2500 (estimated)--------------------------------------------------------------------------------State Dependent Cell Leakage Power Calculationcell: u1state condition: A B'State Dependent Leakage Power = 2239. cell leakage power = leakage power value * state probabilityLeakage Power Value = 8957. library model: scalarvalue = 8957. (no scaling since the library has no leakage power k-factors)State Probability = 0.2500 (estimated)--------------------------------------------------------------------------------State Dependent Cell Leakage Power Calculationcell: u1state condition: A BState Dependent Leakage Power = 2210. cell leakage power = leakage power value * state probabilityLeakage Power Value = 8839. library model: scalarvalue = 8839. (no scaling since the library has no leakage power k-factors)State Probability = 0.2500 (estimated)--------------------------------------------------------------------------------Default Cell Leakage Power Calculationcell: u1Default Leakage Power = 0.000 cell leakage power = leakage power value * state probabilityLeakage Power Value = 4935. library model: scalarvalue = 4935. (no scaling since the library has no leakage power k-factors)Default State Probability = 0.000 Total Leakage Power for Cell 'u1' = 8159. ================================================================================
由于线网a、b使用的是默认的翻转活动性(由变量power_default_static_probability和power_default_toggle_rate指定),因此四种输入状态的概率都是0.25,由于不存在未定义的状态,默认漏电功耗的概率为0。
动态功耗
内部功耗
逻辑库中的internal_power组及其相关的属性和子组定义了引脚的内部功耗非线性查找表(NLPM)及其缩放因子,单元的内部功耗是该单元中所有输入与输出引脚的内部功耗之和。
关于查表计算的过程, 内部功耗非线性查找表类似于非线性延迟查找表,可以参考下面的博客。
Design Compiler:线性延迟模型和非线性延迟模型https://blog.csdn.net/weixin_45791458/article/details/146131977?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522caa8a27e7d5fb63019b47e3552950773%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=caa8a27e7d5fb63019b47e3552950773&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-146131977-null-null.nonecase&utm_term=%E9%9D%9E%E7%BA%BF%E6%80%A7&spm=1018.2226.3001.4450 值得注意的是,内部功耗非线性查找表可以是一维、二维和三维查找表,表1显示了这些查找表的类型和适用引脚方向,并说明了它们的索引方式。
表格类型 | 引脚方向 | 索引 |
一维查找表 | 输入 | 输入引脚转换时间 |
输出 | 总负载电容 | |
二维查找表 | 输出 | 输入引脚转换时间和总负载电容 |
三维查找表 | 输出 | 输出引脚转换时间和两个输出引脚的总负载电容(适用于触发器) |
对于内部功耗,一般考虑其状态相关形式,下面展示了输入和输出引脚的内部功耗计算方式。
需要注意的是,其中的指的是由对应输入引脚导致的输出引脚翻转率。当一个信号发生转换时,上升沿转换所对应的内部功耗与下降沿转换所对应的内部功耗是不同的,允许根据转换方向分别指定上升沿和下降沿的查找表。
下面展示了一个具体的状态相关的内部功耗的计算过程,依旧以图2为例。
// 逻辑库节选
pin(B) {direction : input;internal_power() {power(energy_template_7x1) {index_1 ("0.012, 0.02, 0.034, 0.062, 0.118, 0.232, 0.46");values ("0.002054, 0.002069, 0.002110, 0.002177, 0.002289, 0.002467, 0.002803");}}
}pin(Y) {direction : output;internal_power() {related_pin : "A";power(energy_template_7x7) {index_1 ("0.012, 0.02, 0.034, 0.062, 0.118, 0.232, 0.46");index_2 ("0.0005825, 0.001398, 0.0031455, 0.006524, 0.0133975, 0.0271445, 0.054755");values ( \"0.002054, 0.002069, 0.002110, 0.002177, 0.002289, 0.002467, 0.002803", \"0.002057, 0.002069, 0.002106, 0.002172, 0.002284, 0.002462, 0.002793", \"0.002115, 0.002119, 0.002143, 0.002196, 0.002302, 0.002481, 0.002801", \"0.002304, 0.002288, 0.002287, 0.002319, 0.002406, 0.002582, 0.002917", \"0.002819, 0.002759, 0.002699, 0.002695, 0.002749, 0.002907, 0.003230", \"0.003988, 0.003871, 0.003768, 0.003721, 0.003648, 0.003748, 0.004035", \"0.006493, 0.006291, 0.006050, 0.005887, 0.005845, 0.005715, 0.005946");}}internal_power() {related_pin : "B";power(energy_template_7x7) {index_1 ("0.012, 0.02, 0.034, 0.062, 0.118, 0.232, 0.46");index_2 ("0.0005825, 0.001398, 0.0031455, 0.006524, 0.0133975, 0.0271445, 0.054755");values ( \"0.002040, 0.002056, 0.002098, 0.002168, 0.002282, 0.002461, 0.002787", \"0.002031, 0.002044, 0.002083, 0.002153, 0.002263, 0.002448, 0.002783", \"0.002062, 0.002069, 0.002097, 0.002159, 0.002267, 0.002450, 0.002784", \"0.002195, 0.002188, 0.002198, 0.002242, 0.002342, 0.002525, 0.002852", \"0.002651, 0.002607, 0.002552, 0.002571, 0.002645, 0.002806, 0.003137", \"0.003732, 0.003639, 0.003561, 0.003546, 0.003499, 0.003623, 0.003931", \"0.006131, 0.005957, 0.005758, 0.005635, 0.005639, 0.005545, 0.005807");}}
}
使用report_power_calculation即可查看具体功耗计算过程,如下所示。
dc_shell> report_power_calculation [get_cells u1] -verbose****************************************
Report : power_calculationu1-verbose
Design : AND
Version: W-2024.09-SP2
Date : Fri Jul 25 20:07:31 2025
****************************************================================================================================Pin Internal Power Calculationcell: u1pin: BRise Pin Internal Power = 0.0001016pin internal power = internal energy * pin toggle rateRise/fall internal energy per transition = 0.002032 library model: NLPMtable variables:X = input_net_transition = 0.000 relevant portion of lookup table:(X) 0.0120000 (X) 0.0200000(Y) 1.0000000 (Z) 0.0020540 (Z) 0.0020690Z = A + B*XA = 0.0020315 B = 0.0018750Z = 0.0020315(no scaling since the library has no internal power k-factors)Rise Pin Toggle Rate = 0.05000 rise pin toggle rate = 0.5 * net toggle ratenet toggle rate = 0.1000 (default value)Fall Pin Internal Power = 0.0001016pin internal power = internal energy * pin toggle rateRise/fall internal energy per transition = 0.002032 library model: NLPMtable variables:X = input_net_transition = 0.000 relevant portion of lookup table:(X) 0.0120000 (X) 0.0200000(Y) 1.0000000 (Z) 0.0020540 (Z) 0.0020690Z = A + B*XA = 0.0020315 B = 0.0018750Z = 0.0020315(no scaling since the library has no internal power k-factors)Fall Pin Toggle Rate = 0.05000 fall pin toggle rate = 0.5 * net toggle ratenet toggle rate = 0.1000 (default value)Total Internal Power for Pin 'u1/B' = 0.0002032================================================================================Path Dependent Pin Internal Power Calculationcell: u1pin: Ypath source: APath Dependent Rise Pin Internal Power = 5.061e-05pin internal power = internal energy * pin toggle rateRise/fall internal energy per transition = 0.002036 library model: NLPMtable variables:X = input_net_transition = 0.000 Y = total_output_net_capacitance = 0.000 relevant portion of lookup table:(X) 0.0120000 (X) 0.0200000(Y) 0.0005825 (Z) 0.0020540 (Z) 0.0020570(Y) 0.0013980 (Z) 0.0020690 (Z) 0.0020690Z = A + B*X + C*Y + D*X*YA = 0.0020356 B = 0.0006429C = 0.0239116 D = -0.4598441Z = 0.0020356(no scaling since the library has no internal power k-factors)Path Dependent Rise Pin Toggle Rate = 0.02486 (estimated)Path Dependent Fall Pin Internal Power = 5.061e-05pin internal power = internal energy * pin toggle rateRise/fall internal energy per transition = 0.002036 library model: NLPMtable variables:X = input_net_transition = 0.000 Y = total_output_net_capacitance = 0.000 relevant portion of lookup table:(X) 0.0120000 (X) 0.0200000(Y) 0.0005825 (Z) 0.0020540 (Z) 0.0020570(Y) 0.0013980 (Z) 0.0020690 (Z) 0.0020690Z = A + B*X + C*Y + D*X*YA = 0.0020356 B = 0.0006429C = 0.0239116 D = -0.4598441Z = 0.0020356(no scaling since the library has no internal power k-factors)Path Dependent Fall Pin Toggle Rate = 0.02486 (estimated)--------------------------------------------------------------------------------Path Dependent Pin Internal Power Calculationcell: u1pin: Ypath source: BPath Dependent Rise Pin Internal Power = 5.069e-05pin internal power = internal energy * pin toggle rateRise/fall internal energy per transition = 0.002039 library model: NLPMtable variables:X = input_net_transition = 0.000 Y = total_output_net_capacitance = 0.000 relevant portion of lookup table:(X) 0.0120000 (X) 0.0200000(Y) 0.0005825 (Z) 0.0020400 (Z) 0.0020310(Y) 0.0013980 (Z) 0.0020560 (Z) 0.0020440Z = A + B*X + C*Y + D*X*YA = 0.0020389 B = -0.0008571C = 0.0251386 D = -0.4598798Z = 0.0020389(no scaling since the library has no internal power k-factors)Path Dependent Rise Pin Toggle Rate = 0.02486 (estimated)Path Dependent Fall Pin Internal Power = 5.069e-05pin internal power = internal energy * pin toggle rateRise/fall internal energy per transition = 0.002039 library model: NLPMtable variables:X = input_net_transition = 0.000 Y = total_output_net_capacitance = 0.000 relevant portion of lookup table:(X) 0.0120000 (X) 0.0200000(Y) 0.0005825 (Z) 0.0020400 (Z) 0.0020310(Y) 0.0013980 (Z) 0.0020560 (Z) 0.0020440Z = A + B*X + C*Y + D*X*YA = 0.0020389 B = -0.0008571C = 0.0251386 D = -0.4598798Z = 0.0020389(no scaling since the library has no internal power k-factors)Path Dependent Fall Pin Toggle Rate = 0.02486 (estimated)Total Internal Power for Pin 'u1/Y' = 0.0002026Total Internal Power for Cell 'u1' = 0.0004058
使用get_switching_activity命令即可查看翻转活动性,可以看出输出线网的转换率就是上述报告中四种转换率之和4*0.02486=0.09944。
dc_shell> get_switching_activity [get_nets y]
(y: probability = 0.2507, toggle_rate = 0.0995, type = propagated)
切换功耗
切换功耗的计算比较简单,与漏电功耗和内部功耗不同的是,Power Compiler在线网上计算切换功耗,计算公式如下所示。
下面展示了一个具体的切换功耗的计算过程。
dc_shell> report_power_calculation [get_nets y]****************************************
Report : power_calculationy
Design : AND
Version: W-2024.09-SP2
Date : Fri Jul 25 23:00:46 2025
****************************************================================================================================Net Switching Power Calculationnet: ydriver: u1/YSwitching power = 0.000 net switching power = switching energy * net toggle rateSwitching Energy Per Transition = 0.000 switching energy = 0.5 * capacitance * voltage ^ 2total net capacitance = 0.000 voltage = 1.100 Net Toggle Rate = 0.09946 (propagated)
动态功耗的单位
之前说到,漏电功耗的单位由库属性leakage_power_unit决定,而动态功耗的单位需要按步骤进行计算,假设存在以下的库属性。
capacitive_load_unit (0.35, ff);
voltage_unit: "1V"
time_unit: "1ns";
1、使用逻辑库中的电容单位、电压单位和时间单位进行以下计算。
2、从MKS单位范围中选择一个单位,使乘数能转换为整数,例如nW。
3、从1、10、100等10的幂中选择一个最接近转换后整数的幂,例如100。
4、将单位和幂组合得到动态功耗的单位100nW。
使用CCS逻辑库描述功耗信息
本文只设计了NLPM查找表,CCS逻辑库包含了用于功耗与电源轨分析及优化的统一库数据,从而实现一致的分析结果与简化的分析流程,通过在逻辑库中捕获电流波形,可以更准确地识别潜在的问题区域。如需了解有关CCS逻辑库及其生成方式的更多信息,请参阅《Library Compiler User Guide》。