下冰雹 · 2021年06月07日

SoC设计之功耗 – RTL功耗计算(二)

耐冷耐苦,耐劳耐闲。

--  曾国藩

上周写IR drop的时候想起,当初写RTL功耗计算只写了原理性的东西,今天再写一些实操方面的吧,以PowerArtist软件为背景。

还记得上篇SoC的功耗组成吗?分为静态功耗和动态功耗,其中动态功耗又分为internal和switching。EDA在计算功耗的时候,首先要把RTL转换成标准单元(standard cell),然后再去lib文件中查找每个标准单元的数据(需要注意,功耗power和能量energy是两个不同的概念),最后根据仿真波形中的翻转信息(也可以通过设置翻转率toggle rate推算)计算出SoC的整体功耗情况。

WeChat Image_20210607095318.png
图1  动态功耗示意图

通过以上的描述,我们就可以猜出做RTL功耗仿真所需要的文件了。必要的有RTL(貌似是废话),lib文件和时钟信息。此处要说明一下时钟,在现在的大规模SoC设计中,时钟树消耗的功耗占比越来越大,如果不特意注明时钟树信息,EDA工具会认为时钟树是理想(ideal)状态!所以我们给出简单的设置也比不设置要好得多。

对于波形文件,虽然不是强制,但是加上会大大提高仿真的准确性。VCD和FSDB是常见的波形文件格式,不需要多说。SAIF是一种不太常见的格式,里面只是记录了信号的翻转率,因此只能计算平均功耗(后面会介绍)。对于项目初期,可能功能仿真环境还没建立好,连SAIF也给不出,这时就只好通过设置toggle rate了,也就是下图中的vectorless。

同理,加入寄生参数文件也是为了提高仿真的准确性。回忆一下,在计算switching的时候是不是需要一个Cload?

UPF是低功耗设计文件,暂时不多说了,后面会单独写文章介绍。此处留下一个坑\~\~

WeChat Image_20210607095331.png
图2  RTL功耗仿真

准备工作做完,撸起袖子开干。第一步并不急于上来就计算,因为我们并不知道所给的波形文件是什么情况。脑补一个场景,你去找验证工程师说“请给我一个典型应用场景的波形文件”,验证工程师想了想,找出一个验证case,敲下回车,等待一会之后产生了一个FSDB。可问题是,这真的是你想要的吗?

以下图为例,纵坐标是SoC的平均翻转率,横坐标是时间。在仿真的初期,翻转率非常高,这是因为SoC在做reset,但是很可能这个时间窗的功耗情况并不是我们真正关心的,想想你的SoC多长时间会冷启动一次呢。可能后面在填充pipeline的时间窗内也不是我们关心的。真正想分析的是pipeline填充好以后的工作情况,也就是图中的蓝色框部分。

接下来就可以告诉EDA工具,功耗计算所需波形文件中的起始时间和结束时间。总结一下,就是做activity分析首先会帮助我们抓出真正关心的工作场景,第二是会大幅缩减功耗计算的时间,因为activity分析要比功耗计算快的多得多。正是所谓磨刀不误砍柴工。

WeChat Image_20210607095345.png
图3  波形文件平均翻转分析

选好了时间窗,就可以开始计算功耗了。功耗计算有两种模式,一种是平均(average)功耗,顾名思义,就是计算在选定的时间窗口内的一个平均值;另一种是time-based模式(不会翻译了,哈哈),简单理解就是把选定的时间窗根据需要再切割成若干更小的时间窗,每个时间窗计算一次功耗,这样就会得到一个功耗随时间变化的曲线图了。所以time-based模式会比average模式慢很多,仿真时间跟切分粒度正相关,最极端的情况就是每一个cycle计算一次。

WeChat Image_20210607095358.png
图4  功耗计算报告

WeChat Image_20210607095409.png
图5 time-based模式下功耗随时间变化

必然会有一些初学者纠结RTL功耗计算的准确性,跟netlist的结果去比,跟silicon去比。之前讲过影响RTL功耗计算的诸多因素,感兴趣的同学可以去翻翻两个月前的文章,或者自己推断一下。真的在意RTL功耗计算的准确性,就必须提高输入文件的准确性。RTL功耗计算方法学带来的天然偏差并不大。

虽然本篇的题目是RTL功耗计算,但是计算功耗并不是最终的目的。如果计算出的功耗很大怎么办(假设准确性在合理范围内)?或者发现设计中带入的功耗bug怎么办?当然是改了。必须说明一点,功耗bug不是功能bug,而且往往通过功能验证是发现不了功耗bug的。举个例子,运算单元没有做输入操作数隔离,导致运算单元内部的大量无效翻转,这种功耗bug很可能不会造成功能错误,因为在运算单元的输出端做了隔离。可能会有少数人觉得自己不会犯这种错误,对此只能表示呵呵了。

众所周知,时钟门控是一种有效控制动态功耗的方法。但是,你的时钟门控策略有多有效呢?CG插入的数量是多还是少呢?我还是保留公众号第一篇文章的观点,ASIC设计中没有绝对,只有tradeoff,凡事需多想一二。

WeChat Image_20210607095423.png
图6  RTL功耗优化策略

具体的功耗优化方法在各EDA工具中不尽相同,此处也不展开了,要想说全恐怕万字不止,还是留待以后另开话题吧(又一坑)。

PowerArtist还提供一个回归(regression)的小功能,个人认为有些用处,简单介绍一下。如果是在项目初期就建立了RTL功耗仿真流程,那么随着项目的进行,需求变化/实现变化/功耗优化等等诸多因素都会影响SoC功耗,功耗回归功能可以帮助项目管理者很方便的查看SoC功耗变化情况,不至于在RTL freeze的前几天发现惊奇而被迫加班。功耗回归可以随RTL的milestone,也可以随时间,比如一个月做一次。

WeChat Image_20210607095434.png
图7  功耗回归示意图

作者:老秦谈芯
来源:https://mp.weixin.qq.com/s/XqSbEgkMx7SfdjPVJvgRhg
作者微信公众号
qrcode_LaoQinTanXin_1.jpg

相关文章推荐

更多IC设计技术干货请关注IC设计技术专栏。
推荐阅读
关注数
19635
内容数
1303
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息