verdi中波形怎么看间距_波形⽂件详解-ljc24156313的⽇志-
EETOP创芯⽹论。。。
波形⽂件⼀般⽤于仿真后记录波形⽂件,⽤于做详细分析和研究。
说⼀下⼏种波形⽂件WLF(Wave Log File)、VCD(Value Change Dump)⽂件,fsdb(Fast Signal DataBase)⽂件、shm、vpd。
WLF(Wave Log File)
Mentor Graphics 公司Modelsim⽀持的波形⽂件。
在modelsim波形窗⼝观察波形时,仿真结束时都会⽣成⼀个*.wlf的⽂件(默认是vsim.wlf),可以⽤modelsim直接打开,命令如下:
ascii文件夹怎么创建vsim -view vsim.wlf -do run.do
其中,run.do中的内容为要查看的波形信号。
这个wlf⽂件只能由modelsim来⽣成,也只能通过modelsim来显⽰。不是⼀个通⽤的⽂件格式。
VCD(Value Change Dump)
IEEE1364标准(verilog hdl语⾔标准)中定义的⼀种ASCII⽂件,是通⽤的⽂件格式。
它主要包含了头信息,变量的预定义和变量值的变化信息。正是因为它包含了信号的变化信息,就相当于记录了整个仿真的信息,我们可以⽤这个⽂件来再现仿真,也就能够显⽰波形。因为VCD是 Verilog HDL语⾔标准的⼀部分,因此所有的verilog的仿真器都能够查看该⽂件,允许⽤户在verilog代码中通过系统函数来dump VCD⽂件。
我们可以通过Verilog HDL的系统函数$dumpfile 来⽣成波形,通过$dumpvars的参数来规定我们抽取仿真中某些特定模块和信号的数据。⽰例如下:
// 在testbench中加⼊以下内容
initial
begin
$dumpfile("*.vcd");
$dumpvars(0,**);
end
我们可以通过modelsim 命令来dump VCD⽂件,这样可以扩展到VHDL中。具体的命令:
vcd file myfile.vcd
vcd add /test/dut/* # ⽣成⼀个含dut下所有信号的VCD数据信息)
vsim -vcdstim myfile # 使⽤VCD来进⾏仿真 )
test;add wave /*;run -all;
特别说明的⼀点是,正是因为VCD记录了信号的完整变化信息,我们还可以通过VCD⽂件来估计设计的功耗,⽽这⼀点也是其他波形⽂件所不具备的。Encounter 和 PrimeTime PX (Prime Power)都可以通过输⼊⽹表⽂件,带功耗信息的库⽂件以及仿真后产⽣的VCD⽂件来实现功耗分析。
FSDB (Fast Signal DataBase)
Spring Soft (Novas)公司 Debussy / Verdi ⽀持的波形⽂件,⼀般较⼩,使⽤较为⼴泛,其余仿真⼯具如ncsim,modlesim 等可以通过加载Verdi 的PLI (⼀般位于安装⽬录下的share/pli ⽬录下) ⽽直接dump fsdb⽂件。
fsdb⽂件是verdi使⽤⼀种专⽤的数据格式,类似于VCD,但是它是只提出了仿真过程中信号的有⽤信息,除去了VCD中信息冗余,就像对VCD数据进⾏了⼀次huffman编码。因此fsdb数据量⼩,⽽且会提⾼仿真速度。我们知道VCD⽂件使⽤verilog内置的系统函数来实现的,fsdb是通过verilog的PLI接⼝来实现的,例如$fsdbDumpfile, $fsdbDumpvars等。⽰例如下:
// Testbench中加⼊以下内容
initial
begin
$fsdbDumpfile("*.fsdb");
$fsdbDumpvars(0,**);
end
shm
Cadence公司 NC verilog 和Simvision⽀持的波形⽂件,实际上 .shm是⼀个⽬录,其中包含了.dsn和.trn两个⽂件。
使⽤NC Verilog 对同⼀testcase和相同dump波形条件的⽐较,产⽣shm⽂件的时间最短(废话,本来就是⼀个公司的),产⽣vcd⽂件的时间数倍于产⽣shm和 fsdb的时间。在笔者测试的例⼦中,产⽣的fsdb⽂件为⼗⼏MB,shm⽂件为⼏⼗MB,⽽vcd⽂件则要⼏个GB的⼤⼩。
vpd
Synopsys公司 VCS DVE⽀持的波形⽂件,可以⽤$vcdpluson产⽣。
其余波形⽂件
就是各家不同的仿真或调试⼯具⽀持的⽂件类型,互不通⽤,但基本都可以由VCD⽂件转换⽽来(其实就是VCD⽂件的压缩版,因为只取仿真调试需要的数据,所以⽂件⼤⼩要远⼩于原始VCD⽂件),有的还提供与VCD⽂件的互转换功能。
********************************************************************************
fsdb的⼀些⽤法:
(1)下⾯是⼀个列表,提⽰了fsdb 的各种可能⽤法,具体的内容⼤家可以Google ⼀把,就都出来了。
fsdbDumplimit - 限制FSDB ⽂件size 如何使⽤?$fsdbDumpvars([], *)
fsdbDumpfile - 指定FSDB ⽂件名
$fsdbDumpfile(“”)
fsdbDumpvars - Dump 指定的变量
fsdbDumpSingle - Dump 指定的信号
fsdbDumpvariable - Dump 指定的VHDL 变量
fsdbSwitchDumpFile - 将dumping 切换到另⼀个FSDB ⽂件
$fsdbSwitchDumpFile(“”)
fsdbAutoSwitchDumpfile - 限制⽂件⼤⼩并在数据量过⼤时⾃动创建新的FSDB ⽂件
$fsdbAutoSwitchDumpfile(, “”,< number of file>)
fsdbDumpflush - Force to Dump Result to FSDB file
fsdbDumpMem - Dump 指定的memory 的内容
$fsdbDumpMem(, [, []])
$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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论