最近做了一个项目,时间紧张,顶层用不用upf两版并行跑,模块是共用的,所以upf版本把switch cell放在顶层来控制模块的power on/down,debug upf文件解决加switch cell的问题过程如下。

低功耗设计-power switch

先来分析一下upf:

create_power_domain PD_TOP -supply {primary SS_TOP} -element {u_top}

create_power_domain ... ...
create_power_domain PD_BT -supply {primary SS_BT} -element {u_top/u_core/u_bt_top}

这里u_top/u_core/u_bt_top指的是BT这个模块。

create_power_switch BT_SW -domain PD_BT -input_port {VDDP VDD_TOP} -output_port {VDDC VDD_BT} -control_port {EN */u_bt_powon/O} -on_state {BT_ON VDDP {EN}}  -off_state {BT_OFF {!EN}}
add_port_state BT_SW/VDDC -state {on 0.72}
add_port_state BT_SW/VDDC -state {off off}

这里-domain用的PD_BT,input port/output port/control port对应switch cell的输入输出pin。add_port_state是block供电电压的开关状态。

到这里有两个问题:

1) BT_SW的power domain设置错了,因为PD_BT只包括一个模块,所以给PD_BT加switch是加不上的。

2) switch cell类型变了,所以input port/output port/control port都要跟着变。

第一个问题把PD_BT改成PD_TOP即可,第二个问题对照着switch cell的pin name去改就行,这里再讲一下加switch cell的过程。

一般给core 内加switch cell,使用create_power_switch_array -voltage_area $VA -pg_strap命令,但要给指定区域加就要用-boundary选项。

首先,让PD_BT覆盖BT模块以及给switch cell预留的区域,根据不同voltage area添加power rail。

然后,收缩PD_BT的voltage area,仅覆盖BT模块,让PD_TOP覆盖添加switch cell的区域,使用create_power_switch_array -boundary添加switch cell,这里使用-y_pitch和-x_pitch控制switch cell间距为0,保证一个挨一个不留间隙。

create_power_switch_array -power_switch BT_SW -lib_cell */HEADBUFTIE5 -y_pitch 1 -x_pitch 0.5 -boundary {{xx yy} {xx yy}}

最后,给power switch上手动拉power strap,connect_pg_net连接switch的输入,create_pg_vias创建power via。

connect_pg_nets VDD_TOP [get_flat_pins -all *BT_SW_snps*/VDDG] 

create_pg_vias -nets VDD_TOP -from stripe -to_type pwrswitch -from_layer ME5 -to_layer ME2 

 

 

04-18 14:47