// 本文为笔者本人在使用vcs进行数字电路仿真时的学习笔记,仅用于本人纪录回顾,如有错误,欢迎指正
1、VCS安装
已安装好并设置好环境变量的直接跳转到下一章节
VCS(Verilog Compiler Simulator)是Synopsys推出的进行数字电路仿真的工具,支持Verilog和SystemVerilog等数字电路语言。首先,需要从官网获取安装包,需要官网账户和许可证,所以公司或学校一般会给安装办法。(实在不行,就只能自己找一些“魔法”教程了)。
下载好安装包,进行解压缩
tar -xvf VCS_Install.tar.gz -C /path/to/temp/dir
进入解压后的目录,并安装程序
cd /path/to/temp/dir
./install.sh
设置环境变量并添加许可证,在~/.bashrc中(csh需要使用csh的语法)
export VCS_HOME=/path/to/vcs/installation
export PATH=$VCS_HOME/bin:$PATH
export LM_LICENSE_FILE=27000@your_license_server
保存并关闭文件,source
source ~/.bashrc
验证是否安装成功
vcs -full64 -ID
打印出VCS版本信息,即表示安装成功。
2、分步编译与仿真
(1)编译
在进行vcs仿真之前,应该提前具备以下文件:
- verilog或systemVerilog源文件
- testbench文件
- list.f文件列表文件(源文件较多时)
- vcs运行脚本(vcs参数较多时)
准备好文件之后,先进行源码编译:
编译选项比较简单,只有一个verilog时,可直接在命令行编译:
vcs -full64 -debug_all test_top.v -o simv
- -full64:启用 64 位模式。
- -debug_all:启用所有调试选项。
- -o simv:指定输出可执行文件名为 simv
- test_top.v:verilog源码文件
当有verilog top文件,且已经由testbench文件时:
vcs -full64 -debug_all test_top.v tb.v -top test_tb -o simv
- -top:指定top module
当源码文件较多,可以将文件列表放在sim.f文件中:
vcs -full64 -debug_all -f sim.f -top test_tb.v -o simv
但往往我们使用vcs进行编译时会使用很多附加选项,以对仿真进行约束与配置,所以一般建议将vcs命令放置在脚本中,具体可见下一节。
(2)仿真
在vcs编译完,如果使用了-o simv参数,会生成指定的可执行文件simv,运行文件即可开始仿真:
./simv
(3)生成波形
如果希望vcs仿真时生成波形文件(VCD或者FSDB文件),可以有两种办法
- tb中添加
在仿真测试平台中添加以下语句:
initial begin
$dumpfile("tb.fsdb");
$dumpvars(0, testbench);
end
-
dumpfile指定生成波形文件名称
-
dumpvars指定记录的模块以及信号层(0表示纪录该模块中的所有信号)
-
simv参数中添加
若在tb中没有添加生成波形的语句,也可以在simv运行参数中添加:
./simv +vcs+dumpvars+tb.fsdb
波形的查看需要使用其他工具,vcd波形使用gtkwave,fsdb使用verdi。
3、使用脚本编译与仿真
往往使用VCS进行编译时,使用参数较多,一步步编译仿真较为麻烦,建议直接放在脚本或makefile中一步到位。
(1)脚本执行
可以将vcs的参数放置在一个可执行脚本中(例如sh),并利用vcs -R参数在编译完之后直接运行仿真,提升效率。以下是一个run_sim.sh示例脚本。
#xxxxxx
vcs \
+vcs+lic+wait \
-full64 \
+v2k -v2005 \
-sverilog \
-kdb \
-Mupdate=1 \
+vpi \
-lca \
-ntb_opts uvm-1.2 \
-ntb_opts svp \
+error_10000 \
+lint=TFIPC-L \
-debug_access+all \
-Marchive=100 \
-reportstats \
-diag timescale \
+nospecify \
-timescale=1ps/1fs \
-assert nopostproc \
-debug_all \
+vc \
+vcs_loopdetect \
+evalorder \
+neg_tchk+sdfverbose \
+define+YOUR_PARAMETER \
+incdir+../src \
-y /path/your_library \
-top test_tb \
-l vcs.log \
-f ./test_sim.f \
-R
脚本中使用的参数解释:
- +vcs+lic+wait:等待许可证可用
- -full64:启用 64 位模式
- +v2k -v2005:启用 Verilog 2001 和 Verilog 2005 标准
- -sverilog:启用 SystemVerilog 支持
- -kdb:启用调试数据库
- -Mupdate=1:启用增量编译
- +vpi:启用 VPI(Verilog Procedural Interface)
- -lca:启用库编译加速(Library Compile Accelerator)
- -ntb_opts uvm-1.2:启用 UVM 1.2 选项
- -ntb_opts svp:启用 SVP 选项
- +error_10000:设置最大错误数为 10000
- +lint=TFIPC-L:启用特定的 lint 检查
- -debug_access+all:启用所有调试访问
- -Marchive=100:设置最大归档数为 100
- -reportstats:报告统计信息
- -diag timescale:启用时间尺度诊断
- +nospecify:禁用 specify 块,通常用于忽略时需检查和路径延时
- -timescale=1ps/1fs:设置timescale为 1ps/1fs
- -assert nopostproc:禁用断言后处理
- -debug_all:启用所有调试选项
- +vc:启用 VC(Verilog Compiler) 选项
- +vcs_loopdetect:启用循环检测
- +evalorder:启用评估顺序选项
- +neg_tchk+sdfverbose: 启用负时间检查和 SDF 详细输出。
- +define+YOUR_PARAM:定义宏
- +incdir+/path/src:添加包含目录
- -y:指定库路径
- -top:指定顶层模块
- -l:打印仿真日志并制定log名称
- -f:指定编译文件list
- -R:编译完直接运行仿真
根据需要选择并添加合适的参数即可,其他参数可使用vcs -help查看参数及定义,或者查看工具使用文档说明。
运行脚本:
chmod +x ./run_sim.sh
./run_sim.sh
其中我们默认tb中添加了生成波形文件的参数,如果没有可自行在脚本中添加“+vcs+dumpvars+tb.fsdb”参数。
仿真结束后,使用verdi查看fsdb波形:
verdi -sv +v2k -f run_sim.f -ssf tb.fsdb -top test_tb -nologo -log verdi.log
(2)Makefile执行
若环境中安装了make相关驱动,可以编写Makefile来执行vcs编译与仿真。下方给出了一个Makefile文件示例。
#xxxxxx
all: clean comp run clean \
### -----------------------
clean:
\rm -rf simv* csrc* *.log *.fsdb.* ucli.key parload_file
clean_all:
\rm -rf simv* csrc* *.log *.fsdb.* *.fsdb ucli.key parload_file verdiLog *.conf *.rc
comp:
./run_vcs_sim
run:
./simv -ucli -i run_cli -l run.log
执行以下命令进行对应的操作:
- make clean: 删除无用的中间文件
- make clean_all:删除所有编译后、仿真后的文件
- make comp:执行VCS编译
- make run:执行仿真
- make或者make all:清理空间,执行VCS编译并仿真
注意的是,示例的Makefile需要提前准备好以下文件:
- run_vcs:vcs编译脚本,参照上一节执行脚本且去掉-R参数,即仅进行vcs编译。
- run_cli:包含一系列ucli(Unified Command Line Interface,提供一个交互式命令行界面)命令,在仿真时自动执行。
以下是一个简单的run_cli示例,该文件在vcs仿真时不是必须的。
alias . run
alias quit exit
force test_tb.test_top.test_signal 1'b0;
call \$fsdbDumpfile {"tb.fsdb"}
call \$fsdbDumpvars 0 test_tb
run 1000us
exit
脚本意义:
- alias:别名
- force:给某些信号强制赋初始值
- call:调用另一个脚本或者执行一组命令
- run:运行仿真,可设定仿真时间
- exit:退出
可以看出,run_cli可以用于对仿真过程做一些补充命令,这些命令可能在tb中没有体现,用不同的run_cli可以实现用同样的设计做不同条件下的仿真。