# 这个是一级标题

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 10

UPF在数字前端中的使用

Edited by yzhang on 2024.01.30

UPF介绍
功耗意图(Power Intent)是指实现芯片低功耗设计所需要的思想和方法。UPF 语言提供了一种描述芯
片功耗要求的方法,但是却没有精确的描述这些要求是如何实现的。UPF 语言描述了如何连接每一个设
计单元的供电电源,供电网络的模型,以及电路的逻辑功能如何来支持动态电压切换等等,但却没有任
何关于布局布线的描述。UPF 语言独立于RTL 语言,并且像RTL 语言一样都是设计的输入文件。

UPF发展到现在,已经成为IEEE的标准(IEEE Std 1801-2018),目前是3.0版本。主流的EDA工具都


会支持UPF。下图是S家的低功耗设计流程图。像SDC文件一样,UPF文件要单独编写,在综合阶段作
为输入文件送给Design Compiler。综合完成后,DC会生成一个UPF文件给ICC,在物理设计阶段就能
看到了level shifter,isolation cell,retention cell和power gating cell了。同时,在验证阶段,也要做一
些有关低功耗的仿真工作,这时也需要UPF文件。

UPF 能表述出IC 电路低功耗设计的供电意图,比如描述电压域、电压域的供电端口、电压域的电压变


换、电压域的供电电压、电压域之间怎样加入低功耗元件,以及定义电路的电源网络、电源间的行为等
等。

UPF DEMO
为了让大家有个更清晰的认识,编了一个小的demo。SoC构成非常简单,一个MCU作为控制器,一个
功能模块U1,一个功耗控制器U2。假设,U1工作在高电压1.2V,MCU和U2工作在低电压1.0V。当系
统处于空闲状态时,可以关闭U1的供电,以减少静态功耗,电源开关的控制信号由U2模块给出。为了
简化描述,本demo中不支持DVFS,并省略功耗控制的逻辑设计部分。

有了上面的约定条件,我们可以知道,现在有了两个电源域,分别定义为VH(下图红色)和TOP(蓝色
还记得前面提到的,在RTL里面可是看不到供电信息的,我们必须把这个信息告诉工具才行。
所以,第一步就是描述电源信息。

现在,EDA工具里的视图就是下面的样子。
由于U1模块可以做电源关闭,所以要加上power gating,开关信号由功耗控制单元U2给出(忽略具体

添加PG信息后的视图
因为U1模块可以关电,所以至少要对其输出信号要做隔离,以保证U1下电后不会影响其它模块正常工作

添加isolation信息后的视图
为了保存U1模块下电前的状态,以便U1再次上电后恢复状态,要添加一些retention cell。

添加retention信息后的视图
接下来,是对高低电压间的信号转换添加level shifter。

添加level shifter信息后的视图
到此,还差最关键的一步,需要建立一张power table。

以上仅仅是展示一个使用UPF1.0语法的demo,在upf最新的3.0中删除了部分1.0的语法支持,增加丰富
了更多的语法支持。推荐学习和使用upf3.0。

在实际的项目中,电源域可能会更加复杂。需要designer提前考虑好电源域的划分与摆放,遇到问题耐
心debug。
UPF在数字前端设计流程中注意事项

1.vcs仿真(前仿/后仿)
vcs加入编译选项

+define+UPF :定义UPF的宏;
-upf upf_filename.upf :导入UPF文件(irun中的选项是 - upf_1801);
-power_top TOP:指定UPF供电的顶层。这一条也可以在UPF文件中进行指定。

在顶层导入UPF库并供电

`ifdef UPF
import UPF::*;
initial beign
supply_on("VDD", 1.1);//on
supply_on("GND", 0);
//supply_off("VDD_G");//off
end
`endif

注意:在生成fasb的时候,fsdbDumpvar选择“+all”或者“+power”

-initial begin f sdbDumpf ile("verilog.f sdb");fsdbDumpvars("+all"); $fsdbDumpMDA();end

verdi 使用demo

verdi tb_ChipTop.v -f filelist -sverilog -upf UPF/ChipTop.upf -power_top ChipTop +define+UPF -ssf
test.fsdb &

在后仿中,请不要使用带pg的verilog lib model代替upf做上电下电仿真。

2.xrun/irun/ncverilog仿真
irun加入编译选项

-lps_1801 UPF.upf :指定符合IEEE 1801标准的UPF文件;


-lps_assign_ft_buf :指定assign赋值被当作buffer对待,而非默认的wire,好处是从always-on
domain进入和穿过power-down domain的信号被force成x,便于debug;
-lps_iso_verbose: 使能 isolation 的 log 功能,这个一般需要加上;
3.DC综合注意事项
在read_verilog && link后,读入upf。

load_upf ${UPF_PATH}/xxx.upf

设置工作电压,注意需要与upf中定义电压保持一致。

set_voltage 1.1 -object_list {VDD}


set_voltage 0.0 -object_list {GND}

如果工作电压是浮动电压,例如1.1-1.9v,定义如下

set_voltage 1.1 -min 1.9 -object_list {VDD}

如果时钟需要插入levelshift

set auto_insert_level_shifters_on_clocks all

4.ptpx

给出一个求peak功耗的参考tcl脚本
set search_path ". ../../ref/saed_libs"
set link_library "* saed90nm_max_hth_lvt.db saed90nm_max_hth_cg_lvt.db saed90nm_m

set power_enable_timing_analysis true


set power_analysis_mode time_based
set power_scale_dynamic_power_at_power_off true

read_verilog ../dc/top_gates.v
#source -e -v ../dc/top_gates.link
current_design TOP
link
define_scaling_lib_group {saed90nm_max_hth_lvt.db saed90nm_max_lvt.db}
define_scaling_lib_group {saed90nm_max_hth_cg_lvt.db saed90nm_max_cg_lvt.db}
define_scaling_lib_group {saed90nm_max_hth_lvt_rdsr.db saed90nm_max_lvt_rdsr.db}
define_scaling_lib_group {saed90nm_max_hthn_lvt_lsh.db saed90nm_max_htln_lvt_lsh.
create_clock -p 4 clk
set_input_delay 1 -clock clk [remove_from_collection [all_inputs] [get_ports clk]
set_output_delay 1 -clock clk [all_outputs]
set upf_create_implicit_supply_sets false

load_upf ../dc/top_gates.upf

set_operating_conditions WORST -library saed90nm_max_lvt


set_voltage 1.08 -object_list VDD
set_voltage 0.7 -object_list VDD1
set_voltage 0.7 -object_list VDD1_ADD
set_voltage 0.00 -object_list GND

#####################################
## Multi Rail Analysis Power Reports
#####################################
set power_enable_multi_rail_analysis true
source ../dc/map.ptpx
set_power_analysis_options -waveform_output multirail_capp -multi_rail_waveform "V
read_vcd -strip_path tb/MUT ../annotate/rtl.vcd
report_switching_activity -include_only rtl

update_power

You might also like