大概在遥远的90nm之前,leakage power在library里确实是被描述成一个常值的。但从90nm开始,为了更加精确,library里的leakage power不再是个常值了,而是被模拟成一个输入状态的函数。所以基础还是library,在一个library里跟leakage相关的变量大致有:
library(my_lib) {
leakage_power_unit :"1nW";
default_leakage_power_density :0.0;
default_cell_leakage_power :0.0;
cell_leakage_power :53057.365200;
leakage_power(){
when :"!A & !B & !CI";
value: ...;
power_level:"VDD";}
}
-
Leakage_power_unit:标示leakage power的单位,如果所有库里都没有该变量的定义,每个工具都会有自己默认的单位,如Genus默认用nW。
-
cell_leakage_power:标示固定的leakage power值,如果library里没有该变量的定义,或者该变量是个负值,工具会用default_cell_leakage_power的值,如果default_cell_leakage_power也没有指定,则用default_leakage_power_density的值乘以该cell的面积来计算得出一个leakage值,如果这三个变量都没有定义,则leakage的值为0。
-
leakage_power(){}:这一部分就是用来定义跟输入状态相关的leakage power,其中"when"用于定义输入的状态,如果某种状态没有定义,则用cell_leakage_power定义的值来计算leakage;power_level用于多电压cell中指定是跟哪个电压相关的leakage power。
1.如果library里既没有定义cell_leakage_power也没有定义default_cell_leakage_power而只定义了default_leakage_power_density,则:
cell_leakage_power= area *default_leakage_power_density
2.
拿AND2X2这个cell为例,它的输入总共有四种组合状态,在lib中只定义了三种状态,同时还定义了cell_leakage_power,所以对于没定义的状态,在计算时用cell_leakage_power指定的值。假设,A处在状态"1"的概率是0.6,B处在状态"1"的概率是0.3,则该cell的leakge power为:
prob(!A) x prob(!B) x yy11+ prob(!A) x prob(B) x yy22 +prob(A) x prob(!B) x yy33 +prob(A) x prob(B) x YYYY=0.4 x 0.7 x yy11 +0.4 x 0.3 x yy22 + 0.6 x 0.7 x yy33 +0.6 x 0.3 x YYYY
在实际项目中,如果没有读入activity的文件,不同的工具都会有根据默认或指定的probability来计算每个cell输入pin的probability,不同工具也会有相应的命令来report出当前的probability是多少,如Genus可以用命令:report instance –power,也可以通过以下attribute得到相关信息:
lp_probability_type
lp_default_probability
lp_computed_probability
不成熟的小建议:找一个cell在不同的工具里分别去报它的leakage,再根据本文陈述的内容,去观摩工具的行为,这一点就会尽在你的掌握之中了。