低功耗设计概述
低功耗设计动机
- 功耗的增加影响芯片Power grid(电源网格)的设计;
- 功耗的增加导致芯片温度的上升,进而带来一系列影响。如Leakage Power增加;电路时序可能变差;IR Drop(IR压降)变大;
- 功耗的增加导致芯片封装成本和散热成本的增加(packing cost、cooling cost)
- 功耗的增加会影响芯片的长期可靠性(Long Term Reliability);
- 对于便携设备来说,功耗的增加会导致电池寿命的降低和重量的增加;
- 某些产品对对耗电有严格要求,例如基站的用电成本占运营商开支的30%。
CMOS电路功耗来源
CMOS电路功耗=动态功耗(Dynamic Power)+静态功耗(Static Power).
(1)静态功耗(Static Power)
静态功耗(Pstatic)是指电路不翻转时所消耗的功耗,器件中所有晶体管的漏电流(源极到漏极以及栅极泄露)引起的功耗,以及任何其他恒定功耗需求,即leakage power。电路处于静态时,由于 CMOS管没有完全关断,源漏之间的亚阈值电流和有源区与衬底之间的反向漏电流仍会造成功耗消耗。静态功耗主要由上述两种漏电流造成。
,其中Igate为有源区与衬底之间的反向漏电流,Is→d为源漏之间的亚阈值电流。
- 静态功耗增加的比例大约是温度增加的3次方(或1.03倍)
- 随着工艺提高,要求沟道相对宽度L减小,漏电流越大;
- 静态功耗与供电电压呈线性关系
(2)动态功耗(Dynamic Power)
动态功耗(Dynamic Power) = 开关功耗(Switch Power)+ 短路功耗(Short-current Power)
Switch功耗(Pswitch)是指CMOS电路输出发生翻转时对负载电容充放电时所消耗的功耗。负载电容包括net电容和gate电容,
其中,A为电路翻转活动因子,C为电路负载电容和固有电容,f为电路工作频率。Switch功耗与供电电压呈平方关系,随逻辑反转率线性增长;逻辑的布线影响C,进而影响动态功耗,C是同等规模FPGA比ASIC功耗大的主因。
Short-current功耗(Pshort)是指 CMOS电路的输入变化导致输出状态翻转的时候,在电源和地之间形成的短暂通路所消耗的功耗(可以理解为Q1、Q2的延迟不一致,当Q1导通时,Q2也导通,会形成一瞬间的VDD到GND的通路), Pshort = A*V*Isc*f,其中,A为反转活动因子,V为供电电压,Isc为短路电流,f为运行频率。
功耗优化时间窗
低功耗设计涉及系统设计、架构设计到生产工艺的各个阶段,不同的设计层次采用相应的功耗优化设计技术。实践证明,按照自顶向下的电路设计方法,在不同设计层次上对功耗进行优化时,改善的程度是不同的:设计层次越高,优化所能达到的效果越好。
以微处理器设计为例,在系统结构级上进行优化,它们的优化程度20%~90%不等,RTL(寄存器传输)级优化程度为10%~15%,而到版图级时优化程度则小于5%。
低功耗设计目标的实现是权衡收益与代价的结果。芯片设计是一个追求性能、面积和功耗等多个设计目标的过程。总的来说,面积 、成本、性能、功耗、风险、进度等因素都是相互关联和相互影响的,优化芯片的功耗势必会影响到芯片的其它方面,例如高性能必然伴随着高功耗。低功耗设计的目标就是采用各种优化技术和方法,在各个设计目标之间找到最佳的结合点,选择一种较好的折衷方案。
低功耗编码
复位方案
复位信号的扇出和功耗,都仅次于时钟网络,设计原则上要简化复位网络,减少对布线资源的占用。大规模逻辑的reset的网络占用了走线资源,如果能省掉一半的reset布线,其他信号就拥有了更多的布局布线选择,拥塞会缓解,时序有优化,功耗同样可以优化。
建议数据路径尽量不用reset,控制路径如果必须用,也尽量用同步复位。ASIC芯片无复位寄存器面积小于带复位寄存器,功耗也小。例如3种28nm HPTSMC工艺下的寄存器参数,可以发现同一类型下面积差别如下;
同步复位比无复位的REG面积大约5~15%左右;
异步复位比同步复位的REG面积大约0~10%左右;
Memory方案
设计原则:合理使用Memory模式,降低Memory组件功耗。
设计原则描述:系统设计时,优化Memory数目和大小。大规模逻辑Memory功耗占比较高,通过控制Memory使用,减少Memory反转,降低Memory功耗。
- 在设计上尽量减小Memory的大小,减小无效读写次数,避免无效访问。尽快利用计算后的结果,减少对临时存储的需求。
(bit) | Memory Type | Memory Lib | Area (um2) | Iwr (uA/MHz) | Ird (uA/MHz) | clk (MHz) | Irent1 (uA) | Irent2 (uA) | Itotal (uA) |
1024x64 | sprf | spsram | 18211.4 | 3.682 | 2.792 | 50 | 6.302 | 5.03 | 330.002 |
2048x32 | sprf | spsram | 17446.3 | 2.546 | 1.993 | 100 | 6.256 | 4.648 | 460.156 |
4096x16 | sprf | spsram | 17446.3 | 2.101 | 1.895 | 200 | 6.191 | 4.533 | 805.391 |
上表为22nm工艺下,不同深度x位宽的memory的面积和功耗结果。其中,读/写的电流分别为Ird/Iwr;在吞吐量一致的情况下,读写时钟分别为50MHz、100MHz、200MHz。两种retention场景下的漏电流分别为Irent1和Irent2,计算Itotal时取两种场景的最大值。可以看出Memory的深度x位宽一样的情况下,位宽越大,静态功耗Irent1和Irent2越大,但动态功耗越小(Iwr+Ird)。因此在制定Memory方案时,需要提前综合,对比不同方案的面积和功耗。
- 门控处理:用Memory的片选信号(或者读写使能)对时钟和地址/数据总线进行门控处理,减少时钟和地址总线不必要的翻转。例如某些Memory在某种工作模式下没有用到,则可以关闭时钟信号。在没有读写操作时必须为无效状态,地址在没有读写操作时必须为固定值,例如为上一次操作的历史值。
- 存储器分片处理,减少同时访问Memory块数,降低整体功耗。通过将系统所需要一定容量的存储器分成多块,然后高位地址线进行片选译码。通过这种分片方式,来降低Memory访问功耗,适用于大块Memory。越大的Memory,时序越差;分片处理可降低Memory功耗,对Timing也有好处,但是对面积指标会有影响。将小的Memory合并为大的Memory,可以减小面积;将大的Memory拆分为小的Memory,可以降低功耗和优化时序,这两者在设计时需要进行折中权衡,例如:1024*32的两块RAM和2048*32的一块RAM。面积:1块2048的比2个1024的小;功耗:采用2块1024的RAM,每次读写只操作了2块中的一块,读写的动态功耗小。采用1块2048的RAM,读写的总次数不变,但是由于每次操作的都是一块大RAM,读写的动态功耗大。
平均动态电流(mA) | 芯片面积(mm2) | |
优化前 | 13.4 | 6.4 |
优化后 | 11.2 | 6.4 |
- 小深度的RAM由寄存器数组替换,深度小于64的RAM,建议用存器数组来实现,功耗和布局上都有帮助。
- WRITE_MODE推荐全部用NO_CHANGE模式,功耗最优。
- RAM的读使能启用,不访问时建议启用ram sleep mode。并且RAM读出的数据用读使能锁存,减少数据的翻转。
- 挖掘更有效的数据存储格式,减少对冗余信息的存储。
- 采用合理高效的层次化Memory结构,提高Memory使用效率,合理安排片内片外Memory比例。
- 控制对Memory的读写操作次数,提高读写效率对Memory地址和数据总线的处理。
- 编码处理:对地址总线进行编码,编码的目的是为了降低地址总线的翻转率;例如,对于深度为2^n,并且地址规律递增或者递减可以进行格雷码编码,减少地址bit位翻转,降低功耗。
- Memory选型
对于ASIC:
- 如果Vendor提供低功耗Memory库,在性能和面积满足要求的情况下,建议选用低功耗Memory库。通常我们以端口功能来对Memory分类,对应到物理实现上,每一种memory,都有多个不同的类型可以选择,包括HSD(高速)、HDE(高密度)等。Memory的功耗、面积与其bit数,并不是理想的比例关系,具体选择哪一种memory类型,需要实际综合一下看看。另外注意进出低功耗模式有时间开销,需要在设计中提前考虑能否及时切换。
- SRAM和RegFile之间的选择:如果SRAM和RegFile深度和位宽规格相同对两者的面积和功耗进行评估,从中选择更优的。
- 一般Memory具有Power gating/power retention等低功耗特性,支持这些低功耗特性的Memory面积会稍稍变大,根据应用场景分析且在面积成本可接受的前提下,推荐选用这些低功耗特性Memory;可在Memory idle条件下彻底关断电源以节省漏电。
对于FPGA:
- WRITE_MODE推荐全部用NO_CHANGE模式,功耗最优。
- 大块的RAM使用URAM替代(X 16nm FPGA以后);
- RAM的读使能启用,不访问时建议启用ram sleep mode。并且RAM读出的数据用读使能锁存,减少数据的翻转。
组合逻辑电路
设计原则:优化流水线,减少组合逻辑毛刺,降低功耗。
设计原则描述:组合逻辑,尤其是异或逻辑,每次输入的任何变化都会改变输出值,对于高位宽XOR逻辑,功耗会非线性增加。
插入REG分解流水
加解密压缩以及CRC模块存在大量高位宽的XOR逻辑,导致信号反转率飙升,信号消耗的功耗较大。解决办法是在中间插入寄存器,但会额外增加一个周期的延时,如果无法承受这部分时延,建议插入下降沿触发器,这会影响时序,但对功耗有帮助。
操作数隔离技术
对设计中的算术运算单元做操作数隔离设计,主要思想是:在不进行算术运算的时候,使这些模块的输入保持不变,不让新的操作数进来,使得输出结果不会翻转;而在进行算术运算的时候,再将它们打开。从而去除算术单元的冗余运算,达到降低翻转率的目的。以乘法器为例,是一个组合逻辑,输入数据如果一直在变化,那么这个乘法器会一直有相应的动态功耗。
超前计算技术的本质是操作数隔离,主要针对复杂运算。一般地,一个复杂的运算过程通常由很多计算步骤组成,而这些计算步骤由不同的功能逻辑完成。针对某一种具体的输入,有些计算步骤其实并不需要,可以简化关键是如何判断。因此,可以通过超前计算来形成判断条件,由此来判断是否可以简化计算步骤。如下图所示,如果这个比较器的位数很大,这种超前计算结构几乎可以节省一半的功耗。
还有基站、WIFI等芯片的接收链路,只有在AGC锁定后(agc_locked=1)才会正常工作,因此接收链路会用agc_locked做CG(降低时序逻辑的功耗),另一方面也会用agc_locked对输入的I/Q数据做操作数隔离,即只有AGC锁定后,才会把ADC变化的数据输出到下一级(降低组合逻辑的功耗)。
思考:
XXX模块的功能是当输入数据过大时,将其乘以一个系数。系数为coef=F(x)计算过程复杂。
方案A:每个数据都进入F(x)的计算。根据x的大小判断是否要与系数相乘。
方案B:先判断x的大小。当x过大时,才计算相应的系数F(x)。
你会选择哪种方案?
状态机的编码优化
状态机编码对信号的活动性具有重要影响,通过合理选择状态机状态的编码方法,减少状态切换时电路的翻转,可以降低状态机的功耗。其原则是:对于频繁切换的相邻状态,尽量采用相邻编码状态机编码,如优先使用格雷码,保证在相邻状态切换时,只有1bit翻转。对于位宽较窄的计算器,分频器也可以借鉴此类方法。小型状态机可以选择使用one-hot/one-cold编码。
状态编码使用最少的比特。最多使用Log2N向上取整个比特进行编码。避免频繁迁移的状态间有大量比特翻转,避免状态机中存在冗余状态。
降低频繁开关信号的逻辑深度
重新安排"if-else"表达式,可将毛刺或快变化信号移至逻辑锥体的后部。这样既减少了开关动作的传播,又降低了功耗。
其他
- 如果一个信号的值是”Dont Care”的,那么保持它最后的动态值,而不是强制地使它为1或者为0。减少无谓的比特翻转,同时,便于综合器方便插入时钟门控,提高寄存器门控比例。例如case语句中的default部分。
- 采用特定的编码风格,充分利用综合工具对DataPath的优化。例如使用signed/unsigned进行有符号数/无符号数的转换和运算。两个有符号数相乘,使用signed转成有符号数后,用”*”来写乘法运算,可以充分利用综合工具的优化功能,对DataPath进行自动优化,达到更优的面积和时序性能。简单地说,手动补符号位等操作,会让综合工具识别不出DataPath。总之,就是把数据运算的部分写在一起,直接使用”+"、”-"、"*"符号,以及$signed等,让综合工具能够理解代码的DataPath,才能更好的优化功耗、时序和面积。
- 通过并行结构与流水线技术降低功耗。n个并行度可以把每个模块的速度降低为原来的1/n。根据延时和工作电压的线性关系,工作电压可以相应降低为原来的1/n,电容增大为原来的n倍,工作频率降低为原来的1/n,功耗降低为原来的1/n2。
ASIC低功耗技术
根据前面分析,影响CMOS电路功耗的因素可以总结为下表:
表xx 影响CMOS电路功耗的因素
影响因素 | 动态功耗 | 静态功耗 | 降功耗技术举例 |
供电电压 | √√√√ | √√ | Multi-Vdd、Power-gating、DVFS/AVS等 |
工艺 | √√√ | √√ | Multi-Vt等 |
环境(如温度) | √ | √√ | |
工作频率 | √√ | / | Clock-gating、DVFS等 |
翻转活动因子 | √√ | / | 自动时钟门控编码、Memory低功耗处理、操作数隔离技术、状态机优化编码等 |
翻转电容 | √√ | / | 优化面积、降低信号fanout |
通过对影响CMOS电路功耗的因素进行分析,ASIC可以通过下面技术降低功耗。
低功耗设计技术 | 简介 |
Clock Gating技术 | 时钟门控技术,通过在电路中加入时钟门控单元,在电路不需要工作的时候控制时钟关闭,降低动态功耗。 |
Power Gating技术 | 电源关断技术,通过控制板级或Vendor提供的片内电源开关单元在不需要某些模块工作时,关断该模块的电源电压,降低静态功耗。 |
Multi-Vdd技术 | 多电压供电技术,也叫Multi-Voltage技术,性能需求低的模块使用较低电压供电,降低动态和静态功耗。 |
Multi-Vt技术 | 多电压阈值技术,在时序宽松的路径采用静态功耗低的High Vth逻辑单元库,通常在综合、后端实现,降低静态功耗。 |
DVFS/AVS技术 | 动态调压调频/自适应调压技术,根据芯片内部的实时状态,动态调整芯片的供电电压和芯片的时钟频率,降低动态和静态功耗。 |
Clock Gating
Clock Gating(门控时钟)技术通过时钟门控单元将不需要工作的电路的时钟关断,达到降低功耗的目的。时钟树的功耗消耗达到芯片动态功耗的30%~60%,因此,电路不工作时关断时钟是目前降低动态功耗最常用和最成熟的手段之一。时钟门控通常可以按照“模块级门控”和”电路级门控”归为两类。
(1)模块级门控
模块级时钟门控是对模块整体进行门控,通过例化门控单元将空闲模块的时钟关断或者降低时钟工作频率。
通常统一编码成独立的CRG(时钟复位)模块实现。模块级门控实现粗粒度的时钟门控,需要模块按照功能独立性划分。门控开关通常可以由软件静态配置,也可以设计逻辑更精确地自动门控。
对复杂模块内部的二级模块,建议支持时钟自动门控。时钟自动门控使能信号由逻辑自行产生,时钟自动门控支持Bypass功能,即软件可以force on。
在使用模块级门控时,要尽量减少时钟门控的级联。时钟门控不得超过两级;多个门控的条件,可以先进行逻辑运算,通过一级时钟门控控制,而不是多级门控级联。多级CG串联,会导致CG使能端的寄存器时序难收敛;级数越多,时序越难收敛。
(2)电路级门控
除了例化门控单元,综合工具还能够根据RTL自动综合出时钟门控电路。还有可能省面积(多个MUX转换成一个门控时钟器件)。工具自动转换,不必更改代码,容易实现。但要求RTL在编码时要注意编码风格,以尽可能提高门控的覆盖率。
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
q <= 32'b0;
else if(data_vld)
q <= data_in; //(接收新数据)
else //保持不变
;
值得注意的是电路级CG并不是所有情况下都是功耗/面积最优的,会受工艺/寄存器位宽等影响。在40nm和22nm工艺,寄存器位宽大于3时,采用电路级CG会比数据做MUX更省面积和功耗。
在用spyglass进行功耗分析时,可以设置如下option:
set_option sgsyn_clock_gating true
set_option sgsyn_clock_gating_threshold 4
即spyglass会检查位宽大于等于4的寄存器的编码风格,是否符合电路级CG要求。并且可以报告出哪些不符合要求的寄存器,以及通过电路级CG可以优化多少功耗。
在DC综合时可以设置如下命令实现电路级CG的综合(编码风格符合要求,且寄存器位宽大于3):
set_clock_gating_style -mininum_bitwidth 3(set_clock_gating_style 有三个关键的option,-minimun_bitwidth/-max_fanout/-num_stages,最好根据需求都设定)
compile_ultra -gate_clock -scan
Power gating
Power Gating概述
Power Gating即电源关断。指芯片中按照功能划分为多个电源域,并可以控制分别断电。 Powergating可以消除整个被关断模块的功耗。
Power gating可以由板级控制上下电或者由片内MTCMOS开关单元控制上下电。Power gating需要进行专门的上下电顺序的设计,和详尽的RTL功能验证,保证系统上电之后能够正确恢复工作。Power gating技术需要使用特殊的库单元配合完成,各模块在下电之前,必须先用Isolation Cell对其输出信号进行隔离。片内控制各模块的上下电还需要专用的Power Switch Cell。如果gated block的某些寄存器值不想丢的话,这些寄存器可以用retention registers。大致原理就是用特殊的具有低功耗模式的寄存器,在低功耗状态下值不可变,但是能保留。
Power Switch Cell
Power Switch Cell是电源Switch Cell,用来控制片内某区域电源的开关的专用逻辑Cell,它通过关断芯片中暂时不需要的某个区域或者某个子模块的供电电压,来达到降低静态功耗的目的。通常使用MTCMOS Cell实现。
对于电源控制,通常有两种办法,一种是控制VDD,另一种是控制VSS,只要关闭其一即可。所以电源开关的类型就分为两种,header和footer,如下图所示:
header用pmos 控制VDD的关断,footer用nmos 控制VSS的关断。一般通常采用高阈值的管子做开关管,来降低泄露功耗。
一般来说,只需要使用Header Switch或者Footer Switch就可以实现电路关断,其中Header Switch结构漏电较小,而Footer Switch结构控制效率高,且面积较小。在实际应用中,因为其漏电(leakage)低和实现的便利性,往往都是选用Header类型的Power switch cell。
另外,所有的Header或者Footer也不能同时一起打开或者关闭,因为这样在电源或者地上会有很大的电源噪声(IR drop);为了避免这种现象,合理的做法是让模块内部依次上电,而不是同时上电,目前设计中广泛采用菊花链结构(也就是前一个电源开关打开后会有一个输出,连到后一个电源开关的控制输入端,以此类推,把所有的开关串成一条链),多个Footer或者Header之间插入Buffer,每隔一段时间开启/关闭一组,再隔一段时间开启/关闭另外一组,直到最后所有的switch cell开启/关闭为止。
Isolation Cell
什么是 iso cell
Isolation Cell是一种确保供电关闭区域输出信号不被悬空的特殊电路,起到不同电压域之间的电压钳制和隔离作用,从而避免了不定状态的传播。isolation cell是shutdown模块和always on模块之间的接口,用于隔离两个不同的 power domain。
isolation cell示意图如下:
iso cell 有一个控制端 EN:
当 EN 无效时, A 端信号直接送到 Y 端,此时 iso cell 等效于一个buffer;
当 EN 有效时,buffer 断开,Y 端保持固定到高电平或者低电平;
为了保证isolation cell能够在power down的时候仍然能够正常工作,一般来说isolation cell都会有一个primary power和一个secondary power,后者能够保证前者power down时器件仍然能够工作。即如上图所示,iso cell 的两组 power:primary power VDD 和 backup power VDDB,当 左边domain 关掉时, VDD off,此时就由 VDDB 供电,维持 Y 端的固定电平。
如何使用 iso cell
通常isolation cell和Level Shifter一起连用,AND和OR门都可以组成一个isolation cell;
1. AND类型:输出iso成0;
2. OR类型:输出iso成1;
何时需要用到 iso cell
当信号从一个module传入另一个module,如果shutdown模块的电源关闭,则输出信号可能出现不可预测的数值,若此数值传递给always on模块,可能会导致功能出现问题。因此需要将电源关闭module的输出信号和其他module隔离开来,给所有的边界信号加入isolation cell。
isolation cell的作用在于在电源关掉之后,将某个信号电位固定到高电位或低电位,保证输出的信号是一个确定值(1或0)。如下图所示:
当信号从一个 off domain 穿到 另一个 domain (on 或者 off)时,如果 domain A 关掉,而 domain B 还在运行,就会出现 B 的input floating,此时 B 就可能会因为输入不定态而出现错误;所以当信号从 A 到 B 时,需要加 iso cell,保证在 A 关掉时,A 的输出信号维持在稳定的电平;
iso cell的插入位置?
关于isolation cell的插入位置,我们需要决定是放在power gated module (source module)内还是always-on module (destination module)内。
- 插在 source module 的ouput 端一是可以节省所需要的 isolation cell 数量,考虑一个模块引脚的输出连到多个模块引脚的输入的情况,二是便于检查。
- 插在destination module的input 端优点是 isolation cell 需要 always-on 的 power。若放在 source module的output端,还需要引 always-on 的 power rail 过来。
(考虑到power-on rail的走线,isolation cell自身的功耗,一般还是放在input端比较好,因为放在input端不需要always-on的power)
不管放在那里,其power的连接都需要注意:isolation放置的地方都需要gated power和always-on power同时存在并且物理和逻辑连接都正确,因此经常会把isolation cell指定一个固定的区域放置,可以选择在此区域中打上两种不同的power stripe和power rail来连接它们,或者选择让工具以自动routing的方式将secondary power连接起来,后者主要出现在非先进工艺中。
总结:
isolation_cell放在哪个domain,或者独立呢?可以从几个角度思考:
(1)isolation_cell电源问题。
isolation_cell工作的意义就在于power_gated_domian关闭不影响always_on_domain,所以其本身要工作至少不能使用power_gated_domian的电源。所以isolation_cell放在always_on_domain或者独立更好。
(2)isolation_cell数量问题。
对于power_gated_domian:always_on_domain=1:n时,即可关电模块的信号要输出给很多其它模块用,isolation摆放在source端可能更合理一点,因为如果放在destination端就要在每个用到这个信号的模块内都实现isolation;isolation放在source端带来的一个潜在问题是,可关电的模块内部要给isolation提供常开电源。所以具体情况还是要结合具体设计需求做trade-off,不能一概而论。
(3)isolation_cell所占的面积问题。
如果isolation_cell独立,单个isolation_cell所占的面积可以稍微大一些。因此,可以看出isolation_cell的位置是与具体的场景有关,并不是唯一的。
如果power_gated_domian:always_on_domain=1:1, 那放在always_on_domain中应该是最优解,因为可以直接使用电源,数量为1,面积最小。
注:
- power_gated_domian:电源可关闭域,即低功耗下,为关闭状态。
- always_on_domain:电源常开域,即器件主要处理域,电源工作状态不可关闭。
Retention Register
在电源关断模块有可能要求register对关断前的数据进行锁存或者在电源打开后要求对锁存的数据进行恢复,这就需要特殊的单元Retention Register。
retention register有两组寄存器,main 寄存器和shadow寄存器;它有两个电源,一个用于模块电源未关断时的工作用电,一个用于模块电源关断时的用电;它还有两个控制信号save和restore,用于控制是否锁存数据或者恢复数据。
如上图所示,这个寄存器需要有两个电源,一个是常开的VDD_BACKUP,给shadow寄存器用,另一个是可以关断的VDD,给Main寄存器用。
在需要保留状态时,使能SAVE信号,Main 寄存器的值就被保留到shadow寄存器中,然后即使VDD关闭了,shadow寄存器的值也会保留。当模块再次上电,通过使能RESTORE信号,就可以把shadow寄存器的值写回Main 寄存器中;
对于可以关断的Power Domain,如下图Block1内的PD1,在关断电源之后,内部数据全部丢失,如果想在断电后仍然保存这些数据有几种方式:
(1)在断电前,将内部数据存到Block外部的RAM中,等上电之后再将数据读回;
(2)将一些不希望掉电的模块集中到一起,放在always on电源域;
(3)在电源可以关断的Power Domain中使用Retention Register。其内部结构如上图,该寄存器可以在电源关断前通过SAVE信号将数据从Main Register保存到内部的Shadow Register中。在上电后,再通过RESTORE信号将数据从Shadow Register恢复到Main Register中。
与前面的各种低功耗Cell一样,Retention Register内部的Shadow Register也是Always On Cell,必须有Always On的供电源。Shadow Register连接到always-on电源上以保证其能够正常工作。由于是Always On的,所以为了实现低功耗的目标,内部的器件多用高阈值的MOS管来实现以降低Power Down模式下的Leakage Power。Retention Register内除了Shadow Register之外,其余的器件均使用可以关断的电源,为了高性能以及快速恢复数据,Main Register可能还会使用低阈值的管子。假设普通寄存器功耗 = Main Register功耗 = 1uW, Shadow Register功耗=0.2uW,如果90%的时间关断,那么使用Retention Register时,整体平均功耗为(1+0.2)*10%+0.2*90%=0.3uW;比使用普通寄存器功耗节省了1-0.3=0.7uW。即使Retention Register有2个寄存器,但功耗仍比普通寄存器的功耗低,并且关断时间越长,越节省功耗。另外普通的register实际中需要考虑ISO,仅仅clock,data,reset就需要3个isolation cell。功耗比较高,另外对timing也有影响。而retention register内部就考虑了这些,只要保证进retention register的信号是always on就可以,而且进出retention register的速度都非常慢,所以对timing 不会有影响。
Retention Register与常规的寄存器相比,面积更大,一般要比普通寄存器面积大约20%,如果设计的鲁棒性好一些,甚至会大超过50%。 但是与其他方案相比,上电后数据恢复的速度非常快,且操作也简单。因此,使用retention register需要特别注意它带来的额外的面积和功耗。当需要断电保存的数据过多时,retention cell带来的功耗可能会使整体的low power效果打折扣。
Multi-Vdd
Multi-Vdd技术即多电压技术。
动态功耗和供电电压的平方成正比,微小的电压值调低,就会获得较大的功耗下降。基于系统性能等级要求,是多电压设计的基本思想。最终的设计目标是根据不同的性能等级,工作于不同的电压和频率。可同时节省动态功耗和静态功耗。跨电压域路径时序受到影响,在设计时需要考虑时序余量。Multi-Vdd带来不同电压域的cell互联通讯的问题,需要使用特殊的单元Level Shifters。
Level Shifters是一种专门处理不同电压区域边界两边的电压和时序差异的特殊电路,它可以在较宽的电压范围内提供可靠的voltage level shifting,从而使信号的占空比和延迟受到的影响最小。这种cell在我们使用的IO中也广泛存在,用于将外部的电压与core电压之间进行转换,有点类似模拟域的电平转换芯片。
从高电压到低电压的level shifter,可以是两个反相器的串联:
何时需要用到level shifter?
根据电平转换的方向,Level Shifter可以分为三种:
- HL -> 高电平转低电平
- LH -> 低电平转高电平
- HL_LH -> 双向转换均可
需要在两个Power domain之间插入level shifter的情况有三种:
- VDD_PD1 < VDD_PD2;
- VDD_PD1 > VDD_PD2;
- VDD_PD1 > VDD_PD2且两者相差不多;
情况1和情况2如果不插入level shifter,可能造成功能错误或者芯片不稳定;
情况3虽然VDD_PD1传入VDD_PD2可能能够正确识别逻辑功能,但是由于VDD_PD1和VDD_PD2不是完全相同,为了保证时序,还是需要插入level shifter;
如果是高电压域的信号输出到低电压域,由于低电压域器件的阈值电压低,直接接高电压信号有可能会造成误抖动;
如果是低压平域信号输出到高压平域,由于高电压域器件的阈值电压高,所以高电压域器件很难区分低电压域信号的0/1,如果直接连接会有驱动不足等问题;
建议:
不管是从高到低转换还是从低到高转换,都要加上level shifter。Level shifter通常不具备逻辑功能,只是用于不同电压值之间的信号电平的转换,也就是Level shifter并不会影响逻辑设计,它只是一个电压转换的buffer;所以level shifter不会对功能仿真造成影响,不需要去写验证激励来测试;
level shifter的插入位置?
上面这个列子是一个buffer类型的Level shifter, 逻辑上相当于一个buffer,只是输入输出的电压不一样。
上面这个例子是带ISO的level shifter,将两个cell合成一个,叫做enable level shifter (ELS);
比如当下图中信号从AON block传输到PD1时,需要加Level shifter。
当信号从PD1传输到PD2时,由于PD1是power gating模块,所以需要在PD1和PD2之间加带Isolation 功能的Level shifter cell(ELS:Enable Level shifter)。
Level Shifter可以加在信号的源(source)端,也可以加在信号的目的(destination)端。一般推荐加在目的端,因为不需要连secondary pg pin,更加节省资源。
也就是说:
- 如果是高到低转换,放在低电压域,电源电压由低电压模块提供;
- 如果是低到高转换,放在高电压域,电源电压由高电压模块提供;
但是这个规则并不绝对,具体要结合实际情况,比如要考虑功耗,时序等。高到低的level shifter只会引入一个buffer的延迟,对时序的影响较小。低到高的level shifter会带来比较大的延迟,对于时序影响大,需要更加注意。
Multi-Vt
Multi-Vt技术即多电压阈值技术。同一颗芯片中混合使用多种电压阈值的逻辑单元。在时序紧张的路径上使用low-Vt或者Normal-Vt的cell,在时序宽松的路径上使用High-Vt的cell,可以节省功耗。
不同阈值的逻辑单元面积、形状相同因此可以在项目多个阶段替换而不影响前后端其他工作正常进行。
不同阈值逻辑单元的选择和替换在综合后端通过设定指令由工具比较自动化地来完成,不需要前端代码的特殊处理。
值得注意的是,Low-Vt的cell delay小,Leakage大;High-Vt的cell delay大,Leakage小,相互关系如图所示。
使用Multi-Vt后的效果:
(b)
图xx Multi-Vt效果
上图横坐标代表delay大小,竖线为timing constraint的位置,上图、下图分别为使用Multi-Vt前后的效果图。图(b)中的A、B路径为没有受使用Multi-Vt技术影响的路径;C、D、E路径为通过对非critical path使用Multi-Vt技术,将C、D、E中的全部或部分cell替换为high-vt的效果。
DVFS/AVS
DVFS,Dynamic Voltage & Frequency Scaling,动态电压频率调整,动态技术是根据芯片所运行的应用程序对计算能力的不同需要,动态调节芯片的运行频率和电压(对于同一芯片,频率越高,需要的电压也越高),从而达到节能的目的。属于开环调节。
Avs,Adaptive Voltage Scaling,自适应电压调整。其基本原理是跟踪系统的性能变化(HPM),由电源控制器(PC)做出自适应电压调整。AVS的优点是可以在满足系统性能的前提下,补偿工艺、温度波动、时钟频率变化、电源变换器偏移等对系统的影响,系统正确运行在所需最低电压下,从而达到节省功耗的目的。属于闭环调节。
- DVFS
开环调节需要电压margin留得足够大,可以容忍整个工作过程温度变化、芯片个体工艺差别等。
升压提频流程(先升压后提频)流程如下:
根据应用场景配置 CMU(Clock Management Unit)中的目标时钟频率;
APC(Advanced Power Controller)根据预先定义好的目标时钟所对应的核电压数值,通过 PWI给EMU发信息调电压;在电压变化稳定后,切换时钟到目标频率。
降压降频流程(先降频再降压) 流程如下:
根据应用场景配置CMU中的目标时钟频率;切换时钟到目标频率;APC根据预先定义好的目标时钟所对应的电压数值,通过PWI给EMU(Energy Management Unit)发信息调电压。
2.AVS
AVS在电压调节模块(PWI)、供电模块(EMU)和片内性能监控单元(HPM)之间形成闭环;HPM实时监控得到供电电压、温度、工艺、频率等因素对芯片的综合影响,控制PWI作出自适应电压调节HPM需要仅邻被调压IP放置。大型芯片中会有多个HPM,监控多点性能.
无论DVFS,还是AVS,一定是先升压再提频,或者先降频再降压。
FPGA低功耗设计
FPGA芯片选型
设计原则:选择合适的芯片规模、合适的速度等级和核电压。
设计原则描述:芯片规模越大、速度等级越高、核电压越高芯片的功耗越高,根据项目规模和架构选择合理的芯片规模和速度等级。
(1)同系列芯片规模越大,成本越高、静态功耗越大,选择功耗、成本、扩展性均衡的器件。
(2)功耗优先项目,建议选择低功耗等级器件(16nm的LV等级器件)
时钟网络
设计原则:精简时钟网络,紧凑而不拥塞的布线结果会带来最优的功耗表现。
设计原则描述:精简的时钟网络,可以降低CLOCK部分的功耗,更重要的是可以让布局布线更合理,对时序收敛有帮助。紧凑而不拥塞的布线结果应该会带来最优的功耗表现。
- 干掉不必要的BUFG,例如时钟管脚仅仅驱动MMCM,会在中间插入BUFG,实际上不需要。
- MMCM的大部分反馈时钟路径BUFG可以干掉,因为大部分都不需要做反馈补偿。
- 如果可以,请考虑将多个MMCM合并为1个MMCM;
- 如果可以,尽量用PLL,功耗会比MMCM低;
- 如果子模块的负载较大/部分功能互斥,可以考虑不同子模块用不同的BUFG驱动,有利于关断时钟。
DSP
设计原则:合理使用DSP,降低DSP功耗
设计原则描述:大规模算法逻辑DSP功耗占比较高,合理使用DSP,减少DSP反转,降低DSP功耗。
- DSP启用M REG对功耗和时序均有帮助(隔断毛刺反转传播,收益10%)
- Pre_add/multi/pattern不使用时选择关闭(收益10%~30%)
硬IP
设计原则:优先使用FPGA内嵌IP电路
设计原则描述:FPGA硬IP即逻辑芯片内嵌块化ASIC,该部分电路时序和功耗可以达到ASIC水平,功耗优先项目芯片选项和方案设计优先使用。
案例:xx项目FEC编解码LDPC模块在1.5G流量FPGA版本功耗约4w,16 nm Xilinx ZU28DR内置SDFEC硬core,相同激励下功耗约2w.
逻辑后端工具
设计原则:后端综合、布线选择功耗优先策略
设计原则描述:FPGA后端工具打开部分组件功耗优先策略,工具自动插入控制逻辑,降低逻辑翻转,通过工具降低设计功耗。如果使用厂家软件默认设置会使用管脚的最大驱动电流,实际上一般并不需要这么强的驱动通过约束文件的设置减少管脚的功耗,均衡时序和功耗。
(1)综合选项:
- Fanout_limit:建议设置默认值10000.如果担心扇出高问题,在物理优化阶段会有针对性的信号复制,更有效。
- keep_equivalent_registers:建议设置Fasle,理由与Fanout_limit一样。
- min_shreg_size:建议设置为6/auto
(2)Implementation选项:
- Opt_design:建议设置为defalt,功耗更优;
- 布局之前和布局之后的功耗优化开关打开。