耐冷耐苦,耐劳耐闲。
-- 曾国藩
上周写IR drop的时候想起,当初写RTL功耗计算只写了原理性的东西,今天再写一些实操方面的吧,以PowerArtist软件为背景。
还记得上篇SoC的功耗组成吗?分为静态功耗和动态功耗,其中动态功耗又分为internal和switching。EDA在计算功耗的时候,首先要把RTL转换成标准单元(standard cell),然后再去lib文件中查找每个标准单元的数据(需要注意,功耗power和能量energy是两个不同的概念),最后根据仿真波形中的翻转信息(也可以通过设置翻转率toggle rate推算)计算出SoC的整体功耗情况。
图1 动态功耗示意图
通过以上的描述,我们就可以猜出做RTL功耗仿真所需要的文件了。必要的有RTL(貌似是废话),lib文件和时钟信息。此处要说明一下时钟,在现在的大规模SoC设计中,时钟树消耗的功耗占比越来越大,如果不特意注明时钟树信息,EDA工具会认为时钟树是理想(ideal)状态!所以我们给出简单的设置也比不设置要好得多。
对于波形文件,虽然不是强制,但是加上会大大提高仿真的准确性。VCD和FSDB是常见的波形文件格式,不需要多说。SAIF是一种不太常见的格式,里面只是记录了信号的翻转率,因此只能计算平均功耗(后面会介绍)。对于项目初期,可能功能仿真环境还没建立好,连SAIF也给不出,这时就只好通过设置toggle rate了,也就是下图中的vectorless。
同理,加入寄生参数文件也是为了提高仿真的准确性。回忆一下,在计算switching的时候是不是需要一个Cload?
UPF是低功耗设计文件,暂时不多说了,后面会单独写文章介绍。此处留下一个坑\~\~
图2 RTL功耗仿真
准备工作做完,撸起袖子开干。第一步并不急于上来就计算,因为我们并不知道所给的波形文件是什么情况。脑补一个场景,你去找验证工程师说“请给我一个典型应用场景的波形文件”,验证工程师想了想,找出一个验证case,敲下回车,等待一会之后产生了一个FSDB。可问题是,这真的是你想要的吗?
以下图为例,纵坐标是SoC的平均翻转率,横坐标是时间。在仿真的初期,翻转率非常高,这是因为SoC在做reset,但是很可能这个时间窗的功耗情况并不是我们真正关心的,想想你的SoC多长时间会冷启动一次呢。可能后面在填充pipeline的时间窗内也不是我们关心的。真正想分析的是pipeline填充好以后的工作情况,也就是图中的蓝色框部分。
接下来就可以告诉EDA工具,功耗计算所需波形文件中的起始时间和结束时间。总结一下,就是做activity分析首先会帮助我们抓出真正关心的工作场景,第二是会大幅缩减功耗计算的时间,因为activity分析要比功耗计算快的多得多。正是所谓磨刀不误砍柴工。
图3 波形文件平均翻转分析
选好了时间窗,就可以开始计算功耗了。功耗计算有两种模式,一种是平均(average)功耗,顾名思义,就是计算在选定的时间窗口内的一个平均值;另一种是time-based模式(不会翻译了,哈哈),简单理解就是把选定的时间窗根据需要再切割成若干更小的时间窗,每个时间窗计算一次功耗,这样就会得到一个功耗随时间变化的曲线图了。所以time-based模式会比average模式慢很多,仿真时间跟切分粒度正相关,最极端的情况就是每一个cycle计算一次。
图4 功耗计算报告
图5 time-based模式下功耗随时间变化
必然会有一些初学者纠结RTL功耗计算的准确性,跟netlist的结果去比,跟silicon去比。之前讲过影响RTL功耗计算的诸多因素,感兴趣的同学可以去翻翻两个月前的文章,或者自己推断一下。真的在意RTL功耗计算的准确性,就必须提高输入文件的准确性。RTL功耗计算方法学带来的天然偏差并不大。
虽然本篇的题目是RTL功耗计算,但是计算功耗并不是最终的目的。如果计算出的功耗很大怎么办(假设准确性在合理范围内)?或者发现设计中带入的功耗bug怎么办?当然是改了。必须说明一点,功耗bug不是功能bug,而且往往通过功能验证是发现不了功耗bug的。举个例子,运算单元没有做输入操作数隔离,导致运算单元内部的大量无效翻转,这种功耗bug很可能不会造成功能错误,因为在运算单元的输出端做了隔离。可能会有少数人觉得自己不会犯这种错误,对此只能表示呵呵了。
众所周知,时钟门控是一种有效控制动态功耗的方法。但是,你的时钟门控策略有多有效呢?CG插入的数量是多还是少呢?我还是保留公众号第一篇文章的观点,ASIC设计中没有绝对,只有tradeoff,凡事需多想一二。
图6 RTL功耗优化策略
具体的功耗优化方法在各EDA工具中不尽相同,此处也不展开了,要想说全恐怕万字不止,还是留待以后另开话题吧(又一坑)。
PowerArtist还提供一个回归(regression)的小功能,个人认为有些用处,简单介绍一下。如果是在项目初期就建立了RTL功耗仿真流程,那么随着项目的进行,需求变化/实现变化/功耗优化等等诸多因素都会影响SoC功耗,功耗回归功能可以帮助项目管理者很方便的查看SoC功耗变化情况,不至于在RTL freeze的前几天发现惊奇而被迫加班。功耗回归可以随RTL的milestone,也可以随时间,比如一个月做一次。
图7 功耗回归示意图
作者:老秦谈芯
来源:https://mp.weixin.qq.com/s/XqSbEgkMx7SfdjPVJvgRhg
作者微信公众号
相关文章推荐
更多IC设计技术干货请关注IC设计技术专栏。