Verdi
1.testbench中控制生成fsdb文件记录波形
initial
if($test$plusargs("DUMP_FSDB"))//只需要在仿真命令后面加上如下命令即可,这里的DUMP_FSDB字符串 即 vcs +DUMP_FSDB
begin
$fsdbDumpfile("testname.fsdb"); //记录波形,波形名字testname.fsdb
$fsdbDumpvars("+all"); //+all参数,dump SV中的struct结构体,如果不用+all的参数,SV中的struct结构体无法被Dump出来
$fsdbDumpSVA(); //将assertion的结果存在fsdb中
$fsdbDumpMDA(0, top); //dump memory arrays
//0: 当前级及其下面所有层级,如top.A, top.A.a,所有在top下面的多维数组均会被dump
//1: 仅仅dump当前组,也就是说,只dump top这一层的多维数组。
end
end
end
$fsdbDumpfile("FSDB_NAME",Limit_Size); 指定波形文件名,第二个参数可选择用来限制波形的大小(MB)。
$fsdbDumpvars(depth,instance,"option="),
$fsdbDumpvars(0,system,"+fsdbfile+novas.fsdb");
dump system模块中的所有信号并且生产novas的波形文件
0表示dump该模块以及该模块下面的所有信号
1表示只dump该模块这一层的信号
如果波形文件比较大的话,打开时会占用很多内存,这时可以把波形文件分段输出,调试时只要载入指定时间段的波形文件就可以了
fsdbDumpfile 行替换成 $fsdbAutoSwitchDumpfile(25, “test.fsdb”, 150);
这条语句表示将fsdb文件分成每个大小为25MB的文件,最多输出150个文件。每个文件的仿真时间范围记录在test.log文件中。
2.vcs仿真命令控制dump fsdb
有时候不想去改变testbench代码,或者说想根据不同case去dump不同层次结构下的fsdb波形,可以采用vcs仿真命令去控制dump波形,直接在仿真命令加上“-ucli -i dump_fsdb_vcs.tcl”
com:
vcs -sverilog -debug_acc+all -LDFLAGS -rdynamic -full64 \
-P $(VERDI_HOME)/share/PLI/VCS/$(PLATFORM)/novas.tab \
$(VERDI_HOME)/share/PLI/VCS/$(PLATFORM)/pli.a \
-f tb_top.f \
+vcs+lic+wait \
-l com_vcs.log
sim:
./simv +ntb_random_seed=$(SEED) \
-ucli -i dump_fsdb_vcs.tcl \//这里这里这里这里这里
+fsdb+autoflush \
-l sim_vcs.log
-ucli 使能UCLI命令;-i 指定一个VCS执行仿真时包含CLI命令的文件,一般与-ucli配合;dump_fsdb_vcs.tcl 是一个tcl文件
global env # tcl脚本引用环境变量,Makefile中通过export定义
fsdbDumpfile "test.fsdb" # 设置波形文件名,受环境变量env(demo_name)控制 # demo_name在makefile中使用export demo_name=demo_fifo
fsdbDumpvars 0 "tb_top" # 设置波形的顶层和层次,表示将tb_top作为顶层,Dump所有层次
run # 设置完dump信息,启动仿真(此时仿真器被ucli控制) 可以run 100ns会在仿真100ns的时候停下来下来
=================================临时补充===================================================
我们在进行verilog仿真时,经常喜欢采用宏定义,来做条件判断,但是通过宏定义做条件判断的这种方法,存在很大的弊端,就是条件改变的时候,需要重新编译,这样会导致,在项目后期进行回归测试和后仿的时候,很多时间都浪费在重复编译上面,效率非常低下。
为了提高仿真效率,建议采用系统函数 $test$plusargs和$value$plusargs来实现,仿真命令到仿真环境之间的,条件判断和参数的传递
宏定义方式
initial
begin
`ifdef dump_fsdb
$dumpfile("test.fsdb");
$dumpvars;
`endif
end
需要开启宏定义条件编译功能,在编译命令加上 -define dump_fsdb;这种编译方式实现条件编译,当条件改变,需要重新编译,会造成仿真效率低;
条件编译函数$test$plusargs
initial
begin
if($test$plusargs("test1")
$readmemh("test1.dat",mem1);
if($test$plusargs("test2")
$readmemh("test2.dat",mem2);
end
在使用的时候只需要在仿真运行命令加上 +test1 +test2,如果不需要test1.dat,就把+test1去掉
参数传递函数$value$plusargs
$value$plusargs可以将运行命令(run-options)中的参数值,传递给指定的信号或者字符,其语法格式如下:
$value$plusargs(“string”,signalname);
if($value$plusargs("finish=%d", finish))
begin
repeat(finish);
$display("finish=%d", finish);
$finish;
end
if($value$plusargs("freq=%f",frequency))
begin
$display("freq=%f", frequency);
end
if($value$plusargs("testname=%s"testname))
begin
$display("testname=%s",testname);
end
在仿真的时候加上 +finish=1000 +freq=7.212 +testname=test1
仿真结果为
finish=1000
freq=7.212
testname=test1
==================================补充结束=======================================================