温度升高->可靠性下降->需要保持低温环境,增加了成本。
功耗源:
(1)浪涌:浪涌电流指器件上电时产生的最大瞬时输入电流(启动电流),浪涌电流与设备有关(不同设备的浪涌电流是不同的),例如基于SRAM的FPGA有很突出的浪涌电流,因为上电时这些器件没有配置,所以需要从外部存储器中下载数据来配置其编程资源(如布线连接和查找表)
(2)静态功耗:关断主电源或系统进入待机模式下产生的电流,由此电流产生的功耗称为待机功耗,同样与电气特征密切相关;而静态功耗也包含电路中由晶体管的漏电流所导致的功耗
(3)动态功耗:门电路输出切换时,由逻辑转换所引起的功耗
动态功耗=翻转次数 * 门寄生电容 *供电电压的平方*时钟频率
而ASIC的总功耗为静态功耗+动态功耗
减低功耗的方法:(系统级、逻辑级、物理级)层次越高对功耗的减低就可能越有效。
(一)系统级低功耗技术
(1)片上系统
由于I/O使用比芯片内核逻辑更高的电压供电(typical value 3.3v),使得其占到总功耗的50%以上。所以如果整个系统包含多个芯片,这些芯片的连线就会消耗大量的功耗。
(2)硬件/软件划分
1、硬软件协同设计的常规方法
系统的设计首先从性能规范开始->决定系统哪些部分用硬件实现(以ASIC的形式),那些部分用软件来实现。也涉及到不同部分的描述,例如硬件部分可以用verilog语言进行描述,软件部分可以用C语言进行描述。此外,接口逻辑
也需要确定下来。
使用硬件综合工具从verilog描述的模块中提取物理模型,编译器也可以将用高级语言编写的程序编译为嵌入式处理器所使用的原生指令集。
使用商业级协同仿真平台在集成环境下已综合的硬件和软件模型进行协同仿真(用于验证设计功能和规范的约束)
2、还可以使用基于模型的方式,模型要么完全自己建立要么使用已复用的已有模型库,随着库的增加,可以缩短设计时间。(可以使用systemC 建立模型,可以用标准C++编译器编译并产生用于仿真的目标代码)
(3)低功耗软件
由于C代码中可能会使用若干循环,可以使用几种技术优化这些循环。
比如将以下代码:
for i := 1 to n
do a;
end;
for i :=1 to n
do b;
end;
将循环合并,由于移除了循环计数器(初始化、递增和比较),使循环指令数目减少
for i := 1 to n
do a;
do b;
end;
基于uP的实现会产生高序列,由于内部寄存器(ALU加法器)可以用来快速地进行这些操作。例如,可能只需一步就可以更新硬件计数器,而在软件中实现同样的操作需要许多时钟周期来顺序执行若干条指令。
(4)选择处理器
1、选择合适数据宽度的处理器
例如:使用8位的微控制器来处理16位数据会增加大量排序;对于16位乘法,使用16位处理器需要30条指令(加与移位),而使用8位处理器则需要127条指令;而更好的结构是使用乘加单元(MAC)或16*16位并行乘法器用一条指令执行乘法。
2、使用节省功耗的系统体系结构,利用微处理器进行控制,同时用协处理器或DSP(Digital Signal Processor)进行数据处理(使任务在最小且能耗最高的机器中完成),大多数情况下,微控制器和协处理器不会并行运行。
(二)体系结构级降低功耗技术
(1)高级门控时钟
1、组合门控时钟:在输出不变时使触发器的时钟失效,所以它可以降低5%~10%的动态功耗(在插入门控时钟之前和插入之后电路的功能并没有改变,所以可以用一致性检查工具进行验证)
2、时序门控时钟:时序门控时钟能减少连接到带有门控时钟的寄存器块的设计部分的冗余切换(在不影响设计功能的情况下改变设计结构,由于需要多余逻辑,不适用于多位宽的情况)
使用时序门控时钟在于识别流水线上“多余的”或“不关心”的状态,而这样使用时序门控时钟就可以降低大量功耗,典型情况下可以降低15%~25%的开关次数
(2)动态电压频率调节(Dynamic Voltage/Frequency Scaling,DVFS)
在对频率不敏感的应用阶段中降低时钟速率和供电电压,可以在性能适度损失的情况下大幅度降低功耗(但是降低供电电压会降低系统的性能,所以需要作出权衡,而对于一般应用,一般只在很小的时间中需要高性能,而在其余的大多数时间中使用低性能、低功耗的处理器就足够)
注意:在实时嵌入式系统中,往往不能直接使用DVFS算法,因为改变处理器的操作电压将会影响到任务的执行时间并违反时效性要求(也可以将DVFS合并到OS调度程序和实时嵌入式系统任务管理服务中)
DVS:一个可编程的DC-DC开关电压调节器,一个可编程的时钟产生器和一个宽操作域的高性能处理器。
(3)基于缓存的系统体系结构
对大多数DSP,FFT算法要求频繁访问系统存储器的数据,可以在系统存储器或RAM和处理器之间增加缓存。
(4)对数FFT体系结构
对于大规模运算的应用,使用对数系统(LNS)比使用线性系统更好,LNS在降低平均位元活跃度的同时用加法和减法实现乘法运算,使其效率比线性系统更高,因此可能节省大量功耗。负面影响是加法器和减法器的宽度会增加-导致需要以指数级增大的查找表。
(5)异步(无时钟)设计
为了避免时钟偏移->时钟(形成大规模时钟树结构)->增加了SOC的功耗
其中两个模块使用握手接口进行交互:(由于未工作元件几乎不消耗能量,所以异步电路的动态功耗接近0)
异步电路基于依赖延迟不敏感编码,双轨道编码用两根线传输每个数据位(单轨只使用一根线传输每个数据位)
“LL”=”无数据“,”LH"=“0”,“HL"=“1”,“HH”=无效。这里L="0"且H=“1”.
(6)电源门控
电源门控通常指在芯片上加入开关以根据应用要求选择性切断供电电源
1、细粒度电源门控
在每个门和地之间存在一个开关晶体管
2、粗粒度电源门控
创建一个电源开关网络,各组开关晶体管能并行地将整个模块打开或关闭。
(7)多阈值电压
多单元库(包含至少两组功能相同但阈值电压不同)有助于处理漏电和动态功耗的问题。高阈值电压单元较慢但是漏电较少;相反,低阈值电压单元更快但是漏电较多
(8)多电压供电
在多电压供电(MSV)设计中,设计可以分割为独立的”电压域”,根据每个区域对时序的要求而使用不同的供电电压。
(9)存储器电源门控
SRAM消耗了总功耗的1/3->
(1)使用多个小存储器(一小部分存储器常开)
(2)基底偏压存储器(提高了阈值电压并降低了漏电功耗)
(3)使用多模式给存储器供电(在读写时,存储器使用全电压供电;在存储器不需要读写,降低供电电压,只需保持数据不丢失即可)
(三)寄存器传输级降低功耗
在大规模ASIC中,在RTL完成时至少80%的功耗已经确定。
(1)状态机编码和解码
在各种状态机编码类型,格雷码是最适合低功耗设计
1、格雷码每次只有一个触发器变化,消耗能量小。
2、格雷码消除了依赖于状态的组合等式中存在毛刺的风险。
(2)二进制数表示法
在大多数应用中,用补码来表示二进制数往往比有符号数更常用。然而对于某些只使用积分器进行求和的应用,补码表达法在0到1的转变发生所有位都会发生变化(有较高的开关功耗),相比之下,有符号数只有两个位发生变化
(3)门控时钟基础
code style1:
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
test_ff<=32'h0;
else
test_ff<=test_nxt;
end
assign test_nxt = load_cond?test_data:test_ff
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
test_ff<=32'h0;
else if(load_cond)
test_ff<=test_data;
end
(4)独热码多路器
表示多路器(MUX)最常用的方法是使用二进制编码log2(N)
case (sel)
2'b00:out=a;
2'b01:out=b;
2'b10:out=c;
2'b11:out=d;
endcase
如果MUX的每个输入都是多位总线,就会产生明显的开关过程,由此产生功耗。如果使用独热码方式,输出就会更快、更稳定,而且在初期就能将未选中总线掩藏,实现低功耗效果。
case (sel)
4'b0001:out=a;
4'b0010:out=b;
4'b0100:out=c;
4'b1000:out=d;
endcase
(5)除掉多余的转换
如果转换后的数据未被真实采样,那么它就是多余的,将这样的转换去掉显著可以降低功耗。
如果load_out没有置为有效,那么load_op也不应置为有效,这样可以节省一部分功耗;仅当sel 为0时才读入A和B,而仅当sel 为1才读入C和D
新增一些逻辑门,用来取消未选择的总线分支的转换,这些逻辑门会增加一些功耗,但保证了只有最终选中的目标才有数据切换发生,这样就降低了功耗。
(6)资源共享
如果有同样的操作在多处使用,必须避免相应的运算逻辑在多个位置重复出现
(使用重复逻辑会增大面积,而且增加功耗)
always@(*)
begin
case(sel)
3'b000:out=1'b0;
3'b001:out=1'b1;
3'b010:out=(value1 == value2);
3'b011:out=(value1 != value2);
3'b100:out=(value1>= value2);
3'b101:out=(value1<= value2);
3'b110:out=(value1< value2);
3'b111:out=(value1 > value2);
endcase
end
只需一个比较器 == 和算术比较器 > 就实现了上面同样逻辑的功能
assign cmp_equal = (value1==value2)
assign cmp_great = (value1> value2)
always@(*)
begin
case(sel)
3'b000:out=1'b0;
3'b001:out=1'b1;
3'b010:out=cmp_equal;
3'b011:out=!cmp_equal;
3'b100:out=(cmp_equal || cmp_great);
3'b101:out=!cmp_great;
3'b110:out=!cmp_equal && !cmp_great;
3‘b111:out=cmp_great;
endcase
end
(7)使用行波计数器来降低功耗
(四)寄存器级低功耗技术
(1)通过更先进的硅处理技术,可以额外降低功耗
(2)版图优化
所有直接关联的模块在硅片都应紧密挨在一起
(3)衬底偏压
衬底偏压减少漏电功耗。采用这种技术,可以将衬底电压偏置,以提高晶体管阈值,因此减小漏电。
(4)减少氧化层厚度
氧化层作为门栅和沟道之间的绝缘体,常常做得尽可能薄,以使晶体管在打开时将沟道的导电性和性能增大,并在晶体管关闭时将阈限下漏电流降到最低
(5)多氧化层器件
(6)利用定制设计减小电容