2. VCS工具入门
VCS(Verilog Compiler Simulator)是Synopsys公司推出的数字芯片仿真工具,其核心工作方式是把Verilog/SystemVerilog源代码先编译成可执行的仿真二进制,再运行该二进制产生波形和日志。理解这一“两段式”流程,是掌握VCS所有命令行选项的前提。本节从环境准备讲起,逐步完成一个可运行的Hello World仿真实例。
一、安装与环境准备
VCS通常随Synopsys的EDA工具套件一起安装,安装目录一般形如 /tools/synopsys/vcs/T-2022.06。安装完成后,需要把可执行文件路径加入环境变量,并设置License相关变量。典型的环境配置如下:
export VCS_HOME=/tools/synopsys/vcs/T-2022.06
export PATH=$VCS_HOME/bin:$PATH
export LM_LICENSE_FILE=27020@lic-server.company.com
export VCS_ARCH_OVERRIDE=linux64
其中 LM_LICENSE_FILE 指向License服务器,格式为 端口@主机名。若使用本地License文件,也可写成 export LM_LICENSE_FILE=/path/to/license.dat。配置完成后执行 vcs -ID 可查看版本信息,若正常输出版本号,说明安装与环境变量已生效。
二、License配置与常见问题
VCS启动时会向License服务器请求feature。常见的feature包括 VCSRuntime_Net(运行时License)和 VCSCompiler_Net(编译时License)。如果请求失败,工具会报出类似 Cannot find license file 或 License server unreachable 的错误。排查顺序建议为:先确认 LM_LICENSE_FILE 或 SNPSLMD_LICENSE_FILE 是否设置正确,再用 lmstat -a -c 27020@lic-server 检查服务器状态和feature余量,最后确认本机hostname与License文件中的hostid是否匹配。
vcs -licqueue,当feature暂时被占用时排队等待,而不是直接报错退出。三、编译与仿真基本流程
VCS的标准流程分为两步:编译(compile)和仿真(simulate)。编译阶段把设计文件和测试平台一起分析、细化并生成可执行文件 simv;仿真阶段运行 simv,产生波形和日志。下图展示了这一数据流与关键产物:
编译命令的典型形式为:
vcs -full64 -sverilog -debug_access+all \
-timescale=1ns/1ps \
-f filelist.f \
-o simv
其中 -full64 表示生成64位可执行文件,-sverilog 允许SystemVerilog语法,-debug_access+all 打开调试访问权限以便后续用Verdi查看波形,-timescale 指定时间单位与精度,-f filelist.f 从文件列表读取源文件,-o simv 指定输出可执行文件名。编译成功后,当前目录会出现 simv、csrc 等文件。
仿真阶段直接运行 ./simv,可附加运行时选项,例如 +vcs+fsdbon 开启FSDB波形记录,+ntb_random_seed=1 固定随机种子,-l sim.log 把日志写入文件。仿真结束后,通过日志中的 $display 输出和波形文件即可判断功能是否正确。
四、常用命令行选项速查
| 选项 | 作用 | 使用阶段 |
|---|---|---|
-full64 | 生成64位可执行文件 | 编译 |
-sverilog | 支持SystemVerilog语法 | 编译 |
-debug_access+all | 打开全部调试访问 | 编译 |
-f filelist.f | 从文件读取源文件列表 | 编译 |
-o simv | 指定输出可执行文件名 | 编译 |
-l log | 日志写入文件 | 编译/仿真 |
+vcs+fsdbon | 开启FSDB波形记录 | 仿真 |
+ntb_random_seed | 指定随机种子 | 仿真 |
五、Hello World仿真实例
下面给出一个最小可运行示例。设计文件 hello.v 只包含一个打印语句:
module hello;
initial begin
$display("Hello, VCS!");
$finish;
end
endmodule
测试平台可以省略,因为 hello 模块本身已包含 initial 块。编译并运行:
vcs -full64 -sverilog hello.v -o simv
./simv
预期输出为:
Hello, VCS!
$finish at simulation time 0
若希望同时产生波形,可在 initial 块中加入 $dumpfile("hello.fsdb"); $dumpvars;,并在仿真时加 +vcs+fsdbon。运行后用Verdi打开 hello.fsdb,即可看到仿真时间轴。虽然本示例没有信号跳变,但它完整走通了“编译—生成simv—运行—输出日志”的闭环,是后续复杂验证环境的基础。
$finish 与 $stop 不同,前者结束仿真并退出,后者暂停仿真进入交互模式。在批处理脚本中应使用 $finish,避免仿真挂起。