注:主要侧重于Makefile调用VCS和Verdi联合仿真。
Makefile带来的好处就是自动化编译和仿真,只需要一个 make 命令。make是Linux下的二进制程序,在shell命令行键入make命令时,将自动寻找名称为“Makefile”的文件作为编译文件。
形式一:
target : prerequisites
command
形式二:
target : prerequisites;command
command
其中:
例如:
clean:
rm -f tb.sv
(1)make会按顺序一条一条的执行命令。每条命令必须以Tab键开头。
(2)而当一个target下有多条命令时,就会有两种可能:
例如,下面两次pwd时显示的文件路径是否相同?
exe1:
cd /home/verifier/
pwd
exe2:
cd /home/verifer/; pwd
// exe1中pwd显示的为 根目录 ~
// exe1中pwd显示的为 /home/verifer/
(3)如果命令执行到当期行,发现命令出错了(如cd命令时不存在目标目录)。假如我们不希望整个make动作因为命令错误而停止,可以再命令行TAB键之后加一个减号“-”,表示不管命令是否出错,都认为是成功的。例如下面:
exe2:
- cd /home/verifer/; pwd
Makefile中变量的使用:
例如:
PATH = ~/project/vip/
sim :
cd ${PATH}
VCS仿真分为两个步骤:编译 + 仿真。VCS在编译 Verilog 文件后,默认会产生一个名为 simv 的二进制可执行文件,然后执行这个simv文件就可以进行仿真。如下例子:
[verifier]$ vcs +v2k top_tb.v -debug_all
...
[verifier]$ ./simv -gui &
解释上面两行指令:
编译时常用的option,如下:
命令 | 描述 | 备注 |
---|---|---|
vcs -help | 打开vcs帮助文档 | 可以重定向生成一个文件,例如采用 vcs -help > vcs_help.txt |
-sverilog | 支持systeverilog语法 | |
+v2k | 支持 Verilog 2001 语法 | |
-l 文件名 | 设置生成的log文件的文件名 | l是小写的L |
-R | 编译完自动地去仿真,不需要手动执行simv文件 | |
-P | pli.tab定义PLI的列表(表)文件 | 配置Verdi时需要 |
-gui <=dve 或 verdi> | 打开仿真图形化界面 | |
–fsdb | 调用Verdi PLI 库,支持fsdb 波形 | |
-ucli | 在运行时指定UCLI模式,即命令行模式 | |
-Mupdate | 如果修改了文件,VCS可以只编译修改了的文件,节省编译时间 | |
-v 文件名 | 告诉VCS是哪个定义好的Verilog工艺库 | |
-y 路径 | 告诉VCS这个Verilog工艺库上哪去找 | |
+libext+< extension > | 与-y配合,用来指定查找的文件的后缀 | 例如查找.v文件,可以用+libext+.v |
+incdir+< dir > | 告诉VCS去哪找 `include的文件 | |
-f 文件列表 | 指定一个包含所有文件路径的filelist文件(.flist) | |
-o 文件名 | 默认编译后产生一个simv文件,-o可以指明这个文件的文件名 | |
+define+名字 = 值 | 定义宏 | |
-timescale = 时间单位/精度 | 设置仿真的时间单位、精度; | |
-debug | 对应TB中的$vcdpluson加载波形函数,使能DVE、Verdi 波形调试和UCLI命令行调试等 | |
-debug_all | 使能所有的debug调试功能 | |
-debug_pp | 使能debug调试功能,可以dump fsdb和vpd,使能DVE、VERDI波形调试和UCLI命令行调试 | |
-cm [option] | 覆盖率收集选项,option包括: line(行)、cond(条件)、fsm(状态机)、tgl(翻转)、branch(分支)、assert(断言) | 常用命令如: -cm line+cond+fsm+tgl |
-cm_dir < dir > | 指定覆盖率文件放置的路径 |
仿真时常用的option,如下:
命令 | 描述 | 备注 |
---|---|---|
-l 文件名 | 输出log文件 | l是小写的L |
+notimingcheck | 关闭时序检查 | |
-vpd_file 文件名 | 生成vpd文件 | vpd是VCS的产生的波形文件 |
注,对几种波形文件介绍:
上面我们知道VCS仿真可以分为两步:编译+仿真。下面我们就实现一个最简单的Makefile脚本启动VCS仿真。
comp:
vcs +v2k top_tb.v -debug_all -l comp.log
sim:
./simv -l run.log -gui &
clean:
rm -r *.log *.vpd *.vcd *.fsdb
根据上面的脚本,可以在Terminal中输入make comp 和 make sim 命令就可以直接启动仿真。
为了实现VCS仿真和Verdi查看波形的效果,需要在VCS仿真时产生Verdi所需的fsdb波形文件,dump fsdb文件,再使用Verdi打开fsdb文件。下面解析步骤:
这里可以有两种方式来生成fsdb文件:可以参考fsdb dump。下面介绍其中一种,如下:首先在TB中添加Verilog的函数首先在VCS编译脚本上,需要用-P选项配置verdi,找到目录中对相应的 Synopsys/Verdi/ 的文件夹,指定需要加载的动态库(.so)、表格文件(.tab)和静态库(.a)。如下:
NOVAS_HOME = /share/eda/Synopsys/Verdi/L-2016.06/ # 这是我电脑上Verdi的目录
NOVAS_ARGS = ${NOVAS_HOME}/share/PLI/VCS/LINUX64/novas.tab \ # 这部分基本是固定的
${NOVAS_HOME}/share/PLI/VCS/LINUX64/pli.a \
vcomp:
vcs -full64-debug_pp -LDCLASS -rdynamic -P ${NOVAS_ARGS} \
-f complie.f \
-l compile.log
解释一下上面的命令:
相应地仿真时的脚本文件,如下:
sim:
./simv \
-ucli -i dump_fsdb.tcl \
+fsdb+autofulsh \
-l sim.log
解释上面的命令:
dump_fsdb.tcl的脚本如下:
global env
fsdbDumpfile "$env(file_name).fsdb"
fsdbDumpvars 0 "top_tb"
run
解释上面的tcl脚本:
verdi -f file.f -ssf *.fsdb &
解释上面的命令行中:
下面是一个简单的makefike脚本,如下:
export file_name = top_tb
FILE_LIST = compile.f
TB_DIR =
SIMV_FILE = simv
LOG_DIR = ./log
#----Coverage----
CM_TYPE = line+cond+fsm+branch+tgl
CM_DIR = ./coverage
#----Verdi-----
NOVAS_HOME = /share/eda/Synopsys/Verdi/L-2016.06/
NOVAS_ARGS = ${NOVAS_HOME}/share/PLI/VCS/LINUX64/novas.tab \
${NOVAS_HOME}/share/PLI/VCS/LINUX64/pli.a \
DUMP_COND = DUMP_FSDB
VCOMP = vcs -full64 -sverilog +v2k -debug_pp \
-o ${FILE_LIST} \
-l ${LOG_DIR}/compile.log \
-f ${FILE_LIST} \
+incdir+${TB_DIR} \
CM = -cm ${CM_TYPE} \
-cm_dir ${CM_DIR} \
VERDI = -LDFLAGS -rdynamic -P ${NOVAS_ARGS}
#----------COMMAND-----------
comp:
${VCOMP} ${CM} ${VERDI}
sim:
verdi:
verdi -nologo -sv -f ${FILE_LIST} -ssf *.fsdb +${DUMP_COND}
clean:
rm -rf *.csrc ./*.daidir ${SIMV_FILE } *simv* ucli* *.vpd *.fsdb *novas* *.log
tcl脚本,如下: