为功耗分析生成仿真波形文件及RTL文件列表
一、获取RTL文件列表
RTL文件包括vhdl,v,sv三种文件,可以根据后缀获取工程内部所有文件夹,及子文件夹内部的相关文件。
可以通过shell脚本实现该功能。
1 #!/bin/bash 2 ###################################################################### 3 ## ## 4 ## 遍历指定目录获取当前目录下指定后缀(如txt和ini)的文件名 ## 5 ## ## 6 ###################################################################### 7 8 ##递归遍历 9 traverse_dir() 10 { 11 filepath=$1 12 13 for file in `ls -a $filepath` 14 do 15 if [ -d ${filepath}/$file ] 16 then 17 if [[ $file != '.' && $file != '..' ]] 18 then 19 #递归 20 traverse_dir ${filepath}/$file 21 fi 22 else 23 #调用查找指定后缀文件 24 check_suffix ${filepath}/$file 25 fi 26 done 27 } 28 29 30 ##获取后缀为txt或ini的文件 31 check_suffix() 32 { 33 file=$1 34 35 if [ "${file##*.}"x = "vhdl"x ] || [ "${file##*.}"x = "sv"x ] || [ "${file##*.}"x = "v"x ];then 36 echo $file 37 fi 38 } 39 40 #测试指定目录 /data_output/ci/history 41 traverse_dir /data_output/ci/history
注意中括号前后的空格注意一定要敲上
二、获取fsdb波形文件
在TESTBENCH中添加下列代码
initial if($test$plusargs("DUMP_FSDB")) begin $fsdbDumpfile("testname.fsdb"); //记录波形,波形名字testname.fsdb $fsdbDumpvars(0,u_rec_intra_top); //0表示生成u_rec_intra_top模块及以下所有的仿真数据 $fsdbDumpSVA(); //将assertion的结果存在fsdb中 $fsdbDumpMDA(0, top); //dump memory arrays //0: 当前级及其下面所有层级,如top.A, top.A.a,所有在top下面的多维数组均会被dump //1: 仅仅dump当前组,也就是说,只dump top这一层的多维数组。 $vcdpluson; //下面这两个是保存所有仿真数据 $vcdplusmemon; end end end
在Makefile中,编译RTL时,添加 -fsdb 选项
三、截取部分fsdb波形
因功耗分析只需要部分波形,故通过分析波形,确定某时间段的波形需求
截取波形需要 fsdbsxtract工具,该工具在安装verdi时会同步安装
对Verilog.fsdb文件使用“-s”命令可以指定自己所需的hierarchy。
Tips:
1)可以指定多个层次结构,
2)要使用斜杠’/‘而不是点’.’
-level命令与$dumpvars命令的参数相似,指定该层次以下导出几层,比如-level1, -level3… 而-level0表示下面的所有层次;
-o命令可以改写你切割出来的波形的名字,取一个容易标记的名字吧,送给将来一定会忘记的你自己;
-bt和-et命令指定begin time和end time,现在你就可以根据时间轴随意切割你想要的波形文件了;
fsdbextract verilog.fsdb -s /top/module1 -o sub.fsdb fsdbextract verilog.fsdb -s /top/module1 /top/module2/u_sub1 -level0 -o sub.fsdb fsdbextract verilog.fsdb -s /top/module1 -bt 1ms -et 3ms -o sub.fsdb //bt=begin time, et=end time