目录
FSDB Dumper支持三种方式来加入options:
1) simulator的command line中添加,simv +fsdbfile+high.fsdb
2) 直接在env中添加,setenv NOVAS_FSDB_FIEL mid_prio.fsdb
3)FSDB Dumping cmd中添加,$fsdbDumpfile("+fsdbfile+low_prio.fsdb")
$fsdbDumpfile
$fsdbDumpfile("FSDB_NAME",Limit_Size);
指定波形文件名,第二个参数可选择用来限制波形的大小(MB)。$fsdbDumpfile("FSDB_NAME",Limit_Size);
$fsdbDumpvars
$fsdbDumpvars(depth,instance,"option="),
$fsdbDumpvars(0,system,"+fsdbfile+novas.fsdb");
dump system模块中的所有信号并且生产novas的波形文件
0表示dump该模块以及该模块下面的所有信号
1表示只dump该模块这一层的信号
$fsdbAutoSwitchDumpfile
$fsdbAutoSwitchDumpfile(file_size, “fsdb_name”, number_of_files[, “log_file_name”, “+fsdb+no_overwrite”])
当波形的大小达到限制后自动以一个新的波形文件起始加载波形;
在所有的波形文件加载完成后,会创建一个virtual FSDB文件,文件后缀.vf。查看波形时只需要加载此文件就可以合并所有的波形文件。
file_size—波形文件大小限制,单位为MB,最小为10M,若值小于10M则默认10M;
file_name—波形文件的名字,在实际加载波形时,文件名为file_name_000.fsdb file_name_001.fsdb…;
number_of_files—最多可以加载多少个file_size这么大的波形文件,如果写为0,则默认没有限制;
log_file_name—指定log文件的名字;
+fsdb+no_overwrite—当number_of_files限制的个数达到时停止dump波形;
$fsdbDumpflush
在仿真过程中强制将信号值加载到波形中,便于在仿真过程中查看波形
实用技巧
转载
http://blog.sina.com.cn/s/blog_78699cbf01015x55.html
1)下面是一个列表,提示了fsdb 的各种可能用法,具体的内容大家可以Google 一把,就都出来了。
fsdbDumplimit - 限制FSDB 文件size 如何使用?
$fsdbDumpvars([<level>], <scope | signal>*)
fsdbDumpfile - 指定FSDB 文件名
$fsdbDumpfile(“<FSDB name>”)
fsdbDumpvars - Dump 指定的变量
fsdbDumpSingle - Dump 指定的信号
fsdbDumpvariable - Dump 指定的VHDL 变量
fsdbSwitchDumpFile - 将dumping 切换到另一个FSDB 文件
$fsdbSwitchDumpFile(“<new FSDB name>”)
fsdbAutoSwitchDumpfile - 限制文件大小并在数据量过大时自动创建新的FSDB 文件
$fsdbAutoSwitchDumpfile(<file size>, “<FSDB name>”,< number of file>)
fsdbDumpflush - Force to Dump Result to FSDB file
fsdbDumpMem - Dump 指定的memory 的内容
$fsdbDumpMem(<reg name>, [<start addr>, [<size>]])
$fsdbDumpon - 打开 FSDB dumping
$fsdbDumpoff - 关闭 FSDB dumping
(1)一个自由开关FSDB 的方法
有时候要运行很长时间的仿真,但是关心的波形却只是其中一小段。这个时候怎么来开关波形,使文件不至于太过庞大呢?这里介绍一个方法。示例仅供参考,大家可以结合实际应用创造出更加多样的变化来。
initial begin
$timeformat(...);
$fsdbAutoSwitchDumpfile(...);
$fsdbDumpvars(...);
// 条件表达式1
$fsdbDumpoff;
// 条件表达式2
$fsdbDumpon;
End
( 2 )、我们比较常用的一般还有$value$plusargs 这个task,在test_top 中:
$value$plusargs("casename=%s",casename)
通过脚本在run 的时候把casename 传递进去(给vcs/nc SIM_ARG: +casename=$Testcase_name.fsdb)
便于如果同时跑多个testcase 的时候可以同时dumpfsdb,另外就是跳过一些时间开始
dump(SIM_ARG: +time=$start_time)
$value$plusargs("time=%d",skip)
#skip
(3)、project 中每个人关注的module 不同,为了频繁去修改test_top 的dump,一般也会把需要dump 的内容用dumplist
的file 来实现
$fsdbDumpvarsToFile("dump.list");
比如dump.list 内容 #用于注释)
0 test_top
#1 test_top
#0 test_top.dut
#0 test_top.dut.m1
#0 test_top.dut.m2
用的时候一般是在test_top.v 添加相关的语句:
reg [100:0] casename;
integer skip, i;
initial begin
if( $test$plusargs("dumpfsdb") ) begin
if( $value$plusargs("time=%d", skip) )
#skip;
if( $value$plusargs ("casename=%s",casename) )
$fsdbAutoSwitchDumpfile(300, casename, 30);
else
$fsdbAutoSwitchDumpfile(300,"./test_top.fsdb",40);
$fsdbDumpvarsToFile("dump.list");
end
end
跑仿真的时候,对应的如果要从5000ns(时间单位根timescale 有关)处开始dump 波形,给vcs/nc 的参数
+dumpfsdb +time= 5000 +casename= testcase1.fsdb
其中的testcase1 一般我们都会在脚本处理后跟case 名字关联起来,这样子跑完之后就会从5000 开始dump
testcase1_000.fsdb, testcase1_001.fsdb 这样子,
2. 另外那个dump.list(名字可以随便取)里面的设定就跟平常的设定dump 的层次设置一样了
层次 路径名
0 test_top.dut.m1
例子:
//=================
// dump FSDB wave
interger start_dump;
integer stop_dump;
integer finish_time;
integer result;
reg [8*30*-1 : 0] waveform_name;
initial begin:fsdb_dump
start_dump = 0;
finish_time = 0;
waveform_name = "debussy.fsdb";
if ($test$plusargs("FSDB"))
begin
if($test$plusargs("DUMP_FILE"))
result = $value$plusargs("DUMP_FILE=%s",waveform_name);
$fsdbAutoSwitchDumpfile(150,waveform_name,100);
$fsdbDumpflush;
#start_dump;
//select dump signals
$fsdbDumpvars(0,xx_tb);
end
end