一、低功耗设计与UPF
随着芯片功能越来越强,功耗问题变得越来越突出。低功耗设计(Low Power Design, LPD)通过设计方法、架构优化和工具支持,降低芯片的动态功耗和漏电功耗。
常见的低功耗手段有两类:
- 只改逻辑:如clock gating(门控时钟),RTL里就能写
- 改供电结构:如关掉空闲模块的电源(power gating)、让不同模块用不同电压(多电压域)
第二类在RTL里写不了:RTL只描述逻辑功能,不描述哪个模块接哪路电源、什么时候断电。
这些功耗意图(power intent)单独用UPF(统一功耗格式,Unified Power Format)描述,交给仿真、综合和后端工具共同读取。
二、功耗来源
CMOS电路的功耗分为两部分,公式的推导见Dennard Scaling的功耗公式:
- 动态功耗:信号翻转时给负载电容充电、放电消耗的功耗
- :activity factor,每个周期发生翻转的电容所占的比例
- 、、:负载电容、电源电压、时钟频率
- 静态功耗(漏电功耗):晶体管关断以后仍有漏电流(leakage current)流过,由此产生的功耗
工艺缩小时漏电会变大,主要原因:
- 变低:为了在小尺寸下保住速度,阈值电压被调低,而关断时的subthreshold(亚阈值)漏电流随降低按指数增大(数量关系见Dennard Scaling为什么失效)
- gate控制变弱:channel变短后,gate对channel的控制变弱,出现short-channel effect(短沟道效应),等效的更低
- 典型的是DIBL(drain-induced barrier lowering,漏致势垒降低):drain电压拉低了source端的势垒
- 栅氧化层变薄:栅极隧穿漏电增加
- 晶体管更密:单位面积上的晶体管更多,漏电流叠加起来更大
三、低功耗手段
这一节研究的是:三种常用的低功耗手段各怎么做。clock gating只改逻辑,RTL里就能写;voltage domain和DVFS改的是供电结构,要在UPF里描述。
1. Clock Gating
Clock gating(门控时钟)研究的是:寄存器不需要工作时,怎样把送给它的时钟安全地停下来,省掉时钟网络上的动态功耗。
(1) 时钟网络的功耗
时钟从时钟源一路分到每个FF(flip-flop,触发器):
时钟源(如片外晶振)→ clock buffer(驱动时钟的缓冲器)组成的clock tree → 每个FF的clock pin
同一个clock domain(由同一个时钟驱动的范围)里的FF可达上百万个,时钟几乎覆盖整块芯片。
时钟每个周期都充电、放电各一次,,是芯片里翻转最频繁的信号,所以时钟网络本身就是动态功耗的主要来源。
一个idle(空闲)的模块,寄存器的值都不变,它的FF在clock pin上还有功耗吗?
有。模块没有有效数据、寄存器不更新,时钟照样每个周期送到:
- clock buffer继续充放电
- clock走线继续翻转
- FF的clock pin继续收到时钟
要让idle的模块少耗电,就要在数据不工作时把时钟也停下来。时钟不再翻转,这部分的接近0,动态功耗接近0,只剩静态功耗。
(2) Signal Enable与Clock Gating
让idle的FF停止更新,有两种做法:
- signal enable:FF的D端前面加一个MUX,由enable信号en选择
- en = 1:选新数据,Q更新
- en = 0:把Q送回D,Q保持不变
- 缺点:时钟照常每个周期送到FF的clock pin,时钟网络的动态功耗没有减少
- clock gating:在clock path(时钟路径)上加门控单元ICG(integrated clock gating cell,第(5)小节讲),用en控制时钟能不能往下传,门控后的时钟记作gclk(gated clock)
- en = 1:gclk = clk,FF正常工作
- en = 0:gclk保持低电平,下游FF的clock pin和这一段clock tree都停止翻转
- 缺点:要额外加ICG单元,en的时序也要单独检查(第(4)小节)
两种做法都让Q保持不变,区别在时钟:signal enable只停数据,时钟还在翻;clock gating把时钟本身停下来,Q也就不变了。
if (en)本身是signal enableRTL里的if (en) q <= d;描述的是数据什么时候更新,对应D端前面的MUX,不控制时钟。它会不会变成clock gating,要看综合时有没有插入ICG(第(5)小节)。
(3) 直接用AND门控的问题
最直观的门控是把clk和en接到一个AND门:
gclk = clk & en
- en = 1:gclk = clk
- en = 0:gclk = 0
这种做法面积几乎为0,仿真也能正常工作,但常规的大规模设计不这样用(少数设计这样用时,要在约束和RTL上做大量配套)。
问题不在en = 0或en = 1的时候,而在en变化的瞬间。AND是组合逻辑,en的变化会原样传下去:
en的变化(包括en上的glitch,即毛刺)→ 立刻传到gclk → 下游所有FF的clock pin都收到
第二个高电平期间en拉低,gclk的这个高电平被截短,变成一个窄脉冲(glitch),gclk的周期不再一致。
同样是glitch,出现在时钟上比出现在数据上严重得多:
- data path上的glitch:影响有限
- glitch出现在两个clock edge(时钟沿)之间,只要在下一个有效的clock edge之前稳定下来,满足setup/hold time(clock edge前后数据必须保持稳定的时间),FF采到的值仍然正确
- STA(static timing analysis,静态时序分析)检查的就是clock edge前后,可以兜底
- clock path上的glitch:造成功能错误
- 相当于多出一个意料之外的clock edge:FF多采一次数据、FSM(状态机)多跳一个状态、datapath写入错误的结果
- setup time不满足还能靠降频解决,功能错误降频也没用
时钟不能像数据那样随意经过组合逻辑生成,clock path上要用专门的、不产生glitch的门控结构。
(4) 可靠门控的要求
可靠的clock gating要做到:
- 开关落在完整周期的边界上:gclk要么输出完整的时钟周期,要么一直保持低电平,不在一个周期中间开或关
- 不产生glitch:gclk的每个脉冲都是完整的高电平宽度
- 门控用的enable只在clk低电平期间变化:前两条靠这一条保证。上一小节的glitch,就是en在clk高电平期间变化造成的
- en满足时序检查:en到达门控单元时也有setup/hold要求,STA会做这项检查(clock gating check)
- 能配合后续流程:STA、CTS(clock tree synthesis,时钟树综合)、DFT(design for test,可测性设计)都要能处理,不是仿真跑通就行
(5) ICG单元
ICG是standard cell library(标准单元库)里专门做clock gating的单元。library由foundry(晶圆代工厂)或IP厂商提供,ICG的时序经过他们验证,不是设计者用AND、OR门拼出来的。
综合(synthesis)把RTL映射成standard cell library里的单元,得到netlist(门级网表),所以library里要有ICG,综合工具才能插入clock gating。
ICG有两个来源:
- 综合工具自动插入:识别出一组共用同一个enable的寄存器(如
if (en) q <= d;),用一个ICG代替它们D端前面的MUX,由en直接控制这组寄存器的时钟 - 设计者在RTL里例化:有经验的前端设计者写RTL时就考虑哪些时钟需要门控,直接例化ICG
两种一起用:设计者先手动加一批,综合工具再按代码插入一批,门控覆盖的寄存器更多。
ICG的组成:
- 端口:clock输入、enable输入、gated clock输出(端口名各家library不同)
- 有的ICG还带TE(test enable)端:DFT做scan测试(把寄存器串成链,移入、移出测试数据)时,用TE强制打开时钟
- 内部结构:一个低电平透明的latch加一个AND门
- latch(锁存器):clk为低时透明,输出en_l跟随en;clk为高时关闭,en_l保持不变
- AND门:gclk = clk & en_l
en_l只会在clk低电平期间变化,所以:
- clk为低时:en_l可能变化,但clk = 0,gclk也是0
- clk为高时:en_l不变,高电平不会被截短
这正好做到了第4小节的第三条:只要en满足setup/hold要求,gclk就不会出现glitch。
en在第二个高电平期间拉低,en_l等clk变低才跟着拉低,这一拍的gclk保持完整,从下一拍开始关闭。
2. Voltage Domain
Voltage domain(电压域)研究的是:让不同模块跑在不同的下,各自按需要选电压。例如CPU核1V、IO接口1.8V,核心逻辑能降到多低就用多低,IO按接口标准来。
信号跨域时要加level shifter(电平转换器):从0.8V的域传到1.2V的域,0.8V的高电平在对方看来不够高,要先把电平拉上去才能被正确识别。多电压域因此多出一类单元和相应的面积、复杂度。
把一个域的电源整个关掉叫power gating:断电域的输出要用isolation cell钳到固定值,不然下游收到漂移的电平;断电期间要保留的状态存进retention寄存器。哪个模块属于哪个域、什么时候断电,都在UPF里描述(一、低功耗设计与UPF)。
3. DVFS
DVFS(dynamic voltage and frequency scaling,动态调压调频)研究的是:按负载调电压和频率,省动态功耗。有电压域才能单独调一个模块的电压,所以voltage domain是DVFS的前提,但有域不等于在做DVFS。
动态功耗正比于电压的平方乘以频率(二、功耗来源)。降电压比降频率强:电压降一半功耗到四分之一,频率降一半只到一半。负载低时把两个一起降:
从1.0V、1GHz降到0.8V、600MHz,功耗变成原来的0.8² × 0.6 ≈ 0.38倍;只降频率到600MHz,功耗是0.6倍。
顺序有讲究,任何时刻频率都不能超过当前电压允许的最高值:
- 升:先升电压,等调压器应答电压到位,再升频率
- 降:先降频率,再降电压
时钟这一侧,切频时PLL要重新锁定,锁定期间输出不稳定,先切到旁路的参考时钟或者把时钟门控住,lock来了再切回去(《时钟电路》「PLL与上电顺序」)。正在进行的总线事务怎么办,有的设计要求先让总线空闲再切。
四、不只是省电
低功耗不只是省电,而是让芯片在性能、功耗和可靠性之间,找到最佳平衡。
参考
- Wikipedia, Clock gating
- Wikipedia, Unified Power Format(IEEE 1801)
- Wikipedia, Dynamic frequency scaling
- Wikipedia, Level shifter
- Wikipedia, Power gating
Discussion
Loading comments…
Checking sign-in…