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中的解释。
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模块再次上电后,不能恢复下电前的状态,造成系统紊乱。综上,对于这部分的低功耗设计,必须要做相应的功能仿真。