【Vcs + Verdi】仿真环境搭建
版本记录
| 版本号 | 描述 | 日期 | 作者 |
|---|---|---|---|
| v 1.0 | 初始版本 | 2024/10/10 | winki |
| v 2.0 | 根据代码仓环境重新修改仿真环境 | 2025/3/20 | winki |
| v 3.0 | 添加优化仿真时间的方法 | 2025/3/31 | winki |
| v 4.0 | 优化版本,重新定义环境配置以及代码添加、存放的方式 | 2025/12/3 | winki |
| v 5.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}/ifpga/01_src/00_hdl/top/filelist.f \ ${GITLAB}/ifpga/01_src/00_hdl/gpio/filelist.f \ ${GITLAB}/ifpga/01_src/00_hdl/ebus_router/filelist.f \ ${GITLAB}/common/dip/ebus/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” 一节中子模块文件列表前的路径参数
[!info] Makefile
######################################################################### # # # 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}/ifpga/01_src/00_hdl/top/filelist.f \ ${GITLAB}/ifpga/01_src/00_hdl/gpio/filelist.f \ ${GITLAB}/ifpga/01_src/00_hdl/ebus_router/filelist.f \ ${GITLAB}/common/dip/ebus/filelist.f \ ./00_tb_file/filelist.f
[!info] setupENV.sh
#!/bin/sh export SYNOPSYS_SIM_SETUP=/proj/winkiliang/sim_lib/synopsys_sim.setup #配置xilinx编译库位置 export GITLAB=/proj/winkiliang/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 位编译模式 | vlogan -full64 | |
| -kdb | vlogan -kdb | ||
| +v2k | 支持 Verilog-2001 | vlogan +v2k | |
| -sverilog | 支持 SystemVerilog | vlogan -sverilog | |
| -nc | 屏蔽 Synopsys 版权消息 | vlogan -nc | |
| -notice | 启用详细诊断消息 | vlogan -notice | |
| -l <analysis.log> | 日志文件输出 | vlogan -l ./02_log/analy. log | |
| -timescale = 1 ns/1 ns | 指定时间精度 | vlogan -timescale = 1 ns/1 ns | |
| +define+<macro> | 定义一个文本宏,与源文件中的 `ifdef配合 | vlogan +define+MASK_DDR | |
elabration_opt
| 编译选项 | 说明 | 实例 |
|---|---|---|
| -full 64 | 64 位编译模式 | vcs -full 64 |
| -kdb | vcs -kdb | |
| -notice | 启用详细诊断消息 | vcs -notice |
| -top <file> | 设置 file 为顶层文件 | vcs -top testbench+glbl |
| -debug_access+all | ||
| -P /xxx/novas.tab /xxx/pli.a | ||
| -o /path/simv | ||
| -l <elab.log> | 日志文件输出 | vcs -l ./02_log/elab.log |
| -Mdir=./01_temp_file | vcs -Mdir=./01_temp_file | |
| -nc | 屏蔽 Synopsys 版权消息 | vcs -nc |
run_opt
| 编译选项 | 说明 | |
|---|---|---|
| +no_notifier | ||
| +notimingcheck | ||
| -cm line+cond+fsm+tgl+branch | ||
| +fsdb+dump_log=off | ||
| +fsdbfile+<xxx.fsdb> | ||
| -l <sim.log> | 日志文件输出 | |
verdi_opt
| 编译选项 | 说明 | |
|---|---|---|
| -nologo | ||
| -ssf /path/xxx. fsdb | ||
| -dbdir /path/simv. daidir |

浙公网安备 33010602011771号