业界有三大仿真工具,Synopsis家的VCS、Cadence家的IUS-irun(现在是Xcelium-xrun)和Mentor的Modelsim。
VCS的全称是Verilog Compile Simulator,是Synopsis公司的电路仿真工具,可以进行电路的时序模拟。VCS属于编译型verilog仿真器,内部的仿真工具是DVE。VCS先将verilog/systemverilog文件转化为C文件,在linux下编译链接生成可执行文件,在linux下运行simv即可得到仿真结果。VCS使用步骤是先编译verilog源码,再运行可执行文件:
下面以实操的方式,用计数器的案例来讲述VCS+DVE+Verdi的操作步骤,中间穿插shell脚本的使用,最后将shell脚本改成makefile的形式,希望对整个工具的使用能有理解。
1 工程说明
整个工程比较简单,目录结构如下所示:
文件 |
说明 |
de/top.v |
Verilog设计文件 |
dv/tb_top.sv |
SystemVerilog仿真文件 |
sim/dve.tcl |
Dve工具的脚本文件 |
sim/filelist.f |
文件列表,可由find指令或makefile生成 |
sim/makefile |
makefile脚本 |
sim/verdi.tcl |
verdi工具的脚本文件 |
1.1 设计和仿真文件
设计文件top.v代码如下所示:
module top(
input clk ,
input rst_n ,
output reg cnt );
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
cnt <= 0;
else if(cnt == 9)
cnt <= 0;
else
cnt <= cnt + 1;
end
endmodule
仿真文件tb_top.sv的代码如下所示:
`timescale 1ns/1ps
module tb_top;
//----------------------------------------
reg clk ;
reg rst_n ;
wire cnt ;
//----------------------------------------
top u_top
(
.clk (clk ),
.rst_n (rst_n ),
.cnt (cnt )
);
//----------------------------------------
initial clk = 1'b1;
always #10 clk = ~clk;
initial begin
rst_n = 0; #11 rst_n = 1;
end
//----------------------------------------
`ifdef DUMP_VPD
initial begin
$vcdpluson;
#1000;
$vcdplusflush;
$finish;
end
`elsif DUMP_FSDB
initial begin
#1000;
$finish;
end
initial begin
$fsdbDumpfile("tb_top.fsdb");
$fsdbDumpvars("+all");
end
`endif
endmodule
1.2 makefile文件
all: filelist com_fsdb sim verdi
#---------------------------------------------------------------
filelist:
find ../de ../dv -name "*.v" -o -name "*.sv" > filelist.f
#---------------------------------------------------------------
com_vpd:
vcs -f filelist.f \
-timescale=1ns/1ps \
-full64 +v2k -sverilog -Mupdate +define+DUMP_VPD \
-debug_all \
|tee vcs.log
#---------------------------------------------------------------
com_fsdb:
vcs -f filelist.f \
-timescale=1ns/1ps \
-full64 +v2k -sverilog -Mupdate +define+DUMP_FSDB \
-debug_acc+all \
|tee vcs.log
#---------------------------------------------------------------
sim:
./simv |tee sim.log
#---------------------------------------------------------------
dve:
dve -vpd vcdplus.vpd -script dve.tcl &
#---------------------------------------------------------------
verdi:
verdi -f filelist.f -ssf tb_top.fsdb -play verdi.tcl &
#---------------------------------------------------------------
clean:
rm -rf csrc DVEfiles novas* *.log simv* *fsdb* ucli.key *.vpd verdiLog
1.3 tcl文件
dve.tcl文件内容如下所示:
add_wave -group tb_top /tb_top/*
add_wave -group top /tb_top/u_top/*
verdi.tcl文件内容如下所示:
wvAddSignal -group {tb_top}
wvAddSignal -scope tb_top
wvAddSignal -group {top}
wvAddSignal -scope tb_top/u_top
1.4 filelist文件
../de/top.v
../dv/tb_top.sv
下面就以实验的过程,讲解一下VCS+DVE+Verdi和makefile的使用。
2 VCS+DVE仿真
2.1 GUI交互式仿真
GUI交互式仿真符合我们使用软件的习惯,比较简单易用,这里简单介绍一下。
(1)VCS编译
在sim文件夹下执行指令:
vcs ../de/top.v ../dv/tb_top.sv -timescale=1ns/1ps full64 -sverilog -debug_all |tee vcs.log
下面是一些vcs指令常用的选项说明:
VCS编译 |
|
vcs |
启用vcs进行某些操作,必须放在命令的开头。 |
-full64 |
以64bit模式编译,输出文件是64bit。 |
-debug_access+all |
用于仿真调试时的参数,all表示支持的功能最多。dupm vpd文件时也可以写成-debua_all |
|tee vcs.log |
仿真结果输入到vcs.log文件中。 |
+2k |
表示兼容Verilog2001以前的标准,也可以不填。 |
-f filelist.f |
.v文件过多,可以写进一个filelist文件里,然后用-f吃这个文件。 |
-R |
编译后立即执行./simv,但要注意代码里写好了停止条件,否则terminal会一直卡着。 |
-Mupdate |
源文件有修改时,只重新编译有改动的.v文件,节约编译时间。 |
-sverilog |
打开对Systemverilog的支持,编译Systemverilog文件时使用。 |
timescale=1ns/1ns |
设置仿真精度,如果有些代码文件没有表明timescale,则必须在vcs命令中加入此选项才不报错。 |
-o simv_file |
默认产生的可执行文件为simv,可以用-o选项给它改名。 |
+define+DUMPVPD |
识别代码中的`define的内容,一般用于指定哪部分程序需要编译。 |
-LDFLAGS -Wl, -no-as-needed |
ubuntu18.04以上版本必须加上此参数,否则报错说不支持高版本内核。 |
|tee vcs.log |
编译结果写入到vcs.log文件中 |
执行完后会生成simv文件,该文件就是dve工具的仿真文件。
(2)DVE仿真
执行“./simv -gui &”打开DVE工具,它会自动装载该工程,gui是以图形化方式打开,然后我们右键添加波形:
输入时间精度和运行时间,点击⬇开始仿真,按f键可以缩小波形为全局,它产生的波形文件为inter.vpd文件。
在用“./simv -gui &”打开DVE时,可以指定dve.tcl脚本,这样DVE打开时就自动添加波形了,dve.tcl的书写可以查看DVE的命令台,其语言风格和modelsim类似,常常用“add_wave”添加波形、“run 1us”指定跑多久等指令,其他还有“-radix unsigned”、“-style analog”等规则,可以在DVE命令台输入help add_wave,help -all等指令查看更多可用的参数。
用./simv打开DVE的方式比较少用,后面都是用dve指令来打开DVE工具,dve指令也可以指定打开DVE后要自动运行的tcl脚本,它的参数则是-script ./run.tcl,详见上面贴出的makefile内容。
下面是偶尔会用到的simv选项说明。
simv仿真 |
|
./simv |
vcs编译成功后会生成simv指令,该指令可以执行仿真相关的命令。 |
-do run.tcl |
打开DVE工具后自动执行run.tcl文件。 |
-q |
静默模式执行仿真,不会打印仿真报告。 |
+vpdfile+xxx.vpd |
修改默认产生的vpd文件名。 |
-gui |
打开DVE工具,界面操作产生的vpd文件默认名为inter.vpd。 |
|tee sim.log |
将仿真结果输入到sim.log文本中。 |
GUI交互式仿真也能够产生vpd波形文件,默认名为inter.vpd,仿真结果会不断写入到该文件中。
2.2 UCLI接口仿真
UCLI仿真指的是在用户命令行接口仿真,例如在代码中添加一些调试代码,遇到error时会$stop,相当于每发生一次错误,终断一次仿真。
在vcs编译时,加入-ucli使用UCLI接口:
在仿真时会打开UCLI,并使仿真停止在 0 时刻。
使用 run 继续运行仿真,当出错时,$stop被调用而使仿真停下。使用 scope 查看当前 module 名。使用 show 查看信号列表。使用 get sum_test -radix hex 查看当前某个信号的值。
使用 UCLI 进行Debug其实是非常低效的,使仿真在错误的地方停止,用命令打开一个一个“黑盒子”(module) 并查看内部信号与预期是否一致。在实际使用VCS的时候基本不用,在此简单介绍,不做过多赘述。
(摘自知乎:https://zhuanlan.zhihu.com/p/129034106)
2.3 后处理模式仿真
交互式调试会非常吃内存而且非常卡,而UCLI接口仿真同样低效且难用,实际工作中我们更常用的是后处理模式。后处理模式是指仿真跑完(断点或finish)处,将波形dump到对应的波形文件中,以供DVE直接读取查看。DVE支持的波形文件类型为vpd,有vcd.vpd和vcdplus.vpd这两种,其中vcd是没有经过压缩的,文件比较大,而vcdplus是带有压缩功能的,更加推荐使用。
注:Verdi里使用的是fsdb文件,Modelsim里使用的是wlf文件。
(1)make filslist
执行“make filelist”可以将所需的设计文件和仿真文件写入到filelist.f文件中,这其实就是用了一个find命令,比较简单,但非常省事。后面需要指明文件时,用-f选项指明该filelist.f文件即可。如果文件较少,也可以不用filelist,直接在命令后面写明文件路径即可。
(2)make com_vpd
执行“make com_vpd”可以调用vcs编译工程,在tb_top.sv里运用了define,然后在vcs里用+define参数的方式指定了代码段,这样就能够指定dump vpd类型的波形文件。
下面是vcd系统函数的一些常用选项说明:
程序 |
说明 |
$vcdpluson; |
使能dump波形到vpd文件,一般放在仿真的0时刻。 |
$vcdplus(2,tb_top); |
记录tb_top开始往下2层的所有信号。 |
$vcdpluson(tb_top.reset); |
只记录此信号。 |
$vcdplusoff(tb_top.reset); |
不记录此信号。 |
$vcdplusflush; |
仿真finish时,有些波形数据还缓存在系统中,该命令可以将缓存中的波形数据写到vpd中。 |
$vcdplusautoflush |
当遇到stop/finish或中端时,将缓存中的波形写道vpd文件中。 |
$vcdplusfile(“filename”) |
指定生成的vpd文件名称,比较少用,一般在仿真时加参数实现此目的。 |
(3)make sim
执行“make sim”即可产生vpd波形文件,默认名称是vcdplus.vpd,可以加入参数+vpdfile+xxx.vpd来改名。
明白编译和仿真的过程后,vcs和simv命令可以合并,只需要vcs命令里加上参数 -R 即可自动执行./simv命令,但这样不太好指定输出sim.log文件。
(4)make dve
命令模式:
执行“make dve”即可后台打开DVE工具,并且它自动装载好vpd文件,并且自动运行dve.tcl脚本文件,非常方便。
界面模式:
界面模式比较少用,即先直接在terminal上执行dve命令打开DVE工具,然后点击File---Open Database,选择vpd文件即可。
3 Verdi仿真
相比VCS自带的DVE工具查看波形,业内更多的用Synopsis家另一款工具——Verdi。Verdi不是仿真器,只能查看波形,查看波形时必须引入 fsdb 文件,该文件可由EDA工具的仿真器来实现(如Synopsys的VCS,Cadence的irun,Mentor的Questa),这个过程也称为 Dump 波形文件。一共有两种方式可以产生 fsdb 文件:
- Verilog系统函数
- tb内手写,大多用这种方法。
- Ucli/Tcl接口脚本
- 快捷但较复杂,不利于新手
3.1 Verdi使用流程
(1)产生fsdb文件
首先是要在testbench中添加verdi系统函数,和上面dump vpd文件类似,在Testbench中加入下面命令即可在执行./simv仿真时产生fsdb文件。
更多verdi系统函数可以查看verdi官方手册,即下面这个:
执行“make com_verdi”对工程进行编译,然后执行“make sim”即可产生fsdb波形文件。
注意,这里不能是debug_all,改用debug_acc+all就行了。
如果觉得两步比较麻烦,可以改一下makefile脚本,在com_verdi的vcs命令中间加上-R,即可编译完成后自动执行simv程序,但是暂时没有想到这样怎么产生sim.log文件。
(2)Verdi打开波形
执行“make verdi”即可打开verdi,并自动运行verdi.tcl脚本文件。
3.2 Verdi常用技巧
Verdi的操作技巧比较多,可以翻阅手册《Verdi and Siloti Command Reference》。
下面是一些常用选项和快捷键的说明。
(1)Verdi常用选项
选项 |
说明 |
-sv |
支持systemverilog语法 |
+systemverilogext+.sv |
指定sv文件的后缀 |
-ssv |
取消-v指定的library为lib cell |
-ssy |
取消-y指定的library为lib cell |
-ssz |
忽略`celldefine的compiler指令 |
-top tb |
指定整个环境的top名称为tb |
-vc |
支持DirectC语法 |
-f |
指定文件列表 |
-ssf |
指定波形文件 |
-preTitle |
指定GUI界面名称 |
nologo |
关闭欢迎界面 |
& |
使Verdi后台运行,不占用terminal |
(2)Verdi快捷键
Verdi界面和Modelsim界面很相似,需要多多练习才能够掌握,下面是最常用的一些功能:
目标 |
快捷键 |
查看波形 |
Ctrl+W |
100%显示 |
F |
缩小波形 |
Z |
放大波形 |
shift+Z |
移动信号 |
中键选择位置+信号+M |
拷贝波形 |
Ctrl+P |
粘贴波形 |
中间选择位置+Ins |
删除信号 |
Del |
显示结构 |
H |
重仿真后刷新波形 |
shift + L |
代码中出现当前时刻的值 |
x |
直接添加信号 |
g |
修改波形颜色 |
c或t |
更多知识可以查看一些博客总结:https://blog.csdn.net/immeatea_aun/article/details/80961258
4 其他补充内容
4.1 vcd文件
VCD (Value Change Dump)是一个通用的格式。 VCD文件是IEEE1364标准(Verilog HDL语言标准)中定义的一种ASCII文件。它主要包含了头信息,变量的预定义和变量值的变化信息。正是因为它包含了信号的变化信息,就相当于记录了整个仿真的信息,我们可以用这个文件来再现仿真,也就能够显示波形。因为VCD是 Verilog HDL语言标准的一部分,因此所有的verilog的仿真器都要能够实现这个功能,也要允许用户在verilog代码中通过系统函数来dump VCD文件。我们可以通过Verilog HDL的系统函数$dumpfile 来生成波形,通过$dumpvars的参数来规定我们抽取仿真中某些特定模块和信号的数据。
4.2 gtkwave工具
Gtkwave工具也是一种常用的波形查看工具,我没有用过,有时间再学学。
4.3 irun/xrun
- Cadence有两大验证仿真工具。一个是IUS,代表工具NCverilog,一个是IES,代表工具irun。
- IUS——ncverilog:Cadence上古时期仿真工具
- 多步仿真模式,一步步执行
- ncvlog/ncvhdl
- ncelab
- ncsim
- 单步仿真模式,根据源程序类型自动调用相应的编译程序
- ncverilog
- IES——irun:ncverilog的后继者
- 1后,IUS转为IES
- ncverilog命令被替换为irun命令
- NEW——Xcelium:Cadence最新仿真工具
- 和irun的使用方式一样
与 Verdi 相似的,运行 irun 同样有两种方法,Makefile 和敲命令的方法。makefile 不过是把 irun 命令集中在一个文件内,方便后续执行而已。Makefile 如下所示:
irun 的选项很多,下面列举一些常用选项:
选项 |
说明 |
-64bit |
使用64bit irun模式 |
-f |
指定file list |
-vlog_ext |
修改verilog文件的默认后缀如 -vlog_ext .vvv,.vv ,修改verilog的默认后缀为.vvv和.vv |
-c |
只生成snapshot,不仿真 |
-access |
设置访问权限 |
-nclibdirpath |
指定 INCA_libs 目录 |
-R |
只仿真,需要有提前生成的snapshot |
-sv |
支持systemverilog语言 |
-uvm |
开启uvm,自动编译uvm库 |
-uvmhome |
指定uvm库位置CDNS-1.2 默认IES中的uvm-1.2版本 |
-uvmnoautocompile |
不自动编译uvm库 |
-clean |
在run执行之前,删除INCA_libs文件夹 |
-l |
指定输出log文件 |
-seed |
指定随机种子数 |
-top |
指定顶层模块 |
-hdlvar |
指定 hdl.var文件 |
-cdslib |
指定cds.lib文件 |
-loadpli1 |
指定读取外部读取的库文件 |
-prep |
打开prep mode,不仿真,生成多步仿真的脚本文件生成4个文件,ncvlog_ver.args: ncvlog工具的参数文件ncelab.args ncelab工具的参数文件ncsim.args: ncsim工具的参数文件RUN_NC: 仿真的脚本文件,调用ncvlog,ncelab,ncsim。 |
-checkargs |
检查irun的输入参数,是否有误 |
-helpargs |
打印每个输入参数的作用 |
-helpall |
打印帮助信息 |
+xxx=yyy |
向验证环境传递仿真参数xxx,值为yyy |
参考资料:
[1] V3学院IC教程
[2] 知乎文章-VCS入门教程4篇:https://www.zhihu.com/people/xing-qi-55-65/posts
[3] CSDN文章-常用数字设计仿真工具(Questa,VCS,IUS/Xcelium,Verdi等)使用入门: https://blog.csdn.net/chenxy_bwave/article/details/125893738
标签:仿真,文件,波形,DVE,top,Makefile,vpd,VCS From: https://www.cnblogs.com/xianyuIC/p/17473754.html