Low Power Methodology Manual For System 2.docx
《Low Power Methodology Manual For System 2.docx》由会员分享,可在线阅读,更多相关《Low Power Methodology Manual For System 2.docx(49页珍藏版)》请在冰点文库上搜索。
LowPowerMethodologyManualForSystem2
LowPowerMethodologyManualForSystem-on-ChipDesign
第一部分:
前言功耗问题的起源
芯片功耗的问题最近几年得到了越来越多的重视,主要来源于以下几个方面:
1、90nm以下,随着设计流程的发展,芯片的集成度达到了上千万门级。
一颗最顶级的芯片总功耗可以达到惊人的100-150W(可以煮鸡蛋了),单位面积功耗可以达到50-75W/cm^2,而局部热点的功耗更大。
这就产生了芯片封装成本、电源成本和可靠性问题,估计还要有大得像砖头一样的散热片。
2、对于需要电池供电便携式设备和无源芯片类(非接触电子标签)来说,功耗则意味着电池寿命和工作距离。
功耗的组成:
功耗分为动态功耗和静态功耗两大部分。
动态功耗是电路在工作时(翻转时)所消耗的能量。
对于CMOS电路来说,它又分为开关功耗和短路功耗。
开关功耗为电路翻转时对负载电容充电的功耗,短路功耗为输入翻转时,PMOS和NMOS同时打开的瞬间电流形成的功耗。
用公式描述可写为:
Pdyn=(CL*Vdd2*Ptran*F)+(ttran*Vdd*Ipeak*F)其中,CL为电路总负载电容;Vdd为工作电压;Ptran为工作电路所占比例;F为工作时钟频率;ttran为PMOS,NMOS同时导通时间;Ipeak为短路电流。
公式中前半部分为开头功耗,后半部分为短路功耗。
一般来说,只要gate输入斜率足够小,也就是ttran足够短,短路功耗一般可以忽略。
从公式中可以看到降低动态功耗的思路,无非是从Vdd、F、CL和降低gate翻转次数的方向出发。
由此会带来一系列架构设计上、设计流程上、时序分析上、电路设计上、后端布局上的考虑,以及由于工艺的发展带来的一系列问题。
在后续章节中会详细讨论这些内容。
再来说说静态功耗。
静态功耗是电路在没有翻转时,只有供电的情况下,晶体管中漏电流造成的功耗。
根据重要性可以分为以下四个部分:
1、亚域值漏电流Isub:
从Drain经过弱反形层流向Source的电流2、栅电流:
Igate:
由于隧道效应和热载流子效应,由Gate经薄栅氧流向Sub的电流3、由Gate引起的Drain电流IGIDL:
由于Drain端的强电场引起的由Drain流向Sub的电流4、结反偏电流Irev:
反偏结耗尽区少子漂移和电子空穴对产生形成的由Drain、Source到Sub的电流。
其余电流还好理解,就是IGIDL没搞清楚是怎么来的。
查了一些资料,看起来应该是这样形成的,是由于工艺尺寸降到90nm以下后,在Drain端会形成超强的反偏电场,而在Gate和Drain的overlap区域,Sub的参杂浓度偏大(为了防止punchthrough),在这里会容易发生band-bandtunneling或者avalanche,因此会形成较大的Drain到Sub的漏电流。
深亚微米下,Vdd降低,为了提高性能会同时降低管子Vt,而Isub和Vt是指数反比关系,会造成Isub急剧增大。
45nm下Isub会是90nm下Isub的6.5倍。
同时Isub也会随温度上升指数增加。
90nm工艺下,栅氧厚度只有几个nm(几个原子的厚度),栅氧的隧穿电流Igate在90nm下可以达到Isub的1/3,在65nm下可以等于Isub电流。
降低静态功耗的方法:
有几种方法可以降低静态功耗,其中Multi-Vt和powergating的方法后面会详细介绍。
其它还有VTCMOS、StackEffect和Longchannel器件的方法。
VTCMOS(VariableThresholdCMOS)是在SUB上加上一个反偏电压,从而提高管子的 VT,以减小Isub。
这样会额外增加两条powerrails,增加了建库的难度,而且在小尺寸下,这种作法的作用也不明显了。
StackEffect就是采用叠加的gate,如果叠加的gate中有两个输入都是关闭状态,则流过两个gate的静态电流会很小。
在理论上,应该在关闭时钟前将所有gate输入置为关闭状态,但在现实中,这是不可实现的。
长沟道器件:
长沟道器件可以有效降低静态电流,但同样会影响动态响应,降低电路性能。
同时长沟通也会增加栅电容,对动态功耗不利。
因此可以考虑在开头次数较小或者对性能要求不高的地方采用长沟器件。
第一部份大概就这内容了。
下一部分是一些标准的低功耗措施了,包括clockgating,gatelevelpoweroptimization,multi-VDD,multi-Vt等
第二部分:
几种常用低功耗技术
这一部分书中介绍了四种低功耗技术,clockgating,gatelevelpoweroptimization,Multi-VDD,Multi-Vt。
大概都是些比较常用的技术,而且很多都已经是工具很好的支持了。
书中一带而过,没有深入讲。
我根据书上内容说说自己的理解。
1、clockgating门控时钟的基本思想是在寄存器不工作时(使能信号无效时),把clock关掉,从而clocktree上的buffer及register都不会再有动态功耗。
现在单元库中会有专门提供用于gateclock的cell,这种cell可以检查setup/hold的violation,工具可以保证时钟上不会出现glitch。
如果库中没有这样的单元,也可以手动的在RTL中插入门控电路,或者在DC中用命令自动插入门控电路,或者是二者混合应用。
一般会有两种门控电路,一种是基于latch+一个逻辑门(and/orgate),一种是就用一个逻辑门。
如果电路中全部采用的同相时钟,最好使用第一种电路,可以用latch保证逻辑门的输出不会出现glitch(当然也要用STA分析相应的时序)。
如果采用双相时钟,用第二种电路也可,同样需要用STA报告setup/holdviolation。
插入门控时钟可以极大降低电路动态功耗,书上例子说可以节省50%以上动态功耗。
同时还有一个附加好处是可以显著减小电路area。
因为如果一组寄存器的EN电路被一个clockenable电路取代,会减小相应的面积。
同时如果这个clocktree上还需要串入delaycell的话,也由于gatecell引入的delay而减少delaycell的数量。
书中的例子说完成clockgating后,电路面积减小20%左右。
(记得一次面试还被问过这方面内容,可惜当时理解还不深,没回答好,呵呵)DC中自动插入门控单元的命令为:
set_clock_gating_style-sequentiallatch-positive_edge_logic{and}-negative_edge_logic{or}-setup0.5-hold0.5-minimum_bitwidth3在compile前执行insert_clock_gating-module_level-sequentiallatch指定DC用基于latch的门控电路类型。
-positive_edge_logic指定时钟risingedge触发的寄存器所用的门控单元。
-negative_edge_logic指定时钟fallingedge触发的寄存器所用的门控单元。
-setup/-hold指定setup/hold约束。
-minimum_bitwidth指定一组最少多少个寄存器共用一个门控单元,缺省值是3。
据分析至少是3个寄存器共用一个门控单元才能达到节省功耗及面积的目的。
-module_level选项可以指定DC自动替换在RTL中手动插入的门控单元为DC认为安全的门控单元。
2、门级功率优化这一级优化是由工具自动完成的,对设计者和后端工程师都是透明的,设计者可以不用关心具体细节。
其基本思想包括:
把翻转频率高的net在path早期和翻转频率低的net运算,高翻转率net的传播路径;高翻转率net接到低输入电容的门输入端,低翻转率net接到高输入电容的门输入端等。
3、MultiVdd其基本思想就是SOC中,不同模块根据其性能要求不同采用不同电源供电。
书里的例子,CacheRAM需要工作在最高时钟,因此分配的电压值最高,为1.2V;CPU的电压值次之,保证整个系统的性能还是取决于高速RAM的速度;其余部分的电路工作在最低频,因此电压最低为0.9V。
这样做会得到最好低功耗效果,但也会较大影响设计流程。
设计需要在模块间额外增加powerrails和levelshifters。
而且我想工艺库中也应相应提供各种电压下单元的delay信息。
各个模块接口之间的时序可能也要严格保证。
书中以后可能会有详细这方面的详细内容。
4、Multi-VT降低VT也是把双刃剑。
由于深亚微米下,工作电压降低,降低VT是势在必行。
降低VT可以提高动态电流也就是可以提高电路工作速度,但VT是和静态漏电成指数反比关系。
书中给出了漏电流和延时的关系图。
基于这个原理,在设计中我们就可以对于性能要求高的电路,采用lowVt的管子;对于性能要求不高,频率低的电路可以用高VT的管子。
书中说现在工具可以利用库中给出的不同域值的单元自动优化timing和power。
我至少目前还没有做过这样的项目,没有这方面的体验。
书中提到了双VT设计流程。
如果项目的目标是追求最高性能,则第一遍实现时用lowVT单元库。
然后再用highVT单元库进行优化,把非关键路径中的cell替换为highVT的cell,从而实现在满足性能的同时,功耗最低。
反之则顺序相反。
听起来到是个好办法,有没有人做过这样的流程?
有什么体会不?
工具怎么样支持这种设计流程?
最后书里给出了一个这几中常用技术的低功耗效果和对传统流程影响的表格。
这一部分并没有深入展开讲,可能是作者认为已经是很常见的技术了。
从下一部分开始就要进入比较新颖、复杂的低功耗技术-powergating和adaptivevoltagescaling
第三部分:
多电压设计(Multi-VoltageDesign)
既然从前面的公式可知,动态功耗和电压平方成正比,静态功耗也正比于电压,则降低功耗就首先从降低电压上做文章了。
一言以蔽之,低电压策略的原
则就是在功能、性能允许的情况下尽量降低工作电压。
其中,最基本的形式就是
芯片划分为不同电压域(PowerDomain),高性能的部分在高电压域,低性能要求的部分就分配在低电压域。
举例来说,一个SOC芯片中,MCU应该工作在尽可能高的时钟,则它的电压应该是最高电压;而外设中的USB模块,有协议定义的固定速率,则只要分配给能满足要求的工作电压即可;一些平时不工作的模块甚至可以将电压关断(PowerGating),也就可使功耗趋于0。
这样一个芯片中,就会划分为各种不同的电压域。
根据低电压策略应用的复杂性,这种技术可分为以下四种:
*静态电压缩放(StaticVoltageScaling,SVS):
芯片中,不同模块具有一个固定的电源电压。
*多级电压缩放(Multi-levelVoltageScaling,MVS):
芯片中各个部分的电源电压可以根据运行时状态在两级或多级电源电压间切换。
*动态电压频率缩放(DynamicVoltageandFrequencyScaling,DVFS):
相对于MVS,DVFS会有更多的电压级数用于模块的切换。
也即比MVS的电压调整粒度更细。
*自适应电压缩放(AdaptiveVoltageScaling,AVS):
顾名思义,这是一种带有控制环路的自动实时调整各模块工作电压的方式。
书中这一部分就以上多电压技术的一些共性的问题做了一定的分析,MVS技术可以说多电压技术的一个代表,就从这一个角度出发先介绍一些基本概念。
后续的章节会对每种技术的具体问题具体分析。
由多级电压技术带来的设计上的挑战包括:
*各级电压域之间信号的传递需要增加电平移位器(LevelShifter)*由于芯片各个模块会工作在多种电压下,因此在各种电压下的时序都要满足。
增加了STA分析复杂度。
*电源网格(Powergrids)的布局规划、模块接口单元的电源布线等需要仔细考虑。
*板级上需要更多电压regulator来提供各种不同电压,增加板级设计复杂度。
*由于电压不同,各个模块的上电/下电顺序也需要仔细设计以避免电路出现死锁。
下面分别就这些挑战展开分析:
由levelshifter引入的问题:
1、为什么需要levelshifter?
2、Levelshifter的对芯片powerdomain划分的影响。
3、什么时候需要插入levelshifter?
4、插入levelshifter对传统STA带来的影响?
5、Levelshifter对传统PR带来的影响
1、由于一个芯片中各个模块之间工作电压会有差异,信号的传递就会有从高电压传区域传到低电压的情况(hightolow)或者由低电压向高电压区域传递的情况(lowtohigh)。
理论上,由hightolow传递时,driver输出可以直接连接到输入gate上,不用插入特别的接口单元。
但是如果这样设计,目标电压域中的所有单元都将重新针对输入高压情况下建库,对timing进行建模,工作量会很大。
而如果插入特殊设计的hightolow单元,则可只对其进行timing建模,隔离了内部单元为一个单独的电压域。
这样有利于建库和STA分析。
反之,
lowtohigh时除了有以上问题,还会有功耗问题。
低电压的driver直接驱动高电压gate,如压差较大,则会造成负载单元P管不能完全关断,造成较大漏电流。
因此,不同电压域之间的levelshifter是必要的。
2、levelshifter的设计是一个模拟电路问题。
它只能是单向的,也就是只能是hightolow或者是lowtohigh。
双向的levelshifter的设计需要用到特殊的器件,不易实现。
由于levelshifter只能是单向的,要求系统在划分不同电压域时,相临电压域之间的关系必须的确定的。
也就是一个电压域在工作时电压值只能是永远高于相临域或者永远低于相临域。
而不能是一段时间高,一段时间低。
3、1中分析过,hightolow时,接口上会造成timing分析上的误差,电压差大到一定值时,这个误差会造成时序上的error,此时需要有准确timing模型的levelshifter的插入以用于STA分析。
具体多大的压差需要插入levelshifter,则根据库和设计的约束决定。
lowtohigh时,除了以上timing问题,还会有不能完全关断负载的问题。
工程上,一般取电压差在VTPMOS基础上留一个10%VDDH余量,即VDDH-VDDL>VTPMOS–(0.1*VDDH)时,就需要插入lowtohighlevelshifter。
4、对STA带来的影响:
一方面,插入的levelshifter会带来极大的延迟,在设计criticalpath和CTS综合时要充分考虑到levelshifter带来的影响。
另一方面,各个模块的电压域值不同,而且在工作中会动态变化,而不同的电压值会带来不同的timing值。
那么我们在综合、STA、PR时选用哪一个电压模式呢?
书中的做法时,同时对所有可能的电压情况进行约束,用于综合、STA、PR中。
在一个电路实现中应该同时满足各种电压模式下的时序要求。
(看起来好像是工具可以支持同时对各种工作电压进行描述了,现在的DC可以同时设定各种不同电压的operatingconditions么?
还没在实际中这么用过…)。
5、levelshifter对于PR的影响主要包括其placement和电源的routing。
由于levelshifter的插入不会影响功能,理论上可以由工具自动完成。
用户可以指定工具将levelshifter放在驱动端的powerdomain、中间的powerdomain或者负载端的powerdomain中。
书中的建议是一律放在负载端的powerdomain,因为levelshifter的输出负载相对输入会更大。
如果两个相关powerdomain距离较远,中间还间隔另一个powerdomain时,有可能还需要在中间插入一个驱动端的driver。
这种情况和lowtohighshifter情况还会有对power进行布线的情况出现。
书中介绍对电源线当信号线进行走线很复杂,但没具体介绍原因。
为了便于理解,这里放入书中两个典型的levelshifter电路结构:
图1 图2MVS对系统设计的影响主要包括两个方面:
1、上电过程由于各个模块由各自电压源驱动,各模块间有一个上电顺序的问题以保证电路正常功能。
一般来说CPU会等待周边模块完全上电完成后再启动。
整个上电过程包括上电、振荡器(PLL)稳定、reset信号完成。
一些复杂情况下,上电完成后还需要一些握手协议表示上电完成。
2、上电过冲由于模块电压在工作中还会动态变化,要对电压上升下降的时间进行控制,避免出现overshoot和undershoot。
否则过高或过低的异常电压值可能会造成电路自锁甚至损坏。
这个过程可以用控制信号控制电压的启动、上升过程。
最后由于电压控制一般都是由CPU控制,因此电压控制软件需要集成在系统软件中运行。
这一部分内容只是从概念上介绍了MVS一些基本问题,一些更具体的问题还会在后续内容中有介绍,下一部分介绍powergating的相关内容。
第四部分 门控电源技术(Powergating) 降低功耗最直观的思想就是在不需要电路工作时把它的电源关掉,这样什么动态功耗、静态功耗就全没有了。
在需要电路工作时,再把电源打开,这就是门控电源。
思想简单,实现起来可有许多复杂的情况要考虑。
这一部分主要是介绍了一些门控电源的基本概念和提出一些要解决的问题。
和前面讲的门控时钟等低功耗技术可以对设计者透明不同,门控电源技术则需要系统设计者根据实际情况在各种因素间加以权衡。
先来介绍两个术语:
睡眠(Sleep):
使系统进入低功耗模式(在这里就是关断模式) 唤醒(Wake):
使系统回到工作模式 再来看一下实际powergating工作时的功耗状态图
图一 可以看到,Sleep事件使系统进入关断模式,但由于电路工作状态时的特性和电源开关的非理想性,系统功耗并非立刻进入最小值。
同样,在Wake事件到来将系统唤醒时,由于等待复位和时钟信号的稳定,系统也要延时一定时间才会进入工作状态。
门控电源在各类子系统中应用的考虑:
1、CachedCPU(带有缓存的CPU,不知是否这样翻译合适)子系统会长时间处于不工作状态,适合采用门控电源技术。
CPU不工作时,将其电源关断会节省大量功耗。
但是唤醒时一般是由中断触发,而CPU会有一个唤醒时间的延迟,系统设计时要充分考虑这个延迟(可能会需要更深的FIFO或安排特定的时隙)。
另外,CPU掉电后,其中的cache内容也会消失,如果每次上电后都要先把cache填满,这个动作也会消耗一定的能量。
因此节省的净功耗是电源关断时节省的减去上电时恢复先前状态所消耗能量。
2、外设系统(Peripheralsubsystem)相对于CPU有很好的“作息规律”。
它由驱动软件或操作系统中电源管理模块来规划上电/下电动作。
同样,每次上电/下电时也都要储存/加载状态信息值,这会为软件增加负担。
最好的办法是外设自己内部处理状态信息的保存加载动作。
但这需要一些特殊的电路。
3、在多核系统中,一个或多个核任务完成后在等待下一个任务时,可以将电源关掉以降低功耗。
由于这时各核上一个任务已经完成,再次上电后,可以完全复位重新开始执行新分配的任务。
管理这样一个系统需要一个自适应的关断算法来根据工作量的数量动态增加或减少睡眠CPU核的数量。
(这里可能会有一些算法值得研究一下)
门控电源设计的原则 有两种关断电源的方式,一种是一个子系统有一个独立的外接电源,则如果该子系统想关断电源,可以直接暴力的将芯片外的电源关断即可,这样可彻底把功耗降为0,但这样会花费更长的时间,需要更多的能量完成上电。
另一种是内部电源管理方式,在短时间的电源关断会是更理想的办法。
内部电源管理系统中,内部电路通过一个电源开关网络(power-switchingnetwork)连接到电源上,电源开关网络控制着电路与VDD或VSS的连通与关断。
开关网络由门控电源controller控制,是由一个很大数量的CMOS开关阵列组成。
这样一个系统中会存在一个子系统处于断电状态,而和它相邻的系统处于工作状态的情况。
一个问题出现在两个模块接口上,处于断电状态的系统的输出接口在断电发生时有可能会长时间处于中间电平,会造成相临工作系统上N管P管常开,造成大量的直通电流(Crowbarcurrent)。
为了解决这个问题,在模块相临的接口上需要添加隔离器件。
在前面系统关断发生时,使能该隔离器件隔离两端,隔离器件不会受输入中间电平的影响,直通电流非常小。
这些隔离器件应该是受门控电源controller控制。
当断电系统上电后需要恢复某些断电前的状态时,如果能保持断电前的状态,则可以极大节省再次上电工作的时间和功耗。
这时,可以采用一种“保持寄存器”(retentionregister)来在掉电情况下保持内部状态。
保持寄存器一般都有一个辅助或影子寄存器,它们工作速度慢,但用来掉电时保持状态会消耗极低功耗。
这些影子寄存器是需要长期供电的。
它需要告知什么时候需要保存当前状态,什么时间恢复以前状态,这些也都由门控电源controller控制完成。
电源开关的细粒度控制(FineGrain)vs粗粒度控制(CoarseGrain) 细粒度控制的思想就是在每个标准单元门上加一个电源开关,这种开关需要提供这个单元门的最大工作电流。
为了不影响单元门的性能,这样的开关就会设计得非常大,通常是原标准门的2-4倍面积。
这样做的好处是每一个单元可以很好的模拟性能,包括对timing的影响和IRDrop的影响,相当于重新建一个单元库,还可以放到传统设计流程中采用。
粗粒度控制是整块电路用一组电源开关单元阵列统一控制。
这一组电源的开关的多少很难估计,因为你不知道电路工作时是一个什么的电流需求。
但是相对于细粒度会极大的节省面积上的损失。
(估计对粗粒度中电源开关数量的估计、设计和布局也将会是个课题)。
在过去的几年中,有一种强烈的趋势趋向于粗粒度电源控制,因为细粒度带来的面积上的损失是不能接受的。
在今天,实际上所有的门控电源设计都是采用的粗粒度电源控制。
因此这本书也主要集中在粗粒度门控电源的介绍上。
门控电源的技术带来的设计挑战 (在看这部分之间,本来觉得门控电源没什么,不需要用时把电源关上就行了,没想到看到这才知道还有这么多麻烦的问题...呵呵) *设计电源开关阵列(估计是它的数量、size、位置、漏电流的模拟等) *设计门控电源控制器(驱动电源开关阵列的开/关、什么时候开/关、控制保持寄存器、控制隔离单元功能) *对上电时过冲电流的控制,过大的电流引起的IRDrop可能会损坏其余电路的工作状态。
*选择和使用保持寄存器和隔离单元 *评估和尽量减小门控单元带来的开启延迟和面积上的影响 *对时钟和复位信号恢复的控制 *在实践和分析中设计正确的约束(估计这条是自动化设计中要做的工作了)