VCS数字电路编译与仿真-学习笔记

// 本文为笔者本人在使用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文件),可以有两种办法

  1. 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可以实现用同样的设计做不同条件下的仿真。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ME_Felix

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值