【Vcs + Verdi】仿真环境搭建
版本记录
| 版本号 | 描述 | 日期 | 作者 |
|---|---|---|---|
| v1.0 | 初始版本 | 2024/10/10 | winki |
| v2.0 | 根据代码仓环境重新修改仿真环境 | 2025/3/20 | winki |
| v3.0 | 添加优化仿真时间的方法 | 2025/3/31 | winki |
| v4.0 | 优化版本,重新定义环境配置以及代码添加、存放的方式 | 2025/12/3 | winki |
| v5.0 | 重新整理环境结构,使用 vcs 三步法进行编译 | 2026/06/10 | winki |
环境代码
文件目录
- 在使用环境时,请按照下方 Example 中的环境格式进行搭建。Makefile 中的编译选项以及输出路径都以该环境的相对路径编写
- 使用该环境进行仿真时,请参考 本文的 “代码规范” 一节。该环境与 Vivado 工程管理 一文共同维护一个项目工程
[!example]+
sim_env ├──── 00_tb_file //所有testbench相关仿真文件 | ├──── testbench.sv //testbench | ├──── filelist.f //支撑仿真所需的文件列表 | └──── driver.sv ├──── 01_temp_file //临时文件夹,仿真产生的中间文件都放到该文件夹中 ├──── 02_log_file //日志文件夹 ├──── Makefile //Makefile文件 └──── setupENV.sh //配置仿真环境变量
Makefile
[!example]+
######################################################################### # # # Set Variables # # # ######################################################################### TIMESTAMP = $(shell date +%Y%m%d%H%M) TB_TOP_NAME = testbench TIMESCALE = -timescale=1ns/1ns DEFINE = MASK_DDR+MASK_ILA compile_filelist = \ ${GITLAB}/01_src/00_hdl/module_a/filelist.f \ ${GITLAB}/01_src/00_hdl/module_b/filelist.f \ ${GITLAB}/01_src/00_hdl/module_c/filelist.f \ ${GITLAB}/01_src/00_hdl/module_d/filelist.f \ ./00_tb_file/filelist.f ######################################################################### # # # VCS & Verdi Compile option # # # ######################################################################### vlogan_opt= \ -kdb -lca -full64 -notice -nc -sverilog +v2k \ +define+${DEFINE} ${TIMESCALE} \ ${XILINX_VIVADO}/data/verilog/src/glbl.v \ -l ./02_log_file/anly_${TIMESTAMP}.log elab_opt = \ -kdb -lca -full64 -nc -notice -top ${TB_TOP_NAME}+glbl -debug_access+all \ -P ${VERDI_HOME}/share/PLI/VCS/LINUX64/novas.tab \ ${VERDI_HOME}/share/PLI/VCS/LINUX64/pli.a \ -o ./01_temp_file/simv \ -l ./02_log_file/elab_${TIMESTAMP}.log \ -Mdir=./01_temp_file run_options = \ +no_notifier +notimingcheck \ -cm line+cond+fsm+tgl+branch \ +fsdb+dump_log=off \ +fsdbfile+./01_temp_file/${TB_TOP_NAME}.fsdb \ -l ./02_log_file/sim_${TIMESTAMP}.log verdi_options = \ -nologo \ -ssf ./01_temp_file/${TB_TOP_NAME}.fsdb \ -dbdir ./01_temp_file/simv.daidir & ######################################################################## # # # Makefile command # # # ######################################################################## merge_filelist: cat ${compile_filelist} | sort -u > ./00_tb_file/total_filelist.f analy: vlogan ${vlogan_opt} -f ./00_tb_file/total_filelist.f elab: vcs ${elab_opt} sim: ./01_temp_file/simv ${run_options} sim_gui: ./01_temp_file/simv ${run_options} -gui verdi: verdi ${verdi_options} clean: rm -rf ./01_temp_file/* ./02_log/* \ novas* verdiLog* ucli*
setENV. sh
[!example]+
#!/bin/sh export SYNOPSYS_SIM_SETUP=/proj/winkiliang/sim_lib/synopsys_sim.setup #配置xilinx编译库位置 export GITLAB=/proj/winkiliang/gitlab #配置filelist.f文件中的路径变量
使用说明
第一步 :编译仿真库
- 打开 Vivado
- 在 Tcl 命令窗中,输入
config_compile_simlib -cfgopt {vcs.verilog.global:-kdb} - 点击
Tools->Compile Simulation Libraries,将会显示 Compile Simulation Libraries 窗口 - 根据自己所使用的语法和器件,选择对应的选项
- Simulatior:仿真器,选择
VCS - Language:语言,选择
All - Library:编译库,选择
All - Family:系列,选择
All(也可以只编译项目的器件系列) - Compiled library location:编译库的输出路径
- Simulator executable path:仿真器的路径 (需根据 Vivado 版本选择对应的 vcs 版本)
- GCC executable path:GCC 可执行文件的路径 (需根据 Vivado 版本选择对应的 gcc 版本)
- Miscellaneous Option:指定其他选项,这里添加
-no_xxx - Compile AMD IP:为 AMD IP 启动编译仿真库,这里
勾选 - Overwrite current pre-compiled libraries:覆盖当前编译库,这里
不勾选 - Verbose:暂时覆盖所有消息限制,这里
不勾选 - Command:tcl 命令,上述选项所等效的 tcl 命令
- Simulatior:仿真器,选择
- 点击
Compile,开始编译
下面是我当前使用的编译库(复制上述操作的 tcl 命令)
[!example]+
config_compile_simlib -cfgopt {vcs.vhdl.global:-kdb} compile_simlib \ -simulator vcs \ -simulator_exec_path {/home/tools/Synopsys/vcs/I-2023.03-1/bin} \ -gcc_exec_path {/home/tools/gcc/9.2.0/bin} \ -family virtexuplus \ -language verilog \ -library all \ -dir {/proj/winkiliang/sim_lib} \ -no_systemc_compile
第二步 :设置环境参数
- 修改 Makefile 中
Set Variables下方配置- TIMESTAMP :当前时间戳,用于命名编译时产生的 log 文件时间(不需要修改)
- TB_TOP_NAME :testbench 名字(建议不作修改)
- TIMESCALE : 指定时间精度
- DEFINE :宏定义,与代码中的
ifdef / ifndef配套使用 - compile_filelist :仿真中所使用到的子模块文件列表,请参考 本文的 “代码规范 — filelist.f” 一节说明

- 修改 setupENV. sh 中的环境变量
- SYNOPSYS_SIM_SETUP :第一步中生成的编译库 synopsys_sim.setup 文件路径
- GITLAB : 本文的 “代码规范 — filelist.f” 一节中子模块文件列表前的路径参数

第三步 :输入命令
[!Tip]
命令 说明 source setupENV.sh 配置仿真环境变量 make analy 对 total_filelist.f 中的文件进行语法检查并翻译成库文件 make elab 读取编译好的库文件,建立层次结构,生成可执行文件 make sim 运行可执行文件,输出仿真结果 make sim_verdi 用 verdi 打开可执行文件,在 verdi 中进行单步调试 make verdi 用 verdi 打开波形文件 make clean 清除仿真产生的所有文件 make merge_filelist 将 Makefile 中所有 filelist 合并成一个总的 total_filelist.f
[!example] 常规仿真流程
source setupENV.sh make analy make elab make sim make verdi
[!example] 单步调试流程
source setupENV.sh make analy make elab make sim_verdi
代码规范
filelist.f(文件列表)
背景:
- 在系统中,一般以功能模块去划分不同的子系统,并将子模块放到一个以功能模块命名的文件夹中。在这个子系统中,可能会使用一些公共模块去协助开发,而这些公共模块可能是存放在另外一个文件夹中;当其他人使用这个模块时,可能并不清楚会使用到哪些模块,也不清楚该模块放在哪。因此,这里建议开发人员在完成开发后,编写一个 filelist.f 文件列表,在 filelist.f 中列出所有该子系统所需的模块。这样,不论是添加该子系统到 Vivado 工程中或者是用于仿真,都只需要添加该 filelist.f 即可
目的:
- 如果该子系统有一个包含了所有子模块的文件列表,并且所有子模块都有一个共同的路径。那么我们在使用这个子系统的时候,只需要做 2 件事:
- 添加该文件列表
- 配置共同路径的环境变量
要求:
- 每个子系统中必须有一个包含该子系统所有子模块的文件列表
- 文件列表中的路径必须是相对路径,而且路径的前缀必须是 ${GITLAB}
[!example]
${GITLAB}/i2c_master/i2c_master.v ${GITLAB}/i2c_master/a.v ${GITLAB}/i2c_master/b.v ... ${GITLAB}/common/test_reg.v
编译选项介绍
vlogan_opt
| 编译选项 | 说明 |
|---|---|
| -full64 | 64 位编译模式 |
| -kdb -lca | 使能生成 verdi KDB 数据库 |
| +v2k | 支持 Verilog-2001 |
| -sverilog | 支持 SystemVerilog |
| -nc | 屏蔽 Synopsys 版权消息 |
| -notice | 启用详细诊断消息 |
| -l <analysis.log> | 日志文件输出 |
| -timescale=1ns/1ns | 指定时间精度 |
| +define+<macro> | 定义一个文本宏 |
elabration_opt
| 编译选项 | 说明 |
|---|---|
| -full64 | 64 位编译模式 |
| -kdb -lca | 使能生成 verdi KDB 数据库 |
| -notice | 启用详细诊断消息 |
| -top <file> | 设置 file 为顶层文件 |
| -debug_access+all | Full Debug mode |
| -P /xxx/novas.tab /xxx/pli.a | 指定使用的 PLI 表文件与库文件 pli.a |
| -o /path/simv | 指定运行文件路径和名称 |
| -l <elab.log> | 日志文件输出 |
| -Mdir=./01_temp_file | 指定增量编译的目录 |
| -nc | 屏蔽 Synopsys 版权消息 |
## run_opt
| 编译选项 | 说明 |
|---|---|
| +no_notifier | |
| +notimingcheck | 不进行时序检查 |
| -cm line+cond+fsm+tgl+branch | 代码覆盖率收集选项 |
| +fsdb+dump_log=off | 关闭 dump 波形日志 |
| +fsdbfile+<xxx.fsdb> | 添加 fsdb 文件 |
| -l <sim.log> | 日志文件输出 |
verdi_opt
| 编译选项 | 说明 |
|---|---|
| -nologo | 不显示 verdi logo |
| -ssf /path/xxx. fsdb | 打开 fsdb 波形文件 |
| -dbdir /path/simv. daidir | 打开仿真器数据库(database)文件夹,其中存放的是包含了编译信息的中间数据 |
Verdi 界面说明





浙公网安备 33010602011771号