大家好,我是数字小熊饼干,一个练习时长两年半的ic打工人。我在两年前通过自学跨行社招加入了IC行业。现在我打算将这两年的工作经验和当初面试时最常问的一些问题进行总结,并通过汇总成文章的形式进行输出,相信无论你是在职的还是已经还准备入行,看过之后都会有有一些收获,如果看完后喜欢的话就请关注我吧~谢谢~
在上篇文章中我们对影响芯片功耗的几点因素进行了讨论,本篇文章我们讨论系统级低功耗设计方法和技术。
一、低功耗设计的5个层次
在不同的设计阶段,可采用不同的方式进行低功耗设计,比如可以将低功耗设计化为5个层次进行,自上而下分别为:系统级优化、行为级优化、RTL级优化、逻辑级优化和物理级优化。每个层次对功耗优化的效果也不尽相同,从上往下,依次减小。
二、系统级低功耗优化设计方法
系统层次的设计通常可以节约70%以上的功耗,通常由系统以及架构设计人员对系统层次的低功耗方案进行设计,他们会对系统的性能以及功耗的目标综合考虑,最终得到低功耗方案,并交由前端和后端人员进行实现。
2.1 低功耗优化设计方法
软件/硬件划分:
soc的功能实现可以划分为软件和硬件两个方面,因此不同的功能可以划分为软件或者硬件来做,如果一些资源密集型模块通过硬件实现,就能节约大量的功耗,因此要结合硬件和软件的优势来制定软件和硬件的划分。
算法优化:
算法也是影响功耗的一大因素,在设计时需要对算法尽可能的进行优化,比如:
-规整的算法有利于简化状态机,减少判断分支语句,降低功耗;
-分析算法需要多少存储器及进行多少次存储器访问,尽可能的减少不必要的访问;
-需要多少运算逻辑单元(如乘法器、除法器、加法器等),如何将这些运运算逻辑单元进行优化到最少,例如乘2,4,8这种2^n数时;
-减少不必要的乘法器使用,通过移位代替乘法;
-选择合适的计算精度,即满足需求,尤能减少数据位宽,降低运算模块的面积,进而减少功耗。
-对于大规模运算的应用(比如FFT),使用对数系统(Logarithmic number system,LNS)比使用线性系统更好。LNS在降低平均位元活跃度(也就是降低0到1之间的翻转)的同时使用加法和减法实现乘除法,使效率比线性系统更高。因此基于LNS算法来实现FFT可以节省大量的功耗,但是加法器和乘法器的宽度会增加,导致面积增加。
2.2 低功耗优化设计技术
本节主要介绍一些具体的系统与架构的低功耗设计技术。首先是用于降低静态功耗的一些技术。
2.2.1 静态低功耗技术
-
多阈值工艺(Muti-Vt Design)方法
多阈值工艺方法的实质就是在时序和功耗之间进行折中。
-
高阈值标准逻辑单元具有速度慢、漏电流小的特点。
-
低阈值标准逻辑单元具有速度块、漏电流大的特点。
因此,我们可以在时序紧张的关键路径上使用低阈值的标准逻辑单元来优化时序,在非关键路径上使用高阈值的标准逻辑单元来减少漏电流。
2. 电源门控(Power Gating)方法
电压门控法也称多电源法(Multi-Supply),其思想是将芯片上的模块基于其应用上的不同来采用不同的电源网络进行供电,因此,在某个模块不需要工作时,就可以断开电源,进而将该模块的功耗降为零。
如图所示,电源开关单元(Power Switch Cell)中的高阈值MOS管作为电源闸门,用来将低阈值电源和地隔离开。根据sleep信号的状态对MOS管的开关进行切换。
使用该方法还需要注意,由于睡眠模块和非睡眠模块是有连接的,因此需要添加隔离单元(Isolation Cell),用于在睡眠模块处于睡眠模式时,将出信号保持为常数,从而避免非睡眠单元的输入悬空。并且隔离单元的输出信号需要保证不影响后级非睡眠模块处于非工作状态。
除此之外,在睡眠模块中仍有一些非睡眠区域,需要添加保持寄存器(Retention Register)用于保持一些特殊存储器件上的值,以保证上电时能正常工作。
在睡眠模块上下电时,需要时钟、复位配合,在上电时需要初始化,以避免进入错误状态。且如果有保持寄存器,在下电前睡眠模块需要保存的状态需要存储在保持寄存器中,并在上电后将保持寄存器中存储的状态恢复至睡眠模块中。
3. 体偏置(Body Bias)
晶体管阈值电压随体偏置而变化。
- 在工作模式下,MOS管的体偏置为0,MOS管处于低阈值状态,翻转速度快,漏电大。
-在等待模式下,MOS管的体偏置为反向偏置,处于高阈值状态,漏电小。
此外还需要注意的是,由于MOS管的体偏置需要需要时间,由等待模式进入工作模式的时间较长。
2.2.2 动态低功耗技术
随着芯片的集成度的不断提高,越来越复杂的存储器、处理器和时钟树贡献了动态功耗的大部分,因此要从这些方面进行低功耗设计。
1. 多电压域(Multi-Voltage Domain)
系统的功耗与电压的平方成正比,因此减小工作电压可以有效降低功耗,由于芯片的设计一般都是基于模块的设计,因此就让多电压域的设计成为了可能。但是电压的降低也会将MOS管的翻转速度降低,因此需要保证在降低供电电压时,不会影响模块的正常工作。
在进行多电压域设计时,有以下需要注意的地方:
-需要在不同的电压域之间插入一些电平转换单元(Level Shifter),以将输入电压范围转换成输出需要的不同电压范围。
-如果不同电压域之间的驱动信号和接收信号之间的距离很长,需要插入特殊的驱动单元(Repeater)来增强信号的驱动能力。
- 如果不同电压域之间可以进行power gating,还需要加入保持寄存器和电压隔离单元。
-电压域并非划分的越多越好,增加电压域的同时,也会增加电源,控制和电源网络实现复杂度。 - 跨电压域信号,尽量作为异步信号进行处理。
2. 高级门控时钟(Clock Gating):
就如我们之前提到的那样,对于芯片来说,其中不断翻转的时钟提供了大部分动态功耗,因此在不使用时,将时钟停住就成为了一种非常实用的低功耗方法,也就是所谓的门控时钟clock gating。基于芯片的工作阶段,关闭空闲电路的时钟,可以大量减少消耗在时钟树上的和不工作触发器上的功耗。
门控时钟clock gating的要点:
- 门控时钟应该尽量摆放在时钟源附近,减少在门控时钟单元的前面有太多的时钟缓冲器(buffer)不断翻转而造成的功耗。
-门控时钟也会带来额外的逻辑,比如上图种的寄存器和与门。因此也会带来额外的逻辑面积和路径延迟。 - clock gating也可以通过rtl编码的方式,通过EDA工具自动插入。
3. 异步设计:
对于同步时钟电路来说,为了减少时钟偏移,会生成大规模的时钟树结构,在时钟树中会存在大量的时钟缓冲器,时钟网络消耗的功耗也随着增加。因此,通过使用异步时钟设计,不需要全局时钟,在两个模块之间通过握手信号进行交互,就可以减少功耗。
2.2.3 低功耗SOC系统的动态低功耗管理
1.动态电压频率调节:
动态电压频率调节DVFS,Dynamic Voltage and Dynamic Frequency Scaling是一种通过调整不同模块处在工作状态时,性能和能耗之间的关系来降低功耗,即根据性能的需要, 实时分配不同的工作电压以及工作频率,使得系统的性能恰好满足系统最低工作要求,从而在满足性能的前提下,最大限度的降低功耗的一种低功耗方法。
如果一个电路能够估算出它必须做多少工作才能完成当前的任务,那么理论上讲就可以将时钟频率调低到刚好能适时完成该任务的水平。降低时钟频率意味着可以同时降低供电电压。因此通过降低时钟频率,降低了电压,也降低了漏电流,从而能将动态功耗和静态功耗同时降低。
但是该种方法需要在单元设计、模块设计、模块互连、芯片规划、系统架构以及操作系统和应用设计等设计层面进行修改,因此该方法是比较复杂却有效的低功耗设计方法。
2.采用不同的工作模式
根据芯片的应用和功能,将芯片划分出不同的工作模式,在不同的工作模式下,选用不同频率的时钟,并且可以将一些不需要的模块时钟关闭,或者是直接把那些没有使用的模块电源给关掉。 这种动态功耗管理可以通过软件实现,也可以通过硬件实现。
先举一个例子:
以上是一种测距芯片的低功耗状态机,简要说明一下:
- 当没有供电时,芯片处于power off状态;当给AVDD和IOVDD供电时,芯片启动,进入hp idle状态;
- 当芯片处于hp idle状态时,发送start命令,芯片进入ranging状态,各个模块正常工作,激光器vcsel开启激光输出进行测距。
- 当芯片配置为低功耗模式时,进入lp idle状态,此时只保留数据ram和寄存器内容,其余模块被power gating或clock gating,此外,还可通过LPN信号关闭i2c模块的通信功能。处于lp idle模式下时,芯片的功耗大大降低,仅次于power off状态,而且当发送i2c唤醒命令时,芯片能够从lp idle快速进入hp idle状态;
下面再举一个在不同的工作模式下选择不同的时钟频率,并对不需要工作的模块时钟进行clock gating,从而降低功耗的例子:
上图中将芯片分为了以下4个工作模式:sleep、idle、slow、normal。从normal模式到sleep模式,工作的时钟频率降低,被gating的模块也变多,从而能够将时钟引起的功耗大大降低。
3. 优化存储器:
存储器的功耗也占了芯片总功耗的一大部分,因此降低存储器的功耗非常重要。主要有以下方法可以优化存储器的功耗:
首先可以使用上面提到的方法对存储器进行低功耗优化:
-
最简单的方式是使用门控电源,在不使用存储器时,将其关闭。
-
使用双阈值存储器,比如使用基底偏压存储器,在不使用存储器时将其反向偏置,本质上是提高了阈值电压,并降低了漏电流与静态功耗。
-使用具有多功耗模式的存储器,例如使用双功能存储器,在对存储器进行读写时,使用全电压供电以保证读写操作正常进行,在存储器不需要读写时,降低供电电压进入低功耗模式,仅保持数据不丢失即可。
需要注意的是,在使用存储器的低功耗模式时,存储器的唤醒需要时间,功耗降的越低,唤醒时间越长,因此在设计时需要考虑唤醒时间。 -
使用分块的存储器,将一大块存储器分为几个单独时钟和电压可控的bank,例如将访问频次高的存储器和访问频次低的部分分成独立的bank,每一bank工作在不同的功耗模式下,只使得小部分存储器处于电压开状态,其他大部分存储器只在执行密集型运算时打开。
-对有些需要频繁访问存储器的模块,例如使用快速傅里叶变换(Fast Foutier Transform, FFT)的DSP模块,可以在存储器和处理器之间增加缓存,以预先将相关数据从主存中取到缓存中,使用小范围的缓存能使计算能耗大量下降。 -
将多端口的存储器替换为单端口的存储器,或者使用共享ram,也可以有效降低面积和功耗。
三、总结
本篇文章简要介绍了在系统层面的一些低功耗方法,对于我们这种前端设计人员,先要对这些方法有一个大致的了解,并在以后的工作逐渐积累实战经验,说不定以后在座的各位就是那些架构大佬中的一员呢~
本篇文章主要是参考了《SoC设计方法与实现》和《硬件架构的艺术》两本书,如果有需要的话,可以在公众号回复“soc设计”和“硬件架构的艺术”哦~
如果你喜欢这篇文章的话,请关注我的公众号-熊熊的ic车间,里面还有ic设计和ic验证的学习资料和书籍等着你呢~欢迎您的关注!