版本记录


版本号 描述 日期 作者
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

1
2
3
4
5
6
7
8
9
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#########################################################################
# #
# 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

1
2
3
#!/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. 根据自己所使用的语法和器件,选择对应的选项
  5. 点击 Compile,开始编译
选项 说明
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 命令

下面是我当前使用的编译库(复制上述操作的 tcl 命令)

Example

1
2
3
4
5
6
7
8
9
10
11
12
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” 一节说明
      700
  2. 修改 setupENV. sh 中的环境变量



第三步 :输入命令

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
常规仿真流程

1
2
3
4
5
source setupENV.sh
make analy
make elab
make sim
make verdi
单步调试流程

1
2
3
4
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

1
2
3
4
5
${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 界面说明








参考文献


  1. Vivado Design Suite 用户指南: 逻辑仿真 (UG900)
  2. Verdi快速上手技巧大全
  3. Verification Continuum™ VCS User Guide, Version V-2023.12
  4. VCS使用教程 (Synopsys VCS Simulator Tutorial)