蒙特卡洛分析_基于蒙特卡洛仿真的功耗分析方法

首先希望大家不要被逼格甚高的名字吓到。其实今天的内容很简单,就是讲一个功耗分析的思路,希望能对大家有所启发。

解释下什么是蒙特卡洛仿真。简单来讲就是通过大量的随机输入来求解某事发生的概率。以统计概率作为突破点逆向求解。举个栗子,怎么求解圆周率π呢?一种很简单的方法是投针实验:画一个半径已知的圆,再画一个外切的正方形,然后随机的丢一根针,丢无数次,统计出针落入圆中的概率P,再经过简单的运算(P=π/4),就可以近似得到π。丢针的次数越多,求得的π越精确。当然,这完全可以通过计算机程序来搞定。

再说下功耗分析。一般的功耗分析,主要通过后仿来进行。通过对netlist进行仿真,得到波形,然后将波形和netlist文件输入给后端的功耗分析工具,比如PT-PX进行功耗分析。EDA工具通过分析仿真波形中的信号跳变,结合各种cell的功耗库,给出功耗的分析值。

问题在于,一个波形只是一个case下的特例。你可以容易的得到模块最繁忙的功耗,也可以很容易的得到模块最清闲时候的功耗,毕竟这只是两个特例。但是如果我想知道该模块的功耗期望,或者说平均功耗是多少,该怎么得到?

你不可能通过大量的后仿真,比如说仿真100次,然后让工具分析100次,再对100次的功耗求平均值吧!这样需要大量的时间,因为后仿很慢很慢,而且需要仿真环境真实的模拟出模块的实际使用场景,对仿真环境也有很高的要求。

考虑到这些因素,通过大量的后仿来求平均功耗其实是不现实的。所以就有了我们这个新的理论。

根据数学基础,简化起见:

平均功耗 (功耗期望)=忙时功耗*忙的概率 + 闲时功耗 * 闲的概率。

(并且:忙的概率 + 闲的概率 = 1)

忙的功耗和闲的功耗其实很容易得到,这是两个仿真特例,通过后仿得到波形,然后让PT-PX分析一下,就可以得到结果。

难以得到的是忙/闲的概率。

忙的概率其实也可以大致估算,简化起见:

忙的概率 = 模块的所需吞吐量/模块的最大吞吐量。

所谓所需吞吐量,就是模块集成到系统之中,在实际应用中至少需要具备的吞吐量。所谓最大吞吐量,就是模块的实际能力。模块的最大吞吐量肯定是要高于所需吞吐量的。

举个栗子:比如说水厂给周边供水,周围对水的消耗能力是一天10000吨,水厂每天的抽水能力是30000吨。那么10000吨是所需水量,30000吨是水厂的最大抽水量,水厂一天中只需要1/3的时间干活就可以了。

通常来讲模块的最大吞吐量是很容易计算的。基本等于输入位宽*输入时钟频率。难的是模块的所需吞吐量。

怎么求呢?可以建立一个随机仿真的环境。这个环境不仿真模块的功能,只仿真模块的触发延时和工作延时,以及跟其他模块交互的延时,从而在时域上统计出模块的忙/闲频率,进而得到所需吞吐量。这个就是蒙特卡洛仿真。因为不仿真功能,只仿真大量随机case下的各种延时,所以这个仿真可以很快,并且很简单。

举个栗子:对于CPU,可以简单建一个随机仿真环境,不仿真CPU的功能,只仿真各种随机指令和取指下的cache Hit和不Hit时的延时,流水线中断和停止等时的延时,内存的刷新和bank切换等延时,基本就可以统计出CPU各个模块的工作忙闲的概率分布。再结合各个模块忙闲的功耗,就可以计算出功耗期望。

如此简单,我相信大家都能理解。By the way,公式不具一般性,领会精神,不要扣细节。

欢迎大家关注我的微信公众号:半导学社。

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页