SoC设计之功耗UPF

 


1. UPF定义

统一电源格式(Unified Power Format ,UPF)是一个已发布的IEEE标准,由Accellera的成员开发。它旨在简化指定、模拟和验证具有多个power state和power islands的IC设计的工作。最新正式发布的版本是IEEE 1801-2013。

UPF被设计为在相对较高的水平上反映设计的power意图。UPF脚本描述了哪些power rails应该被route到各个块,块何时被上电或何时被下电关闭,当信号从一个电源域交叉到另一个电源域时,电压电平应该如何偏移,以及如果域的主电源被移除,是否应该采取措施来保留寄存器和存储单元内容。

UPF以及类似的通用电源格式(Common Power Format ,CPF)的主干是工具控制语言(Tcl),这是一种最初创建的脚本语言,旨在提供一种自动控制设计软件的方法。

Tcl的吸引力在于命令行命令可以用作脚本中的语句。大多数Tcl实现都是特定于单个工具的。然而,CPF和UPF的定义不同寻常,因为它们旨在与power-aware flow中的所有工具一起使用——工具本身必须确定Tcl脚本中提供的命令是否与它们相关。

例如,UPF-aware tools 使用Tcl命令“create_power_domain”来定义设计中的一组块,这些块被视为一个电源域,与同一芯片上的其他块不同。这种类型的命令背后的想法是,power-aware tools 读取设计中可以独立通电和断电的块的描述。这些工具可以使用这些信息来确定,例如,仿真在不同条件下的行为。

例如,在SystemVerilog中编写的testbench可以向仿真器识别特定块应该断电,以确保其他块在没有首先检查电源状态的情况下不会访问它。

晶体管级仿真可以使用power定义来观察当电源电压或衬底偏置电压改变时会发生什么。当一个块的电源电压降低以节省power,而其他块则以其最大电压运行时,所有必要的逻辑路径是否符合预期时序?类似地,静态分析工具可以检查正确的电平移位器是否就位,以确定不同power域中的块是否可以通信。

在多电压和电源开关设计中,需要前端做的逻辑设计非常少,绝大部分工作是在综合和物理设计阶段完成的。因为对于逻辑设计来说,电源网络是透明,不可见的,所以跟电源相关的这些设计方法也是不需要关心的。但是必须有一种办法,可以把逻辑设计和物理设计衔接起来才行。这就需要UPF了。

UPF作用是把功耗设计意图(power intent)传递给EDA工具,从而帮助实现物理设计。这就类似于综合时的约束,是把跟时序相关的设计意图传达给EDA。说简单一些,UPF就是一些tcl命令,系统架构师通过这些命令的组合,把真实的低功耗设计意图传递给工具。下面是UPF的spec中的解释。

UPF基于工具命令语言(Tcl)。UPF命令是使用与Tcl兼容的语法定义的,因此可以使用标准Tcl解释器来读取和处理UPF命令。
读取UPF文件的兼容处理器使用完整的Tcl解释器处理UPF文件。兼容处理器应使用Tcl版本8.4或以上。以下内容也适用。
UPF power intent命令按发生顺序执行,就像执行Tcl命令一样,后续命令可以使用返回值。唯一支持正则表达式的UPF命令是find_object和query_upf。
Tcl的所有命令和技术都可以使用,包括proc和procs的库。然而,procs和procs的库最终应该只依赖于用于design 信息的UPF命令。

find_object应是定义电源意图时用于以编程方式访问HDL的唯一来源。允许使用标准Tcl命令(如regexp)处理find_object返回的信息。

UPF旨在用于许多工具,因此在构建power intent时使用特定工具的特定命令是错误的.

 

 

 UPF tool flow

UPF发展到现在,已经成为IEEE的标准(IEEE Std 1801-2018),目前是3.0版本。主流的EDA工具都会支持UPF。下图是S家的低功耗设计流程图。像SDC文件一样,UPF文件要单独编写,在综合阶段作为输入文件送给Design Compiler。综合完成后,DC会生成一个UPF文件给ICC,在物理设计阶段就能看到了level shifter,isolation cell,retention cell和power gating cell了。同时,在验证阶段,也要做一些有关低功耗的仿真工作,这时也需要UPF文件。

图1  Synopsys低功耗设计流程

  • Design Compiler读入RTL和初始UPF描述文件,基于它们综合出门级网表并产生一个更新了的UPF文件,这个Design Compiler输出的UPF文件在示例图中标志为UPF’。UPF’文件中包含了原始UPF文件的内容,并添加了综合时加入的对某些特殊cell(比如isolation cells、level shifters)的电源和地的连接关系。综合输出的门级网表已经被工具根据UPF的相应描述插入了一些低功耗所需的特殊电路单元,比如Level-Shifter,Isolation cells,Retention Register等。
  • IC Compiler读入综合输出的门级网表和UPF’描述文件,基于它们进行物理实现,包括:布局和布线以及电源关断特殊单元(Power-Gating cell)的插入、摆放和控制信号线的连接等步骤。输出一个新的门级网表,一个包括所有cell的电源和地连接关系的网表(俗称pg网表),以及一个更新了的UPF文件,标志为UPF’’。UPF’’文件包含了UPF’的内容,并添加了在物理实现阶段对低功耗电路结构的改变,比如添加了Power Switches(俗称MTCMOS)的连接关系。
  • 这个flow中产生的数据可以用于做功能仿真(利用MVSIM、VCS),插入的低功耗单元的正确性检查(利用MVRC),形式验证(利用Formality),以及时序功耗检查(利用Prime Time-PX)和电压降(IR-Drop)(利用Prime Rail)的验证。
  • VCS仿真器和MVSIM多电压仿真工具可以在几个阶段用来做多电压的功能仿真:RTL级,综合后加入了低功耗相关器件(比如Isolation cell)的门级,以及PR之后加入了Power Switches的门级。MVRC用于检查多电压设计的规则是否正确实现,包括电源连接关系、电源结构、电源一致性等等,也适用于流程中的各个步骤。
  • Prime Time读入DC或ICC输出的门级网表以及对应的UPF文件。它利用UPF文件中的信息建立一个虚拟的电源网络模型,并将电压值反标到每个器件的电源端口,进行带电源信息的时序检查。
  • Prime Rail是基于带UPF信息的版图进行电压降以及电迁移的分析。如果设计中有电源关断单元,它还可以分析相关关断电路的瞬态电流以及动态的电压降分布。来帮助判断这些电源关断单元是否插入合理以及是否需要插入De-cap单元。

下面描述UPF设计。

Power Domain Definitionon on top of the design

1.具有公共电源特性的逻辑化分:(1)Power nets , power ports,(2)Power down and switching style,(3)Voltage area is physical corollary ( 1:1)

2.结构定义

 

 3.RTL级设计验证

硬件描述语言(HDLS)不直接支持在RTL级别上描述电源连接,统一电源格式(UPF)标准定义了一些仿真器已经支持的语言和仿真语义,或者需要一些脚本/手动电源功能描述

(2)创建电源域

1.如果在RTL中定义了电源域$power,$isolate:(只有VCS支持此设置)

infer_power_domain命令将RTL power域结构转换为设计编译器可以处理的power域对象。

2.如果RTL不具有power域构造:

使用UPF声明,仍然可以使用create_power_domain命令从shell(在设计编译器和IC编译器中)定义电源域。

请注意,必须首先创建顶层power域。create_power_net_info命令创建power net信息对象。

UPF示例:

create_power_domain TOP

create_power_domain MULT \

-object_list [get_cells Multiplier] \

-power_down \

-power_down_ctrl [get_nets mult_off]

create_power_net_info VDDM -power

create_power_net_info VDDMS -power

create_power_net_info VSS -gnd

Power Aware Simulation @VCS

1.Synopsys电力系统任务(verilog/VVHDL)提供了在RTL级别使用Synopsys VCS进行低功耗仿真的能力。

verilog系统的任务编码是$power和$isolate。

2.在RTL网表中,用户需要通过$power描述shut down域的行为。

3.用户还必须通过$isolate说明shut down域和常规域之间的连接。这包括隔离单元的输入/输出信号、控制信号和clamp 信号。

4.可以使用以下语法来调用VCS命令:

%unix>vcs–power_aware [vcs options]

$power: 构造定义了一个power 域并指定其power 控制信号。在Verilog中,使用系统任务指定电源域:

 $power (<domain_name>, <power_on_net>, <on_sense_expression>, <power_on_ack_net>, <ack_sense_expression>, , , …, );

$isolate: 构造指定特定信号的隔离行为

$isolate(<isolated_signal>, , , )

Power Aware Simulation @仿真举例:

initial begin $power("PD_mult", PwrDwn_mult, 0’b0, "prod_pre_iso[15:0]"); end

always @* begin $isolate(prod[15:0], multi_iso, prod_pre_iso[15:0], 16’hFFFF); end

 

 仿真结果

 

 Power Domain vs. Logic Hierarchy

支持嵌套电源域

不支持逻辑上不相交的电源域

 

 Equivalence Checking Using Formality

 

 UPF 语法

 

power 域范围

 

suplly 网络

 DVFS:power state

 

 

 power 开关

 

 隔离策略

retention 寄存器策略

 

 库支持:multi-NLDM

 

 非线性电压/温度缩放

下面用一个具体的实例描述,SoC构成非常简单,一个MCU作为控制器,一个功能模块U1,一个功耗控制器U2。假设,U1工作在高电压1.2V,MCU和U2工作在低电压1.0V。当系统处于空闲状态时,可以关闭U1的供电,以减少静态功耗,电源开关的控制信号由U2模块给出。为了简化描述,本demo中不支持DVFS,并省略功耗控制的逻辑设计部分。

有了上面的约定条件,我们可以知道,现在有了两个电源域,分别定义为VH(下图红色)和TOP(蓝色)。

 UPF demo

还记得前面提到的,在RTL里面可是看不到供电信息的,我们必须把这个信息告诉工具才行。所以,第一步就是描述电源信息。

在UPF中描述电源信息

#upf demo

create_power_domain TOP

create_power_domain VH -elements U1

#VDD

create_supply_port VDD

create_supply_net VDD -domain TOP

create_supply_net VDD -domain VH -reuse

create_supply_net VDD -port VDD

#VSS

create_supply_port VSS

create_supply_net VSS -domain TOP

create_supply_net VSS -domain VH -reuse

create_supply_net VSS -port VSS

#VDD12

create_supply_port VDD12

create_supply_net VDD12 -domain TOP

create_supply_net VDD12 -domain VH -reuse

create_supply_net VDD12 -port VDD12

#VDD12G

create_supply_port VDD12G -domain VH

create_supply_net VDD12G -domain TOP  -reuse

set_domain_supply_net TOP -primary_power_net  VDD  -primary_ground_net VSS

set_domain_supply_net VH -primary_power_net  VDD12G  -primary_ground_net VSS

现在,EDA工具里的视图就是下面的样子。

添加电源信息后的视图

由于U1模块可以做电源关闭,所以要加上power gating,开关信号由功耗控制单元U2给出(忽略具体信号名)。在UPF中描述PG

#Power Switch
create_power_switch switch_name_list \
  -domain VH \
  -input_supply_port ( in VDD12}\
  -output_supply_port {out VDD12G } \
  -control_port {port_name [net name] } \
  -on_state {state_name input_supply_port {boolean expression } } \
  -off_state {state_name {boolean expression } }
map_power_switch switch_name_list \
  -domain VH \
  -lib_cell lib_cell_list

添加PG信息后的视图

因为U1模块可以关电,所以至少要对其输出信号要做隔离,以保证U1下电后不会影响其它模块正常工作。在UPF中描述isolation信息:

# Isolation Cell
set_isolation_strategy_name \
  -domain VH \
  -isolation_power_net VDD12\
  -isolation_ground_net VSS \
  -clamp_value 1 \
  -applies_to_outputs \
  -isolation_signal_signal_list \
  -isolation_sense_high \
  -location_self

添加isolation信息后的视图

为了保存U1模块下电前的状态,以便U1再次上电后恢复状态,要添加一些retention cell。在UPF中描述retention

# Retention Register
set_retention retention_name -domain VH \
  -elements element_list
  -retention_power_net VDD12G \
  -retention_ground_net VSS \
  -save_condition {boolean expression} \
  -retention_condition {boolean expression } \
map_retention_cell_des_ret \
  -domain VH \
  -lib_cell_type lib_cell_lis

添加retention信息后的视图

接下来,是对高低电压间的信号转换添加level shifter。

set_level_shifter strategy_name1 \
-domain DES_DOMAIN
-applies_to inputs
-threshold <value>\
-rule low_to_high
-location parent
set_level_shifter strategy_name2 \
-domain DES_DOMAIN
-applies_to outputs \
-threshold <value>
-rule high_to_low
-location parent

图11  在UPF中描述level shifter

添加level shifter信息后的视图

到此,还差最关键的一步,需要建立一张power table。

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 输出电源为关闭状态

power table

以上仅仅是展示一个UPF的demo,里面的一些语法细节我并没有仔细推敲,大家还是以spec为准。实际的SoC低功耗设计肯定要比这个demo复杂得多。

对于设计来讲,isolation和retention还是会影响功能的。比如,假设这个demo中,isolation没做好,U1模块下电后,其输出值没有置到合理值,很可能会影响MCU的正常工作;或者是retention没做好,U1模块再次上电后,不能恢复下电前的状态,造成系统紊乱。综上,对于这部分的低功耗设计,必须要做相应的功能仿真。

 

 

posted @ 2023-03-27 14:26  luckylan  阅读(4337)  评论(0编辑  收藏  举报

目录导航