在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 72384|回复: 175

[转贴] Low Power Methodology Manual For System-on-Chip Design 读书笔记转载

[复制链接]
发表于 2010-5-7 12:57:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 eewater 于 2010-5-7 13:22 编辑

Low Power Methodology Manual For System-on-Chip Design下载地址
http://www.eetop.cn/bbs/thread-251125-1-1.html

文章来自http://www.opengpu.org/viewthread.php?tid=1327

首先感谢IC兄的资源分享!
最近正好有点时间,想静下来读一读书了,就从这本书看起,写写阅读笔记。
这本书是Synopsys和ARM联合开发小组根据实际的项目经验写的,其中实际工程上的考虑应该多于理论分析,适合我们这样的实际工程人员。
第一部分:前言

功耗问题的起源
  芯片功耗的问题最近几年得到了越来越多的重视,主要来源于以下几个方面:
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-band tunneling或者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和power gating的方法后面会详细介绍。其它还有VTCMOS、Stack Effect和Long channel器件的方法。
VTCMOS(Variable Threshold CMOS)是在SUB上加上一个反偏电压,从而提高管子的 VT,以减小Isub。这样会额外增加两条power rails,增加了建库的难度,而且在小尺寸下,这种作法的作用也不明显了。
    Stack Effect就是采用叠加的gate,如果叠加的gate中有两个输入都是关闭状态,则流过两个gate的静态电流会很小。在理论上,应该在关闭时钟前将所有gate输入置为关闭状态,但在现实中,这是不可实现的。
    长沟道器件:长沟道器件可以有效降低静态电流,但同样会影响动态响应,降低电路性能。同时长沟通也会增加栅电容,对动态功耗不利。因此可以考虑在开头次数较小或者对性能要求不高的地方采用长沟器件。

第一部份大概就这内容了。下一部分是一些标准的低功耗措施了,包括clock gating, gate level power optimization, multi-VDD, multi-Vt等
 楼主| 发表于 2010-5-7 12:58:10 | 显示全部楼层
第二部分:几种常用低功耗技术
    这一部分书中介绍了四种低功耗技术,clock gating, gate level power optimization, Multi-VDD, Multi-Vt。大概都是些比较常用的技术,而且很多都已经是工具很好的支持了。书中一带而过,没有深入讲。我根据书上内容说说自己的理解。

1、        clock gating
    门控时钟的基本思想是在寄存器不工作时(使能信号无效时),把clock关掉,从而clock tree上的buffer及register都不会再有动态功耗。现在单元库中会有专门提供用于gate clock的cell,这种cell可以检查setup/hold的violation,工具可以保证时钟上不会出现glitch。如果库中没有这样的单元,也可以手动的在RTL中插入门控电路,或者在DC中用命令自动插入门控电路,或者是二者混合应用。一般会有两种门控电路,一种是基于latch+一个逻辑门(and/or gate),一种是就用一个逻辑门。如果电路中全部采用的同相时钟,最好使用第一种电路,可以用latch保证逻辑门的输出不会出现glitch(当然也要用STA分析相应的时序)。如果采用双相时钟,用第二种电路也可,同样需要用STA报告setup/hold violation。
插入门控时钟可以极大降低电路动态功耗,书上例子说可以节省50%以上动态功耗。同时还有一个附加好处是可以显著减小电路area。因为如果一组寄存器的EN电路被一个clock enable电路取代,会减小相应的面积。同时如果这个clock tree上还需要串入delay cell的话,也由于gate cell引入的delay而减少delay cell的数量。书中的例子说完成clock gating后,电路面积减小20%左右。(记得一次面试还被问过这方面内容,可惜当时理解还不深,没回答好,呵呵)
DC中自动插入门控单元的命令为:
set_clock_gating_style -sequential latch -positive_edge_logic {and} -negative_edge_logic {or} -setup 0.5 -hold 0.5 -minimum_bitwidth 3
在compile前执行
insert_clock_gating -module_level
-sequential latch指定DC用基于latch的门控电路类型。-positive_edge_logic指定时钟rising edge触发的寄存器所用的门控单元。-negative_edge_logic指定时钟falling edge触发的寄存器所用的门控单元。-setup/-hold指定setup/hold 约束。-minimum_bitwidth指定一组最少多少个寄存器共用一个门控单元,缺省值是3。据分析至少是3个寄存器共用一个门控单元才能达到节省功耗及面积的目的。
-module_level选项可以指定DC自动替换在RTL中手动插入的门控单元为DC认为安全的门控单元。

2、门级功率优化
这一级优化是由工具自动完成的,对设计者和后端工程师都是透明的,设计者可以不用关心具体细节。其基本思想包括:把翻转频率高的net在path早期和翻转频率低的net运算,高翻转率net的传播路径;高翻转率net接到低输入电容的门输入端,低翻转率net接到高输入电容的门输入端等。

3、Multi Vdd
    其基本思想就是SOC中,不同模块根据其性能要求不同采用不同电源供电。书里的例子,Cache RAM需要工作在最高时钟,因此分配的电压值最高,为1.2V;CPU的电压值次之,保证整个系统的性能还是取决于高速RAM的速度;其余部分的电路工作在最低频,因此电压最低为0.9V。
这样做会得到最好低功耗效果,但也会较大影响设计流程。设计需要在模块间额外增加power rails和level shifters。而且我想工艺库中也应相应提供各种电压下单元的delay信息。各个模块接口之间的时序可能也要严格保证。书中以后可能会有详细这方面的详细内容。

4、Multi-VT
    降低VT也是把双刃剑。由于深亚微米下,工作电压降低,降低VT是势在必行。降低VT可以提高动态电流也就是可以提高电路工作速度,但VT是和静态漏电成指数反比关系。书中给出了漏电流和延时的关系图。基于这个原理,在设计中我们就可以对于性能要求高的电路,采用low Vt的管子;对于性能要求不高,频率低的电路可以用高VT的管子。书中说现在工具可以利用库中给出的不同域值的单元自动优化timing和power。我至少目前还没有做过这样的项目,没有这方面的体验。
书中提到了双VT设计流程。如果项目的目标是追求最高性能,则第一遍实现时用low VT单元库。然后再用high VT单元库进行优化,把非关键路径中的cell替换为high VT的cell,从而实现在满足性能的同时,功耗最低。反之则顺序相反。听起来到是个好办法,有没有人做过这样的流程?有什么体会不?工具怎么样支持这种设计流程?

最后书里给出了一个这几中常用技术的低功耗效果和对传统流程影响的表格。

这一部分并没有深入展开讲,可能是作者认为已经是很常见的技术了。从下一部分开始就要进入比较新颖、复杂的低功耗技术-power gating和adaptive voltage scaling
 楼主| 发表于 2010-5-7 13:00:24 | 显示全部楼层
第三部分:多电压设计(Multi-Voltage Design)
  既然从前面的公式可知,动态功耗和电压平方成正比,静态功耗也正比于电压,则降低功耗就首先从降低电压上做文章了。
一言以蔽之,低电压策略的原则就是在功能、性能允许的情况下尽量降低工作电压。其中,最基本的形式就是芯片划分为不同电压域(Power Domain),高性能的部分在高电压域,低性能要求的部分就分配在低电压域。举例来说,一个SOC芯片中,MCU应该工作在尽可能高的时钟,则它的电压应该是最高电压;而外设中的USB模块,有协议定义的固定速率,则只要分配给能满足要求的工作电压即可;一些平时不工作的模块甚至可以将电压关断(Power Gating),也就可使功耗趋于0。这样一个芯片中,就会划分为各种不同的电压域。
根据低电压策略应用的复杂性,这种技术可分为以下四种:
*        静态电压缩放(Static Voltage Scaling,SVS):芯片中,不同模块具有一个固定的电源电压。
*        多级电压缩放(Multi-level Voltage Scaling,MVS):芯片中各个部分的电源电压可以根据运行时状态在两级或多级电源电压间切换。
*        动态电压频率缩放(Dynamic Voltage and Frequency Scaling,DVFS):相对于MVS,DVFS会有更多的电压级数用于模块的切换。也即比MVS的电压调整粒度更细。
*        自适应电压缩放(Adaptive Voltage Scaling,AVS):顾名思义,这是一种带有控制环路的自动实时调整各模块工作电压的方式。

书中这一部分就以上多电压技术的一些共性的问题做了一定的分析,MVS技术可以说多电压技术的一个代表,就从这一个角度出发先介绍一些基本概念。后续的章节会对每种技术的具体问题具体分析。

由多级电压技术带来的设计上的挑战包括:
*各级电压域之间信号的传递需要增加电平移位器(Level Shifter)
*由于芯片各个模块会工作在多种电压下,因此在各种电压下的时序都要满足。增加了STA分析复杂度。
*电源网格(Power grids)的布局规划、模块接口单元的电源布线等需要仔细考虑。
*板级上需要更多电压regulator来提供各种不同电压,增加板级设计复杂度。
*由于电压不同,各个模块的上电/下电顺序也需要仔细设计以避免电路出现死锁。

下面分别就这些挑战展开分析:
由level shifter引入的问题:
1、        为什么需要level shifter?
2、        Level shifter的对芯片power domain划分的影响。
3、        什么时候需要插入level shifter?
4、        插入level shifter对传统STA带来的影响?
5、        Level shifter对传统PR带来的影响

1、由于一个芯片中各个模块之间工作电压会有差异,信号的传递就会有从高电压传区域传到低电压的情况(high to low)或者由低电压向高电压区域传递的情况(low to high)。理论上,由high to low传递时,driver输出可以直接连接到输入gate上,不用插入特别的接口单元。但是如果这样设计,目标电压域中的所有单元都将重新针对输入高压情况下建库,对timing进行建模,工作量会很大。而如果插入特殊设计的high to low单元,则可只对其进行timing建模,隔离了内部单元为一个单独的电压域。这样有利于建库和STA分析。反之,low to high时除了有以上问题,还会有功耗问题。低电压的driver直接驱动高电压gate,如压差较大,则会造成负载单元P管不能完全关断,造成较大漏电流。因此,不同电压域之间的level shifter是必要的。
2、level shifter的设计是一个模拟电路问题。它只能是单向的,也就是只能是high to low或者是low to high。双向的level shifter的设计需要用到特殊的器件,不易实现。由于level shifter只能是单向的,要求系统在划分不同电压域时,相临电压域之间的关系必须的确定的。也就是一个电压域在工作时电压值只能是永远高于相临域或者永远低于相临域。而不能是一段时间高,一段时间低。
3、1中分析过,high to low时,接口上会造成timing分析上的误差,电压差大到一定值时,这个误差会造成时序上的error,此时需要有准确timing模型的level shifter的插入以用于STA分析。具体多大的压差需要插入level shifter,则根据库和设计的约束决定。low to high时,除了以上timing问题,还会有不能完全关断负载的问题。工程上,一般取电压差在VTPMOS基础上留一个10%VDDH余量,即 VDDH-VDDL > VTPMOS – (0.1*VDDH)时,就需要插入low to high level shifter。
4、对STA带来的影响:一方面,插入的level shifter会带来极大的延迟,在设计critical path和CTS综合时要充分考虑到level shifter带来的影响。另一方面,各个模块的电压域值不同,而且在工作中会动态变化,而不同的电压值会带来不同的timing值。那么我们在综合、STA、PR时选用哪一个电压模式呢?书中的做法时,同时对所有可能的电压情况进行约束,用于综合、STA、PR中。在一个电路实现中应该同时满足各种电压模式下的时序要求。(看起来好像是工具可以支持同时对各种工作电压进行描述了,现在的DC可以同时设定各种不同电压的operating conditions么?还没在实际中这么用过…)。
5、level shifter对于PR的影响主要包括其placement和电源的routing。由于level shifter的插入不会影响功能,理论上可以由工具自动完成。用户可以指定工具将level shifter放在驱动端的power domain、中间的power domain或者负载端的power domain中。书中的建议是一律放在负载端的power domain,因为level shifter的输出负载相对输入会更大。如果两个相关power domain距离较远,中间还间隔另一个power domain时,有可能还需要在中间插入一个驱动端的driver。这种情况和low to high shifter情况还会有对power进行布线的情况出现。书中介绍对电源线当信号线进行走线很复杂,但没具体介绍原因。
为了便于理解,这里放入书中两个典型的level shifter电路结构:

图1              

图2

MVS对系统设计的影响主要包括两个方面:
1、上电过程
由于各个模块由各自电压源驱动,各模块间有一个上电顺序的问题以保证电路正常功能。一般来说CPU会等待周边模块完全上电完成后再启动。整个上电过程包括上电、振荡器(PLL)稳定、reset信号完成。一些复杂情况下,上电完成后还需要一些握手协议表示上电完成。
2、上电过冲
由于模块电压在工作中还会动态变化,要对电压上升下降的时间进行控制,避免出现overshoot和undershoot。否则过高或过低的异常电压值可能会造成电路自锁甚至损坏。这个过程可以用控制信号控制电压的启动、上升过程。
最后由于电压控制一般都是由CPU控制,因此电压控制软件需要集成在系统软件中运行。

这一部分内容只是从概念上介绍了MVS一些基本问题,一些更具体的问题还会在后续内容中有介绍,下一部分介绍power gating的相关内容。
 楼主| 发表于 2010-5-7 13:01:31 | 显示全部楼层
第四部分 门控电源技术(Power gating)
  降低功耗最直观的思想就是在不需要电路工作时把它的电源关掉,这样什么动态功耗、静态功耗就全没有
了。在需要电路工作时,再把电源打开,这就是门控电源。思想简单,实现起来可有许多复杂的情况要考虑。
  这一部分主要是介绍了一些门控电源的基本概念和提出一些要解决的问题。
    
    和前面讲的门控时钟等低功耗技术可以对设计者透明不同,门控电源技术则需要系统设计者根据实际情况
在各种因素间加以权衡。
  先来介绍两个术语: 
  睡眠(Sleep):使系统进入低功耗模式(在这里就是关断模式)
  唤醒(Wake):使系统回到工作模式
  再来看一下实际power gating工作时的功耗状态图

            图一
  可以看到,Sleep事件使系统进入关断模式,但由于电路工作状态时的特性和电源开关的非理想性,系统功耗并非立
刻进入最小值。同样,在Wake事件到来将系统唤醒时,由于等待复位和时钟信号的稳定,系统也要延时一定时间才会进
入工作状态。

  门控电源在各类子系统中应用的考虑:
1、Cached CPU(带有缓存的CPU,不知是否这样翻译合适)子系统会长时间处于不工作状态,适合采用门控电
源技术。CPU不工作时,将其电源关断会节省大量功耗。但是唤醒时一般是由中断触发,而CPU会有一个唤醒时
间的延迟,系统设计时要充分考虑这个延迟(可能会需要更深的FIFO或安排特定的时隙)。另外,CPU掉电后
,其中的cache内容也会消失,如果每次上电后都要先把cache填满,这个动作也会消耗一定的能量。因此节省
的净功耗是电源关断时节省的减去上电时恢复先前状态所消耗能量。
2、外设系统(Peripheral subsystem)相对于CPU有很好的“作息规律”。它由驱动软件或操作系统中电源管
理模块来规划上电/下电动作。同样,每次上电/下电时也都要储存/加载状态信息值,这会为软件增加负担。
最好的办法是外设自己内部处理状态信息的保存加载动作。但这需要一些特殊的电路。
3、在多核系统中,一个或多个核任务完成后在等待下一个任务时,可以将电源关掉以降低功耗。由于这时各
核上一个任务已经完成,再次上电后,可以完全复位重新开始执行新分配的任务。管理这样一个系统需要一个
自适应的关断算法来根据工作量的数量动态增加或减少睡眠CPU核的数量。(这里可能会有一些算法值得研究
一下)

门控电源设计的原则
  有两种关断电源的方式,一种是一个子系统有一个独立的外接电源,则如果该子系统想关断电源,可以直
接暴力的将芯片外的电源关断即可,这样可彻底把功耗降为0,但这样会花费更长的时间,需要更多的能量完
成上电。另一种是内部电源管理方式,在短时间的电源关断会是更理想的办法。
  内部电源管理系统中,内部电路通过一个电源开关网络(power-switching network)连接到电源上,电
源开关网络控制着电路与VDD或VSS的连通与关断。开关网络由门控电源controller控制,是由一个很大数量的
CMOS开关阵列组成。
  这样一个系统中会存在一个子系统处于断电状态,而和它相邻的系统处于工作状态的情况。一个问题出现
在两个模块接口上,处于断电状态的系统的输出接口在断电发生时有可能会长时间处于中间电平,会造成相临
工作系统上N管P管常开,造成大量的直通电流(Crowbar current)。为了解决这个问题,在模块相临的接口
上需要添加隔离器件。在前面系统关断发生时,使能该隔离器件隔离两端,隔离器件不会受输入中间电平的影
响,直通电流非常小。这些隔离器件应该是受门控电源controller控制。
  当断电系统上电后需要恢复某些断电前的状态时,如果能保持断电前的状态,则可以极大节省再次上电工
作的时间和功耗。这时,可以采用一种“保持寄存器”(retention register)来在掉电情况下保持内部状态
。保持寄存器一般都有一个辅助或影子寄存器,它们工作速度慢,但用来掉电时保持状态会消耗极低功耗。这
些影子寄存器是需要长期供电的。它需要告知什么时候需要保存当前状态,什么时间恢复以前状态,这些也都
由门控电源controller控制完成。

电源开关的细粒度控制(Fine Grain)vs粗粒度控制(Coarse Grain)
  细粒度控制的思想就是在每个标准单元门上加一个电源开关,这种开关需要提供这个单元门的最大工作电
流。为了不影响单元门的性能,这样的开关就会设计得非常大,通常是原标准门的2-4倍面积。这样做的好处
是每一个单元可以很好的模拟性能,包括对timing的影响和IR Drop的影响,相当于重新建一个单元库,还可
以放到传统设计流程中采用。
  粗粒度控制是整块电路用一组电源开关单元阵列统一控制。这一组电源的开关的多少很难估计,因为你不
知道电路工作时是一个什么的电流需求。但是相对于细粒度会极大的节省面积上的损失。(估计对粗粒度中电
源开关数量的估计、设计和布局也将会是个课题)。
  在过去的几年中,有一种强烈的趋势趋向于粗粒度电源控制,因为细粒度带来的面积上的损失是不能接受
的。在今天,实际上所有的门控电源设计都是采用的粗粒度电源控制。因此这本书也主要集中在粗粒度门控电
源的介绍上。

门控电源的技术带来的设计挑战
  (在看这部分之间,本来觉得门控电源没什么,不需要用时把电源关上就行了,没想到看到这才知道还有
这么多麻烦的问题...呵呵)
  *设计电源开关阵列(估计是它的数量、size、位置、漏电流的模拟等)
  *设计门控电源控制器(驱动电源开关阵列的开/关、什么时候开/关、控制保持寄存器、控制隔离单元功
能)
  *对上电时过冲电流的控制,过大的电流引起的IR Drop可能会损坏其余电路的工作状态。
  *选择和使用保持寄存器和隔离单元
  *评估和尽量减小门控单元带来的开启延迟和面积上的影响
  *对时钟和复位信号恢复的控制
  *在实践和分析中设计正确的约束(估计这条是自动化设计中要做的工作了)
  *对每一种电源状态实施依赖于状态的验证工作(涉及门控电源的验证工作了)
  *电源状态转换的验证,确保合法的状态进入/退出可以被仿真和验证。
  *开发可制造和可测试性设计策略(为产品测试作准备)

    这些内容会在后面章节中介绍。这一部分还是个概念上的介绍,真正的如何实施这些技术就要在下一部分中了
,前面做了这些铺垫,终于快要看到本书的重点了!...
 楼主| 发表于 2010-5-7 13:03:15 | 显示全部楼层
第五部分 设计门控电源(一)

  这一部分内容太多,不得不把它分为两部分了。
  这一部分把门控电源每一个组成部分都从RTL前端设计的角度,在设计、验证、测试三个方面做了充分的说明。
其中涉及的面太广,有一些地方还没能搞得太明白,先放到以后再研究一下,或者实际工程中搞清楚了。
  先来看一下,一个完整的门控电源电路的组成:

             图1
  包括控制器、电源开关网络、保持寄存器、隔离器这几大部分
先从分别如何设计这几大部分说起

电源开关网络的设计:
  具体的电路级设计是和工艺相关的,会在附录A中介绍,这里先从架构级考虑设计开关网络的要求。
  第一个问题就是开关控制VDD?还是控制VSS?(header switch or footer switch?)
  首先可以明确的是如果两头都用开关控制是不能接受的,因为那样会造成实际落在中间功能逻辑的电平降低太高,
影响中间真实工作电路的性能。
  有三个理由支持使用header switch
  1、如果是在芯片外进行电源控制,那只能使用header switch,因为板子上的地电平是公共的。
  2、如果在芯片内外都有电源控制,那么芯片内最好也用header switch,表现的功能和片外电源控制一致,方便
验证和分析。
  3、如果芯片内存在多电压域,它们之间会有level shifter(一般是共地,两个不同电压源)。这种情况下不适宜
开关VSS。(具体为什么不太清楚)
  最后,关断VDD意味着所有内部节点电平都会被拉到地,更方便系统设计分析。
  支持footer switch的根据是从电路的电气特性来分析的(会在14章分析)

  总之,在系统开始设计时应尽早确定哪种开关方式最适合系统要求,书中给的建议是不要footer switch和外部电源
开关或者多电源设计混用,会带来复杂的功能、时序和功率分析
。(至于为什么会增加设计难度还要在实践中体会了)

电源开关网络的控制
  控制开关网络的关键是控制过冲电流(In rush current),否则会在power rail上会出现电压尖峰,破坏其余模块的
工作状态。开关网络上可能会有成百上千个开关,避免过冲电流的思想就是分时打开这些开关。或者采用菊花链的形式
(开关上的power on信号通过buffer一级级传到各个开关上,每一个开关打开都会有一定延时),或者由控制器发出多
个power on信号,分时打开相应开关。不管怎样,开关网络的全部打开需要一定的时间,开关网络需要给出一个确认信号
给控制器,表示上电完成。之后控制器才可以开始下一步操作


隔离单元(Isolation cell)的设计:
    上一部分内容说过,隔离单元的作用是就是防止下电模块的输出端口不要对相连的上电模块的功能造成破坏。这里需
要提一下,在模块断电后,其内部节点电位并不是一定被拉向高(VSS Switch)或低(VDD Switch),而是有可能上下漏电
流形成一种平衡,中间节点长时间处在一个中间电平处,因此要将下电模块输出端隔离。下电模块的输入端由上电模块驱
动为正常电平,不会引起电路异常。
  有三种功能隔离单元,将输钳位到0、钳位到1,锁存到最近值。单元库中的隔离单元经过精心设计可以在控制端使能
情况下,输入悬空也不会有串通电流和很小的泄漏电流。另外,这些隔离单元可以被综合工具识别,不会对其进行逻辑上
的优化。图二中是两种概念上的基本隔离单元。

          图二
  这种隔离单元具有较大的延时,在一些高速接口上,比如对高速缓存的访问,这样的延时是不能接受的。有另外一种
隔离方式,即加入上拉或下拉管的方式。这种方式会引入端口上的多驱动问题,要由开关电源控制器控制下电和隔离使能
的顺序,避免出现竞争。由于上电动作先于撤消隔离使能信号,因此使用这种隔离方式会造成上电时的驱动竞争。另外这
种多驱动的方式也会带来测试上困难。
  因此书中推荐尽量采用第一种隔离方式,除非对timing有特殊的要求,否则不要使用上拉或下拉管的方式隔离
  隔离在下电模块输出端还是隔离在上电模块输入端的考虑:一般来说,隔离在输出端有利于验证、节省面积、方便移
植等。但隔离单元需要always on的电源布线,这种方式会造成在一个模块中有多条电源的布线,这增加了布线的复杂度
。好在现代的EDA工具已经可以解决这种问题。而且EDA工具也可以识别隔离单元的位置,不会在隔离单元的前后插入非隔
离单元。
  作者强烈建议,在可重用的IP设计中,把复杂的隔离单元封装在IP内部,达到对SOC级的集成来说是透明的目的
  对隔离接口钳位为1或者0的考虑:一般来说,我们要避免输出的钳位值被接口模块误认为是有效信号,一般在电路设
计中采用的高有效信号,因此隔离单元的接口钳位为0比较合适,而reset信号一般是低有效(因为在全部上电之前,所有
信号都是低电平),因此reset信号需要钳位为1。在相临两个模块都可以独立下电的情况下,如果输入模块下电,而输出
模块隔离接口钳位为1,则会有从输出到输入的漏电流存在,在这种情况下,所有信号(reset除外)均应钳位到0最合适
总结:建议一律采用高有效信号,低有效的reset
  最后,对于保持最近值的隔离单元,需要一个带有latch的隔离单元。书中说任何库中都没有这种单元,需要根据情
况自行设计。

状态保持和恢复的方法:
  系统下电后,内部寄存的所有状态均会消失,如果想要系统上电后继续前面状态进行工作,则需要一种状态保持和恢
复的策略。怎么样快速、高效的保持恢复内部状态是我们要考虑的问题。
目前有三种方法:
  *通过软件控制读出和写入寄存器的方式。
  *通过扫描链将内部状态串入串出的方式。
    *基于芯片内部状态保持寄存器(retention register)的方式。
  通过软件的方式有以下问题,在上电下电过程中,通过总线将内部寄存器读出至RAM,再从RAM读回至寄存器,显著降
低了上电下电速度。总线的竞争也造成了上电下电过程时间的不可预测性,很难判断是否还值得关断电源。增加了软件工
作量,降低了软件的适用性。这里只集中讨论后两种方式。
  扫描链的方式:这种方式利用芯片内部的扫描链,在下电的过程中,下电模块内的寄存器向扫描测试的工作方式那样
将寄存器状态扫描输出至片内或片外RAM中。在上电过程上,再将RAM中的值通过扫描链扫描回芯片内部寄存器。整个过程
由开关电源控制器来控制。这种方式不会增加太多额外的面积,但会带来以下几个问题。
  *从RTL设计的角度,扫描链的插入是在综合后才进行的,而我们需要在RTL设计时就要在RTL级验证控制器。而且寄存
器的数量、扫描链的长度也在初步实现后才可以确定,在RTL设计时需要参数化这些值。对Scan Enable和Scan in/out的
控制也需要在网表生成后连接上。
    *需要多条链并行串出/入数据,加快和RAM的储存/读取速度。一般来说取8条比较合适。这些链需要有相同的长度,
这样控制器只需要一组控制信号即可控制这些链。这样可能会需要增加一些附加寄存器在最短的链上,以平衡所有扫描链

    *扫描所有寄存器进出RAM,需要一定的时间。而且RAM需要保持上电状态。如果RAM是在片外,扫描动作在IO端口上会
消耗大量功耗。即使RAM在片内,这时寄存器同时翻转,在最坏情况下的动态电流也会过大,造成可以破坏内部状态的IR
Drop。
  除了这些潜在问题,扫描链的方式有某些场合还是非常有用的,比如可能会长时间断电的子系统,通过扫描链存储完
状态后,可以完全把片外电源关掉,最大化的降低了功耗

  对于需要在RTL级就仿真验证电源开关控制器的功能来说,可以在RTL级编写一个扫描链功能模型用来仿真开关控制功
能。书中给出了一个RTL扫描链功能模型的例子:
  • `define CPU_SCAN_LEN 257 /* set to implementation length once known */
  • `ifdef RTL_SLEEP_EMULATE
  • parameter scan_reg_length = `CPU_SCAN_LEN;
  • reg [15:0] scanword [0:scan_reg_length-1];
  • integer i;
  • /* initialize the scan chain to count pattern, or more draconian X */
  • initial
  • begin
  • for (i=0; i < scan_reg_length; i=i+1)
  • begin
  • scanword<= i ; // or 16’hXXXX;
  • end
  • end
  • /* emulate scan shift CPUSI -> CPUSO */
  • always@(posedge CLK)
  • begin
  • if (CPUSE == 1'b1) /* when SCAN ENABLE is active */
  • begin
  • for (i=1; i < scan_reg_length; i=i+1)
  • begin
  • scanword<=scanword[i-1];
  • end
  • scanword[0] <= CPUSI[15:0];
  • end
  • end
  • assign CPUSO [15:0] = scanword[scan_reg_length-1];
  • `endif

复制代码
在设计阶段后期,可以用综合后的网表仿真真实的扫描链连接和功能是否正确。

    (这一部分介绍了保持/恢复内部状态的扫描链方式,更为有效的内部保持寄存器的方式放在下一部分介绍了。下一部
分还包括控制器的设计;控制器、隔离器、开关网络、保持寄存器这四类单元的RTL级仿真验证;最后是它们在测试上的
考虑。)

第五部分 设计门控电源(二)
  除了前面说的扫描链的状态保持值方式外,另一种方式就是用自保持寄存器替代标准寄存器。保持寄存器中
包含一个"影子"寄存器,在下电时它可以保存主寄存器的状态,上电时主寄存器再从"影子"寄存器中读回其状态
值。影子寄存器是永远上电的。
  详细的保持寄存器的设计在第13章中介绍。
  实际情况中,保持寄存器会占用一定额外面积,一般来说会大于原电路20%。在一些情况下,用于防止开关
瞬态电压尖峰破坏保存状态的额外保护带会使额外面积大于50%。这种面积上开销是不可避免的。
  除了面积上的开销,它还需要更复杂的电源控制器。电源控制管理状态机必须定义保存和恢复状态操作时序。
由于影子寄存器速度一般较慢,为了保证稳定的存入主寄存器值,状态保存时一般要将主寄存器的时钟停掉。保存
完状态后,电源才可以关断。在上电时,主寄存器要装载完影子寄存器值后才可以继续工作,因此也应该恢复完
保持值后再恢复时钟。
  自保持寄存器策略的一大好处就是它可以支持工具自动化处理,也就是可以对RTL设计是透明的。工具可以自动
完成保持寄存器替换标准寄存器。这种自动实现的前提是在保持/恢复时,主寄存器的时钟和复位信号必须停掉,以
避免读写冲突。(这种自动化处理需要库单元的支持)


全状态保持和部分状态保持
  全状态保持就是模块中所有寄存器均替换为自保持寄存器,这样可以得到最健壮、最易于验证的设计。但有时
在面积不允许的情况下,也可以只保留部分必要的寄存器值。这会带来一些设计挑战,设计需要保证那些非自保持
寄存器的状态在上电后不会出现非法的随机值,并且是可测试的。这种非自保持寄存器在设计中可以是FIFO、
memories和计数器等。这些寄存器并不直接参与逻辑功能的控制,我们称之为深状态寄存器;与之相对的是状态机
中的浅寄存器,这种寄存器直接作用于组合逻辑电路。
一般来说深寄存器可以定义为非自保持寄存器。则深寄存器
应在上电后被复位成合法值,浅寄存器上电后恢复为保持值。这样我们需要两套复位信号分别用于自保持寄存器和
非自保持寄存器。在RTL级仿真中,也需要验证上电后两套复位信号不会互相影响另一方的寄存器状态。深浅寄存
器之间也要进行充分的验证,保证深寄存器不会影响浅寄存器的状态自恢复,否则系统会进入死锁状态。
  各种状态保持策略对clock gating也有一定影响。我们知道clock gating中会用到latch产生门控时钟的使能
信号,因此在上电时,这些latch应能自动保证处于合法的状态,而不必再为这些latch也设计一个自保持寄存器。
这就要求所有寄存器都用一个时钟沿工作,在电路下电时,clock处于0状态,这使得所有latch处于透明状态,状态
值可以自由通过,保证所有寄存器输入端口建立正常信号值。相反,如果电路用到了双相时钟沿,则不能保证所有
clock net上的latch都是透明的,就不能保证所有寄存器能正常恢复状态。
  状态保持对scan测试的影响:在进行scan test时,应使电源控制模块处于不使电路处于保持和恢复状态,否则
会和scan发生冲突。而在扫描到电源控制模块本身时,则需要测试其保持和恢复状态值。

门控电源控制器的设计:
  门控电源控制器控制模块上电/下电的操作顺序。
  对于不需要保持电路的下电操作顺序:
  *结束所有总线上的交易和正在执行的动作
  *停止时钟
  *启动隔离控制信号,使所有输出处于安全状态
  *复位信号使能(使模块上电时处于复位状态)
  *使能电源关闭信号,关断电源
  
  上电操作顺序:
  *禁止电源关闭信号,恢复模块电源(为防止过冲电流,可以选择相应的上电策略)
  *电源恢复后,置位复位信号
  *置位隔离输出信号,恢复输出
      *启动时钟工作,避免毛刺产生

  对于需要保持状态电路的下电顺序:
  *结束所有总线上的交易和正在执行的动作
  *停止时钟
  *启动隔离控制信号,使所有输出处于安全状态
  *产生状态保持信号使需要保持状态的寄存器将状态值存入影子寄存器中
  *使能复位信号作用于不需要保持状态的寄存器
  *使能电源关闭信号,关断电源
  
  上电操作顺序:
  *禁止电源关闭信号,恢复模块电源(为防止过冲电流,可以选择相应的上电策略)
  *电源恢复后,置位复位信号
  *产生状态恢复信号,控制寄存器读入影子寄存器状态值
  *置位隔离输出信号,恢复输出
    *启动时钟工作,避免毛刺产生

  电源的关断或打开都需要一定的延时(避免大的过冲电流),控制器则需要等待电源动作完成后才会进行下
一步操作。控制器这时可以设定一个固定的较长延时,确保电路操作已经完成,但这种方式不利于可重用的设计。
一个方法是控制器和开关网络之间建立一个握手协议,通过REQ、ACK信号来交互信息。在大多数设计中,ACK信号
是异步的,它的时间决定于开关电路的设计。开关控制器在接收时需要先同步这个信号。
  设计电源控制器时要考虑一个极端情况,就是在下电过程还没有结束,又要上电时该如何处理。(我想控制器
内部的状态机应该能判断出这种情况,依反顺序再操作回去)

门控电源设计的RTL仿真
  这一部分,作者一个主要的目的就是从RTL级前端的角度了解门控电源是如何设计和验证的。由于
硬件描述语言不支持对电源连接的描述,因此要仿真门控电源的工作需要扩展RTL代码或者使用UPF(
Unified Power Format)来描述电源开关及其连接。
UPF是一组TCL命令,用于描述电源连接。详细的使用
在11章介绍,这里介绍如何在仿真中运用。现在的EDA工具已经有支持UPF的仿真。对于还不支持UPF的
工具,也可以通过修改RTL代码的方式(手动或脚本自动修改方式,脚本方式需要RTL代码是严格按照
可重用设计方法学要求设计的
),实现大部分UPF的语义。
    RTL中仿真门控电源需要在RTL包括以下内容:
    *电源开关的功能模型(下电后所有节点电平为X等)
    *隔离单元的功能模型
    *保持和恢复寄存器的模型
    *上电/下电执行顺序的功能模型
    首先模拟RTL中上下电的功能,以下图中的电源连接关系为例:

              图一
  用UPF描述上述电源连接,首先在top级定义power domain、power net(VDD,VSS),然后在下级层次定义
power domain、power net,最后定义电源开关及其和各power net、控制信号的连接关系等。
  代码如下:
  • create_power_domain top -include_scope
  •     create_power_domain top_power_domain -include_scope
  •     create_supply_net VDD_SOC -domain top_power_domain
  •     connect_supply_net VDD_SOC -ports {pad_VDD_SOC}
  •     create_supply_net VSS_SOC -domain top_power_domain
  •     connect_supply_net VSS_SOC -ports {pad_VSS_SOC}
  •     set_scope U1
  •     create_power_domain my_power_domain -include_scope
  •     create_supply_net sw_vdd -domain my_power_domain
  •     set_domain_supply_net my_power_domain
  •         -primary_power_net sw_vdd
  •         -primary_ground_net /top/VSS_SOC
  •     create_power_switch my_power_switch
  •         -domain my_power_domain
  •         -input_supply_port {my_sw_input_port /top/VDD_SOC}
  •         -output_supply_port {my_sw_output_port sw_vdd}
  •         -control_port {my_sw_control_port /top/pwr_req}
  •         -ack_port {my_ack_port /top/pwr_ack}
  •         -on_state {pwr_on_state my_input_port
  •                   {my_sw_control_port ==1 }}
  •         -off_state {pwr_off_state
  •                    {my_sw_control_port == 0}}

复制代码
在仿真工具(还不知哪种仿真工具可以支持这种UPF格式的脚本)中加入这段代码,则会在仿真中
模拟开关电源模块的功能,下电后所有寄存器输出为X,上电后寄存器恢复正常工作。值得注意的是,
pwr_ack信号在RTL中是0延迟响应pwr_req信号的,实际电路中会有一定延时。(在考虑网表仿真时或
后仿时这种功能怎么仿?)   
  对于不支持UPF的仿真器,也可以通过修改RTL的方式完成同样的功能,书中也举了详细的例子,就
不在这里重复了,需要的话可以参考书中的例子。
  用UPF模拟自保持寄存器功能,同样也可以用UPF方式或修改RTL的方式。
  •     set_retention my_retention_strategy
  •         -domain my_power_domain
  •         -retention_power_net VDD_SOC
  •     set_retention_control my_retention_strategy
  •         -domain my_power_domain
  •         -save_signal {SAVE posedge}
  •         -restore_signal {NRESTORE negedge}

复制代码
其中,set_retention命令自动替换RTL中寄存器为自保持寄存器,并模拟下电保持,上电恢复功能。
   
电源开关在DFT中的考虑
  DFT的核心是要提供对clock和reset信号的控制,使得内部所有寄存器可观测和可控制,在有power
gating的电路中,对DFT会带来新的要求。
  *对电源开关信号、保持信号、隔离信号的可控和可观测性
    *避免测试电流(功耗)过大,可能会损坏器件(感觉这个应该是通常DFT都要考虑的问题)
    *测试电源开关网络的模拟特性
    *测试电源关断、隔离、自恢复的特性
    *测试电源开关控制器的功能
   
    在测试中,对电源开关电路的可控性包括:
    *防止测试图形偶然的激活电源关断状态使子系统电源关断
    *防止测试图形偶然使能输出隔离功能
    *防止测试图形偶然使能自恢复功能,从而破坏扫描链上寄存器值
  这就要求在测试中要能提供直接控制电源控制器输出的方式,或者直接在PAD上外加信号控制,或者内部
测试控制模块产生屏蔽信号。
  测试中控制所有带有power gating模块,禁止其关断功能是通常作法,但也有例外。测试中,由于所有寄
存器都处于active状态,会造成电路动态功耗达到极大值,可能会超过芯片、封装允许的极限而毁坏芯片。从
而可以有这种作法,在测试中控制让有power gating功能的模块断电,只测试power on的模块。在测试power
gating模块时,再控制其让其上电。这样,对扫描链的设计也要power on/off的模块分开设计。根据芯片的
不同,这些额外的控制信号可以从pad上直接引入,或者用一些内部专门的测试模块产生。

测试开关网络:
  开关网络中开关的一种故障可能会造成开关不能充分打开(IR Drop较大),使电路获得电压变低,影响电路
性能。另一种故障则可能造成开关永远打开,导致静态电流过大。时序的测试失败或者路径延时的测试可以帮助
判断第一种故障,但没有办法可以确认这种故障。静态电流测试(IDDQ)可以用来判断开关是否正常关断。
  除了这些测试,还有必要测试当电源打开关断时不会影响其余模块寄存器(或者自保持寄存器)的状态,这种
测试有相当的难度,因为这中电源开关动作对其它模块的影响是和电路所处状态什么相关的。
测试隔离和自保持:
  在正常扫描链测试中,我们就测试了隔离单元的非隔离功能是否正常了。隔离的单元的隔离功能可以用功能
测试来验证,或者用扫描输入模块寄存器的方式验证。因为隔离功能正常时,该模块的输出钳位至固定值,扫描
出输入模块的寄存器值判断出前级模块输出隔离是否正常。
  保持寄存器的测试需要测试所有寄存器是否可以正常存储0和1,可以采取如下步骤:
  *一个0/1交替的测试图形扫描入寄存器内
  *触发保持功能
  *一个与前测试图形互补的测试图形(0/1相反)扫描入寄存器
  *模块下电再上电(可选)
    *扫描出所有寄存器值,检查是否正常。
    *相反的测试图形,重新再测试一次
测试电源控制单元:
  在测试前面几个单元时,控制单元的输出全部强制设为了固定值,现在需要来测试它的功能。可以采用
功能测试的办法或者扫描链的办法。需要注意的是,扫描链测试时,需要把其所有输出强制为固定值,以防
止偶然对其它模块电源发生控制动作。

测试电源开关芯片的建议:
  *时钟和复位信号必须在芯片外部可控
  *门控电源各控制信号也要在外部可控
  *隔离单元也需要可控
  *自保持和恢复的动作也需要可控
  *有必要进行IDDQ测试,以防止"stuck on"故障发生在电源开关上
需要注意的地方:
  决定标准的IDDQ值是一个挑战。门控单元的静态电流只能通过模块关断时静态电流和电路全部上电时的静态
电流比较得到(静态电流在分布在整个芯片上)。可以用两种情况下静态电流的比例值来设定通过标准。比如睡
眠模式静态电流是工作模式静态电流的20%等。

  这一部分到此告一段落,这部分主要从RTL设计(验证和测试)的角度看待门控电源设计。下一部分会从
架构的角度分析,包括power domain的划分、层次、多电压域等。
 楼主| 发表于 2010-5-7 13:04:38 | 显示全部楼层
第六部分 门控电源的架构级考虑

电源网络的层次:

  从可重用性的角度考虑,power domain的边界应该和RTL Module的接口一致,以利于后面的实现和验证。尽管现在
一些工具支持将RTL中的单个进程分配给一个电源域,但不建议这样做,会加大设计的复杂度。
  理论上门控电源可以任意嵌套,但在实际中,级连的门控开关会带来较大的IR Drop,使电路实性能退化,因此尽量
不要使用门控电源的嵌套
。举例来说,一个CPU系统概念上应该会有一个总的电源开关控制,它的下面又会有一些功能模
块(比如乘累加器和向量浮点单元)可以分别控制电源的开关。这样的系统的几种电源状态如下表:

   表一
它的电源开关的层次可以设计为扁平的一层结构,如下图,开关之间的逻辑关系(比如CPU Off时,MAC、VFP也应同时是Off的
)可以在控制单元中用逻辑来实现层次化的控制。(也就是说物理实现上是单级的,逻辑上可以有层次关系)

   图一

电源网络的种类和它们的控制:
  一个基于处理器的SOC系统一般会有以下类型的电源网络:
  *给整个CPU系统供电的电源网络-可控制使CPU系统完全断电,进入长时间的睡眠模式
  *CPU逻辑部分的供电系统-支持逻辑部分断电防止漏电流,而缓存部分依旧上电的模式
  *(可选的)逻辑部分中,需要状态保持的保持寄存器所需的always on电源网络
  *隔离单元所需的always on电源
  *门控电源控制器和各种控制信号所经过buffer所需的always on电源
  *控制外部电源开关模块所需的always on电源
  下图给出了一个典型的SOC系统的电源网络规划:

  图二

对外部开关电源的控制:
  这一块主要是考虑外部电源的上电时间。关断外部电源可以获得最大的功耗节省。但也会带来相当长的上电时间
(微秒到毫秒级,要等待外部电源稳定,并且难以估计)。设计者也不能指望要快速的上电时间,快速的上电时间会
带来板子上过大的过冲电流和地电平的电压反弹,可能会破坏内部的逻辑状态。实际的上电时间高度依赖于外部电压
源的结构。
  另外,每增加一条电源就会带来板级电源成本和面积的上升(板上开关电源需要电感和电容等器件)和提高片上
电源设计的复杂度。
  大多数SOC系统设计已经有了以下电源:
  *IO Power
    *SOC core Power
    *用于PLL的干净电源
  *用于实时时钟电源(可选)
  再额外增加电源都会显著增加设计复杂性。

片上电源的控制:
  片上电源开关有更快的上电时间,而且控制的电路面积越小,上电时间越短,所需的电流也越小。但控制多个
小面积电路也不见得会比控制一个大电路好,会增加控制器的复杂性,因此这里需要一个设计平衡。 
  
电源状态表和常开区域(always on regions)
    这里讲了片上各个电压域之间可能存在的一些逻辑关系。比如只要B区域下电,则C区域也下电,这种情况下
可以认为B区域相对于C区域是永远上电的。这中电源域之间的相对关系可以用来帮助对电源进行布局布线。
  UPF提供了简便的方法描述这种关系,即电源状态表。工具可以读入这些表的信息用来指导电源的布局布线。   

  (这一部分介绍的内容逻辑上挺松散,总是这一下,那一下的,很难把语言组织清楚,好在说后面还分别有详
细的介绍),下一部分是一个完整的门控电源系统设计实例的介绍。
 楼主| 发表于 2010-5-7 13:05:41 | 显示全部楼层
第七部分 一个门控电源系统的设计实例

  SALT项目用来检验前面介绍的门控电源技术。
  项目概况
  实现工艺:90nm
    包含单元:ARM Core; Cache RAM; AMBA Bus; USB OTG Digital core/PHY
   采用的低功耗技术:
    ARM Core和RAM分别由片外可控电源供电
    ARM Core和USB Core分别独立门控电源控制
    ARM Core采用全状态自保持技术和SCAN保持技术
    USB Core采用部分状态自保持技术
    晶体管域值(VT)调整技术
    全局共地,header switches(switch VDD)

    支持的四种低功耗模型:
    HALT:关闭处理器时钟,仅处理器停止工作
    SNOOZE:处理器片上门控电源下电(支持状态保持与恢复)
    HIBERNATE:处理器内部状态扫描到片外存储器,然后片外VDDCPU switch off。上电时,储存的状态值从片外存储器
          扫描回处理器。处理器与外部存储器的通信通过32位AMBA总线。用32位CRC检验输入/输出数据的正确性。
                              该状态下Cache RAM保持上电。
    SHUTDOWN:同HIBERNATE模式一样的上电下电顺序,但将Cache RAM外部电源关闭。Cache RAM内部的数据需要
                              由操作系统控制写回外部存储器。这是唯一一个需要操作系统介入的状态进入过程。

  除了这四种低功耗状态,该项目还利用衬底偏压控制技术来调整晶体管VT值,以控制芯片性能和漏电流。所有晶体管
的N阱、P阱被连到片外,方便电压控制。
  衬底偏压技术产生三种工作模式:
    NORMAL:标准的阱偏压
    TURBO-RUN:阱负偏压减小VT,增加芯片性能(增大漏电)
    POWERSAVER-RUN:阱正偏压增大VT,减小漏电
  电源控制器被设计为保证阱偏压改变只发生在静态(无时钟时),也就是只在HALT、SNOOZE、HIBERNATE、SHUTDOWN模式
切换到其它模式时调整阱偏压。

设计划分
  如下图所示:

    图一
  整个系统划分为三个电源域:VDDSOC、VDDRAM、VDDCPU
  VDDSOC为always on电源,为除ARM核、RAM外的外设单元供电,包括PLL数字部分、时钟产生器、电源管理单元和其它
一些实时timer。这些timer可以产生中断服务请求将系统唤醒。VDDSOC还通过一个独立的电源控制器为USB OTG供电。
  VDDRAM通过独立的片外开关为存储器供电。这样做的好处是可以让CPU独立下电,而存储器保持上电,则系统可以更快
的恢复上电。另一方面也方便观测存储器的静态/动态功耗特征,选择可以让存储器保持数据的最低电压来降低功耗。
  VDDCPU与VDDRAM一样,也可以方便设计者了解处理器的静态/动态功耗及上/下电时间、功耗等特征。
  为了改进可重用性,总线接口单元和门控电源控制器单元与CPU集成在一起,这样减少了top级模块间的接口,并且门
控电源功能封装在IP核内部,任何IP内部低功耗性能的改进不会影响到Top级集成。改进后的架构如下图所示:

      图二
  其中电源控制单元实现的功能包括:
  *针对hibernate和shutdown模式实现的外部电源开关控制信号接口。
  *总线时钟同步扫描时钟脉冲(用于hibernate模式下,状态保存与恢复)
  *snooze模式下的片上VDD开关控制
      *snooze模式下的隔离和状态保持时序控制
  *与时钟产生单元的握手控制(用于在不同运行模式下调整CPU工作时钟)
  控制单元与所有被控制模块的通信都采用请求/应答的握手协议。这些应答信号对控制单元的时钟来说都是异步的,
因此都在单元内部进行了同步操作。这种方式保证了控制单元广泛的适用性,既可以适用于不需要延迟(应答信号直接
和请求信号绑定)又可以适用于有真实延迟的情况。在这个项目中,隔离、状态保持/恢复、复位的应答信号是直接绑定
请求信号(这些操作可直接执行完,不需要延迟)。对开关的控制则需要真实的延迟,开关控制信号通过菊花链形式传
到各级VDD开关,应答延迟等于整个开关网络开关时间。
  一些额外的设计特征:
  *复位后,执行一个保持/恢复操作,冲掉所有影子寄存器的X状态(可用于一些功能测试模式)
  *发出请求后,在等待响应到来后,才会状态跳转的状态支持挂起操作(holding)等待应答信号
  *这个项目中还一些额外诊断控制功能。如可控制电源开关网络的打开顺序或一次同时打开等

隔离单元
  CPU与Cache RAM间的隔离:在CPU的输出端加入隔离单元,由于VDDRAM相对于CPU来说是always on的,这
些隔离单元放在了VDDRAM域中,这样可以方便对隔离单元电源的布线。在RTL实现中,这些隔离单元被例化为
标准库单元(一种RTL wrapper),它可以用于行为级仿真,也可以被单元库中的功耗管理套件映射为工艺相关的
钳位单元。
这种做法在CPU到RAM间许多关键路径上(时钟、复位等)显示地例化了单元,降低了后端工具对这些
路径设计的灵活性(平衡时钟树等),因此这些关键路径的时序需要精心设计。
  CPU与总线接口的隔离:这部分隔离设计为两套隔离单元,一套隔离单元在VDDCPU域中,在snooze模式下(
CPU的电源被内部关断),这套隔离单元将所有输出钳位为地,从而保护了总线接口。在hibernate模式下(VDDCPU
在片外被关断),这些隔离单元也将没有电源,不能起到保护作用。这时在VDDSOC域中的另一套总线保持器可以将
总线的浮电位拉为0。
  电源隔离控制器产生一个隔离控制信号,该信号被分为两路routing,一路不经过CPU走向RAM;另一路不经过
RAM走向CPU。当CPU在hibernate时下电后,RAM中的隔离信号所经过的buffer在VDDSOC、VDDRAM域内,可以依旧保
持上电。从而保护RAM接口。
  USB OTG模块的隔离:这个模块在RTL中例化了"与门"作为隔离单元,并被设置了dont_touch属性(避免被逻辑
优化)。在综合时,可以将这些与门强制映射为不受浮电平输入影响的单元。
  在SALT项目中初期设计时,所有隔离单元都例化为工艺无关的通用库单元。这有助于可重用性和在工艺确定前
的功能级验证。
在第一版的SALT项目中,还没有工具可以自动支持插入隔离单元,因此隔离单元的插入都是手动完
成的。在后面的版本中,使用了EDA工具实现了在RTL中自动插入隔离单元。在功能验证时,使用UPF语句可以完成功
能仿真,不用再手动例化功能单元。

保持寄存器
  项目中CPU核使用的是全状态保持。全状态保持可以使系统安全的从下电时的任意状态中完全恢复。如果采用部分
状态保持,会增加大量的验证复杂性
(需要验证保持寄存器和非保持寄存器之间不会互相影响)。门控电源设计的一
个重要考虑是状态保持寄存器中的数据不会因为上电/下电的电流冲击而被破坏
。在这个项目中,设计了一种检查机制,
来检查保持寄存器中的数据是否完整。在SAVE操作后,可以利用scan功能将所有影子寄存器中的数据及其CRC校验和扫
描到外部存储器中。在RESTORE后,再将所有寄存器的数据及校验和扫描到外部存储器。两次扫描的数据可以进行比较
从而判断哪里的寄存器数据有破坏。这种方法可以有效的检验任何状态保持寄存器随机数据错误或者位置相关错误和软
起动上电(限制过冲电流)的实际效果。这种检验技术还可用于评估状态保持寄存器在高温、电压波动环境中的数据保
持能力。
  与之相反,USB OTG核使用了部分状态保持技术。这个模块可以分为需要永久保持数据的控制和状态寄存器(CSR)
和只用于存储协议状态的协议接口引擎(PIE)。USB传输的数据保存在基于RAM的FIFO中,在需要下电时,先将RAM中的
数据清空,因此此时的RAM是空的,CSR中的数据可以存入RAM中。上电后CSR再从RAM恢复数据,同时PIE模块被复位,准
备下一次数据传输。
  在SALT项目中,使用了一个控制信号(NRETAIN)来控制保持/恢复功能。NRETAIN的下降沿触发SAVE功能,上升沿
启动RESTORE功能。
  同样,也可以用UPF语句定义自恢复寄存器的功能。或者手动修改RTL的形式来模拟保持/恢复功能。

测试和性能分析
  下图给出了ARM926EJ CPU核(含RAM)的动态/静态功耗相对工作电压的变化曲线。90nm工艺的常规工作电压是1V,曲
线给出了110%到70%的常规电压变化。

      图三
  前三根曲线给出ARM核工作在300MHz、200MHz、100MHz下的动态功耗。
  "ClkGate"给出时钟在gated off下的电路漏电功耗。
  "SRPG"给出电源关门条件下的漏电功耗。这里包括开关的漏电流、状态保持寄存器的漏电流、一直上电的控制信号
经过的buffer tree的漏电流和没有下电的memory的漏电流。
  下图给出了CPU系统在VDDCPU域中的时钟门控条件下和电源门控条件下的相对环境温度变化的功耗曲线。

      图四
  从整个温度范围可以看出,门控时钟下的静态功耗总体是电源门控下静态功耗的10倍,在常温下这个比例可以达
到25倍

  下图给出了CPU和RAM共同的静态功耗曲线(门控时钟)和CPU部分电源关闭的静态功耗曲线。
  
      图五
  可以看出,CPU电源关断后,有1/2的静态功耗被节省。这样,只关闭RAM电源后,也可以达到接近关闭CPU电源所
达到的节电效果。
  下图给出了基准漏电功耗(门控时钟时)与状态保持门控电源时的静态功耗比例关系曲线。

      图六
  曲线中高温部分的退化可以解释为高域值(VT)开关管的特性。可以看到,在这个工艺和项目中,门控电源降低
静态功耗的最佳温度在35度左右


总结
  门控电源技术相对于基准漏电(只有门控时钟)功耗可节省10倍到25倍间。由于RAM一般来说是一直上电的,整
个系统还是有一定的静态功耗。在后面内容中有如何降低RAM静态功耗的办法。
  SALT项目验证了90nm工艺下,状态保持门控电源技术和方法对于降低功耗的有效性。这些技术和方法在65nm或以
下的工艺中将更加适用。


    (下一部分将从复杂IP(处理器、DSP、PCI Express、总线架构等)设计者的角度分析进行低功耗设计所需要的
考虑。)
 楼主| 发表于 2010-5-7 13:07:04 | 显示全部楼层
第八部分 IP核设计中的低功耗
  前面提到过的都是在已有IP核的基础上,在集成这些IP核时,系统架构上实现的低功耗技术。这一部分讨论在设计这些复
杂IP核时如何加入门控电源这一低功耗技术的考虑。
  IP核的目的是在集成更为复杂的系统时,可以方便的与系统集成。这种要求它能够兼顾尽可能多的低功耗技术,以适应不
同系统对低功耗的要求。
  IP集成时可能会用到的低功耗技术包括:
      *多域值技术(Multi VT)
      *门控时钟
  *门控电源(内部/外部)
  *电压缩放(Voltage Scaling)
    在IP核设计的整个过程中(划分/时钟复位设计/相关脚本/IP封装/IP验证)都要加入对低功耗技术的实现。
一些IP核,如Memory、PCI/USB物理层等需要有多个低功耗工作模式。对于软IP来说,问题更为复杂,需要支持
各种低功耗技术以方便集成时可以灵活使用。这里以USB OTG IP核为例,介绍了用UPF的方法修改原IP核RTL设
计为支持门控电源的IP核设计。
  第一大类问题包括结构的划分和接口的设计
  *决定何时IP核会被下电,如何下电
  对于USB OTG核,在收到CPU发来的下电使能信号后,等待USB总线上无数据3ms后,启动下电时序。这时只
有部分电路工作,这部分电路等待来自CPU的读写信号或者总线上的有效信号来激活USB核进入上电时序。
  *决定哪些模块会被下电,哪些一直上电
  在下电时,总线接口单元需要一直上电以接收来自CPU的激活信号。同样,物理层也需要一直上电,以检测
外部的USB信号活动。时钟和复位模块也需要上电以提供这两个模块的时钟和复位。其余的所有模块可以进入下
电模式。其中,状态控制寄存器中的状态值需要状态保存,协议引擎中的寄存器值不需要保存,上电时直接复位
即可。电源控制模块需要一直上电,它集成在AHB Slave block的总线接口单元中,使用AHB的时钟工作。
  整个系统有数字部分、PHY部分两个异步的时钟域。两个时钟域间的信号,包括门控电源控制信号都需要同步。
  *决定门控电源的控制时序  
  1.等待fifo_flushed信号,该信号表示所有未处理的交易已处理完。
  2.使能钳位信号,钳位门控模块的输出接口。
  3.等待钳位响应信号,表示钳位完成。
  4.关闭AHB,PHY时钟信号。
  5.等待关闭时钟响应信号(由于有异步时钟域,响应时间可能是不确定的)。
  6.声明保持信号(异步,保持控制状态寄存器值)
  6.声明复位信号(异步,复位协议引擎寄存器值)
  7.声明下电使能信号,关闭IP核电源
  8.等待下电响应信号,表示已经下电完成。
  电源控制器检测到电源使能寄存器被复位(表示CPU要求USB核上电)或者检测到USB总线上有信号活动,则
状态机进入上电时序。
  1.打开USB模块电源
  2.等待电源上电应答信号
  3.使能复位信号(所有协议引擎中寄存器被复位)
  4.使能恢复信号,恢复保持寄存器中寄存的状态值
  5.恢复两个时钟域中的时钟
  6.等待时钟恢复使能信号
  7.恢复输出端口钳位信号
  8.等待钳位恢复应答信号,表示所有隔离单元被释放。
  除了以上问题,另外还有考虑:
  *决定哪些信号接口需要被隔离
  *决定时钟、复位、电源控制信号的初始化策略
  
  第二类问题是可移植性问题:
  好的移植性体现在接口的灵活性以适应不同的应用,不同的实现库等。
  在IP核中的实现建议包括:
  *接口信号的极性可以配置以适应不同的库要求
  *对所有的控制接口信号以请求/响应握手协议实现,并且提供一种机制使响应信号直接与请求信号相连,
  以适用不需要握手的应用
  *可参数化配置存储保持是单信号控制或双信号控制
  另外,为了避免多个模块同时上/下电,可能会在主控模块中用到对各模块电源控制的仲裁机制。这要求
IP核可以在顶层接口中支持上/下电请求/响应机制。
  第三类问题是关于时钟和复位
  系统中门控电源工作时,下电的模块需要关闭时钟,而上电的模块依旧需要时钟信号。复位信号也是如此。
同时,在测试模式时还要选择用外部的扫描时钟、复位信号。因此时钟、复位信号需要专门一个模块来精心设计。
而且这个模块应该可以由外部直接控制时钟和复位信号。
  
  第四个问题关于验证
  在验证USB OTG核过程中,作者首先验证了全部原RTL的逻辑功能。然后修改RTL加入了power gating功能,再全
部验证了逻辑功能。再专门测试了门控电源的功能。
因为门控电源功能和USB核逻辑功能不相关,这种办法可能是最
合适的验证办法。
  在这个核的仿真中,作者详细仿真了门级电源开关网络的功能和时序(上电/下电的延时)。
  下一个问题是关于IP的打包
  常规的IP打包包括可配置的RTL、可配置的测试平台/向量(用来验证配置后的核)、综合脚本(支持门控时钟
和多域值)。
  对于支持门控电源的IP核还应包括可配置的门控电源控制器(可配置控制信号等)、产生测试门控电源功能的
测试平台/向量、可配置门控电源相关功能(可选择保持寄存器等)、支持门控电源的综合脚本、可配置的UPF代码。
    
USB核中的UPF代码
  IP核中插入保持寄存器、隔离、门控电源功能都可以通过引入UPF脚本来实现(不用直接动RTL)。门控电源控制
模块还需要手动在RTL中加入。

  书中有详细的UPF代码和IP核结构图,这里就不贴了,需要时可以到书里参考。
USB核中门控电源控制器中的状态机
  书中给出了一个电源控制器状态机的RTL实例,使用了适合描述复杂状态的分层状态机结构。这里就贴代码了,附
上书中的两级状态机结构图(用UML2.0描述)
  Top级状态图

    图一
  次级状态图(sleep/wakeup)

        图二 

这一部分没什么新意的地方,就是从IP核设计的角度把前面介绍的内容又回顾了一遍,一些地方介绍得更细致了点。下一部分就要开始介绍一种更为“激进”的低功耗技术-根据工作负载动态调整电压和工作频率的技术-频率和电压缩放技术。
 楼主| 发表于 2010-5-7 13:08:05 | 显示全部楼层
第九部分 电压频率缩放技术
  这一部分介绍电压缩放技术中的DVFS(动态电压频率缩放)技术和AVS(自适应电压缩放)技术。
  前面的门控电源技术主要针对静态功耗的优化,这部分的DVFS和AVS则是从降低动态功耗角度出发讨论设计方法上的新变化。先来看看动态功耗的构成。
  
动态功耗和能量
  动态功耗Pdyn = Ceff * Vdd2 * Fclock
   则降低动态功耗从三个方面出发:
  降低电容值:整个电路的等效电容值取决于设计复杂度(面积)、连线长度、工艺尺寸等因素。这些不是我们要考虑的重点。
  降低频率:动态功耗和工作频率和正比,在性能允许的情况下降低频率可以等比例降低动态功耗。但从能量的角度看,降低了频率则延长了工作时间,完成同样一个任务所消耗的总能量不变(能量是功率对时间的积分)。因此并没有省电(只是可能不会那么发热)。
  降低电压:降低工作电压则不管是从功耗角度还是能量角度都可以平方关系减少。因此在性能允许的情况下,降低电压是最直接低功耗措施。
  一般来说,工作电压和工作频率是成线性正比的,电压越高,频率可以越高,电路运算速度也越高。降低电压则会降低电路能工作的最高频率。但是从下图频率和电压关系可以看出,当电压低到一定时候,最高工作频率不会继续降低,也就是电路速度不按原关系下降了。这个电压的下限值是我们做电压缩放时要考虑的一个限制,工作电压不能变化到低于这个电压值(具体原因下面会提到)。
                    
                                             图一
DVFS技术
  设计DVFS系统要考虑的因素包括:
  *电压/频率可调的变化范围和级数
  *电压/频率缩放的执行顺序
  *电压/频率缩放模块与相临模块的隔离和电平移位设计
  *电压/频率缩放模块与相临模块的接口时序设计
  *电压/频率缩放时间对算法(软件)部分的影响
  *电压/频率缩放对工艺库的要求
  *对电压/频率缩放时间点的控制,也就是什么时候缩放

  *电压/频率可调的变化范围和级数
  决定这个范围是非常困难的,它是和应用密切相关的。级数太少则稳压源转换的时间过长,而转换时电源的能量效率是低于稳定时的。级数太多又容易导致电压源花费大量时间在各级之间变换。
  一般来说在决定这个范围需要考虑如下问题:
  1、在系统不同的工作负载下,需要多快的工作时钟?
  2、哪些时钟周期是PLL周期的整数倍?(如果是整数倍,只要修改分频器就可以完成频率调整了)
  3、什么样的工作电压支持这些目标频率?

  决定工作时钟时可以先提供一个系统的FPGA原型或行为级描述的原型,让软件设计者验证不同的工作负载以得到所需要的最小工作时钟频率。再分析在这些工作时钟下,对应的工作电压应是多少?这个工作需要特殊的库和工具的支持。
  决定工作电压还要考虑到温度反转效应。温度反转是在深亚微米下观察到的一个现象。前面提到的电压低于某值时,电路延时不再随电压反比变化。这个电压下限就是温度反转点。一般来说,温度越高,电路延时越长。而当工作电压低于温度反转点时,电路的延时反而变成温度高延时小了。因此原来是非关键路径的地方温度低,可能反而变为关键路径了。这个温度反转点电压大约在2*VT(见书中参考文献)。因此工作电压下限不能低于这个值,各个工艺由于VT不同,这个值会有所不同。
  
  *电压/频率缩放的执行顺序
  以一个简单系统为例,系统中只有一个处理器核由可编程电压供电,其余电路为固定电压。一个PLL模块产生高速时钟,由分频器产生工作时钟。

  如果目标频率高于当前工作频率,缩放顺序如下:
    1.CPU控制电压源升压到新电压(与目标频率对应的电压值)。
    2.CPU保持当前工作频率一直到电压稳定到新电平。
    3.CPU开始改变工作时钟。
    4.如果只需要改变分频器的设置,则可以直接修改,CPU不用停止工作。
     如果需要修改PLL频率,则CPU需要停止工作,直到PLL频率稳定下来。
  
  如果目标频率低于当前频率,缩放顺序如下:
    1.CPU首先降低工作频率
    2.如果只需要改变分频器的设置,则可以直接修改,CPU不用停止工作。
     如果需要修改PLL频率,则CPU需要停止工作,直到PLL频率稳定下来。
    3.CPU降低电压值至新电平。
    4.电压稳定过程中,CPU可以在新时钟下保持工作。

  *电压/频率缩放模块与相临模块的隔离和电平移位设计
  由于电压缩放模块的工作电压会发生变化,它与周围相临模块的接口则需要电平移位单元。如果这个模块还会被clock gating,则还需要隔离单元将输出接口隔离。
  由于电平移位只适合单向移位,则电压缩放模块的电压变化范围只适合或者永远高于相临模块或者永远低于相临模块。在大多数系统中,RAM的电平没有很大的变化空间,它的电平一般会永远高于或等于CPU工作电压。总线与外部接口,而且它的最小工作频率也很难估计,因此它的工作电压一般也会永远大于等于CPU工作电压。

  *电压/频率缩放模块与相临模块的接口时序设计
  DVFS模块与系统其它模块的接口时序设计是一个挑战。由于它的电压和频率都是在变化的,设计一个低skew的跨接口的时钟树是不可能的,因此设计一个标准的同步接口不可行
  一个解决方案是用异步接口。ARM1176的DVFS配置中使用了这个方法。它提供了与AXI总线的异步接口,在两个方向上用同步器进行同步。这种同步引入了接口上的访问延时。对于AXI这种分割交易(split-transaction)总线来说,这个延迟是可以接受的,不会降低总线的整体性能。
  但是更一般的AMBA,AHB总线不支持分割交易,这种引入延迟的方式会直接降低总线性能,因此异步接口不适合这样的应用。一种办法是采用基于Latch的接口方式,如下图CPU读时序表示:
                     
                                                        图二
  这种方法需要CPU时钟是总线时钟(HCLK)的倍频。CPU时钟被设计为与HCLK的上升沿大致对齐。在设计时要保证即使电压和频率变化造成时钟沿偏移,也不要超过半个CPU时钟周期。在设计时,需要对LATCH的数据端"过约束"(over constraint),保证数据在CPU时钟最快的时钟沿到来之前稳定。如果时钟延迟过来,则数据已被latch锁定,数据可以被CPU时钟稳定读取。
  下图为基于LATCH总线的CPU写时序:

                                                 图三
  写时序中,HCLK低电平保持数据。如果CPU时钟早到,则总线上数据由HCLK低电平保持,使上一次数据写完成。如果CPU时钟晚到,则数据也会晚到达总线,我们需要过约束LATCH数据端,使CPU时钟在最慢情况下,也能保证LATCH数据端的建立时间。
  这样两端读和写的setup约束要靠过约束来保证,hold约束可以自动保证。
  如果不想用Latch,也可以采用全寄存器的接口方式。CPU写数据时,时序上,CPU上升沿保证在HCLK上升沿前面到达,以保证HCLK的建立时间。如下图所示:  

                                                   图四
  读时序上,要对CPU时钟域数据通路加强约束,保证建立时间即可。采用全寄存器的方式可以方便采用标准的设计流程,也可以方便DFT的设计。

  *电压/频率缩放时间对算法(软件)部分的影响
  对电压和频率的转换都需要一定的延迟时间。这段时间可能会要求我们停止当前的工作。电压的转换,尤其是片外线性稳压器,会需要几十ms才会稳定,电压转换过程中的过压、欠压都会延长这个时间。系统设计者需要充分了解这个延时信息,在设计时考虑最坏的情况,保证安全的电压稳定时间。
  频率的转换要速度大大快于电压稳定的时间,尤其是只需要改变PLL分频器的设置时。如果需要改变PLL的输出频率,这个延时可能会和电压转换时间差不多。在系统设计时尽量利用这个快速的频率转换。
  DVFS转换时,如果系统完全停止工作,可能会造成不能接受的中断响应时间。一个解决问题的办法是在转换时用最低速的工作时钟(比如总线时钟)工作。这可以使系统连续工作不会中断。
  
  *电压/频率缩放对工艺库的要求
  在决定工作频率/电压值时,需要在各种电压下,对系统的时序进行分析。这需要特殊库的支持。库需要提供低于常压时的单元时延信息值。后面第十二部分中讲到的电流源模型可以用于此类分析。

  *对电压/频率缩放时间点的控制,也就是什么时候缩放
  对系统性能要求有充分的了解,并且当前系统工作性能高于或低于性能要求时需要进行DVFS转换。问题是,如何知道的系统的性能要求。对于一个已知工作任务的嵌入式系统来说,可以较容易了解任务所需要的工作速度。可以在任务的固件中提出对系统性能转换的要求。对于实时系统来说,可以通过调度器中事件优先级的顺序,动态得到对系统性能的要求,从而对性能转换提出请求。对于DVFS转换的延时,可以预先安排在事件响应的时间中。
  开放式的应用平台难于对性能要求做出估计,因为它的应用任务都是现场下载进去的,在系统设计时根本不清楚应用对性能的要求。由于可能会有很多并行的应用同时进行,不能指望软件工程师在他们代码中加入DVFS转换的请求。从系统利用率或统计的角度来猜测应用对性能的要求不是好的办法。应用软件对系统的性能要求总是突发式的,系统作出的性能转换动作总会滞后一些。保持系统工作在比最高性能略低一点的工作状态是一个办法,这样系统转换到高性能状态会迅速一些,但会功耗消耗会比理论值高一些。
  ARM的智能能量管理(IEM Intelligent Energy Manager)是一个在任务和线程级智能监控系统性能要求的工具。比如一个图形用户界面对windows系统提出的请求频率和显示分辨率等信息可用来判断当前这个交互任务所需要的性能等级。有一系列这样的判断准则可以累积起来综合判断不断变化的工作任务对系统性能的要求。我们的目标是不去改变用户的应用软件,但如果对一些关键的实时性的任务作一个简单标记,向IEM表明它对系统高性能的要求,则会有更好的效果。

AVS技术相关考虑
  DVFS对电压/频率的控制还是一个开环的系统。AVS则是一个闭环的反馈系统。它在可缩放电源和电路性能监视器之间形成一个环路。电路性能监视器不仅可以知道当前工作电压多少,还可以知道当前电路是工作在慢、中等或高速状态下和周围环境温度对系统带来的影响。
  电路性能监视器需要和被监控的模块集成在一起以实现对温度最好的检测。一个大型的系统中可能会有若干个这样的性能监视单元分布在芯片各个位置,它们的监测结果汇兑到一起,最坏的情况会被用来通知电源控制器对系统电源作出转换。

(这一部分就到这里了...这一部分还真是复杂...估计要是真正实现起来还会有更多的困难和问题。各个实现环节都要仔细考虑,系统任务的性能预测也是个难点。下一部分会讲一个DVFS系统的设计实例,看看这种技术的功耗节省的效果到底如何...)
 楼主| 发表于 2010-5-7 13:09:19 | 显示全部楼层
第十部分 电压频率缩放技术的实例

ULTRA926

  ULTRA926项目由ARM总体设计,Synopsys提供EDA工具和方法学支持,Artisan提供IEM单元库和PLL模块,
NSC提供AVS技术支持。芯片由UMC 130nm工艺流片,典型电压1.2V.
    架构图如下:

    图一
  电压域划分:
  Cache memory和CPU在VDDCPU域,由于memory在这个工艺有足够电压缩放裕量,因此可以和CPU同在一个
电压域,共同缩放和关断。
  TCM(tightly coupled memory)在自己的VDDRAM域中,它和VDDCPU一起缩放,但会当CPU断电时保持在最小
电压,以保持内部数据。CPU到TCM的接口由隔离单元隔离。
  其余部分电路在VDDSOC域中,和VDDCPU域由电平移位器相连。CPU输出到SOC域的端口上,CPU时钟提前总
线时钟HCLK,以保证接口中re-timing寄存器的建立时间。VDDSOC电压域是常上电的,其中包括的电路包括:PLL、
电压管理单元、时钟产生、系统内存和外围控制器等。
     UMC 130nm工艺分为高速但漏电流大(130HS)和低速但漏电流小(130LL)的两种工艺,其中130HS用于CPU子系
统设计,130LL用于其余SOC系统实现。
     实现AVS监测模块集成在VDDCPU域中,以最靠近被监测的单元。自适应电压控制模块和PLL、时钟产生器等实现
在常上电的VDDSOC域中。
     对于自适应电压缩放,时钟产生单元会同时产生两个时钟,一个当前工作时钟、一个变化的目标时钟。当需要提升
性能时,CPU首先保持原时钟工作,电压控制单元提升工作电压。当硬件性能监视器监测到延时有足够的裕量时表示电
压已经足够高,这时DCG(数字时钟产生器)单元将时钟转换到目标时钟,完成电压频率调整。
当需要降低工作时钟时,
DCG将低速时钟提供给CPU和硬件性能监测单元,然后电压控制单元降低电压至path上有足够的timing slack。
  电压/频率范围的确定
  选择什么样的工作电压、频率对系统的电压/延时特征有全面的了解。这个特征需要包括对组合、时序、存储器单元
时序的了解。一般来说,设计者需要从一系列电压点出发,决定这些点下的工作频率。
  因为电压的变化范围超过了标准的IR drop的范围,基于模块的时序模型已不能够足够准确,在这个项目中,我们使
用晶体管级的性能分析方法。Nanosim被用于在各种工作电压下详细的路径延时分析,并后处理成模块级的时序模型库
文件(.LIB格式)。由于这个工作计算量太大,在各种工艺、温度条件下细粒度的电压/延时分析是不现实的。(这种高强
度的EDA仿真以后是不是也可以用GPU实现?)
  
  在各种工艺、温度下CPU的标准工作电压为典型值1.2V,最小值1.08V(-10%),最大值1.32V(+10%)。从经验和
对RAM工作电压裕量的认识,电压的工作范围向下扩展为0.94V、0.80V、0.73V,低至0.66V时,RAM模型已不够准
确不能信任了。
  经过验证,各种条件下,不同电压对应的最大工作频率如下图所示:
    
        图二
  标准流程中的"sign off"最差情况下的可以确定的工作频率为288MHz(Fmax[SS] at 1.08V)。由于RAM灵敏放大器
必须工作在0.75V以上,这决定了动态电压变化的下限。这个下限对应的工作频率是144MHz。从先前的DVFS项目经验
看,最大的功耗节省一般在频率的100%-50%的变化范围内。因此288MHz-144MHz的变化范围是合理的。下表给出
了几个中间工作频率点。其中480MHz是另加了一个PLL(主PLL的5/6分频),以产生240MHz频率。表中这些时钟均是总
线时钟(48MHz)的倍数关系。新增加的PLL所带来的额外的功耗也需要考虑是否值得增加。
  
    表一
  能量节省的预测
  从能量节省的角度说,能量仅正比于工作电压(降低频率可以降低功耗,但对同一个任务,消耗能量是一样的)。下
表给出了各种性能下能量节省关系。
    
          表二
  值得注意的是,在典型工艺条件和室温下,最大性能(288MHz)时会有35%的能量节省,最低性能(144MHz)时也只
有50%的能量节省。而且由于没有进一步降压空间,最低性能相对于较高性能(192MHz)时并没有节省能量。这也是在优
化电池寿命时重点考虑的地方。
  所有这些分析都是在工作条件的下限,实际中还要考虑系统级IR-drop和工作环境的裕量,工作电压加上10%的容错
空间是合适的。这时,各种条件下的节能比例不会改变。
  实测能量和性能分析
  下表给出了各种电压下实测的能量数据(功率*时间)。可以看出一个电压下,几种不同的工作频率对应的能量值是
基本相同的,频率降低时能量消耗会微微变大。这是由于,频率变低,工作时间变长,尽管动态功耗保持一样,但是静态
功耗的时间却也加长了,造成静态漏电加大。因此对于漏电较大的工艺,降低电压(降低运行速度)与延长漏电时间有一
个取舍关系。

   
        表三
  
ATLAS926
  ATLAS926项目采用TSMC 65nm工艺的低漏电单元库实现。65nm工艺的典型电压值是1.0V,低漏电版本的电压
是1.2V。低漏电工艺会有更高的动态功耗(比1.0V的典型工艺,增加44%),因此这种工艺下,电压缩放对于优化电池寿
命是必要的。
  这个工艺中编译自动生成的RAM没有足够的电压降低空间,安全读写操作的最低电压要求在1.08V。因此,RAM设
计采用了高VT,低漏电的技术,使得状态保持时的静态功耗最小。电压降低到1.08V后,只有逻辑电路可以继续降低电
压,RAM电压保持在1.08V。
    在1.08v,最差工作条件下确定的最高工作频率为240MHz。与ULTRA926项目不同,此项目没有几周的时间去做详
细的晶体管级电压延时分析。在这个项目中,集成了一个时钟产生模块,可用于瞬间切换一系列工作频率。芯片完成后,
再去决定安全的工作电压和电压裕量。时钟产生模块包含一个1GHz的PLL,并且支持整数倍分频。它为CPU、系统总线
和存储器之间提供同步的时钟接口。
  实测功率和性能分析
  VDDCPU和VDDRAM电源被绑定到片外,以方便独立电源供电、电流测量和测试安全的工作电压。下图给出功率和
电压曲线:
    
            图三
  在1.08v以下,功耗下降曲线斜率变小,这是由于1.08v以下,RAM不再随CPU进行电压缩放,而是保持在1.08v,
只有CPU逻辑电路继续降低电压。
  下图给出的是完成一个工作任务后节省的能量柱状图表示,所有数据以1.2v,240Hz的能量消耗归一化。可以看出
最大性能下可最大节省34.7%的能量
   
    图四
  电压的缩放也对泄漏功耗有较大的影响,下图给出了室温下,各种模式下的漏电功耗。

    
          图五
  HALT:时钟被关掉
  RETENTION:状态保持寄存器工作,其余逻辑电路断电
  HIBERNATE:只有RAM由保持电压供电,其余电路断电
(这里挺奇怪,静态功耗竟比动态功耗大好多...)

(这一部分给出了两个DFVS,AVS的实例,基本上动态能量消耗最大都可以有接近50%降低。但AVS中有一个关键模块,就是硬件性能检测模块,它是决定AVS效果的关键,书中没有详细介绍,有所保留。从上下文看,这个模块应该可以检测芯片各点温度、甚至关键路径上时延,以判断电压是否可以继续安全变化...)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-11-20 04:19 , Processed in 0.032263 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表