本文为作者通过网上各处搜集文章调研后融入了自己的看法与意见,整理出来,目的是为大家学习使用。
随着现在消费者对使用电池供电的消费电子用品的尺寸要求越来越小,导致电池的容量不会太大,且芯片的集成度越来越高,所以在数字芯片设计过程中功耗是一个不得不考虑的重要指标。本文将着重介绍当下数字电路低功耗的设计方法和思路,帮助读者理解低功耗设计的基本方法和思想。
整个芯片的功耗源大致可以分为静态功耗和动态功耗两种,静态功耗是指芯片没有发生状态转换时产生的功耗,主要由电路中晶体管的漏电流所导致,动态功耗是指芯片发生状态翻转时产生的功耗,主要分为短路功耗和翻转功耗,短路功耗指芯片发生状态转换的瞬间,P管和N管同时导通产生短路电流所引起的功耗,翻转功耗指芯片在“0”,“1”两种逻辑状态之间相互转化的过程中产生的功耗。
芯片的低功耗设计通过不同的设计层次可以分为系统级低功耗设计,体系结构级低功耗设计,RTL级低功耗设计和晶体管级低功耗设计,其设计层次越高对功耗降低的效果越明显。
低功耗设计是IC设计基础能力的组成部分,也是IC设计能力地图中重要的一部分。
对于深亚微米(DSM,deep sub-micron)芯片,例如:0.35um,0.25um,0.18um的物理实施与纳米级(nm,nanometer)的设计中≤130nm,需要在物理实施中考虑的更多,也更复杂。同时互连线延时也会随着工艺的更加先进更加严重。现代电子的发展趋势是:半导体的几何尺寸越来越小、供电电压越来越低、单元的阈值电压越来越小、电路规模越来越大,功耗密度越来越高,漏电流越来越大,在90nm或一下的工艺,静态功耗占整个设计功耗的20%以上。因此对于静态功耗也需要有足够的重视,进行相关的优化与设计。
本文首先分析需要低功耗设计的原因,进一步的,对基本的概念进行介绍以及功耗分析的相关概述。进而针对功耗的问题,在多个layer给出对应的低功耗技术及其优缺点。
便携设备的要求 便携设备电池容量有限,低功耗是决定长时间待机的关键
可靠性的要求 功耗越大,芯片的有源区温度越高,芯片失效率越高 ,寿命越低
芯片性能持续发展的要求 2004年后,功耗超过100W,能耗密度过大加上散热成本过高导致芯片温度超过能忍受的限度,时钟频率无法再提升(饱和值3~4GHz)
节约能源的需求 例:世界范围内的4亿台个人电脑(2000年数据),每年消耗0.16T kW/h(1011度电)的电能,与26个核电站的发电能力相当
4.2.1 基本概念
能耗:执行特定任务所消耗的能量,单位J
功耗:单位时间的能耗,单位W
功耗密度:单位面积或单位体积消耗的功率,单位W/CM²,W/CM³
吞吐率:or 吞吐量,单位时间执行的操作次数、指令个数或者运算次数
MOPS(Million Operation Per Second):每秒执行多少百万次操作
MIPS(Million Instruction Per Second):每秒执行多少百万次指令
GFLOPS(Giga Float-Point Operation Per Second):每秒执行多少个10亿次浮点运算
功耗效率:消耗单位功率能达到的吞吐率有MIPS/mW、 GFLOPS/W等
4.2.2 功耗的分类
一般使用反相器来对功耗相关的概念进行介绍,反相器的电路图如下所示:
从动静态来分,可以分为动态功耗与静态功耗,其中动态功耗又分为翻转功耗与短路功耗,其中时钟频率,电源电压对翻转功耗有着较大的影响,静态功耗指得是漏电流功耗。动态功耗是在电路条件下的功耗,静态功耗是即使电路状态不改变也会产生的功耗~翻转功耗是实现电路功能必须的,称为有效功耗,短路功耗与静态功耗不是实现电路功能所必须的,称为无效功耗。
4.2.3 动态功耗
动态功耗可以分为:
1.翻转功耗(有的地方称为开关功耗,但是笔者认为这个名字不准确,因为开关包含的功耗很多,其实是从英文switching power翻译过来,从switching可以看到,名称想表现是动作。所以称为翻转功耗比较准确)
2.短路功耗(或者称为内部功耗,英文是internal power)
4.2.3.1 翻转功耗(switching power)
Switching power 是一个门电路对输出电容进行充电和放电需要的功耗。简单的说就是一个门电路输出从0变到1和从1变到0所需要消耗的功耗。
Switching power 是动态功耗最主要的组成部分。
下面是一个CMOS非门(反相器)的门电路,输出接了一个输出电容:
CL是输出的电容大小;Vdd是供电电压。这样我们可以计算出传输的功耗为:
f是传输的频率;Ptrans是输出翻转的概率;fclock是时钟频率。
这里用fclock*Ptrans=f是合理的,因为时钟就是输出是否改变的参考,乘以概率,就是翻转的频率。
如果我们定义:
即把电容乘以翻转概率定义为有效电容,那么我们可以得到经常见到的计算公式如下:
推导过程其实很简单,但是这个最终的结果却十分重要。
Switching power 和电压,翻转率,负载电容有关;
Switching power和数据无关,也就传输的数据不会影响翻转功耗,但是数据的翻转率会影响翻转功耗;
Switching power和传输的大小也无关
由这个公式我们很容易得到如果想减少功耗,那么方法就是:
降低电压;
降低翻转率;
减少负载电容
当然,这些方法的前提永远是 芯片的功能要满足要求 。功率再低,功能不满足的芯片和板砖有什么区别,起码板砖还能拍人。
芯片的功能要满足要求这个基础就决定了这些方法有一些限制,比如不可能把电压降到0,不可能让信号永远不翻转,不可能电容减少到0。这些都是前提。
4.2.3.2 内部功耗(internal power)
内部功耗又可以称为短路功耗,因为主要原因是由于短路造成的。短路功耗是因为在输入信号进行翻转时,信号的翻转不可能瞬时完成,因此PMOS和NMOS不可能总是一个截止另外一个导通,总有那么一段时间是使PMOS和NMOS同时导通,那么从电源VDD到地VSS之间就有了通路,就形成了短路电流,如下面的反相器电路图所示:
后面的部分就是短路功耗。tsc是短路电流持续的时间,Ipeak是总的短路电流(包含了内部电容充电的电流)
由于传输中短路持续的时间特别短,短路功耗相比翻转功耗来说小很多。所以一般情况下会忽略短路功耗,把翻转功耗就当作动态功耗,那么动态功耗的简化公式就是:
但是值得注意的是,有的情况下,还是要考虑短路功耗,比如如何处理门控模块的悬空的输出的时候。
4.2.4 静态功耗
静态功耗是由于漏电流引起的,在CMOS 门中,漏电流主要来自4个源头:
亚阈值漏电流(Sub-thresholdLeakage, ISUB): 亚阈值泄漏电流是晶体管应当截止时流过的电流.
栅极漏电流(GateLeakage, Igate): 由于栅极氧化物隧穿和热载流子注入,从栅极直接通过氧化物流到衬底的电流。
栅极感应漏电流(GateInduced Drain Leakage, IGIDL): 结泄漏电流发生在源或漏扩散区处在与衬底不同电位的情况下。结泄漏电流与其他泄漏电流相比时通常都很小。
反向偏置结泄漏(ReverseBias Junction Leakage ,IREV):由少数载流子漂移和在耗尽区产生电子/空穴对引起。
MOS管的结构图如下:
4.2.4.3 亚阈值漏电流(Sub-thresholdLeakage)
亚阈值漏电流(Sub-thresholdLeakage)发生在CMOS gate没有完全关断时。一个比较好的计算公式如下:
W/L是晶体管的尺寸,Vth是热相关常量;Cox/Vth/W/L都是工艺相关,不可以调整。VGS就是VDD;
VT 是阈值电压 ;可以看到,阈值电压越高,漏电功耗就越低。但是阈值电压越高,对应的翻转速度就会越慢,延时就会越大,性能就越差。
可以通过调整VDD/VT来降低漏电流,从而减少漏电功耗。
增加VT会带来性能损失,只能在满足功能需求前提下增加VT;
ISUB只和VDD/VT有关,和信号翻转这些都没关系。这是一个工艺强相关的电流,RTL设计对其无影响。
亚阈值泄漏电流随温度呈指数增长(Vth)。这大大增加了设计低功率系统的复杂性。即使在室温下的泄漏是可以接受的,在最坏的情况下,温度会超过芯片的设计目标。
4.2.4.4 栅极漏电流(Gate Leakage)
栅极泄漏电流发生在一个电压加到栅上时(例如当门导通时)载流子遂穿通过薄栅介质的情况下。
泄漏电流与介质厚度有极强的关系。工艺中通过选择合适厚度的介质将栅泄漏电流限制到一个可接受的水平上。泄漏电流还取决于栅极电压。通过使晶体管堆叠起来并使截止晶体管靠近电源/地线可以使栅泄漏电流减小。
在以往的技术节点中,漏电电流一直以亚阈值漏电为主。但是从90nm开始,门极漏电几乎是亚阈值漏电的1/3。在某些情况下,在65nm工艺下,它可以等于亚阈值泄漏。低于65nm,high-k介电材料必须进行保持门级泄漏电流检查,这似乎是唯一有效减少门泄漏电流的方法。
其他两种流电流占比比较小,所以一般不做分析。有时会把静态功耗统一为一个公式:
Ipeak为泄露电流,减少静态功耗的方法就是减小VDD和Ipeak。
不同结构的功耗组成
SOC中不同结构的对功耗的消耗是不一样的。有几个功耗大户如下:
时钟树功耗:时钟树的功耗通常占整个SOC功耗的40%左右,这是因为时钟是一直在翻转的信号,所以动态功耗特别大。所以门控时钟技术就特别重要。
CPU: CPU是SOC主控制器,工作时CPU一般都必须要打开,随着CPU频率越来越高,功耗也越来越大。所以现在的多核,大小核就比较流行,不同场景下用不同功耗的CPU核;
GPU: GPU是并行处理单元,由于其算力主要来自多个模块并行计算,为了正常工作,通常需要很多模块同时运算,功耗也很大,所以很多SOC都不带GPU或者默认关掉;
存储器:DDR这些存储器作为SOC主存也需要时刻使用,也是功耗消耗的大户。
SOC还有很大其他模块,但是时钟树,CPU/GPU, 存储器占了绝大部分的功耗。在AI芯片的时代,CCN IP也是功耗的主要来源,和GPU比较类似。
4.2.5 功耗相关构成
本节提供一些顶层的数据,对于功耗在各个层次的相关数据进行展示
苹果就是软件+硬件共同实现自己的产品,因此在很多方面做的很优秀~同时我们需要在架构设计的时候就将低功耗方案作为一个设计标准,不能仅仅在编码层次进行功耗的优化。该图来自庄老师PPT
一般时钟树与latch占50%,因此在不需要高频的时候降频,加时钟门控思路是很重要的。I/O占用20%,标准单元占10%,存储模块占用20%。根据设计实验,采用多电源电压的方法可以使得功耗减少30%,门控电路方法可以使得功耗减少50%,衬底电压偏置方式功耗可以减少70%。当然,想来也是一个common部分,不是绝对的,只是一个参考~
低功耗方案
我们前面了解了功耗的来源,组成,及其计算方式,下面将介绍一些各个阶段的低功耗方案
功耗设计决策方案有:系统设计-编码与算法,设计架构-多电源电压,睡眠模式
设计实施阶段有:RTL门控时钟,多域值,微架构(RTL编码阶段),综合布局布线(物理实现阶段)
系统算法级别的解决方案为系统分割,内存组织管理,电源管理,电压频率选择,算法评估,算法转换。这些可能看起来比较笼统,但是确实在设计中是很重要且相对来说比较困难的部分。需要经验丰富,能力全面的工程师来做。同时这些将决定后面步骤的实现。个人理解这里是对每一个功能的解耦,将不同的功能单独分割开,方便后续的实现。
系统与架构层次的低功耗设计,可以节省70%以上的功耗。这个层次上的设计往往是由系统和架构设计人员进行的,这些人员往往是有着丰富经验的设计人员。他们制定了低功耗设计方案,由下一级的设计人员(比如做前端设计、做Flow的人员)进行具体实现。下面就来介绍一下在系统架构方面,可以从哪些方面进行低功耗设计,由于我只是只菜鸟,因此这些内容只是我在前人的经验中进行总结学习的笔记,仅供参考。
5.1.1 多电压设计技术介绍
从前面的功耗方程中,我们可以知道,电压与功耗有着密切的联系。因此功耗的降低可以考虑使用低一点的电压。多电压设计技术有三种方式:
A:各电压区域有固定的电压,如上图(a)所示 ;
B:各电压区域具有固定的多个电压,由软件决定选择哪一个电压,如上图(b)所示;
C:自适应的方式,各电压域具有可变的,由软件决定选择哪一个电压,如上图(c)所示。
A是固定分配的电压;而B和C为动态电压管理,涉及到软硬件协同设计,这里我们放到后面进行介绍。这里主要是从整体上进行介绍多电压设计技术及其要求,然后给出A方式的一个例子以及一个多电压低功耗设计的脚本示例。
5.1.2 多电压综合库及电压模式控制单元
无论是哪一种低电压设计方式,都需要综合库的支出。这低功耗设计的综合库中,需要包含同一个单元在不同电压下的描述。此外综合库还要多电压设计的特殊单元,这些单元主要是:
•电平转换器(level shifter):把高(低)电压区域的信号转换到低(高)电压区域。信号通常包括数据、时钟、扫描链数据等。电平转换器的示意图如下所:
•电源隔离单元(power isolation cell):主要用于模块的输入、输出。它可以关掉电源时,将信号保持为常数,从而避免单元的输入悬空。电源隔离单元如下图所示:
•保持寄存器(retention register):在不工作的情况下,将寄存器的状态保留下来。
电源隔离单元和保持寄存器我们将在后面的电源门控中进行详细介绍,这里先给出一个概念。
为了实现电压的动态管理——无论是使用硬件还是软件进行动态管理,都需要在设中加入电压模式控制单元。一个电压模式控制单元的例子如下所示:
该模块的功能是:系统不工作时, 进入IDLE模式, 这时候可以关掉不工作模块的电源; 当系统工作时, 给工作模块提供正常电压。这个模块可以是软件实现,也可以是硬件实现。
![(https://img-blog.csdnimg.cn/direct/3789f5e33dba4cc78cd1dcd75034083e.png)
5.1.3 多电压设计举例
对于多电压设计(尤其是A设计),关键是电压分配。在划分供电区域时, 要尽量与设计的层次结构一致, 并且要考虑到设计复杂性。 下面例子(左图)中(电压分配采用固定分配方案), 存储器、 处理器核 、 其他逻辑用不同的工作电压。
右图中的设计有3个工作频率,分别为300,250和400MHz。由于单元的延迟与供电电压成相反关系,即供电电压越高,单元的延迟越小。因此为了满足时序的要求,对于工作频率高的模块,使用供电电压高的电源,以降低时序路径中单元的延迟,从而降低整条时序路径的延迟。上例中,工作频率为400MHz的模块,时序要求最高,因此供电电压最高,为1.2V。工作频率为250 MHz的模块,时序要求最低,因此供电电压最低,为0. 8V。通过对不同的模块设置不同的供电电压,可以使整个设计既能满足时序的要求,又可以降低其功耗。使用多电压技术,版图设计时,要产生多个电压区域(Voltage Area),把供电不同的模块,分配到不同的电压区域。
在power compiler中,可以使用"Top Down Compile"的方法进行多电压的功耗设计,一个示例脚本如下所示:
前面介绍了多供电电压设计,同时介绍了使用EDA工具实现的一个示例脚本。多供电电压设计中涉及到电压的动态管理,而动态管理可以使用软件实现,这就设计到了软硬件协同设计的问题。在这里,我们主要介绍软硬件协同设计中的软硬件划分以及电压的动态管理技术。
5.2.4 软硬件划分
系统中的功耗都是硬件单元消耗的,但是软件组织对硬件的功耗有着很大的影响。在设计过程中,系统的功能可以用硬件实现,也可以使用使用软件进行实现。低功耗软件的设计需要注意:在满足系统应用的基础上,速度应该尽可能慢,电压应该尽可能低,尽可能满足时间要求。系统设计者根据规范和自身经验对系统性能进行推测(仿真建模),决定哪一部分使用硬件来实现,哪一部分使用软件来实现,从而达到性能和功耗最佳平衡。这些是系统设计者需要考虑的,这里不进行详细叙述,只需要知道,软硬件划分可以很大程度上降低功耗。
5.2.5 动态电压频率调节DVFS技术
DVFS技术:dynamic voltage dynamic frequency scaling,动态电压频率技术,是一种通过将不同电路模块的工作电压及工作频率降低到恰好满足系统最低要求,来实时降低系统中不同电路模块功耗的方法。
电路模块中的最大时钟频率和电压紧密相关,如果一个电路能够估算出它必须做多少工作才能完成当前的任务,那么理论上讲就可以将时钟频率调低到刚好能适时完成该任务的水平。降低时钟频率意味着可以同时降低供电电压。频率和电压同时降低,功耗就大大降低了。这个是DVFS的原理。
DVFS技术这个种方法属于电压的动态管理,可以通过软件和硬件的方式实现。将DVFS合并到操作系统的调度程序和实时嵌入式任务管理服务当中,利用一个可编程的DC-DC开关电压调节器、一个可编程的时钟产生器和一个宽操作域的高性能处理器等资源进行实现。这种技术的使用需要系统使用者决定,这里不进行详述,只需要知道在系统层面可以考虑使用这种方法进行降低功耗。
5.2.6 低功耗软件(操作系统)的动态功耗管理
前面也说了,可以使用软件的方式进行自适应地选择功耗。在系统软件过程运行过程中,可以在操作系统中加入功耗管理机制,把没有使用到的硬件单元关掉,这便是系统功耗的动态管理。加入功耗管理机制的操作系统的示意图如下所示:
这种功耗的动态管理依赖于前面描述的电压模式控制单元,只不过个单元是用软件进行实现的(因为是操作系统进行动态功耗管理)。具体的功耗动态管理实现这里就不详细说明,这应该是属于系统设计者和软件设计人员考虑的。
系统时钟的分频也是系统层面降低功耗可以考虑的方面。时钟是系统中频率最高的信号,其功耗功之高是不容置疑的。在系统设计层面,可以考虑应用要求,将系统设置为不同的工作模式,加入时钟控制模块,在不同的工作模式下选用不同频率的时钟,并且将一些不需要的模块时钟关闭。时钟的分配可以使用内部的状态机实现,也可以使用软件实现。
例如,可以将系统分为4种工作模式:normal 、 slow、idle、sleep。在不同的模式下,器分频的时钟如下所示:
在系统设计层次上面,还可以通过算法和IP这两个方面降低功耗。
5.4.7 算法
算法级在算法级降低功耗是非常有价值的。 在设计算法时, 要分析该算法需要多少ALU操作, 需要多少次存储器访问, 要尽量使那些耗能多的操作最小化。算法级低功耗设计跟具体设计有关。比如,对于大规模运算的应用(比如FFT),使用对数系统(logarithmic number system,lns)比使用线性系统更好。lns在降低平均位元活跃度(也就是降低0和1的变化程度)的同时使用加法和减法实现乘除法,使效率比线性系统更高。因此基于lsn算法来实现FFT可以节省大量的功耗,但是加法器和乘法器的宽度会增加,使用FPGA实现时就会需要更大的LUT(查找表),而且这个查找表的大小是以指数增长的。
在一些行为综合工具中,可采用延时功耗乘积表示系统的优化目标,以降低完成特定计算所需的状态转换数,生成高效的计算结构。算法这一方面的低功耗设计让算法工程去考虑吧,我们来了解一下就可以了。
5.4.8 IP
现在的SoC设计依赖于IP的集成。在选择IP时,除了考虑到性能要求,还需要考虑到功耗问题。例如,在选择CPU时,可以分析在完成相同的功能时,哪种CPU功耗更大。
在系统层次上,除了可以上面那些因素外,我们还可以考虑异步设计。在现在的系统设计中,一个系统可能使用多个时钟,但是在每个时钟控制的区域内部都设计成一个同步的子系统。通过时钟树综合、插入缓冲器减少时钟的偏移。这种方法在时钟网络上添加了大量的缓冲器,时钟网络消耗的功耗也增加。在异步设计里面,不需要全局时钟,两个模块通过握手信号进行交互,这时候就可以减少功耗。因此异步设计也是降低功耗的一种方法。
在大多是DSP中,需要用到FFT算法。FFT算法需要频繁访问存储器,我们可以在存储器和处理器之间添加缓存,在处理器需要之前,预先将相关数据从存储器中取到缓存里面。使用小范围的缓存能够使计算能耗大量下降,提高的FFT的效能。因此在系统设计的时候,特别是系统架构设计的时候,可以考虑基于缓存的系统体系结构进降低功耗。
系统层次上面的低功耗设计方法还有很多,比如说可测性设计上进行低功耗设计、存储器(内存)的低功耗设计等,这些都可以在系统层次上面进考虑,这里就不一一列出来了。
本节主要介绍物理实施,或者是数字后端阶段进行的低功耗技术:操作数分离(一般由工具来做,手工做若是有时序问题,将很难处理)、门级电路的功耗优化、多电压供电、电源门控(Power Gating)。
操作数隔离(简称OI)的核心思路是在不需要计算的时候,使用使能控制信号将输入数置于某一个固定值,使之不再进行计算,从而降低动态功耗~实现方式可以使用RTL编码的实行或者是指导综合工具(新思的Power Compiler)来执行。这里我们更多的关注基本的原理,就像CDC问题一样,对于工具的使用其实也是根据这些基本原理作为其原则来工作的,工具的使用可以关注UG,有需要的可以进行学习。先看下面的图示
上图当SEL_0不等于1、SEL_1不等于0的时候,加法器Add_0的结果不需要送到寄存器的输入。为了节省功耗,我们将通过改变电路的方式来控制当不需要加法输入的时候,停止送数据到加法器的输入。
我们可以看到这种方式带来的问题很明显的有面积的增大,时序变得更差。功耗再一定程度上有所改善。需要结合设计需求进行选择。同时可以在编码的时候进行相关操作,但是引入的问题是在时序过紧的时候,过多的OI可能会导致时序问题,过少的OI又很难有一个明显的功耗优化~算是有些难以理解的,当然一般还是根据需求,设计人员自行决定是否需要加做OI。使用工具加OI的好处是可以根据时序,时序不紧的路径添加,紧的路径不添加,来实现一个时序(性能),面积,功耗的折中PPA。
门级优化是从已经映射的门级网表开始,对设计进行功耗优化以满足功耗的约束,同时保证设计性能,满足设计规则与时序。门级电路的功耗优化包括了设计总功耗,动态功耗以及漏电功耗的优化。在进行优化时,优化的优先次序如下图所示。
我们可以利用多阈值电压工艺库的特点进行漏电的功耗优化,设计静态功耗低,性能高的电路。一般可以将关键路径选择延时较短的,将非关键路径选择延时长的路径(漏电较小)。
对于动态功耗的优化有如下方式:
修改单元的驱动能力
技术映射:把高翻转率的连线放入单元内,减小开关功耗
交换引脚:把高翻转的连线接到电容值小的引脚
相位分配(不太理解这里是做了什么)
因式分解:其中b是高翻转率的信号
插入缓冲器 :插入缓冲器后,减少了与非门的负载,并使寄存器的输入转换时间变小。
降低供电电压是降低芯片功耗最直接的方式,如下图所示,根据不同的频率要求、单元延时与供电电压成反比关系,对于低频可以使用较低的电压,从而满足时序与低功耗的设计要求。
多电压设计的风格有三种
各电压区域有固定的单一电压
各电压区域有多个固定电压,软件进行控制
采用自适应方式,可以使用软件进行控制
采用多电压技术需要在不同的电压之间进行信号的传递,需要使用电平转换器,将高低电压区域的信号传递到目标电压区域。
电源门控值得是芯片中某个区域的供电电源被关掉,即该区域内的逻辑电路的供电电源断开。
RTL级的低功耗设计技术,这也是数字芯片设计工程师最常用到的降低功耗的设计方法。
由于芯片的时钟树几乎消耗了整个芯片功耗的绝大部分,所以对时钟路径进行门控可以大幅度的降低整个芯片的功耗。时钟门控的基本原理就是把暂时没有发生状态转换的触发器的时钟进行关断。
一般比较常用的是与门时钟门控,当然对应的还有或门时钟门控,与门时钟门控可以用实际电路和时序图表述如下图。
但是如上图所示的时钟门控电路会带来一个问题就是毛刺问题,因为EN使能信号是不受控制的,随时可能跳变,这样的纯组合逻辑输出就很容易出现毛刺,如下图所示,这种毛刺其实对实际电路是非常不利的,因此我们必须设计相应的电路来消除时钟路径上的毛刺。
通过对如上所述的时序图的一个观察,我们可以发现,只要保证在CLK的低电平区域EN才跳变或者说在CLK的下降沿才对EN信号进行采样,就能完美避免时钟毛刺的产生,因此,我们可以引入一个下降沿触发的触发器来实现此功能,形成下降沿触发器+与门的时钟门控电路。
同样地,对于或门时钟门控电路而言,需要保证EN信号在时钟高电平区域进行跳变或者在时钟上升沿对EN信号采样就能避免时钟路径上的毛刺,因此可采样上升沿触发器+或门的时钟门控电路。
在实际的芯片设计过程中,我们利用Verilog语言对整个电路进行描述,其实我们并不需要刻意地去描述时钟门控的具体结构,只要我们的Verilog描述语言符合一定的规范,综合工具则会自动综合成时钟门控电路,推荐的Verilog编码规范如下:
always @ (posedge clk or negedge rst_n) begin
if(!rst_n) begin
out <= 1’b0;
end
else begin
if(en)
out <= 1’b1;
else
out <= out;
end
end
在状态机的编码和解码过程中,采用格雷码最符合低功耗设计。因为格雷码的相邻码元之间只变化一位,所以在发生状态转换时实际上只有一个触发器发生了翻转,但是对于状态编码常用的二进制码和独热码而言,在发生一次状态转换时可能存在多个触发器发生了翻转,那么在状态转换过程中也就消耗了更多的能量。另外使用格雷码的一个好处就是消除了状态转换过程中存在毛刺的风险,降低了亚稳态发生的概率。
在一般的RTL设计中,为了占用更少的触发器资源,我们用二进制编码来进行多路选择,基本的Verilog描述如下:
case (sel)
2’b00: out = a;
2’b01: out = b;
2’b10: out = c;
2’b11: out = d;
default:;
endcase
对应的电路为:
但是由此会带来一个问题就是,如果多路选择的输入为多bit数据,那么在进行多路选择时会发生明显的01翻转,引起开关功耗。但如果对多路选择器采用独热码编码的方式,会降低上述所说的开关功耗,但是由此导致的问题就是会使用更多的触发器资源,独热码编码的多路选择器可简单用Verilog描述如下:
case (sel)
4’b0001: out = a;
4’b0010: out = b;
4’b0100: out = c;
4’b1000: out = d;
default:;
endcase
对应的电路为:
那么使用独热码编码的设计可以提前将未使用的总线隐藏,因此可以实现功耗降低的效果。
操作数隔离简单来说就是对未使用的输入进行隔离的操作。比如一个多路选择器,选择的选项有a_in,b_in,c_in,d_in,,但是如果我们选择之前就知道所选择的选项是a_in,那么其他选项的输入以及输入之后的计算就显得没有必要了,就可以不进行相应的操作,所以操作数隔离就是增加一些选择器件,如果这个操作数不需要的话就不选择它以及不进行这个操作数所需要的相应计算。其基本概念和电路可由如下图所示:
资源共享简单来说就是将电路中功能相同的电路单元进行复用的过程,减少重复逻辑的出现,从而降低功耗。
举一个简单的例子,未使用资源共享的Verilog代码描述:
case (sel)
3’b000: out = 1’b1;
3’b001: out = 1’b0;
3’b010: out = (data1 == data2); // ==
3’b011: out = (data1 != data2); // !=
3’b100: out = (data1 > data2); // >
3’b101: out = (data1 < data2); // <
3’b110: out = (data1 >= data2); // >=
3’b111: out = (data1 <= data2); // <=
endcase
其实通过观察上面代码可以发现,所有的比较器可以只用“==”和“>”两种比较器的复用就可以完成。
assign cmp_equal = (data1 == data2); // ==
assign cmp_greater = (data1 > data2); // >
那么原先的Verilog描述可替换为:
case (sel)
3’b000: out = 1’b1;
3’b001: out = 1’b0;
3’b010: out = cmp_equal; // ==
3’b011: out = !cmp_equal;// !=
3’b100: out = cmp_greater; // >
3’b101: out = !cmp_greater & !cmp_equal; // <
3’b110: out = cmp_equal | cmp_greater; // >=
3’b111: out = !cmp_greater; // <=
endcase
实现了逻辑的重用。
总线反转编码
在总线传输过程中,当当前数据和下一个数据之间的汉明距离(对应bit位不同的个数)大于总线宽度的一半时,就将下一个数据进行反转编码后再进行传输,从而可以减小总线上bit翻转的次数,降低功耗。该技术的缺点就是需要传输一个额外的控制位,用以表征总线数据是进行了反转编码,消耗了系统总线的带宽,基本原理如下图所示:
当然如下图所示的例子说明总线反转编码在降低总线上bit翻转次数上还是有收益的,编码前后bit翻转次数有所降低。
在逻辑云的分类中,第一种是将活跃度高的逻辑云和活跃度低的逻辑云分开,第二种是启用和禁用逻辑云,这两种方法在这里不展开描述,具体原理如下图所示:
活跃度高的逻辑云和活跃度低的逻辑云分开:
启用和禁用逻辑云:
对于数据集成电路的低功耗设计,制造工艺在其中有着很大的影响。另外系统架构工程师,前端开发设计人员,后端设计人员通过相关的技术优化也是很有成效的。
低功耗设计是一套完整的理论体系,从原理、代码、UPF、综合、版图等等,每个步骤的一点点提高,都会带来不同程度的优化,勿以优化小而不为,点点滴滴的进步就会造就更加节能的芯片实现。