当前位置: 代码网 > 科技>人工智能 > 低功耗设计——门控时钟

低功耗设计——门控时钟

2024年08月02日 人工智能 我要评论
芯片功耗组成中,有高达40%甚至更多是由时钟树消耗掉的。这个结果的原因也很直观,因为这些时钟树在系统中具有最高的切换频率,而且有很多时钟buffer,而且为了最小化时钟延时,它们通常具有很高的驱动强度。此外,即使输入和输出保持不变,接收时钟的触发器也会消耗一定的功耗。而且这些功耗主要是动态功耗。那么减少时钟网络的功耗消耗,最直接的办法就是如果不需要时钟的时候,就把时钟关掉。这种方法就是大家熟悉的门控时钟:clock gating。(电路图中看到的CG cell就是门控时钟了)。

1. 前言

        芯片功耗组成中,有高达40%甚至更多是由时钟树消耗掉的。这个结果的原因也很直观,因为这些时钟树在系统中具有最高的切换频率,而且有很多时钟buffer,而且为了最小化时钟延时,它们通常具有很高的驱动强度。此外,即使输入和输出保持不变,接收时钟的触发器也会消耗一定的功耗。而且这些功耗主要是动态功耗。

        那么减少时钟网络的功耗消耗,最直接的办法就是如果不需要时钟的时候,就把时钟关掉。这种方法就是大家熟悉的门控时钟:clock gating。(电路图中看到的cg cell就是门控时钟了)。

2. 门控时钟的结构

2.1 与门门控

        如果让我们设计一个门控时钟的电路,我们会怎么设计呢?最直接的方法,不需要时钟的时候关掉时钟,这就是与操作,我们只需要把enable和clk进行“与”操作不就行了么,电路图如下:

        这种直接将控制en信号和时钟clk进行与操作完成门控的方式,可以完成en为0时,时钟被关掉。但是同时带来另外一个很大的问题:毛刺。

        如上图所示,en是不受控制的,随时可能跳变,这样纯组合输出gclk就完全可能会有毛刺产生。时钟信号上产生毛刺是很危险的。实际中,这种直接与门的方式基本不会被采样。所以我们需要改进电路,为了使门控时钟不产生毛刺,我们必须对en信号进行处理,使其在clk的高低电平期间保持不变,或者说en的变化就是以clk为基准的。

  1. 很自然的我们会想到触发器,只要把en用clk寄存一下,那么输出就是以clk为基准的;
  2. 其实还有一种办法是锁存器,把en用锁存器锁存的输出,也是以clk为基准的。

2.2 锁存门控

        我们先看一下第二种电路,增加锁存器的电路和对应的时序如下:

        该方法的原理在于:锁存器在clk为低时透明。这样,en 信号上的毛刺仅出现在clk的低电平处,en1与clk进行与操作,可以将这部分毛刺消除掉。这样,gclk上就没有毛刺了。

        虽然达到了我们消除毛刺的目的,但是这个电路还有两个缺点:

  1. 如果在电路中,锁存器与与门相隔很远,到达锁存器的时钟与到达与门的时钟有较大的延迟差别,则仍会出现毛刺。
  2. 如果在电路中,时钟使能信号距离锁存器很近,可能会不满足锁存器的建立时间,会造成锁存器输出出现亚稳态。

        如下图分析所示:

        上述的右上图中,b点的时钟比a时钟迟到,并且skew > delay,这种情况下,产生了毛刺。为了消除毛刺,要控制clock skew,使它满足skew >latch delay(也就是锁存器的clk-q的延时)。上述的右下图中,b点的时钟比a时钟早到,并且|skew| > ensetup 一 (d->q),这种情况下,也产生了毛刺。为了消除毛刺,要控制clock skew,使它满足|skew|< ensetup一(d->q)。

        常见的是第一种毛刺,不过我们可以将这个逻辑做成一个单元,这样就基本上能消除上面的那两种毛刺了,因为这个门控单元是对skew作了控制,不存在前面描述的毛刺问题,即:

2.3 寄存门控

        如2.1中提到的,我们还有另外的解决办法,就是用寄存器来寄存en信号再与上clk得到gclk,电路图和时序如下所示:

        由于dff输出会delay一个周期,所以除非clkb上升沿提前clka很多,快半个周期,才会出现毛刺,而这种情况一般很难发生。但是,这种情况clkb比clka迟到,是不会出现毛刺的。当然,如果第一个d触发器不能满足setup时间,还是有可能产生亚稳态。

2.4 门控时钟结构选择

        那么到底采用哪一种门控时钟的结构呢?是锁存结构还是寄存结构呢?通过分析,我们大概会选择寄存器结构的门控时钟,这种结构比锁存器结构的问题要少,只需要满足寄存器的建立时间就不会出现问题。那么实际中是这样么?答案恰恰相反,soc芯片设计中使用最多的却是锁存结构的门控时钟。

        原因是:在实际的soc芯片中,要使用大量的门控时钟单元。所以通常会把门控时钟做出一个标准单元,有工艺厂商提供。那么锁存器结构中线延时带来的问题就不存在了,因为是做成一个单元,线延时是可控和不变的。而且也可以通过挑选锁存器和增加延时,总是能满足锁存器的建立时间,这样通过工艺厂预先把门控时钟做出标准单元,这些问题都解决了。

        那么用寄存器结构也可以达到这种效果,为什么不用寄存器结构呢?那是因为面积!一个dff是由两个d锁存器组成的,采样d锁存器组成门控时钟单元,可以节省一个锁存器的面积。当大量的门控时钟插入到soc芯片中时,这个节省的面积就相当可观了。所以,我们在工艺库中看到的标准门控时钟单元就是锁存结构了:

        当然,这里说的是soc芯片中使用的标准库单元。如果是fpga或者用rtl实现,个人认为还是用寄存器门控加上setup约束来实现比较稳妥。

2.5 门控优缺点

2.5.1 优点        

        通常情况下,时钟树由大量的缓冲器和反相器组成,时钟信号为设计中翻转率最高的信号,时钟树的功耗可能高达整个设计功耗30%。加入门控时钟电路后,由于减少了时钟树的开关行为,节省了开关功耗。同时,由于减少了时钟引脚的开关行为,寄存器的内部功耗也减少了。采用门控时钟,可以非常有效地降低设计的功耗,一般情况下能够节省20%~60%的功耗。

  此外,由于门控时钟不需要用到mux单元,加入门控时钟电路后,设计的面积也减少了。门控时钟电路的扇出越大,减低功耗和面积的效能越好。当然,扇出太大了,又会产生时序等的问题。

  门控时钟电路非常容易实现,用工具自动插入门控时钟,不需要修改rtl代码,门控时钟与工艺无关。

   2.5.2 缺点     

        那么完成了clk-gating结构后我们需要分析一下,clk-gating的收益是什么呢?功耗收益,能够在en端不使能时关断时钟降低寄存器的动态功耗。那么对应的额外消耗支出有哪些呢?

  1. 面积增加,与门、或门和latch都是会增加面积的,因此工具不会无脑的插入gating,一般只有在en控制的寄存器超过4bit时才会插入,这个值是可以设置的;
  2. en路径的时序更加紧张,为了保证时钟及时被开启,en端必须更早的实现时序收敛(或者理解为en路径是相对clk的,d路径是相对gating clk的)。关于这一点综合完的clk timing.rpt和clk gating timing.rpt对比下就会发现gating的timing路径中一般会减去一个时间比如-100ps;

3. rtl中的门控时钟

        通常情况下,时钟树由大量的缓冲器和反相器组成,时钟信号为设计中翻转率最高的信号,时钟树的功耗可能高达整个设计功耗40%。加入门控时钟电路后,由于减少了时钟树的翻转,节省了翻转功耗。同时,由于减少了寄存器时钟引脚的翻转行为,寄存器的内部功耗也减少了。采用门控时钟,可以非常有效地降低设计的功耗,一般情况下能够节省20%~60%的功耗。

3.1 门控实现

        那么rtl中怎么才能实现门控时钟呢?答案是不用实现。现在的综合工具比如dc会自动插入门控时钟。如下图所示:

        上图的典型综合结果中(即不使用门控时钟的情况),在每个受en使能控制的寄存器之前加入了一个mux,当en信号有效时,寄存器锁存输入信号d;否则保持原值。这种方法也能减少寄存器上的翻转,因而节省翻转功耗。然而,这种“载入一使能”结构中,每个寄存器都有一个mux,假设mux面积为4,则8位寄存器需要增加的面积为32。面积越大,意味着芯片成本越高,而且整体的功耗也会增加。另外,这种方式不能消除时钟树上的功耗。

        对于右下角的门控时钟形式的综合电路,假设一个门控逻辑的面积为10,一个门控时钟信号可以驱动8位寄存器,则在门控时钟电路中,对每8个寄存器需增加一个门控逻辑,增加的面积为10。由此可以看到,门控时钟的电路比普通综合结果的面积更小、功耗更低。   

  这里有两点需要注意:

  1. 插入门控时钟单元后,上面电路中的mux就不需要了,如果数据d是多bit的(一般都是如此),插入cg后的面积可能反而会减少;
  2. 如果d是单bit信号,节省的功耗就比较少,但是如果d是一个32bit的信号,那么插入cg后节省的功耗就比较多了。

        这里的决定因素就是d的位宽了,如果d的位宽很小,那么可能插入的cg面积比原来的mux大很多,而且节省的功耗又很少,这样得不偿失。只有d位宽超过了一定的bit数后,插入cg的收益就比较大。

        那么这个临界值是多少呢?不同的工艺可能不一样,但是dc给的默认值是3.也就是说,如果d的位宽超过了3bit,那么dc就会默认插入cg,这样综合考虑就会有收益。我们可以通过dc命令来控制芯片中,对不同位宽的寄存器是否自动插入cg。一般情况都不会去修改它:

set_clock_gating_style -minimum_bitwidth 4

        鉴于门控时钟的优点,我们需要把普通的综合结果“转换”为门控时钟的结果,我们主要是通过dc的power compiler来自动实现的。我们主要通过命令来设置门控时钟的风格和通过命令“启动”插入门控时钟。综合工具根据我们所设置的时钟门控的风格,插入相应的门控逻辑。因此,门控时钟的实现主要有两步,一步是设置门控时钟的风格,通过命令set_clock_gating_stale 及其选项来实现;另一步就是在网表中加入门控时钟,通过命令insert_clock_gating来实现

3.2 rtl 门控时钟编码风格

        虽然现在综合工具可以自动插入门控时钟,但是如果编码风格不好,也不能达到自动插入cg的目的。比较下面两种rtl写法:

        左边的rtl代码能够成功的综合成自动插入cg的电路;右边的不能综合成插入cg的电路;右边电路在d_valid为低时,d_out也会一直变化,其实没有真正的数据有效的指示信号,所以综合不出来插入cg的电路。

        需要注意的是,有的前端设计人员,为了仿真的时候看的比较清楚,很容易会写成右边的代码,这样不仅不能在综合的时候自动插入cg来减少功耗;而且增加了d_out的翻转率,进一步增加了功耗。

        在不用的时候把数据设成0并不能减少功耗,保持数据不变化才能减少toggle,降低功耗!所以我们在rtl编写的时候一定要注意。作为前端设计者,了解这些知识就足够了,如果想深入了解综合的控制,可以去了解set_clock_gating_style 这个核心控制命令。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com