首先希望大家不要被逼格甚高的名字吓到。其实今天的内容很简单,就是讲一个功耗分析的思路,希望能对大家有所启发。
解释下什么是蒙特卡洛仿真。简单来讲就是通过大量的随机输入来求解某事发生的概率。以统计概率作为突破点逆向求解。举个栗子,怎么求解圆周率π呢?一种很简单的方法是投针实验:画一个半径已知的圆,再画一个外切的正方形,然后随机的丢一根针,丢无数次,统计出针落入圆中的概率P,再经过简单的运算(P=π/4),就可以近似得到π。丢针的次数越多,求得的π越精确。当然,这完全可以通过计算机程序来搞定。
再说下功耗分析。一般的功耗分析,主要通过后仿来进行。通过对netlist进行仿真,得到波形,然后将波形和netlist文件输入给后端的功耗分析工具,比如PT-PX进行功耗分析。EDA工具通过分析仿真波形中的信号跳变,结合各种cell的功耗库,给出功耗的分析值。
问题在于,一个波形只是一个case下的特例。你可以容易的得到模块最繁忙的功耗,也可以很容易的得到模块最清闲时候的功耗,毕竟这只是两个特例。但是如果我想知道该模块的功耗期望,或者说平均功耗是多少,该怎么得到?
你不可能通过大量的后仿真,比如说仿真100次,然后让工具分析100次,再对100次的功耗求平均值吧!这样需要大量的时间,因为后仿很慢很慢,而且需要仿真环境真实的模拟出模块的实际使用场景,对仿真环境也有很高的要求。
考虑到这些因素,通过大量的后仿来求平均功耗其实是不现实的。所以就有了我们这个新的理论。
根据数学基础,简化起见:
平均功耗 (功耗期望)=