Verdi

发布时间 2023-04-20 21:39:12作者: VincentZJ

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

==================================补充结束=======================================================