芯片的整体功耗都有哪些组成部分呢?最根本的组成部分有两个,即静态功耗和动态功耗。
1. 静态功耗(Static Power),又称漏电流功耗(Leakage Power)。其原理请参见下图:
上图中红色箭头表明了在通电状态下PMOS内主要的泄露电流及其走向,意即:
泄漏电流(Leakage Current) = 漏极->N-Well + Gate->N-Well + 源极->漏极
泄露电流存在的原因在于,MOS管中的多种掺杂区形成导电区域,同时这些区域会组成多个PN节,从而在通电后形成一系列微小的电流。
尽管在现今芯片的工作电压已经很低的前提下,每个MOS管的漏电流很小,但由于每颗芯片中集成的晶体管至多几亿甚至几十亿,积少成多,导致芯片的整体leakage power变得越来越恐怖。
在后端设计中,由于每个标准单元(standard cell)的leakage都集成在其liberty库文件(.lib)中,因此计算leakage power只需在制定条件下将design中所有的标准单元(包括各种Macro)的leakage值相加即可。目前所有的主流PR工具对此都有支持。需要指出的是,由于一个标准单元的leakage power和其面积成正比,因此在实际后端设计的各个阶段,尤其是low power设计中,一般会重点关注芯片中逻辑门的面积变化并以此快速推断design的leakage功耗变化。
2. 动态功耗(Dynamic Power),主要是由于芯片中的寄生RC电路的充放电引起的。换言之,当芯片中的电路出现任何信号翻转,都将会产生dynamic power,其中所占最大比例的就是clock信号的翻转。下图展示了一个反相器(inverter)在信号翻转时的简单模型:
当我们把反相器简化成一个简单的rc电路时,就可以清晰的看清充放电时的电流走向。当芯片处于工作状态时,每一个工作中的标准单元都会随着clock or/and data的翻转而不断重复上述过程,从而产生大量的动态功耗。
在实际后端设计时,动态功耗由于和芯片的功能息息相关,因此在计算的时候会引入翻转率(toggle rate)的概念。翻转率是衡量单位时间内device上信号翻转时间所占的比率。在实际计算dynamic功耗的时候,又会分成两个部分。一部分为标准单元内部的dynamic功耗,又名Internal Power,这部分的计算是嵌入liberty库文件内部,通过标准单元的input transition和output load来查表得到的;另一部分为互连线(net)上的dynamic功耗,这部分的计算通过将所有net上每个翻转周期的功耗乘以其翻转率并相加得到。反转率通过某种固定格式的文件传入EDA工具,比较常用的格式有SAIF(Switching Activity Interchange Format)、VCD(Value Change Dump)以及FSDB(Fast Signal Database)文件。
目前主流的PR工具均支持此类用法,但是signoff时仍然需要比较专业的power计算工具如Synopsys PrimeTime PX或Cadence Palladium等。
至此,我们基本了解了一颗芯片整体功耗的计算方法。而在现今十分重要的低功耗设计中,所有的手法都是从降低以上两个方面(Static, Dynamic)的功耗着手的:
比如应用多个power domain以便在芯片的某一部分功能不用的时候将其断电关闭;或者通过升级更先进的工艺来降低每个晶体管的size从而降低整体面积;抑或通过改善时钟树综合手段来降低芯片中占比很大的clock network power。