You are on page 1of 1

为了降低芯片的功耗,RTL代码无法进行电源分析

why? 为什么提出

1.输入反向偏置电流

静态功耗 关断状态也有漏电流 HVT

2.阈值电压 SVT

LVT
分析功耗发生在哪里
Power Dissipation – VLSI Tutorials 动态功耗
a:切换频率:比如时钟信号的话,a = 1;
每个时钟切换1次,a=1/2, 功耗: , 所以LVT > SVT > HVT, HVT最省电
每个始终切换两次,a=1/4
Vdd:电压
C: 负载电容 1.电平翻转频率
f:工作频率 延时 :LVT < SVT <HVT
2.短路功率

1.dynamic power reduction; -动态功率的降低

2.Static Timing Reduction -静态时序的减少

几个重要的参数 3.Timing & Area Penalty- 时序与面积

4.Verification Impact 验证的影响

5.Implementation Impact 实现的影响

1.clock gating

2.power gating

3.Multi-Threshold

4.Multi-Voltage(MV)
解决方法
5.Gate-level Power Optimization 关系:

6.Architectural Optimization

7.DVFS:Dynamic Voltage and Frequency scaling


动态电压频率调节
ELS 功能是 LS和ISO,但不是简单的连接
一个domain -》到 另一个domain中,H to L 没什么关系,可有可无; L to H一定要
有,因为L去到H domain, L domain中的高电压在H domain可能就是电压很尴尬,不
How 1.level shifters(LS) 知道是高电平还是低电平。

关系:

demo:
因为power gated domain有关断状态,所以会出现x状态,因此我们需要加一个
isolation.就是加一个与非门 + 控制信号,如果要输出状态0,用与门,control 输出
0; 如果要输出状态1,用或门,control输出1.
PMU: power manage unit,电源管理单元

一个domain到另一个domain中,因为domain可能有off,会导致输出不确定的x状
2.isolation 态,这个在芯片中 出大问题。

实现的具体技术
Isolation cells and Level Shifter cells – VLSI Tutorials
Retention cells – VLSI Tutorials Daisy chain 链式结构

优点:节约资源,结构简单
缺点:响应慢
Low Power

3.Power switch 供电电源的切换,也会有一个control 结构


High-fanout 高扇出结构

优点:响应快
缺点:消耗大量资源

4.Retention

在掉电时保存状态save信号, 在上电的时候恢复状态。 一般的retention module由一


个FF+Latch的结构; 因为有一个电源是会掉电的,所以它需要两个电源供电,才能保
证它掉电后保持。

5.AO(Always on) 对于control信号一定要用always on,怕被有off状态的关闭了

6.这个不算low power的技术,只是为了更好的描述可以工作的情况,我们定义了一个
Power state table(PST),来查看有几种工作状态

因为普通的RTL代码无法进行电源的描述,所以需要一个语言去描述它,IEEE推出了
为什么提出 UPF

一共有3次,分析后的UPF', 布局布线后的是UPF''

开发流程
SDC+RTL+UPF ->经过DC -> gatas + UPF' -> UPF''

创建set demo:

create_supply_set mySS1
create_supply_set mySS2 //创建mySS1和mySS2两个set

create_supply_set mySS3
-function {ground mySS1.ground}

create_supply_set mySS2
1.定义domain create_power_domain TOP
-function {power mySS1.power}
顶层TOP, 下面有个u_dhm_core, 我们将它定义为pd1, create_power_domain pd1
-function {ground mySS1.ground}
elements参数表示可关断的domain部分 1.0 -elements u_dhm_core
-update
1.create_supply_port VDD
2.create_supply_port VDDL create_supply_set mySS1
2.划分电压 3.create_supply_port VSS -function {power myVDD}
-function {ground myVSS}
-update //mySS1有电之后,SS2,SS3才能有电。

create_supply_set ssPD1
UPF(Unified Power Format )
create_supply_set ssAO

1.create_supply_net VDD create_power_doamin PD1


-domain TOP -elements {inst1}
2.create_supply_net VDDL set_domain_supply_net PD1
为了更好的管理port, net, 我们使用一个set的概念 -primary_power_net ssPD1.power
-domain TOP
相当于原本是直接从外面port拉电线,然后一个一个连接到内部的 -primary_ground_net ssPD1.ground
3.定义net 3.create_supply_net VSS
这里net和port重名 -domain TOP domain,现在为了更好的管理,我们就是分组(用排插分组)。
set_isolation PDiso -domain PD1
-isolation_supply_set SSAO
-clamp_value 1

set_retention PDret -domain PD1


-retention_supply_set SSAO

1.create_supply_net VDDL
-domain pd1 -reuse
2.create_supply_net VSS
-domain pd1 -reuse
3.create_supply_net VDDLS1
-domain pd1
4.将TOP中的net连接到pd1中 -reuse的含义是从top从直连到pd1,不然在pd1中需要port去接top的信号

1.connect_supply_net VDD
5.将top domain中port,net连接 -ports {VDD} //将前面定义的VDD net 和 top中VDD port相连

1.
set_domain_supply_net TOP
-primary_power_net VDD
-primary_power_net VSS
2.
set_domain_supply_net pd1
6.数值domain的Primary power, ground参数 -primary_power_net VDDLS1
(到这步,电源基本框架就搭建完成了) -primary_ground_net VSS

create_power_switch PD_SW_sw
-domain pd1
-input_supply_port {in VDDL}
-output_supply_port{out VDDLS1} // in, out以上面的图为主,因为这个图来自
其他PPT,端口名字有点不同
-control_port {sleep pwrcon_pd_n} //这个sleep信号是随便定义的, sleep连接的
是power switch, 而pwrcon_pd_n连接控制信号,这个控制信号一般需要always on
-on_state {on in {!sleep}} //当sleep=0时候,state打开。 on in这个就是在什么时
7.开始添加其他cell,如Power switch 候开启。

//设置isolation电压,一般来自外部
set_isolation PD_SW_iso_out
-domain pd1
-isolation_power_net VDD
-isolation_ground_net VSS
-clamp_value 1 //钳位电压
-applies_to output //ISO加在输出端

//设置控制信号
set_isolation_control pd_sw_iso_out set_isolation iso_mult -domain pd1
语法 -domain pd1 1.0 -applies_to input | output | both //在输出与输出端口都添加isolation
-isolation_signal pwrcon_iso_n
-isolation_sense low //低电平有效 使用source 和 sink来指定起点和终点
8.添加ISO -location parent //位置在domain pd1外面,如果在里面的话,用self set_isolation iso_mult -domain pd1
-source TOP_p_sset //指定起点
set_isolation iso_genpp -domain other
2.0 -sink TOP_p_sset //指定终点

set_level_shifter pd1_LSin //设置一个pd1_LSin的LS


-domain pd1
-applies_to input //是输入的
-rule high_to_low //是高到低,高到低其实加不加都无所谓,不加可以节省面积
-location self //这个在domain的内部

9.添加power shifter
set_level_shifter pd_LSout
-domain pd1
-applies_to output
-rule low_to_high
-location parent

//因为retention由FF+latch,这两个器件需要工作在不同的电压域下,一个电源要来自外部,这样一个工作电源断电后,才
能够继续保存。
set_retention PD_SW_ret
-domain PD_SW
-retention_power_net VDD_SW
10.添加retention policy -retention_ground_net VSS

set_retention_control PD_SW_ret
-domain PD_SW
-save_signal {save high}
-restore_sign {restore high}

1.定义各个电压数值;2.定义横坐标;3.定义纵坐标 + 给数值

1.定义各个电压的数值
add_port_state VDD -state {HV 1.08}

add_port_state VDD_PD1
-state {HV 1.08}
-state {LV 0.7}

add_port_state u_dhm_core/pd1_sx/out
//power switch的out不同, 它的写法是 domain/ power switch name / out, out是
固定的
-state {HV 1.08}
-state {LV 0.7}
-state {OFF_state off} //OFF_state是我们自己定义的名称, off是关键字

add_port_state VSS
-state {GND 0.0}

2.定义横坐标
create_pst pst_table -supplies {VDD VDD_PD1 VDD_PD1S VSS}

3.定义纵坐标 + 数值
add_pst_state ON_LO -pst pst_table -state {HV LV LV GND}
add_pst_state ON_LO -pst pst_table -state {HV HV HV GND}
add_pst_state ON_LO -pst pst_table -state {HV LV OFF_state GND}
1.0 add_pst_state ON_LO -pst pst_table -state {HV HV OFF_state GND}

与1.0不同的地方在于定义各个电压这里
11.添加Power state table
add_power_state <object_name> -state state_name
demo:
[-supply_expr {boolean_function}]
[-logic_expr {boolean_function}]
[-simstate simstate]

bootlean_function参数表:OFF, FULL_ON, (PARTIAL_ON, UNDETERMINED)少用

add_power_state ssTOP -state ON //ssTOP是定义的set, ON是自己定义的名字


-supply_expr {power == `{FULL_ON, 1.08}}
add_power_state ssTOP -state ON_g
-supply_expr {ground == `{FULL_ON, 0.0}}

2.0 //unswitched是power switch未切换的状态。


add_power_state ssPD1_unswitched
-state ON_LO
-supply_expr {power == `{FULL_ON, 0.7}}
add_power_state ssPD1_unswitched
-state ON_HI
-supply_expr {power == `{FULL_ON, 1.08}}

You might also like