3 功耗估算
功耗估算的价值是尽可能早地以定量方式看到优化结果,以助于设计者的初期架构探索。在每个阶段, 如产品规划、架构制订、代码书写、综合、P&R等,设计者都面临若干选择,能马上看到选择的结果,而不是到设计流程的末尾,可以有效减少开发时间。
3.1估算的方法
功耗的估算可以在设计流程的各个阶段进行,对应设计表征的不同形式。
software level ->behavior level -> RT -> gate -> circuit
越早的阶段,抽象层次越高,其精确度越差,但可以更早给设计者反馈,同时得到估算结果消耗的时间越少。
1. 软件级
首先,定义系统将执行的典型程序。典型的程序通常会有上百万的机器周期,进行一次完整的RTL级的仿真可能需要数月时间,这是不可接受的。解决的方法是在更高层次建立基本组成单元的功耗模型。
比较实用的方法是根据特定的硬件平台,统计出每条指令对应的功耗数据,进行指令级的仿真。
2. 行为级
在进行分析前,我们首先应了解电路的功率消耗原理,实际电路的电力消耗如图1所示。
图1
Prms = 1/2 * f * Vdd^2 * sigma(Ci * Ai)
--- f : clock frequency
--- Vdd : voltage
--- Ci is capacitance load of node,
--- Ai is the average switching activity of their node
在行为级设计表征中,物理电路单元尚未建立,难点是得到电容与活动率的值。存在两种思路:
1) 理论估计:
根据电路复杂度得到C,复杂度由算术,逻辑操作的数量,状态的数目与转换率衡量。
complex = f (arith ope, boolean ope, state, transition)
可以根据信息理论估算活动率。
2) 实验估计:
由快速综合得到寄存器传输级的原型,进而估计电容与活动率。
3. 寄存器传输级
第一步是在库中为高层的设计组件建立功耗信息算式,得到方式是在不同环境变量组合下通过仿真,统计功耗数据,绘制成曲线形式。然后,通过静态分析电路结构或动态仿真,收集电路动作几率数据,代入上述算式,得到各个组件的功耗值。最后,把所有组件的功耗值求和,得到总功耗。
4. 门级
与寄存器传输级的区别在于,基本单元是工艺库中的标准单元,功耗方程通过电路仿真得到,所以更精确。
5. 晶体管与版图层
所有的连线的电容、单元的负载,驱动都已得到,根据晶体管和连线模型的电压、电流方程,可以算出精确的功耗数据。
3.2估算的流程
因为指令与行为级估算的精确度太差,电路级估算的耗时过多,所以在业界的实践中采用较少。RTL与gate级估算是常用的选择。实际功耗分析的执行必须借助工具的辅助,目前业界通常的选择是在RTL级采用power compiler,在门级采用primepower。
图2
下面以power compiler为例,说明门级估算的步骤。
在dc compile前,设置下面的变量:
power_preserve_rtl_hier_names = false/true
编译
写出ddc文件
仿真生成vcd 文件
vcd2saif转化为.saif文件 (注意vcd2saif由csh调用,而不是在dc_shell界面调用)
读入ddc网表
read_saif
report_power