Loading

【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文件中的路径变量




使用说明


第一步 :编译仿真库

  1. 打开 Vivado
  2. 在 Tcl 命令窗中,输入 config_compile_simlib -cfgopt {vcs.verilog.global:-kdb}
  3. 点击 Tools -> Compile Simulation Libraries ,将会显示 Compile Simulation Libraries 窗口
  4. 根据自己所使用的语法和器件,选择对应的选项
    • 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 命令
  5. 点击 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



第二步 :设置环境参数

  1. 修改 MakefileSet Variables 下方配置
    • TIMESTAMP :当前时间戳,用于命名编译时产生的 log 文件时间(不需要修改)
    • TB_TOP_NAME :testbench 名字(建议不作修改)
    • TIMESCALE : 指定时间精度
    • DEFINE :宏定义,与代码中的 ifdef / ifndef 配套使用
    • compile_filelist :仿真中所使用到的子模块文件列表,请参考 本文的 “代码规范 — filelist.f” 一节说明
  2. 修改 setupENV.sh 中的环境变量

[!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 件事:
    1. 添加该文件列表
    2. 配置共同路径的环境变量

要求:

  1. 每个子系统中必须有一个包含该子系统所有子模块的文件列表
  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




参考文献


  1. Vivado Design Suite 用户指南: 逻辑仿真 (UG900)
  2. Verdi快速上手技巧大全
  3. Verification Continuum™ VCS User Guide, Version V-2023.12
  4. VCS使用教程 (Synopsys VCS Simulator Tutorial)
posted @ 2026-06-10 22:56  winki_0213  阅读(7)  评论(0)    收藏  举报