4. 功耗建模与活动率标注

在 PrimeTime 的功耗感知流程中,时序约束只解决“信号什么时候到”,而功耗分析还要回答“信号有多频繁地翻转”。活动率(activity)就是连接时序与功耗的桥梁:没有活动率,PrimeTime 只能给出静态的开关功耗上限,无法区分一条长期静默的使能路径和一条每个周期都翻转的数据总线。本节围绕活动率的来源、读入方式、默认值设置,以及时钟树与数据路径的差异化建模展开。

活动率的两种表达:翻转率与静态概率

PrimeTime 功耗计算中,每个网络的活动率由两个量描述:翻转率(toggle rate,单位通常是次/时间单位,如 1/ns)和静态概率(static probability,信号处于逻辑 1 的时间占比,取值 0~1)。翻转率决定动态功耗中的开关分量,静态概率则影响短路功耗和漏电的偏置相关部分。二者共同决定一个节点在一个时间窗口内的等效开关次数。

需要先明确参照约定:翻转率按“完整跳变次数”还是“边沿次数”统计,不同工具和文件格式定义不同。SAIF/VCD 中通常记录的是边沿跳变次数,而 PrimeTime 的 set_switching_activity 默认按“翻转次数”(一个 0→1→0 记 1 次翻转)理解。若混用,功耗会被高估约一倍。本文统一采用翻转次数口径,即一个完整周期记 1 次翻转。

SAIF 与 VCD:两种活动率文件的读入

SAIF(Switching Activity Interchange Format)和 VCD(Value Change Dump)是两种最常见的活动率来源,均由 RTL 或门级仿真产生。

  • VCD:逐时间点记录每个信号的值变化,信息最完整,但文件极大。PrimeTime 读入后需要自行统计翻转次数,适合短窗口、关键模块的精确分析。
  • SAIF:直接给出每个网络的翻转次数和持续时间占比,文件小、读入快,是功耗签核的常用格式。分为 forward SAIF(仿真时记录)和 backward SAIF(标注回仿真)。

典型读入命令如下:

# 读入 SAIF,指定作用域与时间窗口
read_saif -input ./sim/top_rtl.saif \
          -strip_path tb_top/u_core \
          -instance_name u_core

# 读入 VCD,限定分析窗口
read_vcd -input ./sim/top.vcd \
         -strip_path tb_top/u_core \
         -time {1000 5000}

# 查看已标注的活动率
report_switching_activity -list_not_annotated

读入后必须用 report_switching_activity 检查标注覆盖率。常见问题是层次路径不匹配导致大量网络未标注,此时工具会退回默认活动率,功耗结果失真。判断依据是:未标注网络占比若超过 10%~20%,应先修正 -strip_path 或 -instance_name,而不是直接接受结果。

默认活动率与翻转率设置

对于仿真未覆盖或未标注的网络,需要设置默认值。PrimeTime 提供全局默认和按对象覆盖两种方式:

# 全局默认:翻转率 0.1/ns,静态概率 0.5
set_switching_activity -default -toggle_rate 0.1 \
                       -static_probability 0.5

# 对特定时钟网络覆盖
set_switching_activity -toggle_rate 1.0 \
                       -static_probability 0.5 \
                       [get_clocks clk_core]

# 对复位、使能等低频网络降低活动率
set_switching_activity -toggle_rate 0.001 \
                       [get_nets {rst_n scan_en}]

默认值的选择直接影响功耗量级。经验上,数据路径默认翻转率可取时钟频率的 5%~20%,控制路径取 1%~5%,复位/测试网络取 0.1% 以下。这些是示例经验值,实际应以仿真统计或设计规格为准。若默认值设得过高,会掩盖真实热点;设得过低,又会漏掉关键功耗路径。

时钟树与数据路径的差异化建模

时钟树和数据路径的活动率特征完全不同,必须分开建模,否则功耗分布会严重偏差。

时钟树:时钟网络每个周期翻转两次(上升沿+下降沿),翻转率等于时钟频率的 2 倍(按边沿计)或 1 倍(按翻转次数计)。时钟树还带有大量缓冲器和反相器,其开关功耗往往占芯片动态功耗的 20%~40%。因此时钟网络应显式标注,不能依赖默认值。对于门控时钟,被关断的分支活动率应显著降低,需要结合门控使能的占空比设置。

数据路径:数据网络的翻转率取决于数据相关性,通常远低于时钟。例如一条 32 位数据总线,若每个周期只有部分位翻转,其等效翻转率可能只有时钟的 10%~30%。数据路径建模应尽量使用仿真标注,而非统一默认值。

下面这张图展示了从仿真文件到 PrimeTime 活动率标注,再到时钟树与数据路径差异化建模的完整数据流关系。

活动率标注数据流与差异化建模 RTL / 门级仿真 VCD / SAIF 输出 活动率文件 .vcd / .saif read_vcd / read_saif strip_path 匹配 标注覆盖率检查 report_switching 覆盖率是否 ≥ 80%? 否 → 修正路径 / 补默认值 set_switching_activity -default 兜底未标注网络 时钟树建模 翻转率 ≈ 时钟频率 × 2(边沿) 静态概率 = 0.5 门控分支按使能占空比折算 占动态功耗 20%~40% 示例:clk=500MHz → 1.0/ns 数据路径建模 翻转率取决于数据相关性 通常为时钟的 5%~30% 优先使用仿真标注值 控制路径 1%~5% 示例:32bit 总线 ≈ 0.15/ns 功耗计算

实操检查要点

完成活动率标注后,建议按以下顺序核对,避免“读入成功但结果不可信”:

  1. 用 report_switching_activity -list_not_annotated 列出未标注网络,确认是否集中在某个层次或某类信号。
  2. 检查时钟网络是否被显式标注,翻转率是否与时钟频率一致。
  3. 检查复位、扫描使能等低频网络是否被误设为高活动率。
  4. 对比标注前后 report_power 的总功耗变化,若差异超过 30%,说明默认值影响过大,应补充仿真标注。
SAIF 文件通常比 VCD 小一到两个数量级,适合全芯片功耗签核;VCD 适合对关键模块做短窗口精确分析。两者可以结合使用:先用 SAIF 覆盖全芯片,再对热点模块用 VCD 细化。
若 read_saif 后未标注网络比例很高,不要直接调大默认翻转率来“凑”功耗。应先排查 -strip_path 与设计层次是否一致,否则后续所有功耗优化都会建立在错误的活动率基础上。

活动率标注是功耗感知时序优化的输入前提。时钟树与数据路径分开建模,才能让 PrimeTime 的功耗报告反映真实的热点分布,后续的功耗优化才有可靠的判断依据。