01
VCS、Verdi介绍
VCS
VCS,全称Verilog Compile Simulator,是Synopsys公司的一款Verilog仿真工具。
编译和仿真:VCS能够对Verilog设计代码和testbench进行编译,生成simv二进制可执行文件,该文件后续用于仿真。
覆盖率分析:VCS提供了丰富的覆盖率分析选项,包括行覆盖率、条件覆盖率、状态机覆盖率和翻转覆盖率等,有助于验证人员全面评估测试的充分性。
调试和可视化:虽然VCS本身不直接提供图形化调试界面,但它可以与Synopsys的其他工具(如Verdi)集成,实现高效的调试和波形查看。
Verdi
Verdi是Synopsys公司的一款高级调试工具,专为SoC、ASIC和FPGA设计提供高效解决方案。
高效调试:Verdi通过强大的技术自动化调试过程,整合了KDB和FSDB数据库,提供结构分析、行为分析等功能,以及时间流视图和多窗口图形用户界面。这使得验证人员能够快速定位和解决设计中的问题。
波形查看与比较:Verdi支持FSDB格式的波形文件,提供了丰富的波形查看和比较功能。用户可以在图形界面中直观地查看仿真结果,分析设计的行为。
源代码浏览与追踪:可查看源代码对应的电路图,最强大之处在于可以在源代码、原理图、波形图和状态图之间进行即时跟踪,协助工程师debug。
这里插一句题外话:大家都用过Vivado,Quartus等,这里以Vivado为例,他包含了RTL,编译,仿真,综合,看波形,烧板子等,集大成为一体。那Vivado这种功能这么全,工业界直接全用一个Vivado走天下不就行了,为何要大费周折用VCS和Verdi呢?Vivado其实只能算个写Verilog的(而且还很慢),只不过集成了综合,仿真,看波形等功能,如果要真正做Asic设计,还是得在各个步骤用上用更加专业的软件,用那些在领域中做到顶峰的EDA,那就是Synopsys的VCS,Verdi这种(毕竟Vivado的优化大多也只针对于自家FPGA)。首先VCS编译仿真速度极快,效率极高,为大家节约时间,Verdi通过看波形也十分方便debug,它支持信号追溯,无缝增加信号波形等功能。虽然上手比Vivado难,但学习之后能感受到其美丽之处的。
02
Linux下VCS+Verdi仿真demo演示
要想在Linux下使用VCS进行编译仿真并使用Verdi观察波形,需要有4个文件:
RTL设计文件,也就是利用Verilog设计的.v文件;
testbench文件,产生激励信号提供给设计模块,用来对设计模块的功能进行验证,可以是verilog文件,也可以是Sverilog设计的.sv文件;
filelist.f文件,用来写出testbench文件和RTL文件的文件名,这样比较方便,不用对所有的文件一个一个的在shell中敲出来,它可以根据列表文件去查找;
makefile文件或者shell等脚本文件,通过makefile或者shell脚本的编写,可以极大的节省效率,编译仿真VCS时可以不用一次又一次的敲命令,直接通过Linux内置的make命令来执行编译控制命令。
RTL设计文件
图1 RTL设计文件
有些时候RTL设计文件数量庞大,可以将大批量的RTL文件放到list中方便VCS编译器进行批量查找,如图2所示。
图2 RTL list文件
testbench文件
一个基本的tb文件要有下面5个部分:
(a)顶层模块定义 ;
(b)端口声明,这里的端口不需要声明输入输出信号,声明信号类型即可,通常输入信号用wire,输出或者双向信号用inout型声明 ;
(c)时钟生成,复位生成:使用always块对总线时钟进行设置,使用initial块对复位信号进行设置;
(d)设置单元实例化。
(e) 激励信号
filelist文件
在RTL设计文档中通常会用到include语法将某个或是当前目录或是在别的目录下的文档吃进来,这里要加上+incdir+绝对路径,告诉VCS要到哪里去找include包含进来的代码。
图3 filelist文件
执行Makefile或者shell script,
即在终端命令行中输入./compile.sh
图4 VCS编译和仿真 shell脚本
编译部分
vcs -full64 +v2k -sverilog -timescale=1ns -l vcs_compile.log ...: 这一行是编译命令,使用Synopsys的VCS编译器
-full64: 表示使用64位编译模式。
+v2k: 表示支持Verilog-2001标准。
-sverilog: 表示编译的是SystemVerilog代码。
-timescale=1ns: 设置默认的时间尺度为1纳秒。
-l vcs_compile.log: 指定编译日志的输出文件。
-debug_access: 允许访问调试信息。
+define+FSDB: 定义一个宏FSDB,这通常用于在代码中控制是否生成FSDB格式的波形文件(一种用于波形查看的数据库格式)。
-cm line+cond+tgl+fsm+branch -cm_dir coverage -cm_hier coverage_hierarchy.cfg: 设置覆盖率收集的参数,包括行覆盖率、条件覆盖率、翻转覆盖率、有限状态机覆盖率和分支覆盖率,并指定覆盖率数据存放的目录和覆盖率层次结构的配置文件。
-f filelist.f: 指定一个文件列表文件,该文件包含了所有需要编译的源文件。
仿真运行部分
./simv: 运行编译生成的仿真可执行文件(通常是simv)。
+vcs: 这是一个传递给仿真器的参数
-cm line+cond+tgl+fsm+branch: 与编译时相同,指定在仿真期间收集哪些类型的覆盖率数据。
-l simv.log: 指定仿真日志的输出文件。
在VCS(Verilog Compile Simulator)编译过程中,“parsing”(即解析)和“start vcs incline pass”是两个关键阶段,它们各自承担着不同的任务。
解析阶段的主要工作是读取和分析源代码。VCS编译器会逐行读取Verilog源代码,并将其转换为内部数据结构(如抽象语法树AST)。在这个过程中,编译器会检查源代码的语法是否正确,变量、函数、模块等是否已正确定义,以及是否存在语法错误或拼写错误
图5 parse阶段
在start vcs incline pass阶段,VCS编译器可能会对内部数据结构进行进一步的优化和调整,以便在后续的仿真过程中提高性能和效率。这可能包括但不限于:对代码进行进一步的语法和语义检查,以确保其符合Verilog或SystemVerilog语言的规范。对代码进行预处理,如宏替换、条件编译等。对数据路径和控制路径进行优化,以减少仿真时间和资源消耗。
图6 start vcs incline pass阶段
打开verdi可视化界面进行波形查看,
追踪和代码浏览
在终端命令行输入 Verdi -f filelist & 可以将filelist中全部经过编译和仿真的文件加载到Verdi可视化图形界面中,并可以进行追踪信号,查看波形,查看电路图等操作。
图7 verdi电路原理图界面
图8 Verdi 查看追钟波形界面