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

【数字IC】【低功耗】UPF/CPF

低功耗技术---UPF&CPF

  • UPF in Design Flow
  • Definitions
  • Power Domain
    • Scope
    • Supply Ports, Supply Nets, Supply Set
    • multi upf
    • Example
  • Special Cells for Low Power Techniques
    • Isolation Cell
    • Level Shifter
    • Retention Register
    • Power Switch
    • Always_On Logic
  • Power States
  • UPF Examples

UPF的全称是统一功耗格式(Unified Power Format),其主要是由 Synopsys 推出的专门用于描述电路电源功耗意图(power intent)的一种语言标准,它是 Tcl 语言的扩展,并且现在已经成为 IEEE-1801 标准且被三大EDA厂商(Synopsy 、Cadence、Mentor)支持。

芯片设计粗略分为三个部分:功能、时序和电源,它们分别对应RTL(functional behavior)、SDC和UPF(power behavior)三种设计文件。前端工程师对RTL和SDC是非常熟悉的,但是UPF(SNPS叫UPF,Cadence叫CPF)更多地是跟后端相关。

UPF的作用是基于工具命令语言(tcl)把功耗设计意图(power intent)传递给EDA工具,从而帮助实现物理设计。

RTL只能实现功能设计,对于功耗设计意图则需要通过UPF实现。UPF 和 RTL 中给出不同设计信息的对比如下所示:

在这里插入图片描述

Power intent 用于描述芯片工作的『电特性』,包括工作电压、电压的开关、芯片的 power state(such as run/standby/retention/shutdown)、低功耗cell插入的策略等


UPF in Design Flow


UPF标准本身包含了大量的用于描述电源网络的 Tcl 命令,直接使用这些命令可以很方便的创建电源域和功耗控制的特殊单元等,用 UPF 编写的统一功耗格式文件不仅可以在 RTL 级,同时还可以被后端工具使用,这在一定意义上保证了整个芯片设计过程中功耗流程的一致性,在后端工具进行处理之后也会生成相应的 UPF 文件,此时前端工具可以使用该 UPF 文件对网表进行 Power 仿真分析。

前端(Design)

目前数字芯片低功耗设计主要是用 Verilog/VHDL 对电路进行描述,同时使用UPF文件对设计的功耗意图进行描述,最初的 UPF 文件标记为UPF0,我们可以使用 UPF0 对 RTL 进行动态/静态功耗验证。

使用 MVSIM 或者 VCS-native mode 对 RTL+UPF0 进行功耗验证,MVSIM 工具是 Synopsys 公司推出的基于 UPF 流程的低功耗动态验证工具。

此前,对与芯片回来后才可以对功耗管理机制等进行验证,一旦出现问题,进行修改代价十分发。

MVSIM 工具允许在 RTL 阶段结合 UPF 文件即可对芯片的功耗管理机制进行功能验证,从而尽量在设计早期阶段发现问题,MVSIM 工具是一款协同仿真器(Co-Simulator),它可以与当下流行的功能仿真器如 VCS/NC 协同仿真,达到对低功耗设计的动态验证目的,应用该工具在 RTL 阶段可以发现大多数的功耗管理、功耗控制等相应的问题。

中端(Syn)

在Synopsis推荐的UPF流程中禁止在RTL阶段手动例化隔离单元(Isolationcell)和电平转换单元(Level Shift cell)。因为在逻辑综合阶段,综合工具DC会根据功耗意图文件 UPF0 自动插入这些单元。

在逻辑综合过程中,综合工具 DC 会读入 RTL文件和 UPF0 文件,然后综合出门级网表并且产生更新后的功耗意图文件 UPF1,在 UPF1 文件中不仅包含了 UPF0 文件的信息,同时还显示的给出了综合后特殊单元的 supply net 的连接关系。

逻辑综合后可以使用 MVSIM 工具或者VCS-native 模式对插入了特殊单元的网表进行仿真。

后端

在物理实现阶段,ICC 工具读入 DC 综合后的网表和 UPF1 后在进行 Place&Routing,ICC 工具可以产生带电源引脚和不带电源引脚的网表文件,与逻辑综合相同的是,ICC 工具也可以产生 P&R 之后更新了的功耗意图文件 UPF2,此时带有 PG 引脚连接关系的网表就可以认为是低功耗架构芯片的全部实现,因为此时网表中不单单有 PowerSwitch 等,同时还有其必要的电源网络布线。

一般情况下,Low Power cells(isolation cells, level shifters…) 在逻辑综合阶段插入,power and ground (PG) net 在物理设计阶段插入。


Definitions


一些专业名词的定义。

HighConn : The side of a port connection that is higher in the design hierarchy; the actual signal associated with a formal port definition.

LowConn : The side of a port connection that is lower in the design hierarchy; the formal port definition.

在这里插入图片描述

sink : A receiver; the HighConn of an input port or inout port of an instance; or the LowConn of an output port or inout port of an instance.

source : A driver; the LowConn of an input port or inout port of an instance; or the HighConn of an output port or inout port of an instance.


Power Domain


对于一款芯片来说,其是由许多模块、子系统集成之后才会发挥它的功能,不同模块之间的工作速度和性能要求不同,此时就需要将这些模块根据实际需要工作在不同的时钟频率和工作电压下。对于暂时不需要工作的模块,可以使用通过降低时钟频率或关掉时钟已达到减少时钟翻转带来的动态功耗(DynamicPower),亦或者通过切断电源来降低静态功耗(Leakage)。

因此,可以将工作在同一电压下的模块归为一个组,即 Power Domain(电源域)的概念。

关于 Power Domain 的定义: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.

每一个电源域可以简单理解为供电逻辑的划分,在该逻辑划分中既包含了设计的物理实体(module)同时也包含了电源线间的连接关系。

在基于UPF标准的低功耗设计过程中,必须存在至少一个电源域,并且顶层的电源域必须在进行任何与电源相关的分析或者综合之前预先定义出来,同时还需要将电源域定义在层次化模块之上。

需要注意的是设计中的任何逻辑只能属于一个电源域,设计过程中也可以嵌套的定义电源域,如下所示:

在这里插入图片描述

形象化一点的理解,PD就是共用一个电源(包括VDD和VSS)的一堆电路,而且这堆电路的边界往往是根据 RTL Hierarchy 的 boundary 来定义的。

在这里插入图片描述

UPF 示例

首先我们需要定义一个顶层的电源域,在定义顶层电源域时不需要指定哪些模块被包含在该电源域中,定义顶层电源域的UPF命令为:

create_power_domain PD_TOP

然后我们在 PD_TOP 电源域中嵌套定义一个名为 PD1 的电源域并且同时指定模块实例 u_cpu_core 位于 PD1 电源域中,其对应的 UPF 命令为:

create_power_domain PD1 -elements {u_cpu_core}

完整语法:

在这里插入图片描述


Scope


在IEEE1801中,电源域被定义的那个逻辑层次称之为电源域的 scope。比如一个设计的逻辑层次是 aaa/bbb/,且将电源域 PD 定义到了 aaa/bbb/ 上,则称 aaa/bbb/ 为电源域 PD 的 scope。【这里的逻辑层次指的是从 RTL Design 来看】

UPF 中的 set_scope 命令用于设定 current scope,其完整语法描述如下所示:

在这里插入图片描述

【UPF是 Tcl 命令,所以会有返回值,也兼容于不同的 EDA 工具】

简单来说,scope 就是 upf 相关命令的作用范围set_scope 从 RTL Design 的角度指定 power domain 的作用范围,create_power_domain 则定义位于该 power domain 内的一系列实例。【比如 RTL 的 aaa/bbb/ 层级下,可能有多个 power domain。这个时候,可以先用 set_scope 指定作用范围,然后使用 create_power_domain 在该范围下定义不同的 power dimain】

换个角度理解,在Linux系统下,我们可以使用“cd dir/”进行工作目录的切换,同样地,scope可以认为是"工作目录切换"。

Examples1

给定 RTL Design 的层次化结构如下:

在这里插入图片描述

如果 current design top instancce 是 /top, current scope 是 /top/mid,那么

set_scope bot	# changes current scope to /top/mid/bot (child of current scope) 
set_scope . 	# leaves current scope unchanged as /top/mid (current scope) 
set_scope .. 	# changes current scope to /top (parent of current scope) 
set_scope / 	# changes current scope to /top (current design top instance) 

如果 current design top instancce 是 /top/mid, current scope 也是 /top/mid,那么

set_scope bot	# changes current scope to /top/mid/bot 
set_scope . 	# leaves current scope unchanged as /top/mid 
set_scope .. 	# results in an error 
set_scope / 	# changes current scope to /top/mid (current design top instance) 

如果 current design top instancce 是 /top, current scope 也是 /top/mid,那么

set_scope mid/bot 	# changes current scope to /top/mid/bot 
set_scope . 		# leaves current scope unchanged as /top 
set_scope .. 		# results in an error 
set_scope / 		# changes current scope to /top (current design top instance)

Notes:

  1. set_scope 后面可以用相对路径,也可以用绝对路径;

  2. set_scope 的使用和 current design top 相关。在 UPF 中,可以使用 set_design_top 来设定 current design top module,其完整描述如下:

    在这里插入图片描述


Supply Ports, Supply Nets, Supply Set


每个 scope 都有一组 supply nets 和 ports 在特定的层次结构上。

Supply Nets:在给定的电源区域内承载电源电压或接地的导体,跨越多个电压域的 net 被定义为“reused"。可以类比 RTL 里面的 wire,用来定义一根电源线,而且只在声明它的PD中有效。

Supply Ports:设计层次结构的两个相邻层次之间、层次结构的父块和子块之间的电源连接点。可以类比 RTL 里面的port,在电路中它们对应的是电源pin。

Supply Port 是一个逻辑概念(Logic Source),在 Physical 上并没有真正的 Pin 端口。主要用于连接给 power/ground 供电,以及连接不同 scope 下相同的 supply net。

Supply Nets 通过 Supply Ports 从设计层次结构的一个层次跨越到下一个层次。

在这里插入图片描述 在这里插入图片描述

Supply Set:supply nets的抽象集合(即并非实际存在,方便在 upf 中使用),一般就是一根 vdd 一根 gnd 的 net 。它是 domain-independent 的,在 supply set 中的 power 和ground 可以被任意在该scope中定义的power domain使用。

UPF Command for Supply Network

create_supply_port
在这里插入图片描述

如果使用 -domain 选项,会在其指定的 power domain 所在的 scope 定义一个 supply port,否则会在 current scope 定义一个 supply port。

Supply ports are loads, sources, or both, as follows:

在这里插入图片描述

create_supply_net
在这里插入图片描述

如果没有使用 -domian 指定 power domain,那么会在 current scope 创建 supply net。在 current scope 或者 below this scope 中创建的任何 power domain 都可以是使用该 supply net。

如果指定了 power domain,那么会在该 domain 所在的 scope 中创建 supply net。 supply net 可以被所指定的 domian 中的单元使用,所有插入到该 domian 中的 cells 也可以使用。

每一个声明的 supply net 都必须要连接到 supply port 上。

connect_supply_net
在这里插入图片描述

create_supply_set
在这里插入图片描述

This command defines a supply set as a collection of supply nets each of which serve a specific function for the set.

func_name 包括:power、ground、nwell、pwell、deepnwell and deeppwell。【就是给具体谁供电】

在这里插入图片描述

每一个 power domain 都要绑定一个 Supply Set 作为其 Primary Supply Set,即为该 Power Domain 内的所有 Stand Cells PG 供电的 Supply Set。

create_pwoer_domian-supply 用于绑定Supply Set ,如下所示:

在这里插入图片描述

supply_set_handle 相当于是绑定的 supply_set 的名称,一个 power_domain 可以有多个 supply_set。

UPF 内部有三个自带的 supply_set_handle 关键字,用于定义特定的 cells 的电源,如下所示:

PD.primary           :means primary supply set of power domain PD.
PD.default_isolation :means default supply set for isolation cells located in domain PD.
PD.default_retention :means default supply set for retention cells located in domain PD.

multi upf


什么是单 UPF 和多 UPF 呢?

对于只有一个UPF设计文件的设计来说,UPF文件是定义在顶层的 scope 中的,此时所有的 UPF对象(如Power_switch、Isolation、Level-shifter等)都只存在于顶层中,子电源域不需要定义 supply port,在不同电源域之间使用 -reuse 来共享 supply net。

对于多 UPF 设计来说,UPF文件的的描述则更加模块化,整个设计是由顶层 RTL+顶层的 UPF 文件和子模块 RTL+子模块对应的 UPF 文件共同描述的,子模块 UPF 文件必须从顶层 UPF 文件进行装载,

在 UPF 中,使用 load_upf 命令来加载其他的 upf 文件。

load_upf core.upf -scope u_cpu_core
# or
set_scope u_cpu_core
load_upf core.upf

在这里插入图片描述


Example


Examples1

如下图所示,该电路中存在 2 个 power domain 和 2 个 power net。

在这里插入图片描述

Power Domian:PD 和 PD_Block

Power Nets:VDD 和 VDD_Block。VDD 是给 PD_Top Domain 中的所有 Stand Cells 供电,VDD_Block 是给 PD_Block Domain 中的所有 Standard Cells 供电,两者公用 VSS。

其对应的 UPF 描述如下:

### 定义Supply_Port、Supply_Net,并进行连接;然后定义Supply_Set
### 具体语法如下:create_supply_port VDD -direction inout              #或“input”,注意尽量避免使用output
create_supply_net VDD
connect_supply_net VDD -ports VDD                    #连接supply_net和supply_portcreate_supply_port VSS -direction inout
create_supply_net VSS
connect_supply_net VSS -ports VSScreate_supply_port VDD_Block -direction inout
create_supply_net VDD_Block
connect_supply_net VDD_Block -ports VDD_Blcokcreate_supply_set SS_VDD_VSS \                        #定义一组相关的nets
-function {power VDD} \
-function {ground VSS}create_supply_set SS_VDD_Block_VSS \
-function {power VDD_Block} \
-function {ground VSS}### 上述代码声明好了电源网络,但是还未将StandCell的PG pin与Supply_Net在逻辑上进行连接
### 具体语法如下:create_power_domian PD_Top -include_scope \
-supply {primary SS_VDD_VSS}                           #创建default domain,并定义其primary Supply_Setcreate_power_domian PD_Block -include_scope \
-supply {primary SS_VDD_Block_VSS}

对于一个 Stand Cell 而言,其 primary_power pin 和 primary_ground Pin 在 lib 中进行描述,如下所示:

pg_pin(VDD){voltage_name:VDD;pg_type:primary_power;
}pg_pin(VSS){voltage_name:VSS;pg_type:ground_power;
}

Examples2

关于 set_scope 的使用。

在这里插入图片描述

对于上图所示的电源域,几种不同的定义方法如下所示:

# Method 1 
## Supply Network
create_supply_net VDD1 -domain Block1/PD1
create_supply_port PRT1 -domain Block1/PD1
connect_supply_net Block1/VDD1 -ports {Block1/PRT1}
## Power Domain
create_power_domain PD_TOP
create_power_domain PD1 -elements {Block1} -scope Block1
create_power_domain PD2 -elements {Block2} -scope Block2
create_power_domain PD3 -elements {Block3} -scope Block3# Method 2
## Supply Network
set_scope Block1
create_supply_net VDD1 -domain PD1
create_supply_port PRT1 -domain PD1
connect_supply_net VDD1 -ports {PRT1}
set_scope ...
...
## Power Domain
create_power_domain PD_TOP
create_power_domain PD1 -elements {Block1} -scope Block1
create_power_domain PD2 -elements {Block2 Block3}# or
create_power_domain PD_TOP
set_scope Block1
create_power_domain PD1
set_scope ...
create_power_domain PD2 -elements {Block2 Block3}

Special Cells for Low Power Techniques


UPF 中包含 level shifter、isolation cell、retention register、power switch 和 always_on buffer 等特殊单元用于实现各种低功耗就技术。

如多电压域技术,芯片中不同模块的工作电压是不同的,并且可以单独关断。这种技术的实现是需要一些特殊的单元的。

在这里插入图片描述


Isolation Cell


Isolation cell 是一种可以在某个电源域关断时,可以保持输入或者输出为常数的单元。

它主要用于不同的电源域之间,主要是将断电后电源域的输出信号钳位到高或者低电平,防止掉电后的X态传播。

为什么电源域关掉后需要把输出用ISO隔离成常数呢?主要有两个原因:① 防止虚假的信号传播到未关掉电源的域,造成逻辑错误;② 防止瞬态开路电流产生的静态功耗。

如下图所示,当左边的Voltage Area处于关断状态,右边的Voltage Area却始终处于开启状态,左边的PD关断使电路输出悬空,处于未知状态X,可能造成右边的域功能出错。另外,PMOS管和NMOS管可能同时导通,造成器件短路,形成瞬态开路电流。

在这里插入图片描述

所以,当信号从一个module传入另一个module,如果shutdown模块的电源关闭,则输出信号可能出现不可预测的数值,若此数值传递给always on模块,可能会导致功能出现问题。因此需要将电源关闭module的输出信号和其他module隔离开来,给所有的边界信号加入isolation cell(ISO)。

在这里插入图片描述

Isolation cell 的作用在于在电源关掉之后,将某个信号电位固定到高电位或低电位,保证输出的信号是一个确定值(1或0)。而当电源打开时,Isolation cell则表现的像一个Buffer,输出等于输入即可。同时,如果被关断的电路输入固定电压,也可能产生对地的电流,Isolation cell可对该部分电流进行保护。一般来说Isolation Cell的输出部分有较大的电容负载,也就是说 Isolation Cell 的延时将会比较大,对时序有一定的影响,是需要注意的。

ISO Cells类型

ISO的原理也很简单,基本上等同于AND或者OR门。

ISO两种类型:① AND类型:输出 iso 成 0;② OR类型:输出iso成1。

在这里插入图片描述

控制信号 ISO_EN(power_ctrl) 必须 always on domain 的信号驱动,在掉电前会先打开 ISO_EN,保证掉电 PD 的输出都处于确定值,然后再关电;反过来,上电完成后才会关闭 ISO_EN,从而保证电路的稳定。

此外,有一种 LATCH 型Isolation cell,在power domain下电前会锁存信号状态,一般较为少用,且面积开销较大。


如果从电源的角度分离,有双电源和单电源两种Isolation Cell。

双电源Isolation Cell如下图所示,有两组 power,primary power VDD 和 backup power VDDB,当左边的domain断电时,VDD off,此时就由 always on 的 VDDB 供电,输出Y端保持固定的电平;

在这里插入图片描述

单电源 Isolation Cell 只有一组 always on 的 power。

ISO Cells 插入位置

Isolation cell 的插入位置有:power gated module/power down domain (source module) 的 output 、always-on module (destination module) 的 input,或者是其他任意的 PD 中。

  1. power down domain的一个输出连接到多个always on domain的输入,此时插在source的output端,可以节省使用Isolation Cell的数量;

  2. isolation cell 需要 always-on 的 power,若放在 source module 的 output 端,还需要引 always-on 的 power rail (The physical implementation of a power supply net.)过来。

UPF 语法

upf 中使用 set_isolation 命令来设定 isolation cells,其完整语法(ref:IEEE1801-2018)如下所示:

在这里插入图片描述

Descriptions

  • domian

    当设定的 iso strategy 所应用的 pwoer domain。

  • elements / exclude_elements

    iso cells 添加或不添加在 PD 的哪些端口(ports)。

    element_listexclude_list 可以是 ports,也可以是 instances 。如果是 instances,那么就是在该 instances 的所有 ports 都添加 iso cells。

  • source / sink

    如果给定的是 PD 的名称,那么使用的是该 PD 的 primary supply。【作用没有看懂】

  • applies_to

    指定将 iso strategy 应用到特定方向的端口。

  • location

    isolation cells 的 logic hierarchy,即 isolation cells 被插入到哪一个 power domain 中。

    self:self domain,即需要被隔离的 domain 本身。【默认值】

    parent:parent domain。

    others

    fanout

  • isolation_supply

    isolation cells 的电源(powers)。

    更早的版本中,该命令的名称为 isolation_supply_set

  • clamp_value

    isolation cells 在使能状态下的输出值。

  • isolation_signal

    isolation cells 的控制(使能)信号。

  • isolation_sense

    isolation cells 控制信号的有效电平。默认值是 high。

lib 中的描述

cell(A2ISO_X4) {is_isolation_cell : true ;		// ISOpg_pin(VDD) {voltage_name : VDD ;pg_type : primary_power ;}pg_pin(VSS) {voltage_name : VSS ;pg_type : primary_ground ;}pin(A) {direction : input ;input_voltage : default ;related_ground_pin : VSS ;related_power_pin : VDD ;isolation_cell_data_pin : true ;	// ISO}pin(EN) {direction : input ;input_voltage : default ;related_ground_pin : VSS ;related_power_pin : VDD ;isolation_cell_enable_pin : true ;		// ISO}pin(Y) {direction : output ;function :(A&EN);output_voltage : default ;related_ground_pin : VSS ;related_power_pin : VDD ;power_down_function :!VDD + VSS” ;		// ISO}
}

Level Shifter


在 Multi voltage Design 中,一个芯片上提供两个或多个电源电压会带来一些复杂性和成本。需要额外的电源输入管脚提供芯片电压,而电源网络必须将每个电压电源分别分配到相应的块。

在这里插入图片描述

Level-shifter 用于实现不同电压域之间信号的电平转换,将信号从一个电压域切换到另一个电压域。

不同电压域的VDD是不一样的,两个 power domain 之间有信号传输的时候,如果不进行电压转换,器件就无法正常工作。例如,将1.0V的电压信号送到1.8V的电压域,有可能连1.8V区域MOS的VTH都达不到(通常VDD越高的工艺对应MOS的VTH也越高),器件自然无法工作。

如下图所示,1.0V的驱动对1.8V的接收端来说,如果落在不定态区域(黄色区域),不一定能区分出0/1的电平。
在这里插入图片描述

因此,Level Shifters 主要用于多供电电压(MSV)的设计中,在2个不同电压域之间有数据交互的情况下,需要将某个电压域输出的电平转换成另一个电压域可以识别的逻辑电平,因此需要用到电平转换的器件,这就是Level Shifter。这种 Cel l在 IO 中也广泛存在,用于将外部的电压与 Core 电压之间进行转换。

在这里插入图片描述

如果是1V的signal去驱动5V的signal,那么需要 LS 的理由是很充足的,因为1V的信号在5V的domain中甚至达不到阈值电压,如果不插入 Level Shifter Cells,可能造成功能错误或者芯片不稳定。

但是为什么如今的IC中高低电压域差别不大,比如0.9v到1.2v,仍然需要LS呢?这是因为0.9v的信号在1.2v的domain里,会造成PMOS和NMOS的同时开启,产生额外的动态短路电流,也就是internal power。


如果设计中含有Multi-VDD且有的Power Domain可以被关断,多个Domain之间还有数据交互,那么既需要用到 Level Shifte r也需要Isolation Cell,这种情况也非常常见。因此一般Foundary都会那种带有Isolation功能的Level shifter,兼两种功能。

下图就是这种情况,PD1是可被关断的,它与 PD2 以及 PD3 之间用的 Level Shifter 就是带有 Isolation 功能的 Level Shifter。而 PD2 是Always On 的,所以它送到 PD3 的数据只需要用普通的 Level Shifter 即可。

在这里插入图片描述


LS 的类型

从功能的角度看,LS有两种类型:

  1. Buffer型Level Shifter cell:功能类似buffer。

  2. AND/OR组合型Level Shifter cell:该类型的Level Shifter会带有1个enable pin,功能兼具Level Shifter 和 Isolation 两者的功能;当一个PD既属于shut off power domain,又属与低电压PD,此时便可用该类型Level Shifter以节省面积。

根据信号电平由高到低和由低到高的转换,Level-shifter 分为:high-to-low(HL)low-to-high(LH)LH_HL 三类。

Bidirectional Level Shifter cell更为常用,它既可以将高电压信号转换为低电压信号,也可以将低电压信号转换为高电压信号。

从表面上来看,在不考虑没有闩锁效应和击穿效应的情况下,一个来自更高的电源域的信号驱动低电压与的CMOS管好像没有什么明显的问题。但是对于一个普通的CMOS管来说,存在一个最佳的电压,让CMOS翻转速度最快。因此,为了时序收敛,我们确实需要一些特定的实现“下移”的单元来实现这个目的。

UPF 语法

upf 中使用 set_level_shifter 命令来设定 LS cells,其完整语法(ref:IEEE1801-2018)如下所示:

在这里插入图片描述

lib 中的描述

lib 中对 LS Cells 的描述会有一些不同于普通 cells 的信息,部分内容如下所示:

cell (LVL_HL_X1) {......is_level_shifter : true;				// LSlevel_shifter_type : HL;				// LSinput_voltage_range (0.72, 1.1);		// LSoutput_voltage_range (0.72, 1.1);		// LS......pin(I) {......direction : input;input_signal_level : COREVDD1;level_shifter_data_pin : true;		// LSrelated_ground_pin : VSS;related_power_pin : VDD;......}pin(NSLEEP) {......direction : input;input_signal_level : COREVDD1;level_shifter_enable_pin : true;		// LSrelated_ground_pin : VSS;related_power_pin : VDD;......}pin(Z) {direction : output;output_signal_level : COREVDD2;						// LSpower_down_function :!VDD + !VPP + VSS + VBB ”;	// LSfunction : “I + !NSLEEP ”;}

Retention Register


电源关断模块有可能要求register对关断前的数据进行锁存或者在电源打开后要求对锁存的数据进行恢复,这就需要特殊的单元Retention Register。它可以在掉电的时候保持住一个数值,用于对后面电路的控制。

在这里插入图片描述

Retention cell是时序逻辑,有两种类型:. retention flip-flop 和 retention latch。

一个Retention cell是由一个普通的flip-flop(或者latch) 加上一个额外的save-latch组成。save-latch可以在关电的时候保存状态,在重新上电的时候恢复普通flip-flop的状态。

在这里插入图片描述

正常情况下,Retention flip-flop和普通的flip-flop功能一样,但是会把输出锁存在Save-latch中,当电源关掉时,由于Save-latch是由备用电源供电,Save-latch还是保持原有状态;当RESTORE信号拉成1时,Save-latch会把输出送给前面的flip-flop,就能立刻恢复下电时的状态了。


Power Switch


power switch 单元提供了关闭逻辑域的电源的能力。一个开关有一个输入供应网,一个输出供应网,以及至少一个用于控制开关的输入信号,可以通过多个信号控制,也可以输出多个信号。

在这里插入图片描述

供电需要数字电VDD和接地VSS,Power Switch可以关断VDD也可以关断VSS, 这样就分为两种PG:

  1. header 类型,关断VDD;
  2. footer 类型,关断VSS

Headers 不用太大的buff tree来控制on/off, 使用的是P管,0的时候打开,相对于Footers (N管1的时候打开)更加安全。所以现在用的都是Headers。

一个 header 型的 Power Switch 如下图所示:

在这里插入图片描述

其中,

VDDG: primary power,主电源,aways-on 电源

VDD: switched power / virtual power,关断电源,或者叫虚电源

NSLEEPIN 信号控制 Power Switch;NSLEEPOUT是可选的,只是 NSLEEPIN 的延时。在 PG cell 需要串成 chain 的时候,会需要NSLEEPOUT。

此外还有一种 Mother-daughter switch cell,其结构如下:

在这里插入图片描述

NSLEEPIN1首先被激活; 这导致子开关(较弱的开关,较大的打开电阻)打开。随后,NSLEEPIN2被打开,导致较强的母开关(具有较低的打开电阻)打开。

相反的情况通常发生在关闭期间。这种方法的优点是可以将冲击电流控制在两步,防止电流太大。

UPF 语法

create_power_switch
在这里插入图片描述

-ack_port 就是在 power switch cells 上定义一个 acknowledge port,及其对应的连接关系。

比如,前面提到的 NSLEEPOUT 端口就饿可以在这了定义,具体如下所示:

create_power_switch TOP_PSW \-domain			TOP_PD \......-ack_port {NSELEEPOUT o_core_powerdown_ack_n {NSLEEPIN}}

NSELEEPOUT 的输出值和 NSLEEPIN 一样,并且连接到 o_core_powerdown_ack_n (design 中的一条真实存在的 net )。-ack_delay 定义的是延时值,如果没有指定,就是默认值 0。


Always_On Logic


在电源关断模块还有可能需要有些信号线或逻辑长期工作,比如MTCOMS单元的控制信号线,Retention Register的save/restore控制信号,Isolation Cell的控制信号。为了实现这种功能,这就需要另外的特殊单元叫Always-On BUF。

在这里插入图片描述

AON cell 是一种特殊的cell,它的供电来自于不会被关断的电源域(always-on domain), 但是被摆放在可以被关断的电源域。

AON cell也有header和footer类型两种,对应的供电分别为:

  1. VDDG / VSS: header类型
  2. VDD / VSSG: footer类型

例如,shutdown domain 中的 retention flipflop 需要加上AON cell。

在这里插入图片描述


Power States


Power States指的是 Chip 的一种供电模式,是特定条件下supply net的供电组合。(设计中所有电源域的电压值和电源开关状态的允许组合。)

在这里插入图片描述

在这里插入图片描述

add_power_state 命令可以为 object 定义一个或者多个 power states,每一个 power state definition 是相互独立的。【也就是说,可以使用多条 add_power_state 语句定义不同的 power states】

power state 的作用对象:a supply set,a power domain,a composite domain,a group,a model or an instance。

示例:

add_power_state PWS_SET -state ON    {-supply_expr {power==`{FULL_ON,0.72} && ground == `{FULL_ON,0}}}
add_power_state PWS_SET -state ON_1V {-supply_expr {power==`{FULL_ON,0.9}  && ground == `{FULL_ON,0}}}
add_power_state PWS_SET -state OFF   {-supply_expr {power==`{OFF        }  && ground == `{FULL_ON,0}}}add_power_state AON_SET -state ON    {-supply_expr {power==`{FULL_ON,0.72} && ground == `{FULL_ON,0}}}
add_power_state AON_SET -state ON_1V {-supply_expr {power==`{FULL_ON,0.9}  && ground == `{FULL_ON,0}}}
add_power_state AON_SET -state OFF   {-supply_expr {power==`{OFF        }  && ground == `{FULL_ON,0}}}add_power_state TOP_PD -state ON {-logic_expr {AON_SET == ON && PSW_SET == ON} } \-state ON_1v {-logic_expr {AON_SET == ON_1V && PSW_SET == ON_1V} } \-state STANDBY {-logic_expr {AON_SET == ON && PSW_SET == OFF} } \-state STANDBY_1V {-logic_expr {AON_SET == ON_1V && PSW_SET == OFF} } \-state OFF {-logic_expr {AON_SET == OFF && PSW_SET == OFF} }

Description:

  1. PWS_SET 和 AON_SET 是之前定义的 supply set,并且都是用于 TOP_PD 这个 power domian。
  2. 对于 TOP_PD 来说,这里是定义了 5 种不同的 power states。TOP_PD 可以工作在两种电源电压(0.9V 和 0.72V)下,在 STANDBY 模式下,其中一个电源关闭,即关闭一部分电路。

UPF Examples


############################################################################
## 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 }

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

相关文章:

  • 未来人工智能:技术、趋势与挑战
  • 【C++语言】精妙的哈希算法:原理、实现与优化
  • Android中的IntentService及其作用。
  • 101、QT摄像头录制视频问题
  • 开源运维软件适用性评估:多维度视角下的理性选择
  • 操作系统之内存管理基本概念
  • 郑州网站制作优化你的网站以吸引流量
  • 机器人学习仿真框架
  • 骨传导耳机哪个牌子最好?真实测评五大年度热门单品机型
  • 【直播回放】达索系统赋能新电池产业链数字仿真一体化协同解决方案
  • 软件源码,招投标管理系统,询价管理系统,供应商管理系统,一体化管理系统,供应链管理(springboot+vue+mysql)
  • 2024年墨西哥金融科技报告解读(上)| 从基础到前沿(附下载)
  • sdads
  • SiLM266x系列SiLM2660CD-DG 可配置的电池组电压检测功能 高压电池组前端充/放电高边NFET驱动器
  • 宠物电商新篇章:SpringBoot驱动的在线交易网站
  • comfyui替换电商模特工作流,模特们要真的要失业了吗?
  • 歌曲伴奏去哪里找?轻松获取你喜欢的伴奏
  • 10.17 多进程编程
  • 2024年9月青少年软件编程Python等级考试(一级)真题试卷及答案
  • 离线安装lrzsz
  • 代购系统搭建涉及到哪几方面❓
  • 电子便签:从偶像剧到职场的实用转变
  • 认识ldconfig,不仅仅可以用于查看库的版本
  • 使用Selenium爬取图片并保存为Excel:完整教程
  • 哪个牌子的台灯性价比高?五款性价比拉满的护眼台灯推荐
  • Thymeleaf模板引擎教程(详细总结)