2. PrimeTime功耗分析环境搭建
在 PrimeTime 中做功耗感知时序优化,第一步不是急着跑 report_power,而是把“功耗分析环境”搭对。环境搭错,后续所有功耗数字都会失真:要么漏算内部功耗,要么把多电压域当成单电压域处理,要么在错误工艺角下得出乐观结论。本节围绕三件事展开:库文件与功耗库的加载、工艺角与电压域配置、功耗分析模式与报告命令的初始化。
一、库文件与功耗库的加载
PrimeTime 的功耗计算依赖两类库信息:逻辑库(.db)提供单元功能、时序和引脚电容;功耗库(通常也是 .db,但包含 power 相关属性)提供单元的内部功耗、漏电功耗、状态相关功耗等数据。标准单元库在综合阶段生成的 .db 往往已包含功耗信息,但先进工艺下常单独提供带功耗特征的库,例如 sc9mcpp84_ssg_0p81v_125c_power.db。加载时用 set link_path 或 read_db 把逻辑库和功耗库都纳入搜索路径。
set search_path [list . ./libs ./libs/power]
set link_path "* sc9mcpp84_ssg_0p81v_125c.db \
sc9mcpp84_ssg_0p81v_125c_power.db \
io_ssg_0p81v_125c.db \
sram_ssg_0p81v_125c.db"
read_verilog ./netlist/top_power.v
current_design top
link_design
关键点:link_path 中通配符 * 表示先查已加载设计,再按顺序查库。若功耗库与逻辑库同名不同版本,必须保证功耗库排在前面,否则 PrimeTime 可能只读到逻辑库而丢失 power 属性。加载完成后用 list_libs 确认库已识别,再用 report_lib -power 抽查某个单元是否带 internal_power 和 leakage_power 信息。
二、工艺角与电压域配置
功耗对工艺角和电压极其敏感。漏电功耗随温度升高而增大,动态功耗随电压平方变化。PrimeTime 用 set_operating_conditions 指定当前分析使用的工艺角,用 set_voltage 或 set_voltage -domain 指定电压域。多电压域设计必须显式声明每个 domain 的供电电压,否则工具会按单一默认电压计算,导致跨域单元功耗错误。
set_operating_conditions -library sc9mcpp84_ssg_0p81v_125c \
ssg_0p81v_125c
set_voltage 0.81 -domain VDD_CPU
set_voltage 1.20 -domain VDD_IO
set_voltage 0.90 -domain VDD_SRAM
set_voltage -min 0.77 -max 0.85 -domain VDD_CPU
这里 -min/-max 用于电压波动范围分析,若只做典型功耗评估可省略。工艺角选择要与设计目标一致:做漏电评估用高温慢角(如 ssg_0p81v_125c),做动态功耗评估用典型角或快角。注意 set_operating_conditions 的库名必须与 link_path 中加载的库一致,否则会报 “library not found”。
三、功耗分析模式与报告命令初始化
PrimeTime 的功耗分析模式由 set_power_analysis_mode 控制,常用参数包括 -method(average/peak)、-analysis_type(static/vectorless)、-clock_gating_default 等。静态 vectorless 模式适合早期评估,不需要仿真波形;若有时序仿真得到的 VCD/SAIF,可用 read_vcd 或 read_saif 提高翻转率精度。
set_power_analysis_mode -method average \
-analysis_type static \
-clock_gating_default \
-waveform_representation \
-include_leakage true
set_power_analysis_options -default_input_activity 0.1 \
-default_clock_activity 1.0
report_power -verbose > ./rpt/power_baseline.rpt
report_power -cell_power -hierarchy > ./rpt/power_hier.rpt
初始化完成后,先跑一次 baseline 报告,检查总功耗、内部功耗、开关功耗、漏电功耗四项是否都有数值。若漏电为 0,多半是功耗库未加载或 -include_leakage 未开;若某电压域功耗异常低,检查 set_voltage 是否覆盖该 domain。报告中的 Cell Internal Power、Net Switching Power、Cell Leakage Power 是后续优化的三个抓手。
四、环境搭建后的验证与基线报告
环境配置完成后,不要直接进入优化。先做一次基线功耗报告,确认四项功耗数值合理。以某 28nm 设计为例(以下为教学示例参数,非实测):CPU 域 0.81V、IO 域 1.20V、SRAM 域 0.90V,静态 vectorless 模式下默认输入翻转率 0.1、时钟翻转率 1.0。报告可能显示:Cell Internal Power 约 42 mW,Net Switching Power 约 18 mW,Cell Leakage Power 约 6 mW,Total Power 约 66 mW。若漏电为 0,说明功耗库未生效;若 IO 域功耗为 0,说明 set_voltage -domain VDD_IO 未覆盖到 IO 单元。
基线报告还要保存为后续对比的参考文件,例如 power_baseline.rpt。每次优化后重新跑 report_power,与基线对比,才能判断优化是否真正降低了功耗,而不是被工艺角或电压设置变化掩盖。建议在脚本中固定 set_power_analysis_mode 和 set_operating_conditions,避免不同 run 之间环境漂移。
power_setup.tcl,每次分析前 source 一次。这样既保证环境一致,也方便在优化前后快速切换对比。set_voltage 必须在 link_design 之后、report_power 之前执行。若在 link 之前设置,工具可能因找不到对应 domain 而忽略该电压,导致功耗按默认电压计算。总结来说,PrimeTime 功耗分析环境搭建的核心是“库对、角对、压对、模式对”。库文件与功耗库决定数据来源,工艺角与电压域决定计算条件,功耗分析模式与报告命令决定输出形式。四者一致,后续的功耗感知时序优化才有可信的起点。