当前位置:首页 >> 信息与通信 >>

【SoCVista】有关FSDB文件的一些问题


收集整理自开源 IP 通吃岛 http://www.socvista.com/bbs
有关 FSDB 波形文件的一些问题 作者:justdoit、winfire、dicer、5life 等等

一、介绍
三个术语: VCD:Value Change Dump 文件, Fsdb:Fast Signal DataBase 文件, WLF:Wav

e Log File 文件, 对于 WLF 波形日志文件,只要我们使用过 modelsim,应该都很熟。但我们在波形窗口观察波形时,仿真结束时都会生 成一个*.wlf 的文件(默认是 vsim.wlf)。 我们下次就可以通过通过 modelsim 直接打开这个保存下来的波形。 vsim -view vsim.wlf -do run.do 其中 run.do 中的内容为要查看的波形信号。 要强调的是这个 wlf 文件只能是由 modelsim 来生成,也只能通过 modelsim 来显示。不是一个通用的文件文件格式。 VCD 文件是 IEEE1364 标准(Verilog HDL 语言标准)中定义的一种 ASCII 文件。可以通过 Verilog HDL 的系统函数 $dumpfile,$dumpvars 等来生成。我们可以通过$dumpvars 的参数来规定。我们抽取仿真中某个特定模块和信号的 VCD 数 据。它主要包含了头信息,变量的预定义和变量值的变化信息。正是因为它包含了信号的变化信息,就相当于记录了整 个仿真的信息。我们可以这个文件来再现仿真,也就能够显示波形。另外我们还可以通过这个文件来估计设计的功耗。 解决了前一段时间一直不知道这个 vcd 文件用来干什么的疑问。因为 VCD 是 Verilog HDL 语言标准的一部分,因此所有 的 verilog 的仿真器都要能实现这个功能。因此我们可以在 verilog 代码中通过系统函数来 dump VCD 文件。另外,我们 可以通过 modelsim 命令来 dump VCD 文件,这样可以扩展到 VHDL 中。具体的命令: vcd file myfile.vcd vcd add /test/dut/* 这个就生成一个含 dut 下所有信号的 VCD 数据信息。我们在使用来进行仿真 vsim -vcdstim myfile.com test;add wave /*;run -all; fsdb 文件是 verdi 使用一种专用的数据格式,类似于 VCD,但是它是只提出了仿真过程中信号的有用信息,除去了 VCD 中信息冗余,就像对 VCD 数据进行了一次 huffman 编码。因此 fsdb 数据量小,而且会提高仿真速度。我们知道 VCD 文 件使用 verilog 内置的系统函数来实现的,fsdb 是通过 verilog 的 PLI 接口来实现的。$fsdbDumpfile,$fsdbDumpvars 等 另外,在 VCS 仿真器中还有一种 VCD+的数据格式 VPD,详细情况参照 VCS 的使用。 我们为什么要输出 fsdb 格式的波形文件的, 原因之一 VCD 文件比较大,读取时间长,故用 fsdb 格式的波形文件, 其二 是该格式可以由 Debussy 读取,以便使用 Debussy 进行代码分析。 我们要输出 fsdb 的话, 要通过 PLI 来调用 Debussy 的系统函数.

收集整理自开源 IP 通吃岛 http://www.socvista.com/bbs

二、产生 FSDB 波形的一些方法和技巧 1、Modelsim 产生 FSDB 波形文件:
1). 编译 PLI 接口 => 在 DEBUSSY 目录中有 PLI 接口代码 ...\Novas\Debussy\share\PLI\modelsim_pli54\WINNT 此目录下有源码, 还有一个批处理文件 make.bat,打开作一些路径上的改动 set cl link MODELSIM_PATH=c:\simulators\modeltech_5.3a -c -I%MODELSIM_PATH%\include veriuser.c -dll -out:novas.dll -nodefaultlib:libcmt.lib -export:init_usertfs veriuser.obj pli.lib %MODELSIM_PATH%\win32\mtipli.lib shell32.lib => 其中命令 cl 与 link c/c++编译连接命令, 安装了 VC++可以找到 => 编译连接后生成 novas.dll,其为 modelsim 与 debussy 的 PLI 接口库 或者用其目录下存在的 novas.dll 文件,modelsim5.4 或更高版本采用 modelsim_pli54\WINNT 下的文件 2). 设置 Modelsim,使其加载接口库 novas.dll,从而在代码中调用接口函数 => 打开 modelsim.ini [vsim] Veriuser=novas.dll 其中 Veriuser 这个变量是在文件中用";"屏蔽了的,找到后去掉分号设置值为库 novas.dll => 设置 windows 系统环境变量 这在 Modelsim 的 user's guide 中有说明 LD_LIBRARY_PATH path\novas.dll PLIOBJS path\novas.dll SHLIB_PATH path\novas.dll 3). 在代码中调用系统函数生成.fsdb 文件 debussy user's guide docs 中有说明 [VHDL] process begin fsdbDumpfile("test.fsdb"); fsdbDumpvars; wait ; end process; [Verilog] initial begin $fsdbDumpfile( "FILE_NAME.fsdb" ); // Debussy 系统任务 $fsdbDumpvars; // Debussy 系统将变量映射到.fsdb 文件 end

收集整理自开源 IP 通吃岛 http://www.socvista.com/bbs

2、NC-verilog
首先, 我们建立一个工作目录 $> mkdir work $> cd work 然后新开一个 teminal 窗口, 找到 Debussy 的安装目录. 进入/share/PLI/, 在该目录下有很多版本的目录,选择一个属于 你的 NC 版本的目录, 比如 nc51, 然后选择你的操作系统, 如 LINUX,(换而言之, 现在处于/share/PLI/nc51/LINUX) 之后你 会发现: nc_loadpli1/ nc_shared/ pli.a veriuser.c 把这些目录及文件拷贝到 work 目录下. * 免编译 如果你不需要添加其他的系统函数, 那么直接可以用 nc_loadpli1 下 debpli.so 文件. 使用方法: $> ncverilog +access+wrc +loadpli1= ./nc_loadpli1/debpli.so : debpli_boot rtl.files 当然在 testbench 文件中要写上你所希望调用的 debussy 提供的函数, 基本的如: $fsdbDumpfile("wave.fsdb"); $fsdbDumpvars(6, tb); * 需编译 如果你已经对 veriuser.c 进行了修改, 那么首先把 veriuser.c 编译为 veriuser.o 文件. cc -KPIC -c veriuser.c -I${CDS_INST_DIR}/tools/verilog/include 之后连接 ld -G veriuser.o pli.a -o debussypli.so 使用方法: $> ncverilog +access+wrc +loadpli1= ./debussypli.so : debussy_bootstrap rtl.files 当然在 testbench 文件中要写上你所希望调用的 debussy 提供的函数, 基本的如: $fsdbDumpfile("wave.fsdb"); $fsdbDumpvars(6, tb); 从 NC 中 dump 出 fsdb 波形文件的方法: 1)在所有的 design file 里不要加入 `timescale 2) 建立一个单独的文件 ( 比如 time.v) , 其内容只有一句 `timescale xx/xx 3) 建立 design 的 file list (比如: flist.f ), 其内容是所有的 design file name, 将 time.v 放在最后一行 (建议) 4) 以如下形式调用 ncverilog: (1) source ....../ncverilog.env (2) ncverilog -f flist.f \ +ncloadpli1=debpli:deb_PLIPtr \ #这个 option 用以使用 fsdb +access+rwc 其他 option 可以自己按需加入. 5) 在 testbench 中 调用 $fsdbDumpfile, $fsdbDumpvars 就可以生成 fsdb 了. 假设 top.v 为 testbench 文件,rtl_list 为记录 verilog 文件的列表文件。 (1)在 top.v 文件加入如下代码: initial begin $fsdbDumpfile("top.fsdb"); // 创建 fsdb 文件供 Debussy 调用,这样就可以观察波形了,名称自定义 。 $fsdbDumpvars(0,top); // top 为 top.v 中的顶层模块名,0 表示将 top 层及以下的子 //模块的信号都 dump 出来。 end (2)调用命令: ncverilog +access+r -f rtl_list (3)调用 veridi 或 debussy 打开.fsdb 文件查看波形: verdi -f rtl_list & 或者 debussy -f rtl_list &

收集整理自开源 IP 通吃岛 http://www.socvista.com/bbs

3、在运行 vcs 的时候使用如下命令:
(1)先生成 fsdb 波形 vcs xxx.v -P /Debussy_path/share/PLI/vcs71/LINUX/debussy.tab /Debussy_path/share/PLI/vcs71/LINUX/pli.a 就可以了,当然 testbench 中要加上有关产生 fsdb 的命令,和 modelsim 一样的。 用 nWave -f xxx.fsdb (2)生成 vpd 波形文件 使用命令 vcs -I test.v 生成 vpd 文件,testbench 文件中加入 $vcdplusfile("xxxx.vpd") $vcdpluson(1,xxx); 就可以生成 vpd 文件,查看 vpd 文件可以使用 virsim 来看,可以通过命令 virsim +vpdfile+xxx.vpd 来直接打开。 (3)vcs -R 编译完后直接执行。 可以通过$fsdbSwitchDumpfile 来将信号 dump 到不同的 fsdb 文件中。

4、列表、技巧
(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

(2)、一个自由开关 FSDB 的方法 有时候要运行很长时间的仿真,但是关心的波形却只是其中一小段。这个时候怎么来开关波形,使文件不至于太过庞大 呢?这里介绍一个方法。示例仅供参考,大家可以结合实际应用创造出更加多样的变化来。

收集整理自开源 IP 通吃岛 http://www.socvista.com/bbs
initial begin $timeformat(...); $fsdbAutoSwitchDumpfile(...); $fsdbDumpvars(...); // 条件表达式 1 $fsdbDumpoff; // 条件表达式 2 $fsdbDumpon; End

( 3 )、我们比较常用的一般还有$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

(4)、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

收集整理自开源 IP 通吃岛 http://www.socvista.com/bbs

跑仿真的时候,对应的如果要从 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

三、使用 Makefile
不过话说,这些命令都可以用自己的一套 makefile 裹好,只需要用 Makefile 提供的函数接口。 首先工作环境是 linux,所有的命令都是用 makefile 来联系在一起的。 举个简单的例子,如果需要运行一个 vcs 命令 并带一些命令行参数。做法如下: 在某个固定的地方创建一个 vcs.makefile 作为通用的 makefile,所有人需要用到 vcs 的,那么在自己项目的 makefile 中 include 这个 vcs.makefile. vcs.makefile: VCS_EXE = $(VCS_HOME)/bin/vcs $(VCS_EXE) ${VCS_FLAGS} \ -l $(vcs_logfile $@) +libverbose \ -LDFLAGS "${VCS_LDFLAGS} ${VCS_LIB_PATHS} -g" ……………… 拿其中的 VCS_FLAGA 来详细说明: VCS_FLAGS += +define+NO_DUMPS VCS_FLAGS += -Mupdate -Mmakep="gmake" VCS_FLAGS += -cc $(GCC_PATH)/bin/gcc -cpp $(GCC_PATH)/bin/g++ -ld $(GCC_PATH)/bin/g++ VCS_FLAGS += $(VCS_VERSION_ARGS) VCS_FLAGS += ${VCS_EXTRA_ARGS} VCS_FLAGS += +define+NO_FSDB=1 这 个 common 的 vcs.makefile 可 以 被 任 意 项 目 调 用 , 我 们 自 己 锁 需 要 做 的 事 情 就 是 创 建 一 个 自 己 模 块 的 module_name.makefile 在其中 include 这个 vcs.makefile, 然后将需要的参数传递给 vcs.makefile 我们一般利用${VCS_EXTRA_ARGS} 变量,将我们需要为项目专门添加和修改的参数传递 比如,在自己模块的 module_name.makefile 中: # vcs argument VCS_EXTRA_ARGS += +notimingcheck +nospecify +udpsched +vcsevalorder $(STANDSIM_DIR)/dini_sodimm/glbl.v VCS_EXTRA_ARGS += +define+M512+S667+X8 $(STANDSIM_DIR)/dini_sodimm/ddr2_vcs.vp VCS_EXTRA_ARGS += +dump_multi_fsdb VCS_EXTRA_ARGS += +dmp_siloti +dmp_top=0 这样我们就添加额外的 vcs command line argument。

收集整理自开源 IP 通吃岛 http://www.socvista.com/bbs
以后需要跑 vcs 的时候,只需要敲一下 make 就可以。

vcs.makefile 把大部分需要设定的参数都会设置好,并有初始值。可以允许我们在各自模块的 makefile 中覆盖,用以执行 自己 special 的情况。当然大部分参数都会用设置好的值,在运行之前,我们甚至多数时候都不知道自己用了哪些 vcs 的 参数,只有 test 跑完,看 logfile 的时候,才会发现原来 vcs.makefile 把我们加了一大堆的参数,包括 vcs 的版本、路径、 项目默认需要包含的很多头文件、使用 v2k、使用-ssy -ssv、等等,可能有 30~40 个默认的参数会被添加。 如果需要使用 siloti,那么我们只需要项目文件夹下执行 make siloti,那么和 siloti 有关的所有参数 vcs.makefile 都会帮我 们自动配置好。 出来的波形都是经过 siloti 的。 确实是很好的方法。统一管理。统一维护,做成统一的库,方便所有人调用。

四、一些注意的
1、在 "NC 中如何 DUMP 出 fsdb 格式的波形文件"的文件中,使用"需编译"的方法 但是確發生如下的錯誤訊息 SYSTEM ERROR : VPI LOADFB fail to find requested bootstrap routine debussu_bootstrap in library ./debusspli.so 可否告知到底那個環節出錯 ??? 答:是 debussy_boostrap 名字不对。请注意一下,文中 debussypli.so 是替代用语。您可以不使用这名字的, 可自行定义。 而 debussy_bootstrap 是 veriuser.c 里定义的 bootstrap 的函数名称, 该函数名字可以由你自己定义的, 若您没进行过修改可 以查看 veriuser.c 文件。 类似于以下 p_tfcell alu_bootstrap() { io_printf("*** Registering ALU user system tasks...\n"); return (alu_veriusertfs); }

2、是不是如果验证中不要用到其他PLI的时候,不需要$> ncverilog +access+wrc +loadpli1= ./nc_loadpli1/debpli.so : debpli_boot rtl.files 这句.而需要使用其他PLI的时候,比如VIP也用在验证中,才需要这句话? 答:当不需要调用 PLI 时 +loadpli1= ./nc_loadpli1/debpli.so : debpli_boot 不需要。 如果需要 VIP 函数的时候,需要用+loadvip 选项。 3、 FSDB_DUMP: process begin fsdbDumpfile("simdata.fsdb"); fsdbDumpvars(0, ""); wait; end process;

收集整理自开源 IP 通吃岛 http://www.socvista.com/bbs
> Note: $fsdbdumpvars is for pure verilog desings, right? A:any "$" call is PLI, hence works in Verilog, some tools might VCS-MX works for both VHDL & Verilog. extend it to mixed designs - for instance $vcdpluson in

4、不明白我严格按照网上的步骤来设置的,最后为什么总是提示没有 task "$fsdbdumpfile", 今天才弄明白应该是 initial begin $fsdbDumpfile("test.fsdb"); $fsdbDumpvars ; end 上边的 D 应该大写。

http://www.socvista.com/bbs/viewthread.php?tid=2539&extra=page%3D1 更多讨论,见 SoC Vista -- 开源 IP 通吃岛 - 基于 FPGA 及 ASIC 的 SOC 设计

文章整理自网络,有问题请 Mail :huahuagood@foxmail.com


相关文章:
【SoCVista】1.敲门砖--入门的准备
【SoCVista】13.位级运算...1/2 相关文档推荐 1.拿起准备这块敲门砖(8......可以说说你的应用都用了那些 DSP 知识,都采用了什么技术解决了哪 些难点问题(...
更多相关标签:
socvista论坛 | fsdb文件 | soc文件 | vista镜像文件下载 | vista 引导文件 | vista 文件共享 | fsdb.shx下载 | fsdbdumpvars |