(笔记)vcs和verdi的联合仿真
环境配置
首先搭建好vcs和Verdi都能工作的环境,主要有license问题,环境变量的设置。在220实验室的服务器上所有软件的运行环境都是csh。所以,所写的脚本也都是csh的语法。
生成波形文件
Testbench的编写
若想用Verdi观察波形,需要在仿真时生成fsdb文件,而fsdb在vcs或者modelsim中的生成是通过两个系统调用$fsdbDumpfile $fsdbDumpvars来实现的。而这两个系统调用并不是Verilog中规定的,是Verdi以pli(Programming Language Interface)的方式实现的。这就需要让vcs编译时能找到相应的库。
首先在testbench中需加入以下语句
`ifdef DUMP_FSDB
initialbegin
$fsdbDumpfile("test.fsdb");
$fsdbDumpvars;
end
`endif
这个编译开关在用vcs编译时加入+define+DUMP_FSDB选项就可以打开,也可以在define.v文件中定义DUMP_FSDB这个宏。
我们现在所接触的仿真波形文件主要有
Ø Wlf文件: WLF波形日志文件,是modelsim的专用文件。这个wlf文件只能是由modelsim来生成,也只能通过modelsim来显示。在用modelsim做仿真时,仿真结束都会生成一个*.wlf的文件(默认是vsim.wlf)。下次就可以通过通过modelsim直接打开这个保存下来的波形。vsim -view vsim.wlf -do run.do其中run.do中的内容为要查看的波形信号。要强调的是不是一个通用的文件文件格式。
Ø VCD文件:VCD 是一个通用的格式。 VCD文件是IEEE1364标准(Verilog HDL语言标准)中定义的一种ASCII文件。可以通过Verilog HDL的系统函数$dumpfile,$dumpvars等来生成。我们可以通过$dumpvars的参数来规定我们抽取仿真中某个特定模块和信号的 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文件:fsdb文件是verdi使用一种专用的数据格式,类似于VCD,但是它是只提出了仿真过程中信号的有用信息,除去了VCD中信息冗余,就像对 VCD数据进行了一次huffman编码。因此fsdb数据量小,而且会提高仿真速度。我们知道VCD文件使用verilog内置的系统函数来实现 的,fsdb是通过verilog的PLI接口来实现的。$fsdbDumpfile,$fsdbDumpvars等 另外,在VCS仿真器中还有一种VCD+的数据格式VPD,详细情况参照VCS的使用。 注意:WIF:波形中间格式;WLF:波形日志文件。由于在ModelSim下只能打开WLF文件 使用ModelSim行命令vcd2wlf 将VCD文件转化为WLF文件。
而在dump fsdb文件需要几个文件,Verdi.tab, pli.a 以及与仿真器相应版本的.so库文件(需要修改LD_LIBRARY_PATH变量)。而这些目录在以往的版本中是比较凌乱的。
在Verdi200907版本之后它的dumper就做了统一化的处理:
How to Link the New Unified Dumper?
Prerequisites:
Ø ${NOVAS_INST_DIR} :
Verdi/Siloti install directory.
Ø ${PLATFORM} :
LINUX: Linux OS (32-bit)
LINUX64: Linux OS (64-bit)
SOL2: SunOS 5.x (32-bit)
SOL7: SunOS 5.x (64-bit)
IBM5: IBM 5.1
Ø Tab file:
novas.tab
Ø LD_LIBRARY_PATH
${NOVAS_INST_DIR}/share/PLI/lib/${PLATFORM} needs to be added as one of the
LD_LIBRARY_PATH searching paths all the time.
Ø Novas banner:
*Novas*
Ø novas.vhd file:
For VHDL and mixed language users who transfer from the old FSDB dumper, the first time use of new unified FSDB dumper needs the “novas.vhd” to be re-compiled (or re-analyzed) if the FSDB dumping commands have been specified in the VHDL design.
The related unified dumper directories are:
l ${NOVAS_INST_DIR}/share/PLI/VCS
l ${NOVAS_INST_DIR}/share/PLI/MODELSIM
l ${NOVAS_INST_DIR}/share/PLI/IUS
l ${NOVAS_INST_DIR}/share/PLI/lib
在我设的vcs环境中(csh)中设计的脚本如下
#!/bin/tcsh
if(-esimv)then
\rm-rsimv
endif
if(-esimv.daidir)then
\rm-rfsimv.daidir
endif
if(-ecsrc*)then
\rm-rfcsrc
endif
vcs0809
#verdi env setting
setPLATFORM=LINUX
setNOVAS_INST_DIR=/opt/spring/verdi201004
setenvLD_LIBRARY_PATH${NOVAS_INST_DIR}/share/PLI/lib/${PLATFORM}:${LD_LIBRARY_PATH}
vcs -l vcs.log \
-notice \
-line -debug_all \
-P $NOVAS_INST_DIR/share/PLI/VCS/$PLATFORM/novas.tab \
$NOVAS_INST_DIR/share/PLI/VCS/$PLATFORM/pli.a \
-f vcs.args
./simv
需要注意:
l Csh中设置环境变量,需把环境变量用{}括起来,这一点我试了很多次,它确实不如bash的解析器更加智能。
l 在220的服务器上,vcs的版本是201006的,而Verdi的版本时间比较低,编译时会提示,相应的libsscore_vcs201006.so文件找不到。现在我用的Verdi的版本是201004,而vcs的版本是200809
其中的vcs.args的参考脚本如下(以intra mode decision为例)
+libext+.v
+v2k
+acc
+define+DUMP_FSDB
-y http://www.cnblogs.com/rtl
-work work
//
// Testbench files
//
+incdir+http://www.cnblogs.com/bench
http://www.cnblogs.com/bench/tb_ip_mode_decision.v
// RTL files
//
+incdir+http://www.cnblogs.com/rtl
http://www.cnblogs.com/rtl/ip_mode_decision.v
http://www.cnblogs.com/rtl/defines.v
http://www.cnblogs.com/rtl/timescale.v
在csh中运行
./run_vcs
即可生成Verdi所需要的fsdb文件
之后运行以下命令启动Verdi
verdi -2001 -f vcs.args -ssf test.fsdb
Verdi调试
Verdi调试主要分为以下几步
Ø Load design and testbench into Debussy;
Ø 打开nWave,载入对应的FSDB;
Ø 在nTrace中将要观察的信号通过鼠标中键Drag&Drop拖放到nWave中;
Ø 通常都是在波形上发现问题,找到错误地方并双击鼠标,会自动跳到Real driver statement,也即会跳到源代码所在。
Ø nTrace中,Active Annotation(快捷键X)标出仿真结果在source code下;
Ø 在先前driver statement中找个driver来使用active trace来追踪有效驱动。
Verdi就是之前的Debussy,在调试时有着诸多的优点,现在我感觉最基础的几点就是它
Ø 只需执行一遍仿真就可以查看所有的波形,而在modelsim中则需要反复运行add wave命令,每一次都要重新仿真。
Ø 可以查看设计的原理图schematic,这非常方便查看每一个module和wire的所对应的硬件结构,modelsim现在还没有这个功能。
Ø 在仿真时可以很轻易地追踪每个信号所对应的源码。