路科验证的个人空间 https://blog.eetop.cn/1561828 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

PowerDomain简介

热度 7已有 11860 次阅读| 2018-2-4 14:50 |个人分类:验证前沿资讯|系统分类:芯片设计

Synopsys 推荐的 UPF 流程简介


上次介绍了在当前先进制程下低功耗设计实现都需要UPF技术的支持,否则在功耗验证的时候将会很难验证并且对后续的综合和后端实现也带来了很大的困难和挑战。

既然当前低功耗设计实现都离不来UPF标准,那么什么是UPF呢?UPF的全称是统一功耗格式(UnifiedPower Format),其主要是由Synopsys推出的专门用于描述电路电源功耗意图的一种语言标准,它是Tcl语言的扩展,并且现在已经成为IEEE-1801标准且被三大EDA厂商(Synopsys、Cadence、Mentor)支持。

为什么在低功耗设计实现过程中需要UPF标准?传统的数字芯片设计均是采用Verilog或者VHDL语言对电路进行描述,但是这种方式描述出的电路并没有包含任何的芯片的供电网络信息,这会导致后续的流程如功耗验证和后端实现很难处理或者极易出错。UPF标准正好可以很好的解决这个问题,因为UPF标准本身包含了大量的用于描述电源网络的Tcl命令,直接使用这些命令可以很方便的创建电源域和功耗控制的特殊单元等,用UPF编写的统一功耗格式文件不仅可以在RTL级,同时还可以被后端工具使用,这在一定意义上保证了整个芯片设计过程中功耗流程的一致性,在后端工具进行处理之后也会生成相应的UPF文件,此时前端工具可以使用该UPF文件对网表进行Power仿真分析,下图1是Synopsys公司推荐的UPF流程。

 

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

1.动态功耗验证

使用MVSIM或者VCS-native mode对RTL+UPF0进行功耗验证,MVSIM工具是Synopsys公司推出的基于UPF流程的低功耗动态验证工具。此前,对与芯片回来后才可以对功耗管理机制等进行验证,一旦出现问题,进行修改代价十分发,而MVSIM工具允许在RTL阶段结合UPF文件即可对芯片的功耗管理机制进行功能验证,从而尽量在设计早期阶段发现问题,MVSIM工具是一款协同仿真器(Co-Simulator),它可以与当下流行的功能仿真器如VCS/NC协同仿真,达到对低功耗设计的动态验证目的,应用该工具在RTL阶段可以发现大多数的功耗管理、功耗控制等相应的问题。下图2是MVSIM验证平台的框架图。


2.静态功耗验证

使用MVRC工具可以对RTL+UPF0进行静态功耗检查,可以发现设计和功耗意图文件等方面的问题,在Synopsis推荐的UPF流程中禁止在RTL阶段手动例化隔离单元(Isolationcell)和电平转换单元(Level Shift cell),因为在逻辑综合阶段,综合工具DC回根据功耗意图文件UPF0自动插入这些单元。

在逻辑综合过程中,综合工具DC会读入RTL文件和UPF0文件,然后综合出门级网表并且产生更新后的功耗意图文件UPF1,在UPF1文件中不仅包含了UPF0文件的信息同时还显示的给出了综合后特殊单元的supplynet的连接关系。   逻辑综合后可以使用MVSIM工具或者VCS-native 模式对插入了特殊单元的网表进行仿真。

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

在图1中可以看到,可以使用各个阶段的功耗意图文件对设计进行一致性检查(Formality),当然对于设计的RTL级功耗分析评估可以使用PowerArtist工具进行仿真分析;对于Gate级功耗分析评估可以使用PTPX进行仿真分析。

 


Power Domain


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

每一个电源域可以简单理解为供电逻辑的划分,在该逻辑划分中既包含了设计的物理实体(module)同时也包含了电源线间的连接关系。在基于UPF标准的低功耗设计过程中,必须存在至少一个电源域,并且顶层的电源域必须在进行任何与电源相关的分析或者综合之前预先定义出来,同时还需要将电源域定义在层次化模块之上。需要注意的是设计中的任何逻辑只能属于一个电源域,设计过程中也可以嵌套的定义电源域,如图3所示。

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

                                 create_power_domain  PD_TOP

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

                  create_power_domain    PD1  -elements { u_cpu_core }

1.定义电源域

在开始介绍电源域之前首先介绍下与之相关的几个概念,什么是scope,单UPF和多UPF的区别。

首先什么是scope?从IEEE1801中可以找到,电源域被定义的那个逻辑层次称之为电源域的scope。比如一个设计的逻辑层次是aaa/bbb/,且将电源域PD定义到了aaa/bbb/上,则称aaa/bbb/为电源域PD的scope。换种方式理解,在Linux系统下,我们可以使用“cddir/”进行工作目录的切换,同样地,scope可以认为是指定的工作工作目录切换,在UPF标准中,可以使用如下命令进行scope的指定。

set_scope   instance_name    ##将instance_name设置为工作的scope

set_scope   /                ##将scope设置到顶层设计

scope作为UPF中的一个重要的关键字,其多用自底向上的IP设计中,在这种设计方法中会多次出现scope。

什么是单UPF和多UPF呢?对于只有一个UPF设计文件的设计来说,UPF文件是定义在顶层的scope中的,此时所有的UPF对象(如Power_switch、Isolation、Level-shifter等)都只存在于顶层中,子电源域不需要定义support port,在不同电源域之间使用-reuse来共享support net。对于多UPF设计来说,UPF文件的的描述则更加模块化,整个设计是由顶层RTL+顶层的UPF文件和子模块RTL+子模块对应的UPF文件共同描述的,子模块UPF文件必须从顶层UPF文件进行装载,比如图1中,我们可以使用如下命令装载UPF文件:

load_upf   -scope    u_cpu_core   core.upf

或者使用:

set_scope    u_cpu_core

load_upf     core.upf

1.1电源域的划分

在设计中划分出电源域之后,会加入Powerswitch cell、Isolation cell、

Level-shifter cell、Retention register cell等功耗管理控制单元,这必然会对面积和时序产生影响,所以需要对电源域的划分进行评估,即若加入一个电源域后对功耗降低没有什么明显的效果,那么该电源域就没必要加入,通常对电源域的划分评估需要对设计进行逻辑综合,基本的评估原则如下:

1.创建最简单的UPF文件(仅仅包含Power switch cell和Isolationcell等),并用基本的约束去分别综合带UPF文件和不带UPF文件的设计,之后进行功耗评估比对。

2.通过分析库去评估功耗的消耗情况。

3.对于大部分时间不会Power down的模块最好不要划分shutdown电源域。

对于一个最顶层的ToP电源域,一般是Always-on的状态,如果设计中要求顶层ToP电源域也可以shutdown,同时ToP电源域中又嵌套定义了两个子电源域PD0和PD1,且PD0和PD1之间的通信将穿过可以shutdown的电源域ToP的话,那么在ToP电源域中就必须加入Always-onbuffer,以确保在ToP电源域进入shutdown后PD0和PD1还可以进行正常通信的。

下面给出一个简单的创建电源域的场景,如图4所示,假如一个设计的层次结构为图4所示,则对应的创建电源域的UPF命令如下:

对应的电源域的创建命令: 

create_power_domain   TOP 

create_power_domain  PD1 -elements{ B }

create_power_domain  PD2 -elements { A/C   A/D }

对于右侧PD1,UPF标准中规定,如果模块B中还例化了模块E和其它的leafcell,此时在创建电源域时指定的-elements选项中只给出模块B,则默认情况下将会对模块B进行遍历操作,即模块B中所有例化的子模块都将和模块B处于同一个电源域PD1中。

对于左侧的PD2,即使模块C和D都被例化在模块A中,但是模块A属于TOP电源域,而模块C和D属于PD2电源域,此时可以通过-elements选项显示的为模块C和D指定电源域PD2。

1.2 电源域的实现

前面讲到的电源域是一种抽象的逻辑划分,而在后续的后端实现中,电源域对应的物理实现的是 VoltageArea ,并且电源域 Power Domain 和 Voltage Area 是一对一的关系。如图 2-4 所示: 


图 6 给出了图 5 所示电源域逻辑示意图对应的后端 Voltage Area 的一个实现示意图。

前面讲到的UPF命令中的-scope 选项,该选项由于指定设计的逻辑层次,且电源域就定义在该层次上; create_power_domain 命令还可以有一个选项-include_scope,该选项用于指定当前scope 中所有的元素都共享该电源域的primarysupply,但是不必都被添加到该电源域中。可以使用下面图7 的例子来理解-scope 和-include_scope 选项的差别。


 对应创建电源域PD1 和 PD2的命令为:

create_power_domain  PD1 -scope Block1 -elements{ U1    U2  U3} 

create_power_domain PD2 -scope  Block1 -elements { U4    U5  U6 }

上面两条命令显示的指定了创建的电源域所在的设计逻辑层次,当然还可以使用下面的命令组合起来替换上面两条命令:

set_scope  Block1

create_power_domain  PD1 -elements { U1    U2  U3}

create_power_domain PD2 -elements { U4    U5  U6 }

对应创建电源域 PD3 的命令为:

create_power_domain  PD3 -include_scope    Block2 -elements{ U7   U8} 

上面的命令表示逻辑层次 Block2 中的所有元素 U7,U8和 U9 都将共享电源域 PD3 的 primary supply,但 U9 却不一定被添加到电源域 PD3 中。


想看与低功耗有关的文章,你还可以点击以下链接或者在订阅号菜单栏中选择“找一点”来按类查找。
低功耗技术浅谈 (一)



你不但可以自己学习low power,还可以转发这篇文章让更多的人学到一点知识,YOU ARE A GOOD MAN!

5

点赞

刚表态过的朋友 (5 人)

发表评论 评论 (2 个评论)

回复 mythbuster 2021-3-19 18:00
讲得很好可惜图挂了
回复 chenwenhaoee 2021-4-14 09:35
谢谢分享!学习了!

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 253

    粉丝
  • 25

    好友
  • 33

    获赞
  • 45

    评论
  • 访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-25 18:31 , Processed in 0.022171 second(s), 13 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部