• 注册
  • 查看作者
  • 数字IC设计中低功耗设计RTL Coding的若干种方法

    吾爱IC社区小编今天将带来数字IC设计中低功耗RTL coding的若干种方法。

    对于低功耗设计,跟前端设计人员有关系,但是似乎也没那么大关系。常用的低功耗技术就是clock gating,power gating,retention逻辑,以及SRAM的低电压retention,DVFS,另外还有的跟综合策略有关系,比如限制某些cell的使用,另外还有加工工艺这种不由设计者控制的事情。这些技术大部分我之前的文章里面都有简单的介绍。但是这些似乎很少跟RTL coding技巧有关系。

     

    如果你问一个IC前端人员,当你写代码的时候,怎么保证你的模块功耗比较小?大部分能告诉你的无非就两点:

    (1)对于寄存器,不工作的时候关掉clock。

    (2)对于组合逻辑,减少其无谓的跳变。

     

    (1)其实就是clock gating。这是最常用的也最受前端人员热爱的技术。写完代码之后也会review一下clock gating的覆盖率,看看有没有达到95%以上。

    clock gating可以是设计人员手动在代码里面添加,也可以综合工具自动插入,这个叫做ICG clock gating,这个之前也讲过。

     

    (2)就比较玄乎了。

    实际coding过程中,不会有人去check每个组合逻辑是不是跳变太多,有些多余的跳变,只要不干扰功能的正确性,没有人会去管。

    比如说: a=b&c;

    假如在一段时间内,b的值为0,那么a的值无疑肯定是0,那么c的跳变就是无意义的跳变。那么输出c信号的cell就是在做无用功,在浪费功耗。

     

    可是组合逻辑不像寄存器,寄存器你只要关掉它的clock,它的输出就不会有任何跳变,就会只剩下静态功耗。组合逻辑没有clock端,与门没有时钟端,或门没有时钟端,MUX没有时钟端,你要关掉它,只能关掉给它提供输入的上一级寄存器源。

     

    听起来,问题似乎都在寄存器端,只要做好了寄存器的clock gating,理论上就没事了啊,只要寄存器output保持不变,从该寄存器拿值的下一级的组合逻辑自然也就保持不变了,自然就没有动态功耗了。毕竟组合逻辑说到底也是上一级寄存器驱动的。

     

    如果一个chip(注意是整个chip)所有的寄存器都让我把clock给停了,理论上不光里面的寄存器只剩下静态功耗,组合逻辑因为输入信号都是恒定值,输出也是保持不变的,不需翻转,也就只剩下静态功耗了。

    那还需要讲啥?做好clock gating就行了呗。

     

    问题在于,寄存器只能管它下级的组合逻辑,不能管它上级的组合逻辑。

    假如关掉一个模块(注意是一个模块)的所有寄存器,这个模块的动态功耗是不是就一定就是0?

     

    不是。

     

    一个模块input上一个模块的输出数据,通常需要做一些逻辑运算,然后才会放入寄存器里面做存储,或者输出。下图是一个典型的模块。红色的圈圈代表组合逻辑,蓝色的方块代表寄存器。当你把这个模块的所有寄存器的clock全部关掉之后,后半部分的组合逻辑会因为输入恒定而不翻转,只剩下静态功耗。但是前半部分,直接从input接口拿数据的那部分仍然可能在翻转,成为漏网之鱼!

    也就是说,停掉这个模块的clock并不能完全停掉这个模块的动态功耗,你还必须停掉这个模块的输入信号的跳变!这些输入信号从别的模块而来,别的模块可能仍在工作。


    那怎么办?怎么彻底清掉这个模块的动态功耗呢?

     

    将该模块的input弄成恒定值。

     

    假如说一个模块,你可以停掉它的clock,那么理所当然的,你可以将其输入全部tie成恒定值。因为反正输入啥都不影响功能。

     

    这就是我要讲的一个技巧:

    当你的一个模块在某一段时间,完全不工作的时候,你可以:(1)在这段时间,关掉这个模块的clock。(2)检查这个模块的input,对还在跳变的input,将其全部tie成恒定值。这样才可以根除这个模块的动态功耗。

     

    当然我只推崇这种模块级的检查。因为一个系统组合逻辑实在是太多,没有必要检查每一条assign语句是不是写得够干净,没有必要检查每个寄存器当它的clock被停掉时,它的D端是不是还在跳。只需要针对一个模块,如果一个模块的clock你可以停掉,那么再补一刀,将这个模块的input全部弄成恒定值,就会大大减少这个模块的动态功耗。

     

    之所以将模块作为一个单元,检查组合逻辑的冗余跳变,也是因为模块本身的划分通常都是逻辑最窄的地方,属于主干,在这个地方做逻辑,效率最高。只需要tie住所有input,不管多大模块都可以变得十分平静,没有翻转。

    小编知识星球简介:

    在这里,目前已经规划并正着手做的事情:

    • ICC/ICC2 lab的编写
    • 基于ARM CPU的后端实现流程(已经发布)
    • 利用ICC中CCD(Concurrent Clock Data)实现高性能模块的设计实现(已经发布)
    • 基于ARM 四核CPU  数字后端Hierarchical Flow 实现教程(准备中)
    • 时钟树结构分析
    • 低功耗设计实现
    • 定期在星球布置作业题(星球已经支持布置作业功能)

    在这里,各位可以就公众号推文的内容或者实际项目中遇到的难题提问,小编会在24小时内给予解答(也可以发表你对数字后端设计实现中某个知识点的看法,项目中遇到的难点,困惑或者职业发展规划等)。

    反正它是一个缩减版的论坛,增强了大家的互动性。更为重要的是,微信有知识星球的小程序入口。星球二维码如下,可以扫描或者长按识别二维码进入。目前已经有六十二星球成员,感谢这六十二童鞋的支持!欢迎各位铁杆粉丝加入!终极目标是打造实现本知识星球全员年薪百万的宏伟目标。(星球的门槛将会越来越高,有需求的朋友趁早上车)

    从数字IC后端设计实现看先进工艺7nm实现的各种挑战

    相关文章推荐

    我是如何在五年内实现年薪60万?

    教你彻底搞懂ARM Cortex-A75 CPU的数字后端实现报告

    这些低功耗设计实现经验,你真的懂了吗?

    深度解析Create_clock与Create_generated_clock的区别

    IR Drop分析之Redhawk分析流程

    CRPR能补偿crosstalk吗?

    原来电路最高工作频率是这么算出来的(STA基础篇)

    数字后端面试问答No.1-3(每日三问)

    教你轻松调DCT和ICC之间Timing与Congestion的一致性

    数字芯片设计实现中修复setup违例的方法汇总

     

    好了,今天的码字就到这里了,原创不容易,喜欢的可以帮忙转发和赞赏,你的转发和赞赏是我不断更新文章的动力。小编在此先谢过!与此同时,吾爱IC社区(52-ic.com)也正式上线了。吾爱IC社区(52-ic.com)是一个专业交流和分享数字IC设计与实现技术与经验的IC社区。如果大家在学习和工作中有碰到技术问题,欢迎在微信公众号给小编留言或者添加以下几种联系方式进行提问交流。

     

  • 0
  • 0
  • 0
  • 868
  • 请登录之后再进行评论

    登录
  • 单栏布局 侧栏位置: