VCS + verdi + Makefile operate
1.需要的文件:
工程目录结构:奇偶校验
UN_gen
-sim
filelist.f
Makefile
-src
UN_par_gen.v
-tb
tb_width_16_par_type_0.sv
UN_par_gen.v
,以及测试激励的tesbench:tb_width_16_par_type_0.sv
注意:对于testbench文件,需要额外建立一个initial块,调用产生有关fsdb格式的波形文件:
initial begin
$fsdbDumpfile("./tb_width_16_par_type_0.fsdb");// 调用fsdbunpfile函数,产生.fsdb波形文件
$fsdbDumpvars(); // 调用fsdbDumpvars函数,声明需要保存的信号的波形,括号不加参数则默认全部保存
end
UN_par_gen.v
module UN_par_gen(datain, parity);
parameter integer width = 16;
parameter integer par_type = 0;
input [width-1:0] datain;
output parity;
generate
// even check //
if(par_type == 0) begin:p_t_0
assign parity = ~(^datain);
end
// odd check //
else begin:p_t_1
assign parity = ^datain;
end
endgenerate
endmodule
tb_width_16_par_type_0.sv
`timescale 1ns/1ps
module tb;
parameter PERIOD = 5;
parameter integer width = 16;
parameter integer par_type = 0;
integer error_count = 0;
// UN_par_gen inputs //
reg [width-1:0] datain;
// UN_par_gen outputs //
wire parity;
UN_par_gen#(
.width(width),
.par_type(par_type)
)
u_UN_par_gen(
.datain(datain),
.parity(parity)
);
initial begin
datain = 0;
#PERIOD;
forever begin
datain = datain + 1;
#PERIOD;
end
end
initial begin
#((1<<width)*PERIOD + PERIOD);
$stop;
end
initial begin
$fsdbDumpfile("./tb_width_16_par_type_0.fsdb");// 调用fsdbunpfile函数,产生.fsdb波形文件
$fsdbDumpvars(); // 调用fsdbDumpvars函数,声明需要保存的信号的波形,括号不加参数则默认全部保存
end
endmodule
2.filelist文件
filelist.f里存放所有需要仿真的’.v’及’.sv’文件
在sim目录下创建filelist.f:
find ../src ../tb -name "*.v" -or -name "*.sv" > ../sim/filelist.f
3.Makefile文件
all : vcs verdi
vcs :
vcs \
-f filelist.f \
-timescale=1ns/1ps \
-debug_acc+dmptf -debug_region+cell+encrypt -full64 -R +vc +v2k -sverilog -debug_all \
-P ${LD_LIBRARY_PATH}/novas.tab ${LD_LIBRARY_PATH}/pli.a \
| tee vcs.log
verdi :
verdi -f filelist.f -ssf tb.fsdb
clean :
rm -rf *~ core csrc simv* vc_hdrs.h ucli.key urg* *.log novas.* *.fsdb* verdiLog 64* DVEfiles *.vpd
说明:
VCS仿真分为两个步骤:编译(vcs_compile) + 仿真(vcs_simulate)。具体详见VCS常见编译参数说明。
verdi
表示启动 Verdi 工具的命令;
-ssf dump.fsdb
表示指定 Verdi 可识别的波形文件 dump.fsdb,该文件可由 -ucli 接口命令生成
make vcs
make verdi
4.UCLI/tcl
如果不想对testbench进行改动,也不想重新编译仿真顶层来修改fsdb信息,可以直接修改脚本完成对dump fsdb的控制,就可以UCLI (Unified Command Line Interface, 统一命令行接口) 命令行来dump fsdb。
dump_fsdb.tcl的脚本如下:
global env
fsdbDumpfile "$env(TEST_NAME).fsdb"
fsdbDumpvars 0 tb
run
TCL脚本引用环境变量;
设置波形文件名称,名称受 $env(TEST_NMAE)控制;注:这个TEST_NMAE 是从仿真的 Makefile文件中,通过 export TEST_NMAE得到。
fsdbDumpvars(0) 表示会 dump 所有层次的信息;注:0代表dump所有层次,非0代表dump的最高层次;
设置完dump 信息,启动仿真。此时仿真器受UCLI命令行控制;
补充知识
find [路径] [匹配条件] [动作]
参数说明 :
路径
是要查找的目录路径,可以是一个目录或文件名,也可以是多个路径,多个路径之间用空格分隔,如果未指定路径,则默认为当前目录。
expression
是可选参数,用于指定查找的条件,可以是文件名、文件类型、文件大小等等。
匹配条件
中可使用的选项有二三十个之多,以下列出最常用的部份:
-name pattern
:按文件名查找,支持使用通配符 * 和 ?。如果匹配多个文件名可以用 "-or -name"连接
-type type
:按文件类型查找,可以是 f(普通文件)、d(目录)、l(符号链接)等。
-size [+-]size[cwbkMG]
:按文件大小查找,支持使用 + 或 - 表示大于或小于指定大小,单位可以是 c(字节)、w(字数)、b(块数)、k(KB)、M(MB)或 G(GB)。
-mtime days
:按修改时间查找,支持使用 + 或 - 表示在指定天数前或后,days 是一个整数表示天数。
-user username
:按文件所有者查找。
-group groupname
:按文件所属组查找。
动作
: 可选的,用于对匹配到的文件执行操作,比如删除、复制等。
find 命令中用于时间的参数如下:
-amin n:查找在 n 分钟内被访问过的文件。
-atime n:查找在 n24 小时内被访问过的文件。
-cmin n:查找在 n 分钟内状态发生变化的文件(例如权限)。
-ctime n:查找在 n24 小时内状态发生变化的文件(例如权限)。
-mmin n:查找在 n 分钟内被修改过的文件。
-mtime n:查找在 n*24 小时内被修改过的文件。
在这些参数中,n 可以是一个正数、负数或零。正数表示在指定的时间内修改或访问过的文件,负数表示在指定的时间之前修改或访问过的文件,零表示在当前时间点上修改或访问过的文件。
正数应该表示时间之前,负数表示时间之内。
例如:-mtime 0 表示查找今天修改过的文件,-mtime -7 表示查找一周以前修改过的文件。
关于时间 n 参数的说明:
+n:查找比 n 天前更早的文件或目录。
-n:查找在 n 天内更改过属性的文件或目录。
n:查找在 n 天前(指定那一天)更改过属性的文件或目录。
VCS常用编译参数说明
-full64
在 64-bit 模式下编译、仿真,用于 64 位操作系统
-notice
详细的显示编译信息
-debug_all
仿真时可以使用 UCLI 接口,可以设置 value、time 断点。可以输出 fsdb/vpd 波形,可以使用 Verdi 和 DVE 波形查看工具。可以被下列参数选项替代:-debug_acc+all
-j8
指定编译器可并行编译的进程数为 8
-timescale=1ns/1ps
指定仿真时间单位与精度,RTL 设计中没有指定 timescale 时,使用此设置
+plusarg_save
使能传参功能。simv 仿真时可将具体数值传递给设计中的相关变量
+libext+.v+.V+.sv+.svh
识别 .v、.sv 等多种格式的设计文件
-sverilog
支持 SystemVerilog 编译
+memcbk
使能多维数组变量 (Memory 类型) 的回调。配合 UCLI 接口,设置波形打印的信号范围时,指定 “+all” 选项,可以查看多维数组变量的波形
-P <path/novas.tab> <path/pli.a> 指定使用的 PLI 表文件与库文件 pli.a 。其中 .tab 文件可以理解为 PLI 接口说明,pli.a 可以理解为系统函数库。当然也可以指定用户自定义的 table 文件和自定义的函数库。
-cpp /usr/bin/g++-4.4
指定 VCS 可识别的 g++ 版本
-cc /usr/bin/gcc-4.4
指定 VCS 可识别的 gcc 版本
-f
指定包含所有设计文件列表的文件名,文件中可包括源代码文件的路径名称,和编译选项参数等。
-top test
设置顶层模块为 test。因为仿真包括 testbench,所以要设置最顶层的 testbench 为 top design。
-l vcs_com.log
输出 VCS 编译的 log 至文件 vcs_com.log 中
TCL + UCLI
1.$ fsdbDumpfile
语法:
$fsdbDumpfile(fsdb_name[,limit_size])
含义:
指定波形文件名,第二个参数可选择用来限制波形的大小(MB)。
例如:
$ fsdbDumpfile(“tb_top.fsdb”,10240);
其中文件名可能被$fsdbDumpvars覆盖。
2.$ fsdbDumpvars
语法:
$fsdbDumpvars([depth, instance][, “option”])
含义:
depth表示要加载波形的层次;0表示当前instance下的所有变量以及其它module实例的波形,1表示当前instance中的变量的波形,不包括当前instance中的其它module实例的波形,2表示包含当前instance以及其中的第一级子instance的波形;以此类推。
instance指定要加载波形的module名。
option加载波形的选项,如:
+IO_Only – 只加载IO port信号;
+Reg_Only – 只加载reg类型信号;
+mda – 加载memory和MDA信号;
+packedmda – 加载packed MDA;
+struct – 加载structs;
+parameter – 加载parameter;
+fsdbfile+filename – 指定fsdb文件名字。