参考链接:基于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
2
3
$set_toggle_region(instance [, instance]);
// 例如监控u_ahb2apb_bridge这个实例化模块
$set_toggle_region(u_ahb2apb_bridge);

当显式指定一个或多个模块实例作为翻转区域时,仿真器会注册这些对象并在仿真过程中对其进行监控

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
2
3
4
5
6
// filename: 这是翻转活动输出文件的名称
// synthesis_time_unit: 这是一个可选参数,表示综合库的时间单位,单位为秒;如果不指定该参数,默认为1 ns(1.0e-9)
// instance_name_string:必需参数,表示从仿真环境顶层到待报告模块实例的完整实例路径名
$toggle_report(filename, [synthesis_time_unit], instance_name_string);
// 例子
$toggle_report ("file.saif", 1.0e-9, "test.DUT");

uvm 中的配置

  • 首先在 tb 中配置
1
2
3
4
5
6
initial begin
$set_toggle_region(u_ahb2apb_bridge);
$toggle_start();
repeat(20) @(posedge HCLK);
HRESETn = 1'b1;
end
  • 在 run_phase 中最终配置
1
2
3
4
5
6
7
8
9
10
task run_phase(uvm_phase phase);
super.run_phase(phase);
phase.raise_objection(this);
ahb_seq = new("ahb_seq");
ahb_seq.start(env.virt_sqr);
$display("simulation end !!!!");
$toggle_stop();
$toggle_report("power.saif", 1.0e-9, "ahb2apb_tb_vip.u_ahb2apb_bridge");
phase.drop_objection(this);
endtask

dc 中的配置

  • 在tcl脚本中,read_verilog之后,compile之前,插入一句话用于把刚刚跑逻辑仿真时vcs生成的saif文件吃进来,更详细的脚本参考dc综合流程
1
2
read_saif -input ../simulation/power.saif -instance ahb2apb_tb_vip/u_ahb2apb_bridge
compile_ultra

attention

对于精确的动态功耗分析,SAIF 文件是必需的

read_saif 命令用于读取 SAIF 文件,并对当前设计中线网、端口和引脚的翻转活动属性(toggle_rate 翻转率)和静态概率(static_probability)进行标注。report_power 命令会利用这些信息来计算动态功耗值。如果 SAIF 文件中的某个对象在当前设计中未找到,工具会忽略该对象并发出警告信息。只要文件中至少有一个对象被成功标注,read_saif 命令就返回 1;否则返回 0

  • 通过report_saif查看标注情况
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
dc_shell> report_saif

****************************************
Report : saif
Design : ahb2apb_bridge
Version: U-2022.12-SP7-3
Date : Sat Apr 18 23:20:57 2026
****************************************

--------------------------------------------------------------------------------
User Default Propagated
Object type Annotated (%) Activity (%) Activity (%) Total
--------------------------------------------------------------------------------

Nets 186(65.72%) 0(0.00%) 95(33.57%) 283
Ports 190(99.48%) 0(0.00%) 1(0.52%) 191
Pins 364(51.49%) 0(0.00%) 337(47.67%) 707
--------------------------------------------------------------------------------
1

info

这份报告说明 SAIF 文件标注很成功:没有使用任何不可靠的默认值,所有活动信息要么来自文件直接标注,要么通过逻辑关系合理传播得到。动态功耗计算结果是可信的。

  • 在compile之后加入report_power和report_area指令
1
2
report_power
report_area

通过上述功耗,得到报告为:

image-20260418232859512

面积报告:

1
2
3
4
5
6
7
8
9
10
11
12
Area
-----------------------------------
Combinational Area: 228.759999
Noncombinational Area: 396.479988
Buf/Inv Area: 47.880000
Total Buffer Area: 35.84
Total Inverter Area: 12.04
Macro/Black Box Area: 0.000000
Net Area: 0.000000
-----------------------------------
Cell Area: 625.239986
Design Area: 625.239986

低功耗设置对比

添加时钟门控

note

添加的时钟门控如下所示,时钟门控是带有锁存器的

image-20260418234603177


在DC中进行的操作如下

  • 为了添加时钟门控,可以直接在dc中添加指令

attention

注意这个设置必须在analyze之前

1
2
3
set_clock_gating_style -sequential_cell latch
analyze -format verilog -library work $rtl_vf
elaborate $top_design -architecture verilog -update
  • 在compile阶段添加-gate_clock
1
compile_ultra -gate_clock

查看功耗报告

image-20260419000336829

info

通过添加时钟门控,此时的功耗为5.699e-3 mW,未加时钟门控的功耗为2.916e-2 mW,功耗为原来的0.195

查看面积报告

1
2
3
4
5
6
7
8
9
10
11
12
Area
-----------------------------------
Combinational Area: 145.879999
Noncombinational Area: 405.439988
Buf/Inv Area: 46.200000
Total Buffer Area: 35.84
Total Inverter Area: 10.36
Macro/Black Box Area: 0.000000
Net Area: 0.000000
-----------------------------------
Cell Area: 551.319987
Design Area: 551.319987

通过gui界面,查看到门控时钟的结构如下所示,确实是锁存器加上一个逻辑门

image-20260419000748649

使用集成门控ICG

  • 首先查看工艺库中的ICG信息
1
2
3
4
5
set icg_cells [get_lib_cells */* -filter "clock_gating_integrated_cell =~ *"]
foreach_in_collection icg_cell $icg_cells {
set type [get_attribute $icg_cell clock_gating_integrated_cell]
puts "[get_object_name $icg_cell] $type"
}

attention

如果没有输出,那么说明工艺库中缺少ICG的内容,无法使用ICG

  • 设置clock_gating_style,可以使用下面这个指令
1
2
3
set_clock_gating_style -sequential_cell latch \
-positive_edge_logic {integrated} -negative_edge_logic {integrated} \
-control_point before

info

  • 每个集成时钟门控单元的名称后缀要么是 _precontrol,要么是 _postcontrol
  • 后缀是通过命令的 -control_point 选项来指定的。
  • 要使用库中可用的集成时钟门控单元,你需要为 -control_point 选项指定一个值。
  • 当你分别指定 beforeafter 时,工具会分别使用 _precontrol_postcontrol 后缀

查看ICG的结构,如下所示:
image-20260422023643362

对应这个cell的attribute如下,从attribute可知,这个单元确实是ICG

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
****************************************
Report : cell
Design : ahb2apb_bridge
Version: U-2022.12-SP7-3
Date : Wed Apr 22 02:35:40 2026
****************************************

Attributes:
b - black box (unknown)
cg - clock gating logic
h - hierarchical
n - noncombinational
r - removable
u - contains unmapped logic

Cell Reference Library Area Attributes
--------------------------------------------------------------------------------
clk_gate_rwdata_reg_reg SNPS_CLOCK_GATE_HIGH_ahb2apb_bridge_1
5.040000 b, cg, h
--------------------------------------------------------------------------------
Total 1 cells 5.040000

操作数隔离

操作数隔离的本质是如果在某一段时间内,数据通路的输出是无用的,将输入置成固定值,数据通路部分没有翻转,功耗就会降低,下面举一个例子。

一个乘法器电路图如下所示

image-20260419003823703

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

image-20260419003711692


DC可以自动进行操作数隔离,具体操作如下

  • 设置启动操作数隔离操作,默认情况下是false

attention

set do_operand_isolation true 也设置在analyze之前

1
2
3
set do_operand_isolation true
analyze -format verilog -library work $rtl_vf
elaborate $top_design -architecture verilog -update

查看功耗报告:

image-20260419003435596

查看面积报告:

1
2
3
4
5
6
7
8
9
10
11
12
Area
-----------------------------------
Combinational Area: 228.759999
Noncombinational Area: 396.479988
Buf/Inv Area: 47.880000
Total Buffer Area: 35.84
Total Inverter Area: 12.04
Macro/Black Box Area: 0.000000
Net Area: 0.000000
-----------------------------------
Cell Area: 625.239986
Design Area: 625.239986

info

设置操作数隔离的效果并不明显,主要是和rtl相关,ahb2apb中包含可以进行操作数隔离的操作较少,体现不出该低功耗方法的效果