当前位置: 首页 > news >正文

芯片低功耗设计实现upf编写指南(附低功耗项目案例)

这里提供一个DEMO(pl8051_extend_chip),可以使读者更快的理解低功耗设计的基础。下图所示,是该设计的功能结构图:

在这里插入图片描述

图 41 pl8051_extend_chip功能结构图

更多关于数字IC低功耗设计实现upf教程,可以前往社区星球查阅。
在这里插入图片描述

由图 41可以看出,整个设计主要是由一个8051控制器,通过SFR总线对其他模块进行控制,U_Des是一个算法模块,U_Pcu是功耗控制单元(Power Control Unit)。整个设计都在Clk的控制下进行工作,只有U_Des工作在ClkF下。
这里假设Clk(28ns)是ClkF(7ns)的4分频时钟,且与ClkF同源同向,这样才可以保证U_Des控制的正确性。
由于U_Des需要在较快的频率下工作,因此需要对U_Des进行一些特殊的设计,也就是对整个设计进行低功耗设计,如下所示:
在这里插入图片描述
图 42 低功耗设计方案示例

低功耗IC后端培训 | 盘点Power Switch Cell在实际项目中应用注意事项

上图主要描述以下信息:

  1. 2个电压域,TOP以及DES_DOMAIN。
    
  2. 电源设计外部提供,分1.2V的VDD12和1.0V的VDD10
    
  3. 设计中除DES电路几乎所有电路工作在1.0V的VDD电压域。
    
  4. U_Des由于工作速度要求较高,工作在1.2V的VDD12电压域DES_DOMAIN,但由于不使用的时候需要关断,以降低静态功耗,因此,通过一组PowerSwitch进行控制,控制信号来源为U_Pcu的PcuSfrDatOut[0]输出。该电压域与TOP电压域共用VSS地信号。
    
  5. 由于U_Des电路处于VDD12电压域,而U_Pcu处于VDD电压域,因此需要添加Level Shifter进行电平转换。
    
  6. U_Des电路输出信号,需要通过一个Isolation Cell,在关断电源时提供稳定电平,而该电平为1.2V,因此还需要利用Level Shifter转换成1.0V电压域信号,Isolation Cell的Enable信号来自于U_Pcu模块的PcuSfrDatOut[1]信号。
    
  7. U_Des电路中的寄存器需要使用Retention Register,save和restore控制信号分别来自于U_Pcu输出PcuSfrDatOut[2]和PcuSfrDatOut[3]经过Level Shifter产生的信号。
    

Synopsys公司为低功耗设计提供了一整套的解决方案,即UPF设计流程。UPF(Unify Power Format)是一种描述功耗设计思想的文件,Synopsys Galaxy Implementation Platform只需要读取UPF文件,就可以将低功耗设计思路实现,而Synopsys Discovery Verification Platform读取UPF后,可以对低功耗思路以及最终实现的电路进行验证。
接下来,我们利用UPF描述该DEMO的功耗设计思路。
4.1 申明电压域以及虚拟电压接口
首先申明电压域,并申明VDD、VDD12以及VSS等电压端口:
create_power_domain TOP
create_power_domain DES_DOMAIN_domain –elements U_Des
create_supply_port VDD
create_supply_port VDD12
create_supply_port VSS

根据上述指令,工具会识别出如下图所示中画圈的信息,电压域及虚拟电压端口开始出现:

在这里插入图片描述

图 43 电压域及虚拟电压端口信息

低功耗设计实现中secondary power pin的连接方法汇总

需要注意的是电压端口只不过是虚拟存在的,并不是一定在顶层连接。

4.2 申明电源网络
接着申明每个电压域中的电源网络,建议从顶层往底层进行申明,如首先申明TOP的VSS,VDD。:
create_supply_net VDD
create_supply_net VSS
以上语句添加下图中画圈部分:
在这里插入图片描述

图 44 产生顶层电源网络

接着申明DES_DOMAIN的电源网络,但需要注意的是,如果需要插入Level Shifter,最好是在与其有连接关系的电源域(TOP)同时申请电源线,并连接起来:
create_supply_net VDD12
create_supply_net VDD12 –domain DES_DOMAIN –reuse #DES_DOMAIN的VDD12与TOP的VSS共用一个网络,因此需要-reuse
create_supply_net VDD12G
create_supply_net VDD12G –domain DES_DOMAIN -reuse
create_supply_net VSS –domain DES_DOMAIN –reuse
create_supply_net VDD –domain DES_DOMAIN –reuse
以上语句添加下图中画圈部分:

在这里插入图片描述

图 45 子电路的电源网路申明
然后将电源网络和电源端口连接起来:
connect_supply_net VDD12 –port {VDD12}
connect_supply_net VDD –port {VDD}
connect_supply_net VSS–port {VSS}
以上语句添加下图中画圈部分:
在这里插入图片描述

图 46 连接电源网络和电源端口
最后为每个电源域申明主电源网络来源,主电源就是该电压域普通逻辑工作使用的电源:
set_domain_supply_net TOP –primary_power_net VDD –primary_ground_net VSS
set_domain_supply_net DES_DOMAIN –primary_power_net VDD12G –primary_ground_net VSS
做完这一步,电源网络申明基本完成
4.3 添加Power Switch
这添加Power Switch主要是2步,第一步创建Power Switch,第二步map Power Switch。可以参看以下脚本进行:

Power Switch

create_power_switch des_sw
-domain DES_DOMAIN
-input_supply_port {in VDD12}
-output_supply_port {out VDD12G}
-control_port {des_po U_Pcu/PcuSfrDatOut[0]}
-on_state {state_on in {!des_po}}
-off_state {OFF {des_po}}

map_power_switch des_sw
-domain DES_DOMAIN
-lib_cell HDRSIHVTD0
create_power_switch和map_power_switch在综合时只会检查语法,不会有实际效果,但在综合时将该UPF指令读入系统,可以由DC输出相应的UPF给Synopsys的PR工具,PR工具可以自动识别这些指令,到时才会真正添加Power Switch。2句命令的结果示意在下图画圈中:

在这里插入图片描述

图 47 添加Power Switch Cell

4.4 建立电源状态表格(Power State Table, PST)
在Power Switch插入以后,需要对电压域的有效电压,以及不同电压域之间的关系进行设置,同时建立电压分布及关断的情景(scenarios),可以用于静态电压分析、仿真等。
建立电源状态表格,可以参看以下脚本:
add_port_state VDD –state {LV 1.0} #VDD是1.0V,属于低电压域(LV)状态
add_port_state VDD12 –state {HV 1.2} #VDD12是1.2V,属于高电压域(HV)状态
add_port_state des_sw/out –state {HV 1.2} \ #Power Switch输出是1.2V,属于高电压域(HV)状态
-state {OFF off} #关闭状态(OFF),无电压(off)
add_port_state VSS –state {ON 0.0} #VSS处于常开状态(ON),电压0V
create_pst design_pst –supplies {VDD VDD12 VDD12G} #建立一个PST,由3个电源状态不同组成
add_pst_state design_work –pst design_pst –state {LV HV HV} #design_work状态下,三组电源都开
add_pst_state stand_by –pst top_pst –state {LV HV OFF} #stand_by状态下,des_sw/out输出电源为关闭状态
需要注意add_pst_state的-state括号里的描述顺序,必须与create_pst的-supplies里一致,选择的状态必须与add_port_state的-state里描述的一致才可以。
这样就建立了下表所示的PST,design_pst:

VDD
VDD12
VDD12G
design_work
LV
HV
HV
stand_by
LV
HV
OF
由此建立了PST,分析工具或仿真工具就知道需要对哪些状态进行分析了。
4.5 插入Isolation Cell
下面需要为DES_DOMAIN输出给TOP的输出信号添加Isolation Cell。脚本如下所示

Isolation Cell

set_isolation des_iso_out
-domain DES_DOMAIN
-isolation_power_net VDD12 -isolation_ground_net VSS \ #隔离后只有VDD12供电
-clamp_value 1 \ #关电后输出逻辑1
-applies_to outputs #对于所有输出添加

set_isolation_control des_iso_out
-domain DES_DOMAIN
-isolation_signal U_Pcu/PcuSfrDatOut[1]
-isolation_sense high \ #控制信号为高时ISO有效
-location self # Isolation Cell添加在DES_DOMAIN里面

这样就可以产生如下图所示画圈部分电路:
在这里插入图片描述

图 48 插入Isolation Cell

4.6 替换Retention Register Cell
接着需要使用Retention Register Cell将DES_DOMAIN中在关断电源后需要保留数据的寄存器替换为Retention Register Cell,可以使用如下脚本:

Retention Register

set_retention des_ret -domain DES_DOMAIN
-retention_power_net VDD12G -retention_ground_net VSS #retention_power_net是关电的Power,表示需要保持VDD12G电源域的数据

set_retention_control des_ret -domain DES_DOMAIN
-save_signal {U_Pcu/PcuSfrDatOut[2] high}
-restore_signal {U_Pcu/PcuSfrDatOut[3] low}

map_retention_cell des_ret
-domain DES_DOMAIN
-lib_cell_type RSDFCSD1 #RSDFCSD1是带有异步置位的Retention Register Type,可以从lib文件中retention_cell属性中看到。
根据以上描述,会按照下图画圈示意图描述电路:
在这里插入图片描述

图 49 替换Retention Register Cell

4.7 插入Level Shifters

插入Level Shifters是根据PST的定义进行,根据PST定义看来,DES_DOMAIN和TOP之间需要插入Level Shifters,其中DES_DOMAIN输出的pin(Isolation Cell的输出)需要插入H->L的Level Shifter,而其输入则需要插入L->H的Level Shifter。
插入Level Shifter在Compile过程中自动进行,也可以利用UPF命令set_level_shifter定义插入的规则。
插入Level Shifter后产生的电路变化示意图如下图画圈处所示:

在这里插入图片描述

图 410 插入Level Shifters

4.8 UPF Demo
######################

CREATE POWER DOMAIS

######################
create_power_domain TOP
create_power_domain DES_DOMAIN -elements U_Des

#######################

TOPLEVEL CONNECTIONS

#######################
#VDD
create_supply_port VDD
create_supply_net VDD -domain TOP
create_supply_net VDD -domain DES_DOMAIN -reuse
connect_supply_net VDD -port VDD

#VSS
create_supply_port VSS
create_supply_net VSS -domain TOP
create_supply_net VSS -domain DES_DOMAIN -reuse
connect_supply_net VSS -port VSS

#VDD12
create_supply_port VDD12
create_supply_net VDD12 -domain TOP
create_supply_net VDD12 -domain DES_DOMAIN -reuse
connect_supply_net VDD12 -port VDD12

#VDD12G
create_supply_net VDD12G -domain DES_DOMAIN
create_supply_net VDD12G -domain TOP -reuse

#####################

PRIMARY POWER NETS

#####################
set_domain_supply_net TOP -primary_power_net VDD -primary_ground_net VSS
set_domain_supply_net DES_DOMAIN -primary_power_net VDD12G -primary_ground_net VSS

###################

DES_DOMAIN SETUP

###################

Power Switch

create_power_switch des_sw
-domain DES_DOMAIN
-input_supply_port {in VDD12}
-output_supply_port {out VDD12G}
-control_port {des_po U_Pcu/PcuSfrDatOut[0]}
-on_state {state_on in {!des_po}}
-off_state {OFF {des_po}}

map_power_switch des_sw
-domain DES_DOMAIN
-lib_cell HDRSIHVTD0

Isolation Cell

set_isolation des_iso_out
-domain DES_DOMAIN
-isolation_power_net VDD12 -isolation_ground_net VSS
-clamp_value 1
-applies_to outputs

set_isolation_control des_iso_out
-domain DES_DOMAIN
-isolation_signal U_Pcu/PcuSfrDatOut[1]
-isolation_sense high
-location self

Retention Register

set_retention des_ret -domain DES_DOMAIN
-retention_power_net VDD12G -retention_ground_net VSS

set_retention_control des_ret -domain DES_DOMAIN
-save_signal {U_Pcu/PcuSfrDatOut[2] high}
-restore_signal {U_Pcu/PcuSfrDatOut[3] low}

map_retention_cell des_ret
-domain DES_DOMAIN
-lib_cell_type RSDFCRD1

Level Shifter

set_level_shifter des_ls_lh
-domain DES_DOMAIN
-applies_to inputs
-threshold 0.1
-rule low_to_high
-location parent

set_level_shifter des_ls_hl
-domain DES_DOMAIN
-applies_to outputs
-threshold 0.1
-rule high_to_low
-location parent

#####################

ADD PORT STATE INFO

#####################
add_port_state VDD -state {LV 0.84}
add_port_state VDD12 -state {HV 1.08}
add_port_state VSS -state {ON 0.0}
add_port_state des_sw/out -state {HV 1.08}
-state {OFF off}

#############

CREATE PST

#############
create_pst design_pst -supplies {VDD VDD12 VDD12G VSS}
add_pst_state design_work -pst design_pst -state {LV HV HV ON}
add_pst_state stand_by -pst design_pst -state {LV HV OFF ON}
4.9 DC UPF Flow Script Demo
source -e …/scr/synopsys_dc.setup
source -e …/scr/ variable.tcl
set_clock_gating_style -min ${CG_MIN_BITWIDTH} -max_fanout ${CG_MAX_FANOUT}
-sequential_cell ${CG_SEQ_CELL}
-positive_edge_logic ${CG_POS_CELL_LIST}
-negative_edge_logic ${CG_NEG_CELL_LIST}
-control_point ${CG_CONTROL_POINT}
-control_signal ${CG_CONTROL_SIGNAL}
-setup ${CG_SETUP_VALUE} -hold ${CG_HOLD_VALUE}
set_operand_isolation_style -logic adaptive
set_operand_isolation_slack 0.1
set_svf N E T L I S T P A T H {NETLIST_PATH} NETLISTPATH{top}${VER}.svf
read_verilog ${RTL_INCLUDE}
current_design $top
uniquify
link
load_upf ${SCRIPT_PATH}power.upf
set auto_insert_level_shifters_on_clocks all ;#can be added in backend flow
set_voltage 1.08 -object_list {VDD12 VDD12G}
set_voltage 0.84 -object_list VDD
set_voltage 0.0 -object_list VSS
source -e -v ${SCRIPT_PATH}timing.tcl
#M1~M9 are avaliable, M1 will be used by STD
#set_ignored_layers -min_routing_layer M4
set_ignored_layers -max_routing_layer M7
report_ignored_layers > R E P O R T P A T H {REPORT_PATH} REPORTPATH{top}_ignored_layers.rpt
set_clock_gating_check -setup ${CG_SETUP_CHECK} -hold ${CG_HOLD_CHECK} [all_clocks]
set_fix_multiple_port_nets -feedthroughs -outputs -buffer_constant
set_attr -type string tcbn90lphpwc0d70d9_pg.db:tcbn90lphpwc0d70d9 default_threshold_voltage_group SVT_LS_LH
set_attr -type string tcbn90lphphvtwc0d70d9_pg.db:tcbn90lphphvtwc0d70d9 default_threshold_voltage_group HVT_LP_LH
set_attr -type string tcbn90lphpwc0d7_pg.db:tcbn90lphpwc0d7 default_threshold_voltage_group SVT_LV
set_attr -type string tcbn90lphphvtwc0d7_pg.db:tcbn90lphphvtwc0d7 default_threshold_voltage_group HVT_LV
set_attr -type string tcbn90lphpwc_pg.db:tcbn90lphpwc default_threshold_voltage_group SVT
set_attr -type string tcbn90lphphvtwc_pg.db:tcbn90lphphvtwc default_threshold_voltage_group HVT
set_attr -type string tcbn90lphphvtcgwc_pg.db:tcbn90lphphvtcgwc default_threshold_voltage_group HVT_CG
set_attr -type string tcbn90lphphvtwc0d90d9_pg.db:tcbn90lphphvtwc0d90d9 default_threshold_voltage_group HVT_ISO
set_attr -type string tcbn90lphphvtwc0d90d7_pg.db:tcbn90lphphvtwc0d90d7 default_threshold_voltage_group HVT_LS_HL
set_attr -type string tcbn90lphpwc0d90d7_pg.db:tcbn90lphpwc0d90d7 default_threshold_voltage_group SVT_LS_HL
check_mv_design -verbose
compile_ultra -scan -no_autoungroup -no_boundary_optimization
change_names -rules verilog -hierarchy
write -format ddc -hierarchy -output D D C P A T H {DDC_PATH} DDCPATH{top}_noscan${VER}.ddc
write -format verilog -hierarchy -output N E T L I S T P A T H {NETLIST_PATH} NETLISTPATH{top}_noscan${VER}.v
set write_sdc_output_lumped_net_capacitance false
set write_sdc_output_net_resistance false
write_sdc -version 1.5 S D C P A T H {SDC_PATH} SDCPATH{top}_cons${VER}.sdc
check_design > R E P O R T P A T H {REPORT_PATH} REPORTPATH{top}_check_design_postcomp.rpt
report_area > R E P O R T P A T H {REPORT_PATH} REPORTPATH{top}_area.rpt
check_mv_design –verbose > R E P O R T P A T H {REPORT_PATH} REPORTPATH{top}_check_mv_design.rpt
report_constraint -all > R E P O R T P A T H {REPORT_PATH} REPORTPATH{top}_all_vio.rpt
report_clock_gating -gating_elements >> R E P O R T P A T H {REPORT_PATH} REPORTPATH{top}_icg.rpt
report_operand_isolation -verbose -isolated > R E P O R T P A T H {REPORT_PATH} REPORTPATH{top}_opiso.rpt
report_threshold_voltage_group > R E P O R T P A T H {REPORT_PATH} REPORTPATH{top}_VT.rpt
report_threshold_voltage_group -verbose >> R E P O R T P A T H {REPORT_PATH} REPORTPATH{top}_VT.rpt
save_upf N E T L I S T P A T H {NETLIST_PATH} NETLISTPATH{top}${VER}_dc.upf #upf’ for next part of flow


http://www.mrgr.cn/news/67690.html

相关文章:

  • 详解使用python读写csv,以及将csv数据写入数据库
  • 【Linux驱动开发】通过设备树节点来配置和调用GPIO(pinctrl节点和gpio-controller)
  • address already in use Port 8718 is in use by another program.
  • 基于Zynq FPGA对雷龙SD NAND的测试
  • 编译google protobuf项目,生成相应语言的dll文件
  • PGMP练-DAY18
  • Git进阶(十九):git revert 导致 merge 代码丢失问题修复
  • Qos基本原理+园区网络
  • kelp protocol
  • 什么是兼容性测试
  • hhdb数据库介绍(8-4)
  • JavaScript void 运算符
  • OpenJDK Vendor下载选择
  • 【工具】数字打乱器
  • 102. 二叉树的层序遍历 队列+迭代
  • 中仕公考:天津市25年公务员出公告啦
  • 入门网络安全工程师要学习哪些内容(详细教程)
  • 人民法院案例库:执行案件中未组织当事人对评估材料进行质证,评估程序是否违法
  • 对一个数据库中的所有表格的所有字符串字段 ,进行文本替换 将 A字符串, 替换为 B字符串
  • 0-基于图的组合优化算法学习(NeurIPS 2017)(未完)
  • 让股票数据分析从此如此简单
  • 什么是进销存?进销存系统都有哪些类型?
  • 【测试语言篇四】Python进阶篇之json模块
  • 初识网络编程
  • 【电子设计】STM32CubeIDE安装
  • 浅玩IO流