可以把芯片设计粗略分为三个部分:功能、时序和电源,它们分别对应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态,如果不加处理连到always on的逻辑,可能导致功能异常。ISO的功能类似AND和OR(取决于掉电后希望保持1还是0),其中ISO_EN由always on domain的信号驱动,在掉电前会先打开ISO_EN,保证掉电PD的输出都处于确定值,然后再关电;反过来,上电完成后才会关闭ISO_EN,从而保证电路的稳定。

那么ISO应该放到关电PD还是always on呢?答案是都可以。放到关电PD的优点是可以节省ISO数量(考虑到一个输出连到多个PD的情况),缺点是需要把always on的power rail拉过来;放到always on的话其电源连接比较简单。笔者更倾向于后者。

4、Power State Table(PST)

用来定义芯片低功耗模式的一张表格,包含power supplies(nets/ports)以及它们在不同模式下的状态(on/off)。

有了这些基本概念,我们可以试着设计一个简单的UPF。

############################################################################
## 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应对一般的电源设计是足够用了。

芯片低功耗设计之UPF简介相关推荐

  1. 低功耗设计——基于UPF进行设计

    UPF, 统一电源格式UPF(Unified Power Format)是新思(Synopsys)公司通用的电源格式,是一组标准的类Tcl 语言的集合,用来描述芯片设计中的低功耗意图(Low-Powe ...

  2. 芯片低功耗设计的两种常用EDA流程

    功耗分析和计算是功耗优化的基础,只有掌握准确估计功耗的手段,才能确保芯片功耗符合设计的要求 .低功耗设计需要EDA流程中各个层次的协同设计,功耗分析和估算必须贯穿芯片设计流程的始终,需要在各个层次的设 ...

  3. 低功耗设计及其UPF实现第四节(最后一节)

    低功耗设计方法学(4) pst 在upf中,使用pst来定义每个pd之间的电压关系,工具也使用pst来检查isolation rules,leve shifter rules是否完全或者冗余.pst不 ...

  4. 低功耗设计及其UPF实现第一节

    第一节:低功耗设计的基本单元和概念 大家好,最近疫情宅家,工作没有那么忙,所以写一下之前从事过的低功耗设计并和大家分享,希望大家多多提出不足.本次总结一共分为若干小节(还没定),我会从最最基础的低功耗 ...

  5. 芯片低功耗设计方法概述。

    芯片功耗来源: 低功耗设计贯穿整个芯片开发流程:系统架构,逻辑设计,综合,PR, 时钟树占据了动态功耗的30~60% 低功耗设计方法: 让系统在保持性能的前提下.芯片工作在所需的最低电压.调整Vmin ...

  6. 芯片低功耗相关的术语简介

    1.IR Drop电压降 由于芯片内部电源网络寄生参数的存在,从而导致电源从输入输出接口到达芯片内部各点的电势不同,其差值称为电压降(IR Drop).电压降分为两种,一是内部节点电压VDD低于供电点 ...

  7. 低功耗设计及其UPF实现第三节

    低功耗设计方法学(3) 本节学习一些UPF的描述,这些描述是实际项目最最使用的. Level shifter 从高电压到低电压不需要LS,反之需要. 时钟需要专门的LS. 图1中蓝色部分就是LS. 图 ...

  8. 低功耗设计及其UPF实现第二节

    通过上一节对基本概念的了解之后,我们对下面的基本概念进行跟进一步学习. Power domain 对于upf的实现,我们必须要有一个pd,哪怕只有一个aon的pd,任何一个逻辑只能属于一个pd,不能同 ...

  9. 低功耗设计(一) —— 设计原理

    PPA(power performance area)在IC设计中尤为重要,芯片低功耗设计不仅可以延长产品使用时间,还可以提高芯片成本.低功耗设计主要包含三类:动态功耗.静态功耗.浪涌功耗. 1.动态 ...

最新文章

  1. 每日一皮:据说PM就是这样忍受你的!
  2. 【upc 9541 矩阵乘法】非正解
  3. Linux ls 命令详解
  4. 上海市提出IDC建设指导意见,新建IDC限制PUE1.3以下
  5. 教你如何将自己的脚本代码放到服务器上运行
  6. 动态的添加和丢弃关键点---32
  7. HDU1573-模线性方程
  8. 五月数据库技术通讯丨Oracle 12c因新特性引发异常Library Cache Lock等待
  9. Linux使用cpuset设置CPU独占
  10. go使用cli实现命令行多指令操作
  11. slam十四讲第十讲:找不到 g2o_viewer
  12. 76 爬虫 - Scrapy案例(阳光热线问政平台)
  13. linux 服务器时钟同步设置
  14. java 字符串 空白字符_Java String中移除空白字符的多种方式汇总
  15. e系列是服务器CPU吗,教你识别英特尔E系列服务器CPU
  16. 【毕业设计之PHP系列】PHP课程网站络管理系统
  17. 动态规划——宠物小精灵之收服
  18. 零基础学爬虫大概多久?
  19. 正宇丨你选择了开始,就不要轻言放弃
  20. 科学的失控与范式的超越——《侏罗纪公园》读后感

热门文章

  1. adobe打开部分pdf时卡死解决方案(未响应)
  2. 【元胞自动机】元胞自动机车流密度不变下的双向两车道仿真(T 字形路口)【含Matlab源码 1290期】
  3. 软交换与硬交换的区别
  4. UE4 在FPS中播放粒子效果
  5. 你最想了解的lammps相关知识
  6. 404网站服务器错误怎么解决方法,网页404状态码应该怎么处理
  7. 8qam 解调 给我代码
  8. (王道计算机组成原理)第五章中央处理器-第三节1:CPU内部单总线数据通路中数据的流动
  9. 在linux环境中将Excel转换成文本
  10. 【openCV】读取视频、调用摄像头/电脑摄像头