2. 功耗基础与建模

数字芯片的功耗分析,本质上是在回答一个问题:电流从哪里来、在什么条件下流动、流了多少、持续多久。Synopsys 的 PrimePower、PrimeTime PX、PrimeShield 等工具之所以能给出可信的功耗数字,是因为它们把芯片的物理行为抽象成了可计算的模型,再用工艺库和开关活动率两类数据把这个模型“填满”。理解这三类功耗的物理机制,以及 .lib、SAIF/VCD/FSDB 各自承载什么信息,是后续所有功耗分析工作的地基。

一、三类功耗的物理机制

动态功耗(Dynamic Power)来自对负载电容的充放电。CMOS 门输出翻转时,PMOS 或 NMOS 导通,把输出节点电容 C_L 从 0 充到 VDD,或从 VDD 放到 0。每次 0→1 翻转从电源取走的能量为 C_L·VDD²,其中一半存储在电容上、一半在晶体管沟道中以热的形式耗散;随后的 1→0 翻转把存储的能量放到地。因此一个完整翻转周期消耗 C_L·VDD²,平均到每次翻转是 ½·C_L·VDD²。若单位时间内翻转频率为 f_sw,则 P_dyn = α·C_L·VDD²·f,其中 α 是翻转活动率(switching activity),f 是时钟频率。这个公式说明动态功耗对电压是平方敏感、对频率和活动率是线性敏感——这也是降压比降频更省电的根本原因。

静态功耗(Static/Leakage Power)来自晶体管关断时并不“完全关断”的漏电流。主要成分包括:亚阈值漏电(I_sub,栅压低于阈值时源漏之间仍有扩散电流,随温度指数上升)、栅氧隧穿漏电(I_gate,薄栅氧下电子直接穿隧)、栅致漏极泄漏(GIDL)和反偏结漏电。静态功耗 P_static = VDD·I_leak,与频率无关,只要供电存在就持续消耗。在先进工艺(如 7nm 及以下)中,漏电可占全芯片功耗的 30%~50%,因此低功耗设计中电源门控(Power Gating)、多阈值电压(Multi-Vt)单元替换、体偏置(Body Bias)都是围绕静态功耗展开的手段。

短路功耗(Short-Circuit Power)发生在输入翻转的瞬间:当输入电平处于 VDD/2 附近时,PMOS 和 NMOS 可能同时导通,形成从 VDD 到 GND 的直通电流 I_sc。它的大小取决于输入转换时间(slew)、输出负载和晶体管阈值。输入边沿越慢,两管同时导通的时间越长,短路功耗越大。P_sc ≈ VDD·I_sc_avg,通常占动态功耗的 5%~15%。在 .lib 中,短路功耗并不单独列出,而是被隐含在单元内部功耗(internal power)的查找表里,与翻转功耗一起构成单元的开关功耗。

记忆要点:动态功耗看“翻转”,静态功耗看“漏电”,短路功耗看“边沿”。三者共同构成总功耗 P_total = P_dyn + P_static + P_sc。
CMOS 反相器三类功耗的物理来源 反相器结构 VDD PMOS Vout NMOS GND Vin I_sc I_leak C_L ① 动态功耗 P_dyn = α·C_L·VDD²·f 来源:输出节点充放电,0→1 取能、1→0 放能 敏感参数:VDD(平方)、f(线性)、α(翻转率) 典型占比:先进工艺中约 50%~70% ② 静态功耗 P_static = VDD·I_leak 来源:亚阈值漏电、栅氧隧穿、GIDL、结漏电 敏感参数:温度(指数)、阈值电压 Vt、工艺节点 典型占比:7nm 以下可达 30%~50% ③ 短路功耗 P_sc ≈ VDD·I_sc_avg 来源:输入翻转瞬间 PMOS/NMOS 同时导通 敏感参数:输入 slew、VDD、Vt、输出负载 典型占比:动态功耗的 5%~15% 总功耗 P_total = P_dyn + P_static + P_sc 动态:翻转活动率 α 决定 静态:漏电电流 I_leak 决定 短路:输入边沿 slew 决定

二、Synopsys 工具中的功耗模型

Synopsys 功耗分析工具(PrimePower、PrimeTime PX)采用基于单元库的解析模型,把每个标准单元、宏单元、IO 单元的功耗拆成三部分:

  • 翻转功耗(Switching Power):由输出负载电容和翻转活动率计算,P_sw = ½·α·C_load·VDD²·f。C_load 来自互连寄生参数(SPEF)和扇出单元输入电容之和。
  • 内部功耗(Internal Power):单元内部节点充放电和短路电流的合并项,由 .lib 中的 internal_power 查找表给出,输入变量是输入转换时间(input transition)和输出负载电容(output load)。
  • 漏电功耗(Leakage Power):由 .lib 中 cell_leakage_power 及 leakage_power 状态相关表给出,与输入状态、温度、电压相关。

工具在时序分析的基础上,把每个单元的翻转次数、负载、转换时间代入上述模型,逐单元累加得到模块级和全芯片功耗。因此,功耗分析的精度取决于三件事:工艺库是否准确、开关活动率是否真实、寄生参数是否完整。

三、工艺库功耗信息(.lib)

.lib 是 Liberty 格式的工艺库文件,是功耗分析的“字典”。与功耗相关的关键信息包括:

信息类别典型属性作用
翻转功耗capacitance、rise_capacitance、fall_capacitance提供单元输入/输出引脚电容,用于计算负载
内部功耗internal_power、rise_power、fall_power以二维查找表给出不同 transition/load 下的内部能耗
漏电功耗cell_leakage_power、leakage_power给出单元在不同输入状态下的漏电值
工作条件operating_conditions、voltage、temperature定义库的标称电压温度,用于缩放

实际项目中,同一工艺通常提供多套 .lib:SS/FF/TT 工艺角、不同电压(如 0.8V/0.9V/1.0V)、不同温度(-40℃/25℃/125℃)。功耗分析必须选用与工作场景匹配的库,否则漏电和内部功耗会有显著偏差。例如,高温库的漏电可能是常温库的 5~10 倍。

四、开关活动率文件:SAIF、VCD、FSDB

仅有 .lib 只能算出“如果翻转会耗多少”,要得到真实功耗,必须知道“实际翻转了多少”。这就是开关活动率文件的作用。

VCD(Value Change Dump)是 IEEE 1364 标准格式,记录仿真过程中每个信号每一次值变化的时间戳。它最精确,但文件极大——一个中等规模 SoC 跑几毫秒仿真,VCD 可达几十 GB。VCD 适合小模块或短时间窗口的精确分析。

SAIF(Switching Activity Interchange Format)是 Synopsys 主推的统计格式,不记录每次变化,而是记录每个信号的翻转次数、持续时间和概率。文件小、读取快,适合全芯片长时间仿真。SAIF 分 forward(前向,用于功耗分析)和 backward(反向,用于仿真激励)两种。典型 SAIF 片段如下:

(SAIFILE
  (SAIFVERSION "2.0")
  (DIRECTION "forward")
  (DESIGN )
  (DURATION 1000000)
  (INSTANCE top/u_core/u_alu
    (NET
      (a[0] (T0 1200) (T1 800) (TC 450) (IG 0))
      (b[0] (T0 950) (T1 1050) (TC 380) (IG 0))
    )
  )
)

其中 T0/T1 是信号为 0/1 的时间,TC 是翻转次数,IG 是毛刺次数。工具用 TC/DURATION 得到翻转率,用 T0/T1 得到静态概率,进而计算动态功耗和漏电状态。

FSDB(Fast Signal Database)是 Verdi 的原生波形格式,压缩率高、支持大容量,可通过工具转换为 VCD 或 SAIF。在功耗分析流程中,常见做法是:仿真产生 FSDB → 用 fsdb2saif 或 vcd2saif 转成 SAIF → PrimePower 读入 SAIF 做功耗分析。

常见误区:直接把 RTL 仿真的 SAIF 用于门级功耗分析。RTL 信号名与门级网表不一致,必须做 name mapping,否则活动率无法正确映射,功耗结果会严重失真。

五、从数据到功耗:一次完整的分析链路

把上述要素串起来,一次典型的 PrimePower 功耗分析流程是:

  1. 读入门级网表(.v)和工艺库(.lib),建立单元功耗模型;
  2. 读入寄生参数(SPEF)和时序约束(SDC),确定负载和时钟频率;
  3. 读入开关活动率文件(SAIF/VCD/FSDB),为每个网络赋予翻转率和静态概率;
  4. 工具逐单元计算 switching + internal + leakage,累加得到层次化功耗报告;
  5. 按模块、按单元类型、按功耗类型排序,定位功耗热点。

判断结果是否可信,可以看三个交叉验证点:动态功耗是否与 α·C·V²·f 的估算量级一致;漏电功耗是否与库中 cell_leakage_power 乘以单元数量级一致;各模块功耗占比是否与设计预期(如时钟树、存储器、数据通路)相符。若某模块功耗异常偏高,优先检查该模块的 SAIF 覆盖率是否过低、时钟是否被误当作数据翻转、或是否存在未映射的信号。