Skip to content

低功耗设计

Low Power AI Assisted
Contents

一、低功耗设计与UPF

随着芯片功能越来越强,功耗问题变得越来越突出。低功耗设计(Low Power Design, LPD)通过设计方法、架构优化和工具支持,降低芯片的动态功耗和漏电功耗。

常见的低功耗手段有两类:

  • 只改逻辑:如clock gating(门控时钟),RTL里就能写
  • 改供电结构:如关掉空闲模块的电源(power gating)、让不同模块用不同电压(多电压域)

第二类在RTL里写不了:RTL只描述逻辑功能,不描述哪个模块接哪路电源、什么时候断电。

这些功耗意图(power intent)单独用UPF(统一功耗格式,Unified Power Format)描述,交给仿真、综合和后端工具共同读取。

二、功耗来源

CMOS电路的功耗分为两部分,公式的推导见Dennard Scaling的功耗公式:

  • 动态功耗αCV2f\alpha C V^2 f:信号翻转时给负载电容充电、放电消耗的功耗
    • α\alpha:activity factor,每个周期发生翻转的电容所占的比例
    • CC、VV、ff:负载电容、电源电压、时钟频率
  • 静态功耗(漏电功耗):晶体管关断以后仍有漏电流(leakage current)流过,由此产生的功耗

工艺缩小时漏电会变大,主要原因:

  • VthV_{th}变低:为了在小尺寸下保住速度,阈值电压VthV_{th}被调低,而关断时的subthreshold(亚阈值)漏电流随VthV_{th}降低按指数增大(数量关系见Dennard Scaling为什么失效)
  • gate控制变弱:channel变短后,gate对channel的控制变弱,出现short-channel effect(短沟道效应),等效的VthV_{th}更低
    • 典型的是DIBL(drain-induced barrier lowering,漏致势垒降低):drain电压拉低了source端的势垒
  • 栅氧化层变薄:栅极隧穿漏电增加
  • 晶体管更密:单位面积上的晶体管更多,漏电流叠加起来更大
Note

FinFET和GAA让gate从三面、四面包住channel,加强了gate对channel的控制,压低了short-channel effect带来的漏电。

三、低功耗手段

这一节研究的是:三种常用的低功耗手段各怎么做。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可达上百万个,时钟几乎覆盖整块芯片。

时钟每个周期都充电、放电各一次,α=1\alpha = 1,是芯片里翻转最频繁的信号,所以时钟网络本身就是动态功耗的主要来源。

Question

一个idle(空闲)的模块,寄存器的值都不变,它的FF在clock pin上还有功耗吗?

有。模块没有有效数据、寄存器不更新,时钟照样每个周期送到:

  • clock buffer继续充放电
  • clock走线继续翻转
  • FF的clock pin继续收到时钟
数据不工作 ≠ 时钟不工作

要让idle的模块少耗电,就要在数据不工作时把时钟也停下来。时钟不再翻转,这部分的α\alpha接近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 enable

RTL里的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在clk高电平期间拉低

第二个高电平期间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不满足还能靠降频解决,功能错误降频也没用
Important

时钟不能像数据那样随意经过组合逻辑生成,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,换成ICG

en在第二个高电平期间拉低,en_l等clk变低才跟着拉低,这一拍的gclk保持完整,从下一拍开始关闭。

2. Voltage Domain

Voltage domain(电压域)研究的是:让不同模块跑在不同的VDDV_{DD}下,各自按需要选电压。例如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。

动态功耗正比于电压的平方乘以频率(二、功耗来源)。降电压比降频率强:电压降一半功耗到四分之一,频率降一半只到一半。负载低时把两个一起降:

Example

从1.0V、1GHz降到0.8V、600MHz,功耗变成原来的0.8² × 0.6 ≈ 0.38倍;只降频率到600MHz,功耗是0.6倍。

顺序有讲究,任何时刻频率都不能超过当前电压允许的最高值:

  • 升:先升电压,等调压器应答电压到位,再升频率
  • 降:先降频率,再降电压

时钟这一侧,切频时PLL要重新锁定,锁定期间输出不稳定,先切到旁路的参考时钟或者把时钟门控住,lock来了再切回去(《时钟电路》「PLL与上电顺序」)。正在进行的总线事务怎么办,有的设计要求先让总线空闲再切。

四、不只是省电

低功耗不只是省电,而是让芯片在性能、功耗和可靠性之间,找到最佳平衡。

参考

Discussion

Loading comments…

Checking sign-in…