可以把芯片設計粗略分為三個部分:功能、時序和電源,它們分別對應RTL、SDC和UPF三種設計文件。
前端工程師對RTL和SDC肯定是非常熟悉的,但是UPF(SNPS叫UPF,Cadence叫CPF)更多地是跟后端相關,所以前端不一定了解。這里簡單介紹一下UPF的原理。
?
首先要明白幾個概念。
1、Power Domain(PD)
網上關于PD的解釋:Hence, the UPF power domain is a collection of instances that are treated as a group for power-management purposes. Power domain defines the group of instances that shares the common set of power supply requirements.
形象化一點的理解,PD就是共用一個電源(包括VDD和VSS)的一堆電路,而且這堆電路的邊界往往是根據RTL Hierarchy的boundary來定義的。
2、Supply Nets, Supply Ports, Power Switches
Supply Nets:可以類比RTL里面的wire,用來定義一根電源線,而且只在聲明它的PD中有效。
Supply Ports:可以類比RTL里面的port,在電路中它們對應的是電源pin。
Power Switches:這個沒有可類比的RTL元素,它就是一個電源開關,其兩端電源屬于不同的Nets,控制信號來自RTL function電路。
?
3、Isolation Cell(ISO)
在用到power switch的多電源域芯片中,ISO是必須用到的單元。原因很簡單,可關電的PD的邏輯輸出,在power down以后呈現X態(tài),如果不加處理連到always on的邏輯,可能導致功能異常。ISO的功能類似AND和OR(取決于掉電后希望保持1還是0),其中ISO_EN由always on domain的信號驅動,在掉電前會先打開ISO_EN,保證掉電PD的輸出都處于確定值,然后再關電;反過來,上電完成后才會關閉ISO_EN,從而保證電路的穩(wěn)定。
那么ISO應該放到關電PD還是always on呢?答案是都可以。放到關電PD的優(yōu)點是可以節(jié)省ISO數量(考慮到一個輸出連到多個PD的情況),缺點是需要把always on的power rail拉過來;放到always on的話其電源連接比較簡單。筆者更傾向于后者。
4、Power State Table(PST)
用來定義芯片低功耗模式的一張表格,包含power supplies(nets/ports)以及它們在不同模式下的狀態(tài)(on/off)。
有了這些基本概念,我們可以試著設計一個簡單的UPF。文章來源:http://www.zghlxwxcb.cn/news/detail-438144.html
############################################################################
## UPF Demo ##
############################################################################
## create power domains
create_power_domain chip_top -include_scope
create_power_domain block1 -elements {inst_block1}
create_power_domain block2 -elements {inst_block2}
create_power_domain block3 -elements {inst_block3}
## create common supply net
## VDD is the always on source net for every block
create_supply_net VDD -domain chip_top
create_supply_net VDD -domain block1 -reuse
create_supply_net VDD -domain block2 -reuse
create_supply_net VDD -domain block3 -reuse
## create supply nets for blocks functional logic
create_supply_net VDD_1 -domain block1
create_supply_net VDD_2 -domain block2
create_supply_net VDD_3 -domain block3
## create common VSS net for whole chip
create_supply_net VSS -domain chip_top
create_supply_net VSS -domain block1 -reuse
create_supply_net VSS -domain block2 -reuse
create_supply_net VSS -domain block3 -reuse
## create VDD port and connect it to VDD supply net
create_supply_port VDD
connect_supply_net VDD -ports VDD
## create VSS port and connect it to VSS supply net
create_supply_port VSS
connect_supply_net VSS -ports VSS
## set primary supply net
set_domain_supply_net chip_top -primary_power_net VDD -primary_ground_net VSS
set_domain_supply_net block1 -primary_power_net VDD_1 -primary_ground_net VSS
set_domain_supply_net block2 -primary_power_net VDD_2 -primary_ground_net VSS
set_domain_supply_net block3 -primary_power_net VDD_3 -primary_ground_net VSS
## create power switch
create_power_switch block1_sw -domain block1 -input_supply_port {<PIN_NAME> VDD} -output_supply_port {<PIN_NAME> VDD_1} \
-control_port {<PIN_NAME> inst_always_on/pwr_ctrl} \
-on_state {<state_name> <input_pin_name> <boolean_expression>} \
-off_state {<state_name> <boolean_expression>}
map_power_switch block1_sw -domain block1 -lib_cells {<cell_list>}
create_power_switch block2_sw -domain block2 -input_supply_port {<PIN_NAME> VDD} -output_supply_port {<PIN_NAME> VDD_2} \
-control_port {<PIN_NAME> inst_always_on/pwr_ctrl} \
-on_state {<state_name> <input_pin_name> <boolean_expression>} \
-off_state {<state_name> <boolean_expression>}
map_power_switch block2_sw -domain block2 -lib_cells {<cell_list>}
create_power_switch block3_sw -domain block3 -input_supply_port {<PIN_NAME> VDD} -output_supply_port {<PIN_NAME> VDD_3} \
-control_port {<PIN_NAME> inst_always_on/pwr_ctrl} \
-on_state {<state_name> <input_pin_name> <boolean_expression>} \
-off_state {<state_name> <boolean_expression>}
map_power_switch block3_sw -domain block3 -lib_cells {<cell_list>}
## set isolation cells, default clamp value = 0
set_isolation block1_iso_out -domain block1 -isolation_power_net VDD -isolation_ground_net VSS -clamp_value 0 -applies_to outputs
set_isolation block2_iso_out -domain block2 -isolation_power_net VDD -isolation_ground_net VSS -clamp_value 0 -applies_to outputs
set_isolation block3_iso_out -domain block3 -isolation_power_net VDD -isolation_ground_net VSS -clamp_value 0 -applies_to outputs
## set exceptions for the isolation cells with clamp value = 1
set_isolation block1_iso_high_out -domain block1 -isolation_power_net VDD -isolation_ground_net VSS -clamp_value 1 -applies_to outputs -elements { \
inst_block1/output_signal1 \
inst_block1/output_signal2 \
inst_block1/output_signal3 \
inst_block1/output_signal4 }
set_isolation block3_iso_high_out -domain block3 -isolation_power_net VDD -isolation_ground_net VSS -clamp_value 1 -applies_to outputs -elements { \
inst_block3/output_signal1 \
inst_block3/output_signal2 \
inst_block3/output_signal3 \
inst_block3/output_signal4 \
inst_block3/output_signal5 \
inst_block3/output_signal6 \
inst_block3/output_signal7 \
inst_block3/output_signal8 }
## set isolation control signals for both clamp vaule 0 and clamp value 1 cells
set_isolation_control block1_iso_out -domain block1 -isolation_signal inst_always_on/block1_iso_en -isolation_sense high -location parent
set_isolation_control block1_iso_high_out -domain block1 -isolation_signal inst_always_on/block1_iso_en -isolation_sense high -location parent
set_isolation_control block1_iso_out -domain block2 -isolation_signal inst_always_on/block2_iso_en -isolation_sense high -location parent
set_isolation_control block1_iso_high_out -domain block2 -isolation_signal inst_always_on/block2_iso_en -isolation_sense high -location parent
set_isolation_control block1_iso_out -domain block3 -isolation_signal inst_always_on/block3_iso_en -isolation_sense high -location parent
set_isolation_control block1_iso_high_out -domain block3 -isolation_signal inst_always_on/block3_iso_en -isolation_sense high -location parent
## define power state on supply port
add_port_state VDD -state {on 0.81}
add_port_state block1_sw/<output_pin_name> -state {on 0.81} -state {off off}
add_port_state block2_sw/<output_pin_name> -state {on 0.81} -state {off off}
add_port_state block3_sw/<output_pin_name> -state {on 0.81} -state {off off}
add_port_state VSS -state {on 0}
#############################################
## Create PST ##
#############################################
create_pst flatten_pst -supplies {VDD VDD_1 VDD_2 VDD_3}
## all power on
add_pst_state pwr_s0 -pst flatten_pst -state { on on on on }
## block2 & block3 power off
add_pst_state pwr_s1 -pst flatten_pst -state { on on off off }
## block1 & block3 power off
add_pst_state pwr_s2 -pst flatten_pst -state { on off on off }
## block1 & block2 & block3 power off
add_pst_state pwr_s3 -pst flatten_pst -state { on off off off }
除了上面提到的內容,UPF還包含level shifter/retention/always_on_cell等單元,可以實現多電壓域等更復雜的低功耗設計。此外,UPF2.0以后的版本還支持面向對象的寫法,靈活度更高,不過可讀性較差。UPF1.0應對一般的電源設計是足夠用了。文章來源地址http://www.zghlxwxcb.cn/news/detail-438144.html
到了這里,關于芯片低功耗設計之UPF簡介的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!