低功耗设计

芯片的整体功耗从根本上可以分为静态功耗和动态功耗;

静态功耗,又称漏电流功耗,是器件特性,和晶体管的阈值电压及其自身特性有关;

动态功耗,主要是芯片中的寄生RC电路的充放电引起的。换言之,当芯片中的电路出现任何信号翻转,都会产生动态功耗,其中所占最大比例的是时钟信号的翻转。

动态功耗还可以分为翻转功耗和短路功耗。翻转功耗和电压、翻转率和负载电容有关,所以降翻转功耗的措施就是降压、降翻转率和减负载电容;

短路功耗是指在晶体管翻转时,nMOS和pMOS会存在同时导通的情况,这时候产生的功耗称为短路功耗。

现代SoC的功耗主要集中在:时钟树功耗(40%)、CPU、GPU、存储器等;
功耗的整体计算公式为:

$$P=(C{\times}V^2{\times}f)+(t{\times}V{\times}I{\times}f)$$

前面的部分是翻转功耗,后面的部分是短路功耗;

静态低功耗技术

电源门控是直接切断电源来减少漏电流;

多阈值工艺体偏置则是通过改变CMOS管的阈值电压来减少静态功耗;

电源门控

指直接关掉某一不用模块的电源,这样可以直接关闭动态和静态功耗;

局限:会引入额外的开销;模块的唤醒需要时间,功耗达到最终的power gating功耗(即使power gating仍然会有少量的漏电流)也需要时间。如果芯片一直在工作,则power gating的收益就有些小。总结而言就是需要考虑唤醒开销和power gating节省的功耗哪个大。

实际做法:
1、两个电源域,每个电源域引出单独的物理管脚,直接物理关断;适合长时间的关断;
2、内部关断:在片上实现一个电源控制器,类似于一个开关,进行电压切换;

为了关断power,我们可以把Vdd换成Vss,也可以将Vss换成Vdd。但一般情况下最好把Vdd换成Vss,因为多电源域一般共地,但Vdd各不相同。
(注,Vdd中d=device,指器件的工作电压;Vss中s=series表示公共连接的意思,也就是公共接地端)

需添加专用的隔离单元(isolation cell),如特殊处理的与门(输出与隔离信号相与,输出低电平),隔离单元处于源模块,但电源一般不关;或者需要给出主电源和备用电源,保证在power down的时候隔离单元还能继续工作;

典型的门控电源的过程:
1、关闭时钟;
2、打开隔离信号;
3、发出save脉冲,提示保存好相关寄存器;
4、拉低rst_n;
5、关闭电源;
6、打开该电源域时,在复位信号拉高后发出恢复信号脉冲;

对于门控电源,具体的实现是在后端,对于架构来讲需要分清楚有几个电压域,有几种低功耗模式;对于前端来讲,要搞清楚接口信号,同时需要实现一个控制器来断电和唤醒电源域,且加上隔离模块;

多阈值工艺

为了满足工作频率越来越高的要求,厂商逐渐降低晶体管的阈值电压Vt,使得晶体管能高速翻转;但是如果阈值电压Vt太低,则晶体管不能完全关断,这将产生很大的静态功耗;

相关名词:
HVT(High V threshold) 高电压阈值
LVT (Low V threshold) 低电压阈值
SVT(Standard V threshold) 标准电压阈值

阈值电压与器件速度和泄露功率的关系:
阈值电压↓ => 器件速度↑ 泄露功率↑
阈值电压↑ => 器件速度↓ 泄露功率↓

总结:在设计中可以在关键路径上使用低阈值的标准逻辑单元来优化时序;在非关键路径上使用高阈值标准逻辑单元来优化漏电流;

优点:
大大减少系统的静态功耗;
没有任何面积开销,工艺库设计是将两种阈值库中的相应单元的面积设计成一样的,这样可以方便替换;

体偏置

对同一晶体管而言,阈值电压也会发生变化。晶体管的阈值电压随着CMOS管衬底的偏置电压变化而变化,而阈值电压影响我们的静态功耗,所以我们可以通过改变偏置电压来改变阈值电压。
在工作模式下,MOS管的体偏置为0,MOS管处于低阈值状态,翻转速度快;
在等待模式下,MOS管的体偏置为反向偏置,处于高阈值状态,漏电流小;

注意:MOS管的体偏置需要时间,电路由等待模式转为工作模式的时间较长;

动态低功耗技术

多电压域

动态功耗的主要组成部分—翻转功耗,是Vdd的平方,静态功耗中的主要组成部分漏电流和Vdd成正比,所以降功耗最有效的方法就是降电压。
但降电压会增加延时,降低门单元的性能,所以很多低功耗技术就是在满足芯片性能要求的前提下,尽可能地降低芯片的工作电压Vdd。
如果不同电压域之间的驱动信号与接收信号距离很远,则需插入特殊的驱动单元(Repenter)来增强信号的驱动能力;如果不同的电压域可以单独断电,则需要考虑添加保持寄存器和电压隔离单元;

代价:
需要变压器;因为你拿0.7v的电压域信号去驱动1.0v的电压域很容易导致1.0v的晶体管时时刻刻在漏电,且变压器会造成延时;
时序分析不好做;
布局时电源网络更加复杂;
上电断电顺序可能是有要求的;
对于架构设计者而言,主要就是搞清楚电压是影响时序的,确保不会因为多电源域影响系统功能就好;

多电压域技术可以分为四种:
静态多电压技术(MSV),对不同的模块固定为不同的电压;
动态电压频率缩放技术(DVFS),对于该模块可以选择几种不同的电压配置,同时电压调整一般会同时调整频率,所以就称为动态电压频率缩放技术;
自适应电压频率缩放技术(AVFS),DVFS需要软件根据不同的应用场景选择不同的电压频率配置,如果更进一步,对改模块的电压频率能够自适应地调整,那么就是自适应电压频率缩放技术;
电压关断技术(PSO),如果某个模块在有些情况下不使用了,我们可以关掉这个模块的电压,需要的时候再打开,又称为电源门控,本质上是一种电压调节的特例;

门控时钟

直接停掉时钟,这样可以减少动态功耗。实际上在数字芯片中时钟网络占用了很大功耗,可能超过50%。

举例说明门控时钟的概念:比如寄存器,当EN信号有效的时候才进行寄存,不如用EN信号将时钟信号进行屏蔽。
注意!门控时钟虽然是很直接的办法,但一般来说不用自己RTL层面写门控时钟,工具会自动优化,自己写的门控时钟有可能产生毛刺影响性能;

如果仅将时钟信号和时钟使能信号相与之后的输出作为模块的时钟输入,则可能存在毛刺;避免毛刺的方式有两种:
采用锁存门控;若锁存器和与门相差很远,则延迟差别较大,仍可能存在毛刺;若时钟使能信号距离锁存器关断信号很近,可能会不满足锁存器的建立时间从而出现亚稳态;
采用寄存门控;用寄存器来寄存EN信号再与上时钟信号得到门控时钟信号;此时需要寄存EN信号的寄存器满足建立时间要求;

实际中看起来寄存结构的门控时钟问题要少,但在实际的SoC中,使用最多的还是锁存结构的门控时钟;
最主要的原因是节省面积!一个DFF由两个锁存器组成,当大量的门控时钟插入到SoC芯片中时,这个节省的面积就相当可观了。
当然,这里说的是SoC芯片中使用的标准库单元。如果是FPGA或者用RTL实现,个人认为还是使用寄存器门控+setup约束来实现比较稳妥;

那在SoC中锁存门控的问题如何解决呢?在实际的SoC芯片中,要使用大量的门控时钟单元,所以通常会把门控时钟做成一个标准单元,由工艺厂商来提供。所以锁存器结构中线延时带来的问题就不存在了,因为是做成一个单元,线延时是可控和不变的,而且还可以通过挑选锁存器和增加延时,总是能满足锁存器的建立时间。这样通过工艺厂预先把门控时钟做成标准单元,这些问题都解决了。

做门控时钟的时候需要注意以下两点:
通常在位宽较大的寄存器上加时钟门控,因为加门控时钟本身也会增加面积和功耗,所以要综合考虑;
加了门控时钟之后要保证原本的电路功能不变;

Tips:
RTL编码中,将不用的数据设置成0并不能减少功耗,保持数据不变才能减少翻转,降低功耗。

RTL级低功耗技术

对于前端RTL设计而言,降低功耗无非两点
对于寄存器,不工作的时候关闭时钟;
对于组合逻辑,减少无效的跳变;

设计中可以考虑的点:

  1. 状态机的编解码:在各种状态机的编码中,格雷码是最适合低功耗设计的。因为它在状态转换过程中每次只有一个触发器变化,同时,格雷码编码的状态机也消除了依赖于状态组合等式中存在毛刺的风险;
  2. 门控时钟:编码方式 if(~rst_n) else if(en_load);
  3. 独热码多路器:将多输入MUX采用独热码编码方式,可以综合为与门和或门,降低功耗;
  4. 操作数隔离,操作数隔离就是增加一些选择器件,如果这个操作数不需要的话就不选择它以及不进行这个操作数所需要的相应计算。在sel信号之前通过将sel和数据信号相与可以降低mux前端信号的翻转率;
  5. 资源共享,将相同的处理使用组合逻辑预先产生,在调用的时候直接调用,不需要把相同的操作复制;
  6. 总线翻转编码,在当前数据和下一个数据之间的汉明距离(汉明距离指的是两个数中不相同位的数量)大于N/2的时,将下一个数据取反后再传输,以减少总线上出现转换的位数量,即总线反转编码;该技术的缺点是需要传输一个额外的控制位,用以表征总线数据是否进行了翻转编码,消耗了系统总线的带宽;

当模块在某段时间完全不工作的时候,你可以:1、在这段时间里关掉这个模块的时钟;2、检查这个模块的输入,对于还在跳变的输入,将其全部固定为恒定值,这样才能根除这个模块的动态功耗;

门级优化技术

个人感觉节省的功耗比较鸡肋,仅做了解即可;

毛刺的消除

毛刺指由于电路中信号的传输延迟引起的不必要的翻转;通过插入缓冲器改变信号的传输延迟从而消除信号的毛刺;

逻辑级优化

引脚的重分配:对同一个门而言,有可能各Pin的功耗不一致,我们将变化率低的信号连接到低功耗的Pin上就有好处。用负载电容低的引脚去连接快速翻转的信号,降低系统的动态功耗;
重排序操作:通过对门级电路的重排序,使得其驱动的门数量降低,从而降低系统的动态功耗;

物理级优化

使用低功耗的库;
使用低功耗的布局规划;
通过布局布线来减少毛刺;
在优化布局的时候调整缓冲器和连线的大小;
调整晶体管的大小减少负载电容;

控制输入向量

系统在睡眠状态下,控制输入向量可以明显减少系统的漏电流。(选择最小漏电流的向量作为组合逻辑的输入)

以反相器为例解释静态/动态功耗

反相器的结构如下图所示,由一个PMOS和一个NMOS串联而成,负载电容记为$C_L$。

1

动态功耗

电容充放电引起的动态功耗

当$C_L$通过PMOS充电时,$V_{C_L}$从0V上升至$V_{DD}$,电路从电源$V_{DD}$上抽取一定的能量,一部分消耗在PMOS上,另一部分被电容$C_L$存储。$V_{out}$由高至低进行电平翻转时,$C_L$通过NMOS放电,之前存储在$C_L$中的能量被NMOS消耗。

下面计算$V_{out}$由低至高电平翻转的过程从电源上抽走的能量,假设$V_{in}$的电平上升和下降时间为零,即NMOS和PMOS不可能同时导通,此时CMOS反相器可以等效为下图所示的电路。

2

$i_{VDD}$和$V_{out}$是随时间变化的,可以看做是时间的函数,在0—dt时间范围内从电源上抽取的能量微元为:

$$dE_{VDD}=i_{VDD}V_{DD}dt$$

理论上$C_L$充电至$V_{DD}$所用的时间为无穷大,因此$C_L$充电过程中从电源上抽取的总能量为:
$$
E_{VDD}=\int_{0}^{\infty}i_{VDD}(t)V_{DD},dt=V_{DD}\int_{0}^{\infty}C_L\frac{d_{V_{out}(t)}}{dt},dt=C_LV_{DD}\int_{0}^{\infty},dV_{out}=C_LV_{DD}^2
$$
电容$C_L$在0—dt时间范围内存储的能量微元为:
$$
d_{E_C}=i_{VDD}(t)V_{out}(t)dt
$$
电容$C_L$充电至$V_{DD}$存储的能量为:
$$
E_C=\int_{0}^{\infty}i_{VDD}(t)V_{out}(t),dt=\int_{0}^{\infty}V_{out}(t)C_L\frac{dV_{out}}{dt},dt=C_L\int_{0}^{V_{DD}}V_{out},dV_{out}=\frac{1}{2}C_LV_{DD}^2
$$
由$E_{VDD}$和$E_{C}$可以看出,电容$C_L$充电期间从电源抽取的能量只有一半存储到$C_L$中了,另一半被PMOS消耗,而存储到电容$C_L$中的这一半能量将在电容放电期间被NMOS消耗掉,也就是说CMOS反相器每经过一次开关周期(“0”→“1”→“0”)所消耗的能量为$C_LV_{DD}^2$,如果一个反相器每秒开关f次,则功耗为:
$$
P_{dyn}=\frac{E_{VDD}}{T}=C_LV_{DD}^2f
$$
其中,T为开关周期,f为开关频率。

NMOS和PMOS同时导通(过渡区)引起的功耗

前面假假设了输入波形的上升、下降时间为零,这是个理想状态,实际上$V_{in}$的上升、下降时间不可能为零,当CMOS反相器处于两个管子同时导通的过渡区时,电源对地有一条直流通路,如下图所示:

3

当直流脉冲可近似看做三角形以及输入电平上升与下降时间相等时,每经过一个开关周期(“0” →“1” →“0”)所消耗的能量为:
$$
E_{dp}=E_{dpr}+E_{dpf}
$$
$E_{dpr}$即$V_{in}$电平上升期间的直流通路能耗,通过上图(b)可以发现,$0{\sim}{\frac{t_{sc}}{2}}$这段时间的瞬时电流$i(t)=2\frac{I_{peak}}{t_{sc}}t$,在$\frac{t_{sc}}{2}{\sim}t_{sc}$的这段时间瞬时电流$i(t)=-2\frac{I_{peak}}{t_{sc}}t$,$V_{in}$从低至高电平转换期间的能耗为:
$$
E_{dpr}=\int_{0}^{t_{sc}}i(t)V_{DD},dt=2\int_{0}^{\frac{t_{sc}}{2}}i(t)V_{DD},dt=4V_{DD}\frac{I_{peak}}{t_{sc}}\int_{0}^{\frac{t_{sc}}{2}}t,dt=\frac{1}{2}V_{DD}I_{peak}t_{sc}
$$
同理可得$V_{in}$从高至低电平转换期间的能耗为:
$$
E_{dpf}=\frac{1}{2}V_{DD}I_{peak}t_{sc}
$$
由此可知电路在过渡区的总能耗为:
$$
E_{dp}=E_{dpr}+E_{dpf}=V_{DD}I_{peak}t_{sc}
$$
所以$V_{in}$一个周期内的平均功耗为:
$$
P_{dp}=\frac{E_{dp}}{T}=E_{dp}f=V_{DD}I_{peak}t_{sc}f=C_{sc}V_{DD}^2f
$$
从平均功耗的表达式可以看出过渡区的动态功耗是一个类电容功耗,$C_{sc}$为过渡区的等效电容,$t_{sc}$为过渡区时长,f为$V_{in}$的电平跳变频率。

静态功耗

理想情况下,CMOS反相器在稳态工作时PMOS与NMOS不会同时导通,这就意味着稳态时电源与地之间没有通路,不会形成通路电流,静态功耗为零,可实际电路里总有一些微弱的泄漏电流$I_{stat}$流过源或漏与衬底之间的反偏二极管,如下图所示,此时的静态功耗为:
$$
P_{stat}=V_{DD}I_{stat}
$$
4

总功耗

显然,CMOS反相器的总功耗可以表示成三个部分的和,即:
$$
P_{total}=P_{dyn}+P_{dp}+P_{stat}=(C_LV_{DD}^2+V_{DD}I_{peak}t_{sc})f+V_{DD}I_{stat}
$$
最主要的功耗是等效电容的充放电造成的$P_{dyn}$,过渡区的功耗$P_{dp}$可以通过调整过渡区宽度控制在限定范围内,静态功耗目前可忽略。

Reference

Jan M. Rabaey, Anantha Chandrakasan, Borivoje Nikolic, 2004. Digital Integrated Circuits :A Design Perspective ,Second Edition.