最简单的编译命令
假设你只有一个顶层 Verilog 文件 top.v,并且没有其他依赖库。

vcs top.v
执行这个命令后,VCS 会:
- 编译
top.v文件。 - 在当前目录下生成一个可执行文件,默认名为
simv。 - 你可以直接运行这个可执行文件来开始仿真:
./simv
注意:在 Linux 环境下,./simv 是必须的,表示在当前目录下执行该文件。
常用编译选项
在实际项目中,编译命令会包含很多选项来控制编译和仿真的行为。
指定顶层模块
使用 +libext+ 和 +incdir+ 来指定文件路径和扩展名,使用 -s 或 --top-module 来指定顶层模块。

vcs -s top_module_name \
+incdir+./src \
+libext+.v+.sv \
./src/params.v \
./src/agent.sv \
./src/dut.v
-s top_module_name: 指定top_module_name为顶层模块。+incdir+./src: 声明一个包含目录,-I./src也可以达到同样效果。+libext+.v+.sv: 指定编译器查找的文件扩展名,这里是.v和.sv。- 后面跟着的是具体的源文件列表。
编译 UVM (Universal Verification Methodology)
UVM 是目前最主流的验证方法学,编译 UVM 测试台需要加载 UVM 库。
vcs -s top_testbench \
+incdir+./src+./uvm-1.2/src \
+define+UVM \
+libext+.v+.sv \
./src/dut.v \
./testbench/testbench.sv \
./uvm-1.2/src/uvm.sv
+incdir+./uvm-1.2/src: 添加 UVM 源文件的路径。+define+UVM: 定义宏UVM,很多 UVM 的代码会依赖这个宏来编译。./uvm-1.2/src/uvm.sv: 显式地包含 UVM 的顶层文件。
更推荐的方式是使用 UVM 的编译脚本:
UVM 发行包中通常包含一个 uvm_pkg.sv 文件,以及一个编译脚本(如 uvm-1.2/src/run.sh),直接使用其编译脚本是最佳实践。
生成波形文件
使用 -cm 选项可以生成覆盖率数据库,而 -kdb 和 -ucli 则可以生成波形文件。
# 生成 VPD 波形文件 (常用) vcs -cm line+toggle -kdb -ucli ... # 其他编译参数 ... # 运行仿真 ./simv -cm line+toggle -kdb -ucli +vcs+lic+wait # 将 VPD 转换为 FSDB (使用 DVE) vpd2fsdb simv.vpd # 或者直接生成 FSDB 波形文件 vcs -cm line+toggle -cm hier -debug_access+all ... # 其他编译参数 ... ./simv -cm line+toggle -debug_access+all
-kdb -ucli: 在编译时生成调试信息文件 (simv.ucli),用于在仿真时记录波形。-cm line+toggle: 生成代码行覆盖率和翻转覆盖率。-debug_access+all: 这是一个非常强大的选项,它允许你在仿真后通过 DVE 或 Verdi 进行调试,查看内部信号,甚至修改信号值,强烈推荐在调试时使用。- 运行
./simv时,需要带上编译时生成的相同选项(如-kdb -ucli)。 - VPD vs. FSDB: VPD 是 VCS 的原生波形格式,FSDB 是 Verdi 的原生格式,VPD 文件通常比 FSDB 小,但 Verdi 对 FSDB 的支持更好。
vpd2fsdb工具可以在两者之间转换。
调试选项
-debug_access: 启用调试功能。-debug_access: 基础调试。-debug_access=rtl: 仅支持 RTL 级调试。-debug_access+all: 最强模式,支持所有调试功能,包括后门访问(backdoor access)、波形查看、信号修改等,调试时推荐使用。
其他常用选项
-Mupdate: 增量编译模式,VCS 会分析文件依赖关系,只重新编译发生变化的文件及其依赖项,可以大大缩短编译时间,对于大型项目,这是必须的。-R: 编译完成后立即运行仿真,这在快速验证小改动时非常有用。vcs -R -s top_module ... # 其他参数 ...
-L: 链接共享库,如果你的测试台需要链接外部的 C/C++ 共享库,可以使用此选项。vcs -L./my_lib.so ... # 其他参数 ...
-full64: 编译 64 位版本的仿真器,如果你的系统是 64 位的,建议使用此选项以获得更大内存空间。vcs -full64 ... # 其他参数 ...
完整的编译与运行示例
假设项目结构如下:

my_project/
├── src/
│ ├── dut.sv
│ └── agent.sv
├── test/
│ └── testbench.sv
├── uvm-1.2/
│ └── src/
│ └── uvm_pkg.sv
└── Makefile
Makefile 中的编译命令示例:
# VCS 安装路径 (根据实际情况修改)
VCS = /tools/synopsys/vcs/O-2025.09/linux64/bin/vcs
# 编译选项
VCS_FLAGS = -full64 \
-s tb_top \
+incdir+./src+./uvm-1.2/src \
+define+UVM \
+define+DEBUG \
+libext+.v+.sv \
-cm line+toggle \
-debug_access+all \
-Mupdate
# 源文件列表
SRC_FILES = ./src/dut.sv \
./src/agent.sv \
./test/testbench.sv \
./uvm-1.2/src/uvm_pkg.sv
# 默认目标
all: compile
# 编译目标
compile:
$(VCS) $(VCS_FLAGS) $(SRC_FILES)
# 运行仿真目标
run: compile
./simv -cm line+toggle -debug_access+all +UVM_TESTNAME=my_test
# 打开波形查看器 (DVE)
view:
dve -vpd simv.vpd -fsdb simv.fsdb
# 清理编译文件
clean:
rm -rf simv* csrc* ucli* vcs* *.daidir* *.vpd *.fsdb *.log DVEfiles*
.PHONY: all compile run view clean
如何使用这个 Makefile:
- 编译:在
my_project目录下执行make compile或直接make。 - 运行:执行
make run,它会先检查是否需要重新编译,然后运行仿真并生成覆盖率数据。 - 查看波形:执行
make view会自动打开 DVE 并加载波形文件。 - 清理:执行
make clean删除所有编译生成的文件,回到干净状态。
VCS 与 Verdi 的配合使用
Verdi 是 Synopsys 的强大的调试和波形查看工具。
-
编译时生成信号数据库 在 VCS 编译命令中加入
-debug_access+all和-kdb选项。vcs -debug_access+all -kdb ... # 其他参数 ...
-
运行时记录波形 在运行
simv时,加上-ucli选项。./simv -ucli
这会生成
simv.ucli文件,其中包含了所有信号的波形信息。 -
使用 Verdi 打开波形 Verdi 可以直接读取
simv.ucli文件,无需生成巨大的.vpd或.fsdb文件,这在调试大型设计时非常高效。verdi -ssf ucli -ssz 1G &
-ssf ucli: 指定信号数据库文件为ucli。-ssz 1G: 为 Verdi 分配 1GB 内存用于加载信号信息,对于大型设计,这个值需要调大。
| 目的 | 常用选项 | 示例 |
|---|---|---|
| 基本编译 | vcs <files> |
vcs top.v |
| 指定顶层 | -s <module_name> |
vcs -s my_top top.v |
| 指定路径 | +incdir+<dir> |
vcs +incdir+./src src/a.v |
| 编译UVM | +define+UVM, -s <tb_top> |
vcs +define+UVM -s my_tb uvm_pkg.sv my_tb.sv |
| 生成波形 | -kdb -ucli (运行时) |
vcs -kdb ... ./simv -ucli |
| 生成FSDB | -debug_access+all |
vcs -debug_access+all ... ./simv |
| 调试 | -debug_access+all |
vcs -debug_access+all ... |
| 增量编译 | -Mupdate |
vcs -Mupdate ... |
| 编译后运行 | -R |
vcs -R ... |
| 64位编译 | -full64 |
vcs -full64 ... |
| 与Verdi联调 | -debug_access+all -kdb (编译) -ucli (运行) |
vcs -debug_access+all -kdb ... ./simv -ucli verdi -ssf ucli |
掌握这些核心选项,你就可以应对绝大多数 VCS 编译和仿真的场景了,对于复杂项目,强烈建议使用 Makefile 或其他构建工具来自动化编译流程。
