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是否匹配。

若公司使用License队列,可在编译命令前加 vcs -licqueue,当feature暂时被占用时排队等待,而不是直接报错退出。

三、编译与仿真基本流程

VCS的标准流程分为两步:编译(compile)和仿真(simulate)。编译阶段把设计文件和测试平台一起分析、细化并生成可执行文件 simv;仿真阶段运行 simv,产生波形和日志。下图展示了这一数据流与关键产物:

VCS 编译—仿真数据流与关键产物 设计源文件 dut.v top.v 测试平台 tb_hello.v 时钟/激励/检查 vcs 编译 分析 → 细化 → 优化 生成 simv + 编译日志 ./simv 仿真 加载 simv 运行激励 产生波形/日志 仿真产物 wave.vcd / dump.fsdb sim.log 关键命令 vcs -full64 -sverilog -debug_access+all ./simv +vcs+fsdbon

编译命令的典型形式为:

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,避免仿真挂起。