5 低功耗设计
5.1 介绍
能量以热量形式消耗。保持低温操作环境意味着使用散热片或风扇来散热一这会增加整体的重量和成本。如果能在 SoC 级对功耗进行控制,就可以减少甚至可能消除掉这些开支,也就可以得到更小、更便宜和更可靠的最终产品。
5.2 功耗源
浪涌、静态功耗和动态功耗是主要的三个功耗源。
- 浪涌: 涌电流指器件上电时产生的最大瞬时输入电流,在应用中称为启动电流。浪涌电流与设备有关(不同设备的浪涌电流是不同的),例如基于SRAM的FPGA有很突出的浪涌电流,因为上电时这些器件没有配置,所以需要从外部存储器中下载数据来配置其编程资源(如布线连接和查找表)
- 静态功耗: 关断主电源或系统进入待机模式下产生的电流,由此电流产生的功耗称为待机功耗。这同样与电气特征密切相关。静态功耗也包含电路中由晶体管的漏电流所导致的功耗。
- 动态功耗:门电路输出切换时,由逻辑转换所引起的功耗。动态功耗=翻转次数 * 门寄生电容 供电电压的平方时钟频率,而ASIC的总功耗为静态功耗+动态功耗。
5.3 在各设计抽象层次降低功耗
在系统级和体系结构级可以达到最大的降低效果。
5.4 系统级低功耗技术
在系统设计之前,必须对系统及其性能以及功耗作为目标进行考虑
5.4.1 片上系统方法
由于I/O使用比芯片内核逻辑更高的电压供电(typical value 3.3v),使得其占到总功耗的50%以上。所以如果整个系统包含多个芯片,这些芯片的连线就会消耗大量的功耗。片上系统方法学主要关注降低功耗,缩减面积以及降低成本的方法 。
5.4.2 硬件/软件划分
系统的设计首先从性能规范开始,决定系统哪些部分使用不同的方法实现,有些使用硬件(verilog),有些使用软件(C语言)。
还可以使用基于模型的方式,模型要么完全自己建立要么使用已复用的已有模型库,随着库的增加,可以缩短设计时间。
5.4.3 低功耗软件
修改应用软件来降低功耗。
比如合并循环等
5.4.4 选择处理器
处理器的选择会对整体功耗产生明显影响。
- 选择合适数据宽度的处理器
例如:使用8位的微控制器来处理16位数据会增加大量排序;对于16位乘法,使用16位处理器需要30条指令(加与移位),而使用8位处理器则需要127条指令;而更好的结构是使用乘加单元(MAC)或16*16位并行乘法器用一条指令执行乘法。 - 选择节省功耗的系统体系结构
使用节省功耗的系统体系结构,利用微处理器进行控制,同时用协处理器或DSP(Digital Signal Processor)进行数据处理(使任务在最小且能耗最高的机器中完成),大多数情况下,微控制器和协处理器不会并行运行。
5.5 体系结构级降低功耗技术
系统使用不同的体系架构对于功耗会有显著的影响。
5.5.1 高级门控时钟
在同步数字系统中,时钟分布贡献了整个数字系统开关功率的绝大部分。在许多情况下可以通过门控时钟将绝大部分不使用的电路关掉。
- 组合门控时钟
组合门控时钟基于从寄存器的输出到输人之间存在着反馈回路这样的事实,所以也称为“基于反馈回路的门控时钟”。注意,在组合门控时钟中,在插入门控时钟之前和插人之后电路的功能并没有改变,所以可以用一致性检查工具进行验证。在本节中我们会接触到一些高级的门控时钟技术。因为组合门控时钟方案在输出不变时使触发器的时钟失效,所以它可以降低5% ~10%的动态功耗。
- 时序门控时钟
时序门控时钟能减少连接到带有门控时钟的寄存器块的设计部分的冗余切换(在不影响设计功能的情况下改变设计结构,由于需要多余逻辑,不适用于多位宽的情况。注意,在使用时序门控时钟时,后序的流水线阶段也使用同样的条件进行门控操作。
使用时序门控时钟最大的挑战在于识别出流水线上“多余的”或“不关心”的状态,一旦这一工作完成,使用时序门控时钟就可以降低大量功耗,典型情况下可以降低 15% ~25%的开关次数。
5.5.2 动态电压频率调节
动态电压频率调节(Dynamic Voltage/Frequency Scaling,DVFS)是提高系统能效的流行方法。在对频率不敏感的应用阶段中降低时钟速率和供电电压,可以在性能适度损失的情况下大幅降低功耗。
在对频率不敏感的应用阶段中降低时钟速率和供电电压,可以在性能适度损失的情况下大幅度降低功耗(但是降低供电电压会降低系统的性能,所以需要作出权衡,而对于一般应用,一般只在很小的时间中需要高性能,而在其余的大多数时间中使用低性能、低功耗的处理器就足够)。现在也有功耗关系芯片控制。
注意:在实时嵌入式系统中,往往不能直接使用DVFS算法,因为改变处理器的操作电压将会影响到任务的执行时间并违反时效性要求(也可以将DVFS合并到OS调度程序和实时嵌入式系统任务管理服务中)
5.5.3 基于缓存的系统体系结构
对大多数DSP,FFT算法要求频繁访问系统存储器的数据,可以在系统存储器或RAM和处理器之间增加缓存。这种方案的最初目的是在处理器需要之前,预先将数据从主存中取到缓存中。使用小范围的缓存能使计算能耗大量下降,极大提高了FFT的能效。
5.5.4 对数 FFT 体系结构
对于大规模运算的应用,使用对数系统(LNS)比使用线性系统更好,LNS在降低平均位元活跃度的同时用加法和减法实现乘法运算,使其效率比线性系统更高,因此可能节省大量功耗。负面影响是加法器和减法器的宽度会增加——导致需要以指数级增大的查找表。
5.5.5 异步(无时钟)设计
对于基于时钟体系结构的同步时钟设计 ,时钟布消耗掉了大部分的能量。传统的设计方法学会形成大规模时钟树结构,这样便潜在地增加了 SoC 的平均功耗。可能存在时钟偏移的问题,即时到达电路不同部分的时间的差异。当电路规模较大并较慢时,时钟偏移无关紧要。但是随着电路工艺缩小和速度增加,时钟偏移的差异就会变得更加明显,需要额外的设计时间和电路来解决这个问题。将时钟分布到整个芯片上并不是一件容易的事,而且可能会产生不规则的版图。此外存在的另一个问题就是相当大的功耗。
由于时钟会导致以上一系列问题,将其从设计中移除是一件很有诱惑力的想法。这就是异步设计的基本意图。然而,并不能简单地直接移除时钟,因为仍需要对电路操作进行某种控制。异步电路本质上进行自我控制,因此也称为自定时电路。
移除时钟使得能效提升。时钟耗费了许多能量,特别在大规模高速系统中,所以将其移除使得能效大大提高。除此之外,因为未工作元件几乎不消耗能量,所以异步电路的动态功耗接近于0。
异步电路基于依赖延迟不敏感编码(delay in-sensitiveencoding)的信号交换接口,其中最流行的是双轨道编码。
双轨道编码用两根线传输每个数据位,因此称为双轨。(单轨只使用根线传输每个数据位。)
“LL”=”无数据“,”LH"=“0”,“HL"=“1”,“HH”=无效。这里L="0"且H=“1”.
5.5.6 电源门控
电源门控通常指在芯片上加入开关以根据应用要求选择性切断供电电源。
1、细粒度电源门控:在每个门和地之间存在一个开关晶体管
2、粗粒度电源门控:创建一个电源开关网络,各组开关晶体管能并行地将整个模块打开或关闭。
5.5.7 多阈值电压
多单元库(包含至少两组功能相同但阈值电压不同)有助于处理漏电和动态功耗的问题。高阈值电压单元较慢但是漏电较少;相反,低阈值电压单元更快但是漏电较多。
5.5.8 多电压供电
在多电压供电(MSV)设计中,设计可以分割为独立的”电压域”,根据每个区域对时序的要求而使用不同的供电电压。
5.5.9 存储器电源门控
在经典的SoC中,SRAM消耗了总功耗的1/3,其余部分由时钟树和随即逻辑消耗掉。
- 使用多个小存储器(一小部分存储器常开)
- 基底偏压存储器(提高了阈值电压并降低了漏电功耗)
- 使用多模式给存储器供电(在读写时,存储器使用全电压供电;在存储器不需要读写,降低供电电压,只需保持数据不丢失即可)
5.6 在寄存器级传输降低功耗
在大规模ASIC中,在RTL完成时至少80%的功耗已经确定。
5.6.1 状态机编码和解码
在各种状态机编码类型,格雷码是最适合低功耗设计
1、格雷码每次只有一个触发器变化,消耗能量小。
2、格雷码消除了依赖于状态的组合等式中存在毛刺的风险。
5.6.2 二进制数表示法
在大多数应用中,用补码来表示二进制数往往比有符号数更常用。然而对于某些只使用积分器进行求和的应用,补码表达法在0到1的转变发生所有位都会发生变化(有较高的开关功耗),相比之下,有符号数只有两个位发生变化
5.6.3 门控时钟基础
让我们考虑一个32位存器“test_ff”,在载人使能“load_cond”为真时会写入32位输人数据值,否则该寄存器的值保持不变。图5.14 是该逻辑的 RTL代码。图5.15 为相应的电路实现。
这种写法,在clock线上不会推出任何门控时钟。
用 RTL 这种编码方式,HDL 编译器可以看到模块的整个图景并能识别“load_cond”为32个寄存器位所共享。此外后端环境设置时也会以加人一个门控时钟(集成化的库单元) 来取代 32 个多路复用器门。集成时钟单元在扫描模式下通常会旁路掉(在图 5.16中未显示)。
对某些综合过程未能识别的情况,可以明确地指定门控时钟对所有功能进行动态控制。
5.6.4 独热码多路器
如果MUX的每个输入都是多位总线,就会产生明显的开关过程,由此产生功耗。如果使用独热码方式,输出就会更快、更稳定,而且在初期就能将未选中总线掩藏,实现低功耗效果。
5.6.5 除掉多余转换
如果转换后的数据未被真实采样,那么它就是多余的,将这样的转换去掉显著可以降低功耗。
例如,如果load_out没有置位,那么前面的操作都是多余的,浪费了能量。
如果load_out没有置为有效,那么load_op也不应置为有效,这样可以节省一部分功耗;仅当sel 为0时才读入A和B,而仅当sel 为1才读入C和D。
图5.21中同样的同一数据输人到所有目标模块中,但是只有“datasel”有效的模块才接收该数据。由于规定“data_sel”每次只有一位有效而所有四条总线分支上都产生了数据切换,这样就导致了不必要的功耗。
图 5.22 是修改后的逻辑,消除了多余转换。新增了一些逻辑门,用来取消未选择的总线分支的转换,这些逻辑门会增加一些功耗,但保证了只有最终选中的目标才有数据切换发生,这样就降低了功耗。
5.6.6 资源共享
如果有同样的操作在多处使用,必须避免相应的运算逻辑在多个位置重复出现。这可以减小面积和功耗。
图 5.24 显示了在各分支条件中只使用一个比较器“==”和算术比较器“>”就实现了上面同样逻辑的功能。
注意: 书中有误 assign cmp_greater = (value1 > value2);
5.6.7 使用行波计数器来降低功耗
每个阶段都进行二分频操作。因为时钟像波浪一样行进穿过系统中各寄存器,所以称为“行波计数器”。由于每个寄存器都存在传播延迟,因此较高有效位相对于较低有效位更晚发生变化。在时钟行进过程中计数器可能产生不正确的值(由于毛刺)。在最高有效位变化时,会产生最坏的影响。
在图5.26 中是计数器从“0111”变为“1000”的时序图,在这个过程中4 个位都发生了变化。在时钟传递过程中会出现短暂的伪输出值。计数器电路会快速在“0111”、“0110”、“0100”、“0000”、“1000”之间变化,即值为 7、6、4、0,然后到 8,而不是干净地从“0111”输出到“1000”
在许多使用环境中,这种效应是在可接受范围内的,因为行波是快速发生的。如果用计数器的输出驱动发光二极管 (LED),根本不会有任何影响。但如果将该信号用于驱动多路选择器,微处理器 (计算机) 电路中存储器的索引指针,或者任何其他伪误差可能导致错误输出的情况,便是无法接受的。
行波计数器对于静态时序分析是一个巨大的挑战,因为行波计数器中每个阶段都产生了一个新的时钟域。这就需要静态时序分析工具处理更多的时钟域,从而会消耗更多的时间。
同理,行波计数器也会为扫描链的插入增加难度。可以在扫描模式下使用多路器对这些寄存器的时钟进行选择,从而使其在扫描模式下处于同一个时钟域中。但是这样会对缺陷覆盖率产生影响,因为新引起的时钟多路器形成了一条无法扫描到的路径。
图 5.27 中的电路可以使计数器不再产生毛刺。接收电路使用低有效使能输人信号,只在时钟为“低”时才读人4 位计数器的值。一旦时钟脉冲置“高”,接收电路就停止响应计数器电路的输出。因为计数电路是正沿触发的,所有计数行为都发生在时钟从低到高的过程中,这样就使接收电路在计数器的4 位输出信切换定之前一直处于无效状态。图5.28 描述了这种行为。
直到时钟信号返回低状态,接收入电路才会开启,这样可以保证所有行波都处于安全稳定状态时新计数值才会读入接收电路。这里时钟信号的“高”时间是一个关键参数:它至少要与计数器的最大行波周期同样长否则,时钟信号会过早开启接收电路,而这时行波过程仍在进行中。总之,行波计数器能减少电路的漏电流并降低电路的功耗,但是在使用时必须非常小心。
5.6.8 总线反转
在当前数据和下一个数据之间的汉明距离大于N/2时(N是总线宽度),就要将一下个数据反向后传输,以减少总线上出现转换的位数量。
5.6.9 高度活跃网络
将活跃度较高的网络和较低的区分开开,置于逻辑云中尽可能深的位置。
5.7 寄存器级低功耗技术
- 技术水平:先进硅处理技术。
- 版图优化: 直接关联的模块在硅片上都应该紧密连接在一起。
- 衬底偏压:衬底偏压减少漏电功耗。采用这种技术,可以将衬底电压偏置,以提高晶体管阈值,因此减小漏电。
- 减少氧化层厚度:降低与阈值电流
- 多氧化层器件
- 利用订制设计减小电容