前言
dump fsdb文件主要有两种方法:
- 在Verilog的TB中调用系统函数;
- 使用 ucli / tcl的命令行;
一、ucli / tcl命令行
有的时候我们不想对TB进行改动,也不想重新编译仿真顶层来修改fsdb信息,可以直接修改脚本完成对dump fsdb的控制,这时使用UCLI命令行来dump fsdb的优势就很明显了。使用这种交互式的接口,控制更加灵活,仿真过程中可以修改dump信息。
1.编译
首先在VCS编译脚本上,如下:
export file_name = top_tb
NOVAS_HOME = /share/eda/Synopsys/Verdi/L-2016.06/ # 这是我电脑上Verdi的目录
NOVAS_ARGS = ${NOVAS_HOME}/share/PLI/VCS/LINUX64/novas.tab \ # 这部分基本是固定的
${NOVAS_HOME}/share/PLI/VCS/LINUX64/pli.a \
vcomp:
vcs -full64-debug_pp -LDCLASS -rdynamic -P ${NOVAS_ARGS} \
-f complie.f \
-l compile.log
解释一下上面的命令:
- debug/debug_pp/debug_all ,使能ucli命令。
- -LDFLAGS ,传递参数给VCS的linker,与后面的-rdynamic和-P配合使用
- -rdynamic,指定需要加载的动态库
- -P ${NOVAS_ARGS},指定需要加载的表格文件(.tab)和静态库(.a)
- export file_name = tb.v ,是为了向后面脚本中传递变量而使用的。Makefile中当一个变量使用 export 进行声明后,变量和它的值将被加入到当前工作的环境变量中。
2.仿真
相应地仿真时的脚本文件,如下:
sim:
./simv \
-ucli -i dump_fsdb.tcl \
+fsdb+autoflush \
-l sim.log
verdi:
verdi -nologo -sv -f complie.f -ssf *.fsdb
clean:
rm -rf *.csrc *.daidir *simv* ucli* *.vpd *.fsdb *novas* *.log
解释上面的命令:
- simv 是 VCS编译Verilog后生成的二进制可执行文件,./simv执行这个文件,进行仿真;
- -ucli 是启动UCLI命令行模式,-i 吃进去 tcl 脚本文件;
- +fsdb+autofulsh,一边仿真,一边dump 波形;
dump_fsdb.tcl的脚本如下:
global env
fsdbDumpfile "$env(file_name).fsdb"
fsdbDumpvars 0 "top_tb"
run 100ns
#-----仿真中交互式控制-------
#fsdbDumpoff
#fsdbDumpon
#run
解释上面的tcl脚本:
- TCL脚本引用环境变量;
- 设置波形文件名称,名称受 $env(file_name)控制;注:这个file_name 是从仿真的 Makefile文件中,通过 export file_name = top_tb
- fsdbDumpvars(0) 表示会 dump 所有层次的信息;注:0代表dump所有层次,非0代表dump的最高层次;
- 设置完dump 信息,启动仿真。此时仿真器受UCLI命令行控制;
二、调用系统函数
在TB里面直接调用系统函数,操作是比较简单,但是受限也比较明显。
1.tb中调用系统函数
可以直接在TB中加入这样一段Verilog代码,
initial begin
if($test$plusargs("DUMP_FSDB")) begin #仿真时添加条件判断是否需要dump fsdb
$fsdbDumpfile("TEST.fsdb"); #生成fsdb波形文件,波形名字TEST.fsdb
$fsdbDumpvars(0,top_tb); #参数含义: 0 代表dump 所有层次;1 代表dump top_tb这个层次;
end
end
注:Verilog还有其他的有关dump fsdb的系统函数,可以直接Google。
2.编译仿真
相应地编译仿真时脚本,如下:
NOVAS_HOME = /share/eda/Synopsys/Verdi/L-2016.06/ # 这是我电脑上Verdi的目录
NOVAS_ARGS = ${NOVAS_HOME}/share/PLI/VCS/LINUX64/novas.tab \ # 这部分基本是固定的
${NOVAS_HOME}/share/PLI/VCS/LINUX64/pli.a \
vcomp:
vcs -full64-debug_pp -LDCLASS -rdynamic -P ${NOVAS_ARGS} \
-f complie.f \
-l compile.log
sim:
./simv \
+fsdb+autoflush \
-l sim.log