powercompiler使用
参考链接:基于design compiler中power compiler的低功耗设计方法
power_compiler 介绍
info
Power Compiler 不是一个独立的安装包,而是集成在 Synopsys Design Compiler (DC) 工具套件中的一个功能模块/许可证选项
安装了 Synopsys 的核心综合工具 Design Compiler 后,只要拥有相应的许可证,就能启用 Power Compiler 的全部功能
saif用于功耗分析
Generating SAIF Files
VCS MX Toggle Commands
info
要从 RTL 或门级 Verilog/SystemVerilog 生成 SAIF 文件,需要使用翻转命令向 VCS MX 指定系统任务。通过使用这些翻转命令,可以指定进行翻转计数的子模块,并定义仿真期间进行翻转计数的特定时间段。您还可以控制翻转计数的启动和停止。
- Define the toggle region
$set_toggle_region 命令用于指定仿真器在生成的 SAIF 文件中记录哪个模块实例的翻转活动
1 | $set_toggle_region(instance [, instance]); |
当显式指定一个或多个模块实例作为翻转区域时,仿真器会注册这些对象并在仿真过程中对其进行监控
attention
对于门级仿真,如果逻辑库单元引脚具有上升和下降功耗值,则会分别监控并报告其上升和下降的翻转活动
- Begin toggle monitoring
使用 $toggle_start() 命令指示仿真器开始监控翻转活动
1 | $toggle_start(); |
在仿真过程中,工具会开始监控翻转区域中定义的模块实例的翻转活动
- End toggle monitoring
使用 $toggle_stop() 命令指示仿真器停止监控翻转活动
1 | $toggle_stop() |
- Report toggle information in an output file
使用 $toggle_report 命令将监控到的门级和 net 翻转活动写入输出文件。可以用不同参数多次调用 $toggle_report
1 | // filename: 这是翻转活动输出文件的名称 |
uvm 中的配置
- 首先在 tb 中配置
1 | initial begin |
- 在 run_phase 中最终配置
1 | task run_phase(uvm_phase phase); |
dc 中的配置
- 在tcl脚本中,read_verilog之后,compile之前,插入一句话用于把刚刚跑逻辑仿真时vcs生成的saif文件吃进来,更详细的脚本参考dc综合流程
1 | read_saif -input ../simulation/power.saif -instance ahb2apb_tb_vip/u_ahb2apb_bridge |
attention
对于精确的动态功耗分析,SAIF 文件是必需的
read_saif 命令用于读取 SAIF 文件,并对当前设计中线网、端口和引脚的翻转活动属性(toggle_rate 翻转率)和静态概率(static_probability)进行标注。report_power 命令会利用这些信息来计算动态功耗值。如果 SAIF 文件中的某个对象在当前设计中未找到,工具会忽略该对象并发出警告信息。只要文件中至少有一个对象被成功标注,read_saif 命令就返回 1;否则返回 0
- 通过
report_saif查看标注情况
1 | report_saif |
info
这份报告说明 SAIF 文件标注很成功:没有使用任何不可靠的默认值,所有活动信息要么来自文件直接标注,要么通过逻辑关系合理传播得到。动态功耗计算结果是可信的。
- 在compile之后加入report_power和report_area指令
1 | report_power |
通过上述功耗,得到报告为:

面积报告:
1 | Area |
低功耗设置对比
添加时钟门控
note
添加的时钟门控如下所示,时钟门控是带有锁存器的

在DC中进行的操作如下
- 为了添加时钟门控,可以直接在dc中添加指令
attention
注意这个设置必须在analyze之前
1 | set_clock_gating_style -sequential_cell latch |
- 在compile阶段添加
-gate_clock
1 | compile_ultra -gate_clock |
查看功耗报告

info
通过添加时钟门控,此时的功耗为5.699e-3 mW,未加时钟门控的功耗为2.916e-2 mW,功耗为原来的0.195
查看面积报告
1 | Area |
通过gui界面,查看到门控时钟的结构如下所示,确实是锁存器加上一个逻辑门

使用集成门控ICG
- 首先查看工艺库中的ICG信息
1 | set icg_cells [get_lib_cells */* -filter "clock_gating_integrated_cell =~ *"] |
attention
如果没有输出,那么说明工艺库中缺少ICG的内容,无法使用ICG
- 设置clock_gating_style,可以使用下面这个指令
1 | set_clock_gating_style -sequential_cell latch \ |
info
- 每个集成时钟门控单元的名称后缀要么是
_precontrol,要么是_postcontrol。 - 后缀是通过命令的
-control_point选项来指定的。 - 要使用库中可用的集成时钟门控单元,你需要为
-control_point选项指定一个值。 - 当你分别指定
before和after时,工具会分别使用_precontrol和_postcontrol后缀
查看ICG的结构,如下所示:

对应这个cell的attribute如下,从attribute可知,这个单元确实是ICG
1 | **************************************** |
操作数隔离
操作数隔离的本质是如果在某一段时间内,数据通路的输出是无用的,将输入置成固定值,数据通路部分没有翻转,功耗就会降低,下面举一个例子。
一个乘法器电路图如下所示

当 sel0 = 0 或 sel1 = 1 时,乘法器 Multiplier 的输出结果并不能通过两个 Mux 到达寄存器的输入端。即寄存器并不能保存当前乘法器的结果,此次乘法运算是没有必要的。在此种条件下,采用操作数隔离,使乘法器不工作保持静态,也可以节省功耗。

DC可以自动进行操作数隔离,具体操作如下
- 设置启动操作数隔离操作,默认情况下是false
attention
set do_operand_isolation true 也设置在analyze之前
1 | set do_operand_isolation true |
查看功耗报告:

查看面积报告:
1 | Area |
info
设置操作数隔离的效果并不明显,主要是和rtl相关,ahb2apb中包含可以进行操作数隔离的操作较少,体现不出该低功耗方法的效果
