本文主要是介绍linux环境下vcs+verdi的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 前言
- 一、vcs编译过程
- 二、vcs常用指令
- 1、常用
- (1)编译文件
- (2)debug选项
- (3)目录
- (4)使用verdi时需要在vcs里面添加的编译选项
- (5)仿真选项(加在sim里面)
- (6)其他
- (7)完整版本
- 2、覆盖率相关
- 3、波形相关
- 4、仿真命令和仿真环境之间传递参数
- 4.1 宏定义
- 4.2 条件编译函数 \$test$plusargs
- 4.3 参数传递函数 \$value$plusargs
- 三、verdi相关
- 四、面试问题
前言
今日感想:学习只能慢慢搭积木,想一步登天可不行啊
在vcs仿真时调用$dump函数dump出fsdb文件,随后verdi load filelist和fsdb文件来进行debug
一、vcs编译过程
1、vcs两步仿真:先编译文件,生成simv可执行文件;后进行仿真
(compilation and simulation)
VCS:Verilog Compiler Simulator
问题一:当设计比较大的时候,每次都要全部重新编译一遍,比较浪费时间;
问题二:当设计中存在VHDL文件时,两步法就无法使用,因为VHDL文件需要单独处理。
2、vcs三步仿真:编译(compilation)、elaboration、和执行仿真(simulation)三步执行
elaboration:把各种资源进行整合链接,有些文章或书上说是建立层次关系,意思差不多,类似于c语言的link
适合于文件中存在多种语言,例如sv和vhdl同时存在
英文解释:Elaboration is the process of binding together the components of the design. Elaboration includes among other things creating instantiations, computing parameter values, resolving hierarchical names and connecting nets
. Often when referring to the compilation and elaboration phases they are not distinguished but are generally referred to as compilation.
3、CLI and GUI界面
(1)VCS有命令行模式和图形模式。
图形模式使用的是DVE,命令交互模式使用的是Unified Command-line Interface (UCLI) 。
(2)vcs中要调用ucli接口,执行脚本,必须在compile的时候,加入debug的权限:-debug,-debug_pp,-debug_all,-debug_access,-debug_region
。在run的时候,指定vcs -ucli [run_option],需要在编译时加入参数以开启ucli,否则ucli交互时只能使用简单的 ’run’、 ‘dump’、 'quit’命令。
4、带-
号的,一般是编译时用的,编译工具自带的。(编译选项)
带+
号的,一般是插件,环境,验证语言等加的,可扩展、自定义的。
5、VCS和VCS_MX区别
VCS_MX为mixed hdl仿真器,支持vhdl+verilog+sv
的混合仿真。VCS只支持verilog, sv。在feature上唯一的区别在于对vhdl的支持。如果没有vhdl的设计的话或许VCS好些,速度快些。
二、vcs常用指令
区分编译步骤和仿真步骤中加上的选项,添加错了位置选项就不起作用了
1、常用
which vcs //查看vcs的安装路径
vcs -help //查看vcs的编译选项
(1)编译文件
vlogan
:vcs的编译指令,支持sv、v文件
vhdlan
:vcs的编译指令,支持vhdl文件
-sverilog
:支持SystemVerilog的语法
-f <filename>
:指定源文件的路径名列表,文件中可包括源代码文件的路径名称,和编译选项参数
-l <filename>
:指定vcs编译信息的存储文件
-ntb_opts uvm-1.2
:表示要引入UVM1.2的包,当然也可以选择使用1.0或1.1版本的,但是要注意这个选项不可缺少
-full64
:在64bit模式下编译、仿真,用于64位操作系统
-Mupdate
:源文件有修改时,只重新编译有改动的.v文件,节约编译时间。
-top
:设置顶层模块
+v2k
:支持Verilog-2001标准
-gui
:打开仿真的图形化界面
-o <name>
:指定编译后产生的可执行文件名,默认编译后的文件名为simv
+incdir <directory>
:指定包含include文件的文件夹,以方便后续编译文件时不用逐个写出所有文件的路径,只需将其在pkg中include一下即可。可以指定多个目录,用+字符分隔每个路径名称
vcs top.v //编译verilog文件
vcs -sverilog top.sv //编译system verilog文件,要加选项
vcs -f file.list //按照顺序把源文件放到file.list里面,然后全部编译
vcs -sverilog +incdir+filespath pkg.sv //把相关的类定义放到一个package里面,pkg里面include源文件
vcs -l compile.log -sverilog top.sv //指定编译信息存储到log文件
vcs –sverilog design.sv –top work.tb1 //设置顶层模块
-R
:编译后立即进行仿真,如果不加这个会生成可执行文件后就退出了
-s
:在simulation仿真刚开始时立即停止,并进入交互模式。一般与-R和+cli配合使用
vcs cpu.v +cli+3 -R -s
-ucli
:在linux终端使用TCL控制仿真进程(统一命令行界面模式)
+vcs+lic+wait
:一直等待licese
+licwait 100
:设置等待license的仿真超时时间
+memcbk
:查看多维数组
-error <number>
:编译器遇到n个错误之后就停止
(2)debug选项
-debug_all
:支持所有调试
-debug_pp
:同上,更加节约资源,可以dump fsdb和vpd,使能DVE、VERDI波形调试和UCLI命令行调试
-debug
:使能dve、verdi波形调试和UCLI命令行调试
-debug_access
:vcs -debug_access时,不需要再手动配置PLI的tab file verdi.tab 和静态库 pli.a,只需设置VERDI_HOME环境变量,vcs会自动查找所需文件,$fsdbDumpfile可以直接使用。
-debug_access+all 并不包含library(-v -y指定)和cell(celldefine编译原语标记的module,是cell module),无法PLI访问(如uvm_hdl_write)和波形dump。加上-debug_region=cell+lib
才可以正常访问。而-debug_all则是默认包含library和cell。(一般library和cell为标准单元,特别是在后仿,RTL综合成stdcell,被celldefine标记,而且PR也加入很多buf和inv, 降低仿真速度,增加波形文件size,如果不需要可以加上+nocelldefinepli+2,只dump module instance上的port波形)
-debug_access是新推出来的选项,更好地控制仿真过程中的调试性能
也就是说,debug_all和配置PLI,或者-debug_access+all和-debug_region选项
现在前仿过程中不涉及工艺库那些信息,所以就可以直接使用-debug_acc+all
!!!就可以了!
这个链接讲的很详细
配置PLI的方法
VERDI_PATH = /home/xxx/synopsys/verdi-2016.06-1/share/PLI/VCS/linux64
VERDI_ARGS = ${VERDI_PATH}/novas.tab \${VERDI_PATH}/pli.a编译选项加上-P ${VERDI_ARGS}
(3)目录
这里涉及到的这三个是个库文件相关的
-v <filename>
:设置搜索设计的文件,这两个参数和工艺库相关
-y <dir_pathname>
:指定目录路径,定义verilog的库
+libext+<extension>
:让VCS在verilog库路径下搜索指定的扩展名文件,与-y配合
一般使用:
- 把所有文件相对于makefile的文件路径都写在filelist里面,然后使用-f xxx.filelist
- 使用+incdir指定include文件所在的文件夹
(4)使用verdi时需要在vcs里面添加的编译选项
-lca
:(Limited Customer Availability)表示使用vcs“用户限制使用”功能,即vcs提供的一些功能,但该功能还未经过充分验证。
-kdb
:是lca下的一个feature,其作用是在vcs two-step flow和three-step flow中生成kdb databas,是vcs支持verdi很重要的选项
这两个命令加在一起:
vcs编译完后生成simv.daidir库文件,其中包含kdb.elab++文件
可以让verdi直接打开VCS编译之后的sim.daidir, 这样verdi可以直接trace代码
simv.daidir
:仿真生成的verdi的库文件,包含代码信息;verdi可以打开rtl代码而不需要重新编译
-debug_access -lca -kdb //vcs编译时加上这个选项,为了后面使用verdi//使用kdb的几种方法
verdi -elab ./simv.daidir/kdb
verdi -dbdir simv.daidir
verdi -simBin simv
verdi -ssf top.fsdb //加载kdb的同时加载波形,一般用这种方式
(5)仿真选项(加在sim里面)
+nospecify
:不进行时序检查
+notimingcheck
:不进行时序检查,前仿为了加快仿真速度暂时不需要,两个选项一般一起用
+delay_mode_unit
:延时模型,都是在前仿用不到的一些参数
+vcs+flush+all
:dump vpd的波形需要的选项
+define+< macro_name>=< value>
:定义一个文本宏,与源文件中的 ifdef配合
//top文件有如下定义
initial begin`ifdef dumpon$dumpfile("results.vcd");$dumpvars;`endif
end
vcs -sverilog +define+dumpon -l compile.log top.sv //改变参数的定义
//需要修改的时候,又要重新编译,比较麻烦
+fsdb+dumpon+500ns
:vcs编译选项,仿真从500ns开始时dump波形
+ntb_random_seed=3
:添加随机种子
(6)其他
-simprofile
:可以记录vcs各模块仿真时间
-override_timescale=< unit>/< preciision>
:让源文件统一使用指定的timescale
-timescale=<time_unit/time_precision>
:为在前面编译且没有`timescale的源文件指定timescale。time_unit采用就近原则,例如顶层文件定义timescale后,中间文件再次定义timescale后,则其后的文件按照中间文件定义的timescale执行
vcs -sverilog -timescale=1ns/1ps -l compile.log top.sv
vcs -sverilog -timescale_override=1ns/1ps -l compile.log top.sv //覆盖源代码中的仿真时间单位和精度,不推荐使用,会把模型的时间单位覆盖,可能导致模型功能错误
(7)完整版本
vcs -sverilog -full64 -fsdb -ntb_opts uvm-1.2 \-debug_access+all -lca -kdb -f flist.f \-timescale=1ns/1ps -cm line+tgl+cond+branch+assert+fsm \-assert -LDFLAGS '-Wl,--no-as-needed' -l com.log
2、覆盖率相关
(这部分请查看另一篇博客,单独来讲解)
覆盖率传送门
3、波形相关
-gui
:开启GUI界面,否则就在linux终端显示transcript的内容
-fsdb
:调用Verdi PLI 库,支持fsdb 波形
-i <filename>.tcl
: 启动DVE后,在UCLI要启动的TCL命令。或者其他的文件,这样就可以不重新编译,直接进行输出波形等的调整,节约仿真资源
在这里可以执行一些tcl命令
scope: 显示当前的顶层模块
scope u1: 就表示进入到当前顶层模块中的u1模块,同时将u1模块设置为顶层模块
scope -up: 回到目前顶层模块的上一层。
show: 显示当前顶层模块的信号以及子模块
show -value 信号 -radix hex/bin/dec:显示信号的值 以特定的进制显示。
run:运行仿真run 一直运行,直到遇到$stop或者设置的断点
run time: 运行多少时间停止(不推荐)
run -posedge: 信号 运行到信号的上升沿停止
run -negedge: 信号 运行到信号的下降沿停止
run -change: 信号 信号有变化时停止
stop: 设置断点stop 显示断点
stop -posedge: 信号 在信号的上升沿设置断点
stop -negedge: 信号 在信号的下降沿设置断点
stop -condition {信号表达式}: 信号表达式为真的地方设置断点
stop -delete 断点值: 删除断点值的断点
restart: 重新开启ucli调试模式
call {系统任务}:调用verilog系统任务,
finish:结束仿真
force:信号强制赋值
release:解除信号强制赋值
get:获取信号数值
step:单步执行
do *.do:可将很多这些UCLI命令整合到一个*.do文件内,然后以打包运行
命令 –h:显示命令的帮助
-vcd <filename>
:将输出VCD文件名设置为指定文件。默认文件名为verilog.dump。Verilog源代码中的$dumpfile系统任务将覆盖此选项;
-verdi
:使用verdi图形界面
+vcdfile+<filename>
:指定想要用于后期处理的VCD文件;
-vpd_file <filename>
:在运行时,定义VCS写入的VPD文件的替代名称,而不是缺省名称vcdplus.vpd;
+define+VCS
:定义全局的VCS,编译器在编译时如果源文件有类似ifdef VCS等字样,那么会执行定义之后的代码。
+vcs+vcdpluson
:编译选项,加入后会使能产生vpd文件,默认文件名vcdplus.vpd
-vpd <filename>
:打开仿真波形,一般在末尾加&,表示在后台运行
4、仿真命令和仿真环境之间传递参数
4.1 宏定义
前面介绍仿真选项的有
4.2 条件编译函数 $test$plusargs
if($test$plusargs("FSDB_ON"))
:表示从命令行读取参数并判断是否开启波形dump处理。如果去掉这个if判断,就表示无条件的波形dump。当然,正式项目开发中通常会加上条件判断,将开关控制权留到实际做仿真时去。因为回归验证由于要做大量的仿真,通常是不会dump波形,只有单个testcase的调试时才会进行仿真验证。
仿真代码:
initialbeginif($test$plusargs("test1")$readmemh("test1.dat",mem1);if($test$plusargs("test2")$readmemh("test2.dat",mem2);end
仿真命令:
只需要加上即可
.... +test1 +test2
4.3 参数传递函数 $value$plusargs
通过仿真命令向仿真环境传递参数
仿真代码:
if($value$plusargs("finish=%d", finish))
beginrepeat(finish); $display("finish=%d", finish);$finish;
end
仿真指令:
.... +finish=3 +freq=50
三、verdi相关
输出波形
verdi需要在testbench中添加如下代码
initialbegin$fsdbDumpfile("./top.fsdb"); //指定输出波形名称$fsdbDumpvars(0,tb); //输出信号层级,0表示所有,1表示第一层,依次类推;//tb表示例化的顶层模块名称$fsdbDumpvars("+all"); //+all参数,dump SV中的struct结构体$fsdbDumpSVA(); //将assertion的结果存存储到fsdb中$fsdbDumpMDA(0, top); //dump memory arraysend
verdi:分析过程,跟踪信号,比vcs自带的dve功能更强
-ssf filename.fsdb
:打开波形文件
-f filelist.f -top adder
:打开rtl代码,顶层模块名为adder
-nologo
:不显示verdi的启动log信息
常用的如下:
verdi -ssf test.fsdb -f filelist.f -top tb_top -ntb_opts uvm-1.2 -nologo
4.1 verdi使用方法
上面的界面:nTrace
下面的波形:nWave
(1)点击dut里面的信号,右键添加到波形图中,或者crtl+w
也可以点击红色图标,打开对话框去选要添加的信号
(2)快捷命令:
波形图左击选中部分波形
:可以放大波形
按f键
:全屏显示所有的波形
shift+滚轮
:左右移动波形
ctrl+滚轮
:放大或者缩小波形
保存添加到窗口的波形
:save,保留成rc文件,方便查看
追踪信号
:选中信号,点左上面一排的绿色的向右向左的图标
信号分组
:选中信号,按照滚轮移动信号到别的分组,或者一开始的时候就进行分组
统计时钟上下升沿个数
:
切换data的进制
:
数字/模拟信号切换
:
data有很多位,包含地址和数据,可以进行分开查看edit bus
:
查看数值logical operation
:选中信号,右键,最下面的选项
然后再去统计个数,就可以知道该信号这个数值有多少次
查找信号Find Scope
:crtl+S
四、面试问题
1、define和 t e s t test testplusargs的区别
define
:需要在编译之前完成变量的定义,如果需要修改的话,要重新编译,比较麻烦
$test$plusargs
:不需要重新编译,是从命令行传递参数进去
$value$plusargs
:它既可以实现testplusargs的要求,它是能传递参数同时对内部信号进行赋值
vcs +define+dumpon -sverilogsim +test1
sim +test1=123
这篇关于linux环境下vcs+verdi的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!