//--------------------------------------------------------------------------------------
// 作者:蚂蚁会游泳
// 日期:2022.01.06
//--------------------------------------------------------------------------------------
前言:
本文适用于对verilog编程语言有一定了解,之前有使用过Linux系统、VCS验证工具的同学阅读。写这篇文章前我也是头一次接触verdi,想通过做笔记的方式记录一下自己的学习过程,以免日后遗忘,也希望有过verdi使用经验的同学能够指出本文的不足之处。
默认大家都已安装好了Verdi2015或其它Verdi版本,配置好了Verdi的环境变量,环境变量配置如下图:
其中,NOVAS_HOME为Verdi2015的安装目录;PATH是为了让系统(Linux)找到Verdi2015;
Verdi自己是不能编译也不能仿真的,需要用VCS来配合进行编译和仿真。VCS专注于编译和仿真,Verdi只是一个波形查看工具。与VCS类似的工具还有Modelsim,Modelsim集编译、仿真、波形调试于一体,用起来也很方便。仿真工具其实都大同小异,不同的公司购买的软件不同,所以没必要纠结仿真工具的好与坏,对于我们学生来讲,都需要了解一下,只需要熟悉基本操作就好。
1、准备
1.1 Makefile脚本
在Linux系统下,我们一般使用批处理文件Makefile来脚本化操作。先看一段脚本:
# Makefile For Verdi
all: compile simulate
compile:
vcs \
-debug_all \ #在完全模式下进行调试,可替换为-debug_access+all
-fsdb +define+FSDB \ #生成fsdb文件,并对所有.v源文件进行宏定义
-l com.log \ #生成com.log文件用于查看编译日志
-f verif.f #文件列表,将verif.f所列文件全部编译
simulate:
./simv -l sim.log #生成sim.log文件用于查看仿真日志
dve:
dve \
-vpd *.vpd & #启动Dve查看vpd类型的波形文件
verdi:
verdi \
-f verif.f \ #用Verdi加载verif.f所列全部源文件
-nologo \
-ssf *.fsdb & #启动Verdi查看fsdb类型的波形文件
clean:
@rm -rf csrc DVEfiles simv simv.daidir ucli.key VCS*
@rm -rf *.log *.vpd *.ddc *.svf *.SDF *Synth *Netlist*
@rm -rf alib-52 work
@rm -rf *.conf *.rc *.fsdb verdiLog
代码说明:
- 关于
-debug_all
的介绍可以参考此文:https://blog.csdn.net/zhajio/article/details/88839838 +define+FSDB
的作用等同于在所有.v
源文件中添加宏定义``define FSDB`
在文件夹(/sim)中新建两个文件,分别命名为:Makefile、verif.f。
用gvim打开Makefile文件,将上面的代码复制粘贴到里面后点击保存,并退出。
用gvim打开verif.f文件,将源文件添加好,点击保存,并退出。
如下图:
1.2 源文件
以超前进位加法器的仿真为例,在文件夹(/rtl)与(/tb)中分别新建好rtl设计代码源文件与testbench测试文件。
如下图:
rtl代码:
module add_ahead_N #(parameter SIZE=8)
(
input wire cin,
input wire [SIZE-1:0] a,b,
output wire [SIZE-1:0] sum,
output wire cout
);
wire [SIZE-1:0] G,P;
wire [SIZE:0] C;
assign C[0]=cin;
assign cout=C[SIZE];
generate
genvar i;
for(i=0;i<SIZE;i=i+1) begin:AHEAD
assign G[i]=a[i]&b[i];
assign P[i]=a[i]|b[i];
assign C[i+1]=G[i]|(P[i]&C[i]);
assign sum[i]=G[i]^P[i]^C[i];
end
endgenerate
endmodule
testbench代码:
`timescale 1ns/1ns
module add_ahead_N_t;
parameter SIZE=8;
reg [SIZE-1:0] a,b;
reg cin;
wire [SIZE-1:0] sum;
wire cout;
//add_ahead_N #(SIZE) AHN (cin,a,b,sum,cout);
add_ahead_N #(SIZE) AHN (cin,a,b,sum,cout);
initial begin
a=0;
b=0;
cin=0;
end
initial begin
#23
cin=0;
a=24;
b=7;
#32
cin=1;
a=42;
b=12;
#100
$finish;
end
initial begin
$vcdpluson();
end
`ifdef FSDB
initial begin
$fsdbDumpfile("add_ahead_N_t.fsdb");
$fsdbDumpvars;
end
`endif
endmodule
1.3 fsdb文件
fsdb文件是一种波形文件,只能用Verdi软件打开。要想得到fsdb文件,除了要将-fsdb
命令添加到前文提到的Makefile文件中外,还要在testbench文件中添加如下代码:
`ifdef FSDB
initial begin
$fsdbDumpfile("add_ahead_N_t.fsdb"); //add_ahead_N_t为测试文件名称,可替换为其它名称
$fsdbDumpvars;
end
`endif
波形文件有很多种,总结如下:
- wlf #WLF文件是Modelsim支持的波形文件,可在modelsim和questasim中打开查看
- vcd #VCD文件是IEEE1364标准(Verilog HDL语言标准)中定义的一种ASCII文件
- fsdb #FSDB文件是Verdi 支持的波形文件,通过verilog的PLI接口,
$fsdbDumpfile
,$fsdbDumpvars
等函 数来实现 - shm #NC verilog 和Simvision支持的波形文件,实际上 .shm是一个目录,其中包含了.dsn和.trn两个文件
- vpd #VCS DVE支持的波形文件,可以用$vcdpluson产生
2、软件使用教程
2.1 启动Verdi
Verdi可以在Terminal中通过命令行输入verdi &
直接启动,然后在图形界面下添加所需要的源文件、fsdb文件。下面通过脚本的方式启动Verdi。
在文件夹(/sim)中,打开Terminal终端,输入如下命令:
make
调用VCS进行编译和仿真,如下图:
编译仿真结束后,查看一下过程文件,如下图:
可以看到“add_ahead_N_t.fsdb”这个fsdb文件,接下来我们用Verdi打开它,输入如下命令:
make verdi
用Verdi加载源文件和波形文件,如下图:
这时会弹出Verdi的图形化窗口,如下图:
具体步骤可参考此文:VCS与Verdi联合仿真简易教程及例子示范
2.2 Verdi快捷方式
先来简单认识一下Verdi的窗口:
快捷键要在对应的窗口中使用,使用之前一定要用鼠标左键点一下窗口空白处!
源代码窗口:
- x #显示信号的变化
- ctrl+w #添加信号到波形
波形窗口:
- f #将波形图100%显示
- z #缩小波形
- shift+z #放大波形
- h #开关显示信号结构
- Del #删除信号
- g #加载信号
鼠标操作:
- 拖拽信号 #左键点击选择一个信号,然后按住鼠标中键(滚轮)不松手,向其它窗口拖拽
3、后续
如果想更加深入了解VCS和Verdi,建议去读一下synopsys的官方指导文档。
文本中超前进位加法器的工程文档下载:https://sourl.cn/JSAZUw
更详细的教程,请参考:#Verdi