https://www.cnblogs.com/ChipView/p/9278614.html
LPMM阅读笔记——第1章 引言
LPMM阅读笔记(1)
写给自己:
转眼间我已经工作了两年,在这两年里,为了工作需要我看了很多相关书籍,在我看书的时候都会对自己说等我后面有空的时候要对这本书上的知识点做一个整理和总结,但我发现每次我都只是一如既往地这说说而已,等到书看完了也就仍在一边了,最后充其量拿来当做字典一样使用,不确定/不明白的地方查一下,以至于我现在回过头来问自己两年来到底学会了什么东西的时候,我说不出个123,鉴于此,我决定以后的看书的时候,宁可看第一遍的多花点时间记录一下笔记,然后整理出来,也不要为了暂时的快点把书过一遍而对自己说“等我后面有空的时候要对这本书做一个总结”;这也是我开这个博客的主要原因。
我会以一种将笔记写给自己的心态来记录,因为笔记都是在我学习的时候写的,所以肯定有很多地方理解的不到位/不透侧,如果你是个行家,看到我理解的不对的地方请帮我指出,我会万分感谢,如果你和我一样也是第一次学习,有不一样的见解,可以和我讨论,我们一起学习,将自己的笔记给大家看到,对我来说也是一种监督,我想这样会使我认真的对待这件事情,也会是我坚持下去的动力,这是我开这个博客的另一个原因。
以下正文===========
《Low Power Methodology Manual For System-on-Chip Design》读书笔记
1 引言
1.1 功耗带来的问题
随着芯片的工艺技术缩小到90nm及以下,我们可以在一个相当小的芯片上实现数千万门,但是这也导致芯片的功耗密度和总功耗急剧增大,对芯片后续的设计级应用中的封装和散热都提出了更高的挑战,在一些65nm设计中,漏电流几乎与动态电流一样大;这使得芯片的功耗问题在最近几年越来越被人们所重视。
书中举例提到:
1、一些最强大的微处理器芯片的功耗可达100-150W,平均功耗密度为50-75,芯片上的局部热点可能比这个数字高几倍,总功率密度不仅带来封装和散热难题,它也可能造成可靠性问题。
2、对于电池供电的手持设备而言,芯片的功耗高低则意味着设备的续航时间和电池的寿命长短。
1.2 功耗Vs能量
这一节主要讲的时功耗与能量的区别:如图 1所示:
功耗是指设备中的瞬时功率;能量则是功耗曲线下的面积——功耗随着时间变化的积分。
图 1功耗Vs 能量
芯片的功耗分为静态功耗和动态功耗两部分,下面进行分别说明;
1.3 动态功耗
动态功耗是电路在工作时(信号的值有变化)的功耗,包含开关功耗和短路功耗;
1.3.1 开关功耗
如图 2所示,当IN = 0时,上面的PMOS导通,下面的NMOS截止;Power对负载电容进行充电,充电完成后,Vout的电平为高。
当IN= 1时,上面的PMOS截止,下面的NMOS导通,负载电容通过NMOS进行放电,放电完成后,Vout的电平为低。
系统工作时,会不停的重复上述开关过程,电源对负载电容进行充电,负载电容进行放电就产生了开关功耗;
图 2开关损耗
书上给出了开关功耗Pswitch(书上用Pdyn表示,我在这里改用Pswitch表表示)的计算公式如下所示:
Pswitch = Energy transition • f = CL •Vdd • Ptrans • fclock
在上式中,CL为后级等效电路的负载电容大小,Vdd为电源电压,Ptrans 占空比,fclock为输入信号的翻转频率;
1.3.2 短路功耗
我们在对电路进行分析时,通常会认为信号的翻转是瞬时完成的,但在物理电路上信号的翻转不可能瞬时完成,所以在CMOS电路中就不可能总是一个截止另外一个导通,在控制信号变化期间会出现PMOS和NMOS同时导通的情况,此时电源VDD到地VSS之间相当于短路,便会出现短路电流,如图 3所示:
图 3短路功耗
书上给出了短路功耗(我用Pshort表示)的等效计算公式:
Pshort = tsc •Vdd • I peak • fclock
在上式中,tsc是短路电流的持续时间,I peak是MOS管内部总电流(短路电流加上充电内部电容所需的电流)。
则总的动态功耗Pdyn为:
Pdyn = (CL •Vdd • Ptrans • fclock)+ (tsc •Vdd • I peak • fclock )
从上面的公式中可以看出降低动态功耗的思路,可以从Vdd、fclock和CL这几个变量上出发。基于此会带来一系列设计架构、设计流程、时序分析、电路设计、后端布局方面的考虑,以及由于工艺的发展带来的一系列问题,在后续章节中会详细讲解这些内容。
1.4 静态功耗
静态功耗是在电路上电但没有信号翻转时的功耗,对CMOS电路而言,静态功耗主要是由漏电流导致,漏电流有下面几个部分组成:
亚阈值漏电流
栅极漏电流
栅极和衬底之间的隧道漏电流
PN结反向电流
图 4漏电流
上述几个电流在电路中的流向如图 4所示,在图4中标注出来的都很好理解,对于Isub我没太看懂,我的理解是当我们在栅极上加电压信号后,栅极与衬底之间会存在电容,因此在栅级与衬底之间就会有电流存在,由此产生功耗,且随着我们的工艺变小,栅极与衬底间的绝缘层会变得越来越薄,栅极和衬底之间的隧道漏电流会变得越来越大;为了加深理解我将上述几个电流对应到NMOS管的结构图上,得到的结果如图 5所示;
图 5漏电流在NMOS中的流向
由于亚阈值漏电流对静态功耗的影响较大,仅对亚阈值漏电流进行简单介绍,其余的在此不做介绍;当Vg<Vth时,虽然MOS管没有导通,但是仍会产生从漏极道源极的电流,称该电流为亚阈值漏电流;晶体管的越窄,亚阈值漏电流越大,亚阈值漏电流还与温度增加呈指数增长,亚阈值漏电流可用下面的表达式来表示:
其中,W和L表示晶体管的尺寸,Cox为栅极氧化层的电容值,Vth为晶体管的阈值电压。
书中提到了有下面几种方法可以降低静态功耗:
Multi-Vt和power gating,这两种方法后面会详细介绍。
VTCMOS(可变阈值CMOS):该方法是在衬底上加上一个反向偏置电压,以增加VT,来减小Isub,但是这样会额外多两个电源网络,增加库的复杂度。
Stack Effect:这种方法是采用叠加的gate,加入叠加的gate中有两个输入都是关闭状态,那么流过两个gate的静态电流会很小。在理论上,应该在关闭时钟前将所有gate输入置为关闭状态,但在现实中,这是不可实现的。
长沟道器件(Long ChannelDevices):从的表达式可以看出,增大L,可以减小Isub,但是长沟道器件的动态性差,会降低系统的性能,因此,仅在信号翻转率较低的情况下考虑使用。
LPMM阅读笔记——第2章标准低功耗方法
《Low Power Methodology Manual For System-on-Chip Design》读书笔记
2 标准低功耗方法
这一章节主要介绍了4种低功耗技术,分别是clock gating, Gate Level Power Optimization, Multi-VDD和Multi-VT;下面分别对这几种方法进行介绍;
2.1 Clock Gating(时钟门控)
芯片的动态功耗主要来自时钟网络,超过50%甚至更多的动态功耗都被消耗在时钟树buf上,因为这些时钟的buf在系统中具有较高的翻转率,且驱动能力强;另外,当时钟在翻转时,即使触发器的输入/输出端保持不变,触发器也会消耗部分动态功耗。降低这种功耗最常见的方法是在不需要时钟的时候将其关掉,称这样的方法为时钟门控。
现在的设计工具都支持自动插入时钟门控而不会影响逻辑,其基本原理如下图 1所示:
图 1 时钟门控
上面的方法对于单bit的信号而言,可能体现不出多大的优势,但是对于多bit的信号而言,一个clock gating cell可以gate掉相应bit数的寄存器的时钟,插入时钟门控除了可以极大的降低电路的动态功耗外,还可以显著减小面积,因为一组寄存器的EN MUX被一个clock gate cell代替,同时,clock gate cell引入的delay会减少时钟树上的delay cell数量,书上举例说在作者参与的一个项目中插入clock gate后面积减少了20%,功耗降低了34%~43%;书中建议只对3bis及以上位宽的信号插入clock gate。
2.2 Gate Level Power Optimization(门极功耗优化)
与clock gate一样,门极功耗优化是由工具自动完成的,对于前端设计人员来说,不用关心细节,该方法的思想是将翻转率较高的信号在其传播路径的早期与翻转率较低的信号进行逻辑运算,以缩短较高翻转率信号的传播路径;将翻转率较高的信号接到逻辑门输入电容较低的端口;cell大小调整及buf插入等,示例如下:
图 2 门极功耗优化
图 2中上半部分电路中,与门输出的信号翻转率较高,由于后面跟一个或非门,所以将原电路进行重映射为一个与或门加一个反相器,使翻转率较高的网络成为器件的内部节点,映射后的电路中与门的输出电容更小,所以功耗更低。图7中下半部分电路中,通过优化,将高翻转率的信号接在逻辑门输入电容较低的端口,将翻转率较低的信号接在输入电容较高的端口。
这里书中提到的思想我可以理解并接受,但是我有个疑问:Gate Level Power Optimization是由工具自动完成的,那么对于“将翻转率较高的信号接到逻辑门输入电容较低的端口”这样的操作,工具是如何知道哪个输入端口的翻转率更高的?
2.3 Multi VDD(多电压域)
多电压域的基本思想就是在芯片中,根据不同模块的性能要求不同而采用不同的电源供电。如图 3所示的例子中,因为Cache RAM处于关键时序路径上,其频率较高,所以它以系统中的最高电压1.2V运行;CPU的的速度虽然会很大程度上的影响系统的性能,但cpu需要Cache RAM的速度来保证,所以CPU工作在比Cache RAM低的1.0V电压下,而SoC中各模块的频率较低,所以采用更低的电压供电。
图 3 多电源域系统
多电压域设计可以有效的降低系统的功耗,同时也能保证各模块的性能能达到最佳,但多电压域方案对设计的流程影响较大,不仅需要对电源域间的交互信号做单独的处理(增加电压转换器),还需要增加IO引脚来提供不同电压的电源。下一章会对多电源域设计有详细的介绍。
2.4 Multi-Threshold Logic(使用多阈值电压的库来实现)
随着工艺制程越来越小,工作电压越来越低,降低Vt呈趋势,图 4所示是在90nm工艺下不同库的漏电流与延迟,从图中可以看出降低Vt可以提高电路的工作速度,但会使漏电流变大。基于此,可以在设计中对于性能要求高的电路,采用低 Vt的管子;对于性能要求不高的电路采用高Vt的管子。
图 4 90nm工艺下不同库的漏电流与延迟
在使用不同阈值电压的库优化功耗前必须满足最低的性能要求,在工程中,可以先使用低Vt的库进行实现,然后再使用高Vt的库进行功耗优化,将非关键路径中的cell替换掉,以实现满足性能的同时,降低系统的功耗;若想要优先满足功耗,则可以先使用高Vt的库进行实现,然后再用低Vt的库进行时序优化。
LPMM阅读笔记——第3章 多电压域设计
3 多电压域设计
在现代的SoC设计中,不同的模块有不同的性能和约束;举例来说,CPU在系统中可需要以最快的速度运行,这样的前提下,CPU就需要较高的电源电压,对于另一个模块USB而言,它只需要以一个比协议要求的基本频率稍高一点且相对固定的频率去运行就可以,这种情况下,USB就可以以一个比CPU的电压低的电源来供电;从前面的章节我们可以知道,低电压意味着更低的动态功耗和静态功耗。
多电压域设计是将芯片内部的逻辑分为多个部分,每个部分由其对应的电源电压进行供电。脱离只有一种电压的电源为芯片供电的思想后,有以下几种技术可以应用。
-
静态电压缩放(Static Voltage Scaling),简称为SVS:系统中的模块采用固定的但电压值不同的电源进行供电。
-
多电压缩放(Multi-level Voltage Scaling),简称MVS:系统中的同一个模块根据不同的应用场景,可在两级或多级电压的电源上进行切换。
-
动态电压和频率缩放(Dynamic Voltage and Frequency Scaling),简称DVFS:这是MVS的一种拓展应用,是通过控制电路实时的将不同模块的工作电压及工作频率降低到恰好满足系统最低要求来降低系统中不同模块功耗的方法。
-
自适应电压缩放(Adaptive Voltage Scaling),简称AVS:可以说这又是DVFS的一种拓展应用,该技术采用闭环的控制电路,实时的对各模块的电压进行自动的调整。
3.1 多电压域设计的挑战
多电压域设计对于设计人员而言,主要有以下几个方面的挑战:
-
电压转换器:各级电压域之间的有信号交互时,信号不能直接从一个电压域跨越到另一个电压域,需要在两个电压域之间增加一个电压转换器。
-
静态时序分析:当整个芯片只有一个电压供电时,时序分析时只需要使用一个特征电压的库,工具可以直接进行分析;当芯片的多个模块工作在不同的电压下时,需要用到库里的多个电压特征,某些电压下,库里面可能还没相应的信息,这样的话可能需要通过折算/间接计算的方式进行时序分析,如此便使得多电压域设计的静态时序分析比较复杂。
-
布局:多电压域设计中对于布局有会增加一些约束,所以布局方面需要仔细的考虑一番。
-
板级电源:多电压设计要求板级设计上有更多电压的电源来为芯片供电,增加了板级设计的复杂度。
-
各模块的上下电顺序:多电压域设计中,各模块的上下电顺序不恰当时,可能造成系统死锁,为了避免这种情况,在上电顺序上也需要设计人员仔细考虑。
3.2 电压缩放接口——电压转换器(Level Shifters)
这一节主要回答下面几个问题:
-
为什么需要电压转换器?
-
电压转换器有几种?
-
电压转换器放在什么地方?
-
什么时候需要电压转换器?
从上面的问题就可以看出电压转换器在多电压域设计中是个至关重要的器件,下面对这几个问题进行一一解答,先来看一下为什么需要电压转换器?
假如我们用一个1.2V的信号去驱动一个0.9V的COMS门,理论上不用插入特别的接口单元,但这样的话0.9V目标时钟域的所有timing都会发生变化,需要重新建模,工作量很大。反过来,如果我们用一个0.9V的信号去驱动一个1.2V COMS门,除了时序上的问题外,还会导致CMOS上面的PMOS管和下面的NMOS管同时导通,产生短路电流;为了解决这些问题,我们有必要在两个电压域间交互的信号上插入电压转换器。
3.2.1 电压转换器的方向
电压转换器是采用模拟电路来实现的,其方向是固定的,无论是从高电压域到低电压域还是从低电压域到高电压域的转换方向都是固定的,所以对应的有两种电压转换器,分别是从高到低的电压转换器和从低到高的电压转换器。这个约束对于SVS来说可能不是什么大的问题,但是对于其他电压缩放技术来说可能是一个挑战,因为电源电压可能会在操作过程中发生变化,所以设计人员需要保证两个电压域之间的关系是确定的,要么一直为高电压域到低电压域,要么始终为低电压域到高电压域,或者始终一致。
3.2.2 高电压域到低电压域的电压转换器
高电压域到低电压域的电压转换器是采用两个反相器串联在一起来实现的,如图 1所示,一个从高到低的电压转换器只会引入一个buf的延迟,所以它对timing的影响很小。
图 1 High to Low Level Shifters
3.2.3 低电压域到高电压域的电压转换器
用一个来自低电压域的信号去驱动一个高电压域的cell时,有一个关键的问题是欠驱动力的信号增加了接收输入端的上升时间和下降时间,如此便会增加短路电流的持续时间,还使得时序变差,采用如图 2所示的专用电压转换器可以解决上述问题。
图 2 Low to High Level Shifters
为了加深理解和便于说明,我在图 2上的关键节点加上了标号,各个点对应的真值表如表 1所示,当输入端INL为0时,A点为1,使得VT1导通,C点通过VT1接地为0,则VT2导通,D点为1,经反相器后OUTH输出为0;当输入端INL为1时,A点为0,B点为1,使得的VT3导通,D点通过VT3接地为0,经反相器后OUTH输出为1;
表 1 低到高电压域转换器的真值表
低到高的电压转换器需要两个电源,而且是共地的,相对于高到低的电压转换器,低到高的电压转换器引入的延迟明显更长。
3.2.4 电压转换器的布局问题
多电压域设计在布局方面对设计人员来说有较大的挑战,通常将高到低的电压转换器放在低电压域中,如图 3的例子所示。
图 3 电压转换器放在目标电压域
若图 3中1.2V电压域和0.9V电压域间的距离很小,且1.2V电压域输出信号的驱动能力足够时,两个电源域中间可以不需要额外的buf,但是,若两个电源域间的距离较远,或者输出信号的驱动能力不足的呢?
上述问题可以考虑如图 4所示的解决方法,在1.1V的电源域内插入buf,但是这样就意味着1.2V的电源可能要想信号一样在1.1V的电压域内布线,这种复杂的电源布线是实现多电压设计的关键挑战之一。
图 4 电压域间插入buf
从低到高电压域的电压转换器不论放在低电压域还是高电压域,都存在上述问题,因为低到高的电压转换器需要两个电源,所以必然会有一个电源需要穿越到另一个电源域中,通常我们将低到高的电压转换器放在高电压域中,例如图 5所示的放置,因为输出比输入需要更大的电流驱动。
图 5 低到高电压转换器的放置
3.2.5 电压转换器的自动实现
从逻辑的角度来看,电压转换器只是buf,所以电压转换器不会影响功能设计,现在的工具可以指定电压转换器的插入位置,但书中建议按照前面的两种做法,将电压转换器放在目标电压域,高到低的电压转换器可以根据时序约束来决定是否插入,低到高应该根据功耗和时序两个方面来考虑,工程上,根据下述公式来确定是否插入电压转换器。
VDDH −VDDL >VTPMOS − (0.1*VDDH )
其中,VTPMOS是PMOS管的阈值电压。
3.3 多电压域设计中的时序问题
时钟跨越不同的电压域意味着时钟需要通过电压转换器,对于MVS技术而言,时钟分配会变得更加复杂,如图 6中的buf有时工作在0.9V的电压下,有时则工作在1.1V的电压下,这样的情况下,如何最大限度的减少可变电压域相对于1.2V电源域的clock skew是一个问题,书上提出对于这个问题的解决办法是对两种情况的电压都进行时序分析和优化,确保两种情况都能满足时序要求。
图 6 多电压域设计的时钟分配
3.4 MVS对系统的设计的影响
3.4.1 上电顺序
由于各模块分别由不同的电源驱动,所以各个模块间应该保持一个上电顺序,以确保电路的功能正常,通常情况下,CPU会等待某些模块(例如I/O,PLL)上电完成后才启动。特别的,我们应该保证所有的电源域在完成上电复位前已经完全上电。
3.4.2 电压过冲
多电压系统运行时,电压经常会发生变化,需要仔细控制电压的上升/下降时间,以免出现overshoot 或undershoot,因为电压上升到目标电压以上或明显低于目标电压时,系统可能会发生故障或锁死。
最后一点,电源电压控制通常由CPU实现,所以电源电压控制一般需要在软件系统设计中考虑到。
关于多电压域设计书中在这一章节主要讲了上面的这些内容,看了下目录,在后续章节中有Frequency and Voltage Scaling Design、Examples of Voltage and Frequency Scaling Design和Implementing Multi-Voltage, Power Gated Designs这三个章节与这一章的内容是相关的。
LPMM阅读笔记——第4章 电源门控概述
《Low Power Methodology Manual For System-on-Chip Design 》读书笔记
4 电源门控概述
4.1 动态和泄漏功耗曲线
电源门控最基本的思想是为电路提供两种电源模式,分别为低功耗模式和活动模式;其目的是在合适的时间通过恰当的方式在两种模式间切换,带来最大程度上的功耗节省,同时最大限度的降低对系统中其他模块性能方面的影响。
在第2章中提到的几种低功耗技术不会影响到设计的功能,也不会改变RTL;电源门控技术则会对设计有较大的影响,因为他会影响到模块间通信的接口,并且增加了明显的时序延迟,以实现带电源门控模块安全的进入/退出低功耗模式。
对逻辑块进行掉电的操作可以由软件控制,也可以由定时器或系统级电源管理控制器在硬件中实现。在电源门控中我们会面临着很多类似这样的权衡取舍,除了上述的提到控制的实现外,还包括但不限于以下方面:
l电源门控设计的投入和泄漏功耗上的收益
进入和退出低功耗模式所需的时间消耗
在低功耗模式期间节省的功耗和从低功耗模式退出来时消耗的功耗比例
带电源门控模块的活动曲线(睡眠模式与活动模式的时间比例和切换频率)
图 1显示了使用时钟门控降低子系统功耗时该子系统的功耗变化曲线。从图 1中可以看到,在子模块休眠期间,由于时钟门控的作用,子模块基本没有动态功耗,这时功耗主要有泄漏功耗产生。
图 1使用时钟门控的功耗变化曲线
图 2显示了使用时钟门控和电源门控子系统中,该子系统的功耗变化曲线。从图 1和图 2的对比可以看出使用电源门控可以在子系统休眠期间节省一部分漏电功耗;另外,从图 2 还可以看出唤醒模块所需的时间可能很长,在系统级设计时不应忽略这部分时间:
图 2使用电源门控的功耗变化曲线
图 3显示了子系统中使用电源门控时,该子系统的实际功耗变化曲线。因为电源门控的开和关两种状态间的转换不是理想情况下的瞬间完成的,而是需要一个的转换时间(上电->下电或者下电->上电)。所以电源门控实际节省的泄漏功耗可能比预计的要少一些。
图 3使用电源门控实际的功耗变化曲线
4.2 电源门控对各类子系统的影响:
带有高速缓存的CPU子系统通常可以长时间处于休眠模式,很适合使用电源门控技术。当CPU不活动时,对整个CPU进行掉电可以节省大量的泄漏功耗,但CPU的唤醒一般由中断触发,所以在系统设计时应考虑到中断的处理和CPU唤醒时所需的时间间隙;此外,如果每次CPU下电,cache里的内容也丢失的话,CPU在下次上电的时候可能需要先从总线上读取相关信息将cache填满,这个过程可能需要花费较长的时间和消耗更多的功耗,所以,CPU净节省的功耗应该是休眠期间节省的功耗减去唤醒期间所消耗的能量。
相比CPU而言外设系统有更加规律的活动时间,它可以由软件驱动或系统中的电源管理模块来实现上/下电操作,这样的情况下,软件需要在外设上/下电的时候对一些信息进行存储/重载,会给软件驱动带来很大的负担。比这个更好的方法是外设在睡眠模式下,在其内部存储关键状态信息,但这需要一些额外的控制电路。
对于一个更复杂的多处理器CPU集群而言,其中一个或多个处理器在完成任务并且处于空闲状态时可以完全关闭电源等待分配另一个任务,由于CPU之前的任务已完成,因此,可以不用关注在掉电期间本地缓存的内容是否丢失的问题,CPU被唤醒后可直接执行重新分配的任务,对于这样的系统可能需要相应的自适应算法,这些算法可以根据负载情况动态的调整电源门控的开关情况,从而控制活动的CPU数。
4.3 电源门控设计原理
关断模块的电源有两种方式,最基本的方式是片外控制,假设某个子模块在片外有一个独立的电源供电,那么当该模块休眠时,可以直接在外部将该模块的电源关掉,使模块中的泄漏功耗减少到基本为零。但是,这种方法需要很长的时间来完成上/下电过程,并且需要消耗很多的能量来恢复模块上电。另一种方法是内部电源门控,内部开关用于控制所选块的电源,在短时间内就可以关闭模块的电源。
图 4所示为使用内部电源门控的SoC的简化图。与始终上电的模块不同,带电源门控的模块通过电源开关网络对VDD或VSS进行控制,图 4中控制的是VDD,整个芯片使用的是同一个VSS,电源开关是由很多个CMOS开关组成的阵列,电源开关由电源门控控制器控制。
图 4使用内部电源门控的SoC简图
电源门控带来的挑战是当一个子系统需要掉电时,门控整列从全部导通到全部关断的变化过程非常缓慢,这将导致该模块的输出信号很长一段时间内输出为一个中间电平,从而造成与之相连的模块/子系统CMOS管的上下两个管子同时导通,产生大量的直通电流。为了避免上述现象,可在带有电源门控模块的输出信号上增加一个隔离单元,使带有门控的模块,在掉电期间,输出到其他电源域的信号为一个确定的状态。
有的模块可能非常的希望在其掉电期间能够保持一些内部的状态信息,并能够在模块重新上电的时候将这些状态恢复,这种策略可以使模块在上电时节省大量的时间和功耗,实现这种掉电保持信息可以采用带有保持功能的寄存器(retention register),带有保持功能的寄存器有一个主寄存器和一个影子寄存器,影子寄存器比主寄存器要慢,但它的漏电流比主寄存器小,影子寄存器是始终上电的,在模块电源被门控期间,影子寄存器用于保存主寄存器的内容,该寄存器需要我们通过控制端口告诉它,何时将主寄存器的内容保存到影子寄存器中,何时从影子寄存器中恢复保存的信息到主寄存器中,其控制信号来源电源门控控制器。
4.3.1 电源门控的粒度——粗粒度Vs细粒度
实现电源门控的方式有细粒度电源门控和粗粒度电源门控两种方式。
细粒度电源门控是将电源开关放在库里的每个标准单元内,这个开关需要能够提供该单元所需的最大工作电流,所以为了不影响性能,会将开关设计的很大,导致每个cell的面积开销很大(通常是其原来的2~4倍)。细粒度电源门控的优势在于开关上的压降和钳位行为对时序的影响很容易分析,因为开关在cell的内部,这意味着我们仍然可以使用传统的设计流程来实现电源门控的部署。
粗粒度电源门控是用一组开关阵列控制一个模块的电源,如图 4所示,这一组开关的数量很难估计,因为你很难准确的知道电路所需的最大工作电流,只能进行估算,但粗粒度电源门控相对于细粒度电源门控会极大的减少面积上的损失。
近几年,粗粒度电源门控几乎被作为电源门控方案的首选项,因为细粒度门控方案带来的面积上的损失是难以让人接受的,所以后续章节将主要介绍粗粒度电源门控方案。
4.3.2 电源门控带来的挑战
电源门控的实现并不像我们想象的那样只要给对应的模块加一个电源开关,需要的开,不需要的时候关那么简单,它会给设计人员带来如下这些方面的挑战:
电源门控阵列的设计(包括开关的数量、大小、布局等)
电源门控控制器的设计(包含软件和硬件)
隔离单元和带保持寄存器的选择和使用
需要尽可能的降低电源门控对时序和面积的影响
上/下电过程中时钟和复位的控制
电源域间接口的隔离处理
电源状态验证
电源状态转换的验证
这一章对于电源门控的介绍主要还是在概念上,下一章将会详细的介绍如何实现,也是全书的重电章节。
LPMM阅读笔记——第五章 电源门控设计part1
第五章 电源门控设计part1
由于第五章内容太多,且这一个章节将的内容都是全书的重点,所以我将其拆分成几个部分来写,这是第一部分。
5 电源门控设计
这一章把电源门控的每一个组成部分从前端、RTL的视角进行了介绍,并对验证和测试这两个方面做了补充说明。
图 1 所示的带有电源门控的SoC结构图中展示了电源门控设计中需要用到的关键组件。
图 1带电源门控的SoC结构图
电源门控设计的关键问题包括开关网络和电源门控控制器的设计,另外,还需要确定插入保持寄存器和隔离单元的时间和位置。
5.1 开关结构设计
电源门控网络中用到的开关结构有头开关(Header-Switch)和脚开关(Footer-Switch)两种类型,其结构分别如图 2所示:
图 2基本的开关结构
从功能的角度来看,有以下几个方面的理由支持使用Header-Switch结构的cell组成电源门控网络:
• 如果使用的是片外电源门控,由于板级通常是共地的,所以只能使用Header-Switch对VDD进行控制;若片外和片内门控都有使用,也建议使用Header-Switch对VDD进行控制,因为这样做可以使内部门控和外部门控的行为表现一致,从而简化功能验证、时序分析和功耗分析。
• 对于使用多电压域技术的SoC系统而言,其内部不同电压域间的Level shiffer通常是共地的,不宜对VSS进行门控。
• 使用Header-Switch时,门控关闭意味着内部的信号节点都被接地,这种情况有利于系统设计工程师进行问题分析。
基于上述理由,本章重点介绍基于Header-Switch的电源门控技术,支持使用Footer-Switch切换VSS是基于开关的电气特性来分析的,这部分内容会在后面的第14章介绍。
书中对于电源门控设计给出如下建议:
仅对VDD或者VSS使用门控,而不是两者同时使用,以尽量减小开关网络上的压降。
在设计阶段尽早的确定使用Header-Switch还是Footer-Switch的开关类型。
如果芯片中也有采用外部电源门控设计,则使用Header-Switch最合适。
若芯片中有使用多电压域技术,则使用Header-Switch更合适。
不要将Footer-Switch、外部电源门控以及多电压域设计混用,因为这样会使得功能、时序、功耗分析变得复杂。
5.1.1 电源门控的控制
电源门控的控制中一个关键的问题是避免开关接通时产生浪涌电流,因为过大的浪涌电流可能导致芯片内电源上产生尖峰电压,尖峰电压可能会对始终上电模块中的寄存器或门控电源模块中的保持寄存器造成损坏。
避免浪涌电流的方法在第14章中会有介绍,一种具有代表性的方法是将控制信号以菊花链的方式接到电源门控网络的各个开关上(一个电源门控网络通常由成百上千个开关),电源门控控制器的控制信号接到门控网络的第一个开关上,第一个开关的控制信号加上适当的buf(主要用以增加延迟)后接到下一个开关的控制端,以此类推。
另一种比较积极的方法是使控制器输出多个控制信号,分先后打开不同的开关组,但这样会增加电源门控控制器的复杂度。
无论采用何种做法,都会导致电源网络从上电到上电完成需要一段较长的时间,出于这个原因,电源门控网络需要输出一个反馈信号给到电源门控控制器,用以确认上电完成。
注意:电源门控网络的控制信号上在插入buf以增加延迟时,必须插入始终上电的buf,而不是电源门控后的buf。
5.1.2 电源门控控制的建议
电源控制器需要针对所使用的电源门控技术中采用的开关类型进行设计,确保控制器和开关匹配。
应该为电源门控控制端口增加断言,以匹配所选的开关类型,便于在RTL阶段进行功能验证。
在测试模式下,必须使电源门控控制信号可控。
避免外部门控和内部门控同时使用。
5.2 信号隔离
前面有提到过,带电源门控的模块在掉电过程中,其输出为一个中间电平,可能导致其他模块出现直通电流,造成功能错误,所以需要在电源门控模块的输出上增加一个隔离单元,在门控单元被下电时,将输出钳位到正常的电平,避免引起功能异常。
5.2.1 信号隔离原理
有将信号钳位到0、1和最近的值的3种基本类型的隔离单元。大多数情况下,将信号钳位到无效状态就足够了,即当信号为高电平时,将信号钳位到0,与门可实现该逻辑;当信号为低电平有效时,将值钳位为1,或门可实现该逻辑;这两种基本的门式隔离单元结构如图 3所示;
图 3 基本隔离单元
上述隔离单元在实现信号隔离的同时给信号带来了延迟,对于某些关键路径(如cache)而言,增加这些延迟可能是不可接受的。另一种不增加延迟的隔离技术是使用上拉或者下拉晶体管的方式实现,这种方法的原理如图 4所示:
图 4 使用上拉和下拉晶体管的隔离单元
对于被门控模块输出信号而言,使用上拉和下拉晶体管的隔离单元会有多驱的问题,考虑这样一种场景,被门控模块下电后重新上电时,由于上电操作先于隔离使能的撤销时间,所以在上电时会存在竞争问题,反过来,在下电的时候隔离使能操作先于下电操作,所以下电过程中也存在竞争问题;除了上述问题外,多驱还会对可测性带来影响,因此,尽管上拉和下拉晶体管的隔离单元在时序和面积成本上很低,但仍然不建议使用该方法;相反,在工程中,建议使用与/或门形式的隔离单元。
5.2.2 隔离位置的选择
从逻辑上讲,将隔离单元放在被门控模块的内部或输出信号的目的端是一样的,但有下面这些重要的因素会影响到该选择:
• 如果门控模块的输出信号会给到多个模块使用且将隔离单元放在接收端,则每个输出可能需要多个隔离单元,所以,当门控模块的输出信号会给到多个模块使用时,将隔离单元放在被门控模块内会更节省面积。
• 隔离单元放在电源被门控模块的内部会使各种分析和检查变得简单,否则我们需要检查每一个输出信号,确保每个输出信号上都有隔离单元,若电源被门控的模块需要复用,则相应的检查和分析还要在来一次,将隔离单元放在被门控模块内部则只需做一次这样的工作。
• 将隔离单元放在被门控模块的内部,会对布局和布线有一些约束,由于隔离单元需要始终供电,所以电源被门控模块内部的电源布线会变得复杂,不过现在的EDA工具已经可以帮助解决这些问题了。
书中建议在做可重用的IP设计时,将隔离单元放在IP中封装起来,使SoC的集成不受隔离单元的影响。
5.2.3 钳位值的选择
在考虑电源门控模块的接口隔离时,有两个目标,一是最大限度的减小漏电流,另一个是避免不必要/不正确的行为,对于信号隔离为0/1有如下方面的考虑可供参考:
• 考虑这样一种情况,当电源门控模块断电时,始终上电模块接到值为钳位后的信号,若该信号为高电平有效(例如axi的awvaild),且该信号被钳位为高电平,则axi_slave可能会将这个钳位值解析为一个命令,导致错误的操作;所以为了避免上述问题,应该将信号钳位到无效状态的电平。
• 复位是一个例外,因为复位通常是低电平有效,但实际上,在模块下电时,我们应该是希望其复位信号为有效状态,所以复位信号通常钳位为有效状态0。
• 相邻模块都可以下电时,输出信号钳位为0更合适,因为当我们把输出信号钳位为1时可能出现该信号到达的目标模块也被下电,这样的情况下,该信号在目标模块内可能产生多余的直通电流,增加不必要的漏电流。
综上所述,为简化设计,建议使用Header-Switch类型的电源门控网络,使用高电平有效的信号和低电平有效的复位,将所有输出信号钳位为0,该设计的简化原理图如图 5所示。
图 5 简化后的电源门控设计
5.2.4 信号隔离的建议
对电源门控模块的输出进行隔离。
使用与/或门形式的隔离单元。
确保隔离控制信号在测试期间被钳位到0/1时可以检测到隔离是否生效。
确保隔离单元始终处于上电状态。
避免出现在电源门控模块中产生时钟并输出到外部模块中使用的设计,因为时钟上的隔离会使时钟树综合和时序收敛变得复杂。
LPMM阅读笔记——第五章 电源门控设 part2
第五章 电源门控设 part2
5.3 状态保持和恢复方法
当模块掉电时,所有的状态信息都会丢失,如果想要模块在重新上电后能继续掉电之前的工作,则需要对一些关键的状态和信息进行保存,并在上电后恢复,有三种方法可以保存和恢复电源门控模块的内部信息:
• 基于软件读写寄存器的方法;
• 基于扫描的方法,使用扫描链将状态信息存储在芯片外;
• 使用保持寄存器;
使用软件读写寄存器的方法是在模块要掉电的时候,使用始终上电的处理器将被门控模块的寄存器读出来放在memory中,当模块上电后,处理器从memory读出后写回到模块中,该方法有以下几个方面的缺点:
-
总线交互增加了模块下电和上电所需的时间;
-
总线冲突使信息保存/恢复所需的时间变得不确定,从而难以确定模块的电源何时可以关闭;
-
需要在软件中增加额外的保持和恢复驱动;
鉴于软件读写寄存的方法有上述缺点,下面重点关注另外两种方法;
5.3.1 使用扫描链保存状态
使用扫描链保存状态的方法是利用测试时的扫描链,在下电时,将下电模块的寄存器像测试时那样,通过扫描链输出到片内/片外的RAM中,在上电过程中,在将RAM中的数据通过扫描链移回到模块内部的寄存器中,由于操作过程中所使用的扫描链是复用测试时的扫描链,所以该方法几乎不会有面积上的额外开销,此外,一旦要掉电模块的状态被扫描链移到memory中后,整个模块可以完全关闭电源,但这样对于设计来说有如下挑战:
-
从RTL的角度看,扫描链是在综合后才插入的,但是我们希望在RTL阶段就能进行低功耗的功能和控制器的验证;
-
寄存器的数量以及扫描链的长度需要在初步实现后确定,所以在RTL阶段进行控制器设计时需要对这些内容进行参数化;
-
为了快速保存和恢复,需要使用多条扫描链,结合memory位宽,一般使用8或者8n条扫描链,要求这些扫描链的长度一致,对于短了的扫描链而言,应该添加额外的寄存器来补齐;
-
将状态寄存器移出/重新移入也需要消耗很多的能量,即使是使用内部的RAM,扫描链上的寄存器可能会同时翻转,产生较大的动态电流,若使用外部RAM,则在IO上还需要消耗部分能量;
尽管存在上述挑战,在某些情况下,基于扫描链的状态保存还是非常有用的,例如对于长期下电的子系统而言,通过扫描链可以保存和恢复状态,而不需要再上电后从复位状态开始工作,对于功耗的节省来说更加明显;图 1所示是基于4bits扫描链的保存/恢复简图,图中有一条较短的扫描链使用了额外的寄存来补齐了。
图 1 基于扫描链的状态保存
在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]<=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[i]<=scanword[i-1];
end
scanword[0] <= CPUSI[15:0];
end
end
assign CPUSO [15:0] = scanword[scan_reg_length-1];
`endif
在门级网表release后,就可以使用门级网表进行仿真了,以确保功能、控制、扫描链长度和连接的正确性。
5.3.2 保持寄存器
在电源被门控期间,提供状态保存的另一种方法是使用保持寄存器替换标准的寄存器,保持寄存器包含一个影子寄存器,可以在掉电期间保持,并在重新上电的时候恢复,影子寄存器时始终上电的,图 2显示了两种类型的保持寄存器,左边的保持寄存器有两个控制信号,当SAVE信号有效时,状态从主寄存器加载带影子寄存器中,当RESTORE信号有效时,状态从影子寄存器恢复到主寄存器中,SAVE和RESTORE信号对电平敏感的信号;右边的寄存器只有一个RETAIN控制信号,该信号的上升沿时,将主寄存器的值保存到影子寄存器中,在信号的下降沿时,将影子寄存器的内容恢复到主寄存器中,RETAIN信号对边沿敏感。
图 2 保持寄存器
实际上保持寄存器都有一些额外的面积上的开销,通常为20%或更大,一些带有电压峰值保护的保持寄存器在面积上的额外开销甚至大于50%,在具有大量寄存器的设计中这种面积上的增加可能会很大,但这是不可避免的。
5.3.3 带保持寄存器的电源控制器设计
电源控制器必须管理保存/恢复状态的时序,由于影子寄存器比主寄存器慢,所以我们需要确保主寄存器中的值在保存过程中是稳定的,因此,在状态保存时,一般将主寄存器的时钟停掉,保存完成后在下电(疑问:保存寄存器没有反馈信号,如何确定状态保存已经完成?);在上电时,应该先将状态从影子寄存器中恢复到主寄存器中以后再恢复时钟;为避免读写冲突,在保存/恢复时,主寄存器的时钟和复位应停掉。
5.3.4 全部/部分状态保存
对于使用状态保存寄存器策略的设计而言,最关键的一个决策是在断电期间,保存多少状态信息?若全部保存,则可以得到一个最稳健和最易于验证的设计,但某些设计中,不允许有太多太多额外的面积增加,这样的情况下,就只能选择保存部分寄存器值,这样会给设计带来一些挑战,设计需要保证所有没有保留的寄存器在重新上电后不会出现X态,且是可以验证的。
5.4 电源控制器
5.4.1 电源控制序列
不带保存寄存器的下电顺序:
-
结束总线和外部操作;
-
停止时钟;
-
隔离输出信号;
-
复位模块;
-
关闭模块电源;
不带保存寄存器的上电顺序:
-
打开模块电源,使模块重新上电;
-
Release复位;
-
撤销隔离;
-
恢复时钟;
图 3所示为不带保存寄存器的电源控制序列。
图 3 不带保持寄存器的电源控制序列
带保存寄存器的下电顺序:
-
结束总线和外部操作;
-
停止时钟;
-
隔离输出信号;
-
保存状态信息;
-
复位模块;
-
关闭模块电源;
不带保存寄存器的上电顺序:
-
打开模块电源,使模块重新上电;
-
Release复位;
-
恢复保存的状态信息;
-
撤销隔离;
-
恢复时钟;
图 4所示为带保存寄存器的电源控制序列。
图 4 带保持寄存器的电源控制序列
5.4.2 电源开关网络和电源控制器的握手
为避免模块在上/下电时产生尖峰电流,电源门控网络在关断/打开过程中都需要一定的延时,控制器需要等到模块上电完成后才能发出下一操作,这样就要求控制器知道电源门控网络是否完成了上/下电动作,基于此,在电源门控网络中增加一个反馈信号来实现控制器和电源门控网络间的握手,图 5所示为电源切换确认序列,在大多数应用中,电源门控网络的ack信号是异步的,其延迟取决于电源门控网络的结构设计,控制器在使用之前应先将ack信号同步到控制器所在的时钟域下。电源门控控制器设计时还需要考虑一种极端的情况,就是电源下电过程还未完成时又需要对模块上电。
图 5 电源切换确认序列
书上这一章后面还有两节分别对电源门控设计的验证和测试做了介绍,这一部分后续我会单独整理,所以在此先略过,下一章会从对架构的角度做一些介绍,包括power domain的划分、层次、多电压域等。