本文来自:https://blog.csdn.net/weixin_43727437/article/details/104966528
本文仅作学习记录,精彩内容访问前辈原文。
一、为什么要做clock gating?
1-静态功耗
芯片中的功耗可以广义的定义为动态功耗和静态功耗。
静态功耗通常包含芯片在不翻转的状态下产生漏电功耗(关不紧产生的功耗)、衬底电流产生的功耗、热电子效应导致的电流效应而产生的功耗等及部分组成。
通常情况下,静态功耗在前端设计阶段很难做出一些优化(可以做电源关断处理)。而是一般要基于ME/BE的流程或者工艺方面的改善才能够达到更好的结果。
静态功耗如下图:
2-动态功耗
动态功耗的来源通常包含了两个部分,
1-第一部分
- 第一部分,芯片中功耗消耗所占比例最大的一部分,是由于cell的充放电产生的功耗,如下图,以Inverter(变换)电路为例,由一个PMOS和一个NMOS构成,在输出端可以等效认为有一个对地电容,
每次IN从0到1,PMOS会从导通状态变为断开状态。相反NMOS会从断开状态变为导通状态。从而导致电容从NMOS对地放电。
相反, 当IN从1到0,会导致电容通过PMOS充电,这种充放电的过程会消耗很大一部分电能,从而产生功耗。
第二部分
动态功耗的另一部分是由于cell在翻转过程中,PMOS和NMOS同时导通的瞬间产生的功耗,又称作internal power,如下图,cell在翻转过程中,总会出现一小段时间PMOS和NMOS同时处于导通状态,这时就会出现从VDD到GND的一条直流通路,这个过程虽然很短,但是处于这个过程中,电路中的电阻是非常小的,所以整个通路中电流就非常大。
但是尽管如此,与上面所讲的动态功耗相比,所占比例还是相对较小。
小结
由上面分析可以看出,动态功耗到产生都是由cell翻转导致的。而在芯片中,翻转频率最高的路径便是clock path了。并在时钟路径上要做的就是CTS处理(clock tree)的,就会导致整个clock路径上的CK-BUF或CK_INV特别多。
而clock每个cycle的翻转会带动整条path上所有cell的翻转。据统计,一个芯片中,clock路径上的这种功耗消耗会能够占据到整个芯片功耗比例的40%甚至更多。所以对clock路径做动态关断,能够很大程度上节省功耗消耗。这种对clock进行关断的技术就被称作是clock gating。
二、如何做clock gating(基于CELL)?
如上图所示,data_out在被实现之后可以认为是一个DFF,此DFF的数据并不是每个clock cycle都会有效,只有在data_en==1的时候。DFF在clock的上升沿才会被重写一次。而在其他clock cycle的上升沿,DFF数据实际上是不会被重新覆盖额。这就给我们提供了一个思路,clock的翻转其实只有在data_en为1的前提下才是有意义的,其他cycle都是无效的翻转。
**那如何将这些无效的clock翻转带来的功耗消耗节约下来呢?**我们其实只要能够实现如下的clock波形就可以了。
有了这个思路,我们就容易寻找解决方案了。看到波形我们很容易的就能够想到可以通过AND-GATE或者OR-GATE的方式,将clock做与/或运算,这样就能够达到我们想要的效果了。
通过AND-GATE或者OR-GATE的方式跟原来CLK做运算,**将原来的CLK转化为CLK_G之后,**就得到了一个只有在EN有效的时候clock 才会翻转的波形。这种形式的转化过程就是最基本clockgating的形
这种基本形式的clock gating虽然电路简单,但在真正实现和使用的过程中是要考虑和规避一些问题的。
基于AND-GATE形式的clock gating,由于AND的功能,会将clock在高电平时的信号放过去。这样就会引入一个问题,我们必须要保证EN信号在clock高电平期间是稳定的,不能有glitch,否则就会使得到的clock –CLK_G产生glitch(毛刺)。
那如何保证EN信号在clock高电平期间时稳定的呢?很容易想到,EN信号的产生source,不能是源于上升沿触发的register。如果EN信号的产生源于上升沿触发的register,那么经过组合逻辑之后,很容易在clock的高电平期间产生如下glitch:
如果要解决这个问题,将EN的source在register的下降沿触发,**这样EN信号在第一个clock上升沿来临之前有半个cycle的时间,可以让EN信号稳定下来,**即,达到了让EN信号在clock上升沿到来之前稳定的目的。
并且基于与门形式的clock gating电路,ME/BE工具在check timing的时候,一定能check并约束到这一点。
如果EN信号在clock上升沿之前能够稳定,即整个clock高电平期间EN信号不会有glitch,这样就能够保证最终产生的clock是稳定没有glitch的。(有待理解)
同理,基于OR-gate的clock gating也需要有类似的考量。只是通过分析之后会发现,其需要EN产生的register采用上升沿触发的register。
最后我们可以总结得到:如果要基于ANG-GATE做clock gating,需要EN产生logic是falling edge触发的DFF;如果要基于OR-GATE做clock gating,需要EN产生logic是rising edge触发的DFF。
上面我们在分析的过程中,也提到了基于这种基本CELL方式clock gating,EN信号出来到运算稳定,只有半个cycle的时间。
三、如何做clock gating(高频基于ICG)?
如果要gating的clock时钟频率特别高的话,此处就很有可能会存在很难收敛的timing问题。
要解决上面问题,可以让EN信号的稳定时间延长,换句话说,就是要“借”半个时钟周期来让EN信号稳定。这可以可以用另一个基本CELL —LATCH(锁存器),在电路中可以实现借时间的用途,称作timing borrow。
关于latch在之前的文章有讲过,在数字电路中,很不希望出现锁存器,其中主要一点就是它的timing borrow属性,在做timing时候,会增加很大难度。
但是有两个地方经常使用到latch电路,一个就是这里要说的实现clock gating。
另一处就是DFT中为了解决hold timing问题。
latch + AND gating电路
原来的AND之前加入一级clock low-active的latch,构成如图所示的电路结构,其时序图如图中下所示。
由于加入的LATCH是低电平有效的,所以在CLK为高电平期间,EN信号就算是不稳定,有glitch存在,也不会通过LATCH往后传递。而LATCH之后加入的AND电路,又保证了低电平期间传给LATCH的EN毛刺被挡住了。
这就保证了EN信号在整个CLK cycle之内都可以随意toggle。而LATCH的特殊属性,在整个CLK为低的半个cycle期间EN信号都可以锁存进latch,只要保证EN信号在下一个CLK的上升沿来临之前稳定(保证latch的setup/hold time),就能够将正确的EN信号锁存进去。
基于这种结构clock gating电路,就能够很好地解决了之前提到的EN信号只有半个cycle的稳定时间的问题。
latch + OR gating电路
基于LATCH+OR的clock gating电路形式。如图二所示,其跟AND形式的不同点就是,前面的LATCH要换成clock high-active,并且根据EN信号的高低电平有效不同,会决定图中inverter CELL是否存在,可自行推导,不在赘述。
同样基于这种结构的clock gating电路,也能够为EN信号稳定争取到一个CLK cycle的时间。
如果要想LATCH+AND 电路能够为EN信号提供一整个cycle的运算时间的话,那么EN信号的source register一定要是rising-edge触发的;同理LATCH+OR电路如果想能够为EN信号提供一整个cycle的稳定时间,那么就需要EN信号的source register是falling-edge触发的。
STM32时钟
随着能源的日益短缺和地球的变暖,对电子产品的功耗要求越来越重要,如何降低电子产品的功耗是每一个电子工程师所要思考的问题。
对于半导体产品来说,一个数字电路的功耗有2部分构成,其一是静态功耗,通常表现为电子线路的漏电流,控制这部分功耗主要决定于生产工艺和所用的材料;其二是动态工作电流,而影响这部分功耗的因素很多,如电路设计的方式,线路的复杂程度,工作时时钟频率等。
本文谈的时钟门控技术就是一种非常简单和有效的功耗控制方法,它的基本原理就是通过关闭芯片上暂时用不到的功能和它的时钟,从而实现节省电流消耗的目的。
STM32中使用了这种时钟门控技术,请看下图是STM32的时钟分配示意图:
图中以橙色标注的那些与门就是用于控制不同模块的时钟,用户可以在程序中通过适当的寄存器位,打开或关闭对应模块的时钟,以达到减低功耗的目的。
(http://news.eeworld.com.cn/mcu/2015/0414/article_19372.html)