VCS dump波形的两种方式
- TB内置法
module dumpctrl(input bit clk); string testname; initial begin testname = "test"; if($test$plusargs("DUMP")) begin string tc_name, tc_dir; $display("Enable dump"); if($value$plusargs("TESTNAME=%s", tc_name)) begin if($value$plusargs("TESTDIR=%s", tc_dir)) begin testname = {tc_dir, "/", tc_name}; $display("Get testname: %s", testname); $fsdbDumpfile({tc_dir, "/", tc_name, ".fsdb"}); $fsdbDumpvars(0,tb,"+mda"); $fsdbDumpvars(0,tb,"+packedmda+struct"); $fsdbDumpon; end end end else begin $display("Disable dump"); end end endmodule module tb; dumpctrl udumpctrl(clk); endmodule$fsdbDumpon - 打开 FSDB dumping
$fsdbDumpoff - 关闭 FSDB dumping
$fsdbDumpfile(“FSDB_NAME”,Limit_Size) - 指定dump文件
fsdb_name 为user指定的文件名,Limit_Size 为dump波形的最大size
$fsdbDumpvars(depth,instance,“option=”) dump指定模块的信号
2 通过UCLI的方式在命令行dump
module dumpctrl(input bit clk); string testname; initial begin testname = "test"; if($test$plusargs("DUMP")) begin string tc_name, tc_dir; $display("Enable dump"); if($value$plusargs("TESTNAME=%s", tc_name)) begin if($value$plusargs("TESTDIR=%s", tc_dir)) begin testname = {tc_dir, "/", tc_name}; $display("Get testname: %s", testname); end end end else begin $display("Disable dump"); end end新建一个tcl文件dump_fsdb.do
run 0 #选择从什么时候可以dump get tb.udumpctrl.testname set name [get tb.udumpctrl.testname] if { $name == "test" } { puts "Waveform dump off" } else { dump -file $name.fsdb -type FSDB dump -flush FSDB0 dump -glitch on -fid FSDB0 dump -add tb -depth 0 -fsdb_opt +all+sva+parameter -fid FSDB0 #dump的范围 dump -add.................................. #如果有多个层次需要dump可以继续往下写,也可以写成一个函数调用 } run上述的FSDB0 is returned by the dump -file command.
常用语法:
dump [-file <filename>] [-type FSDB|EVCD|VPD] [-locking] dump -add <list_of_nids> [-fid <fid>] [-depth <levels>] [-aggregates] [-ports|-in|-out|-inout] [-filter=<filter string>] [-msv on|off] [-i<N>|-iall] [-isub][-v<N>|-vall] [-va|-vai|-vav] dump -flush <fid> [-fid <fid>]仿真命令选项为
vcs-sverilog-debug_acc+all-ucli-i dump_fsdb.do