VCS的使用
是Synoposys家的编译型Verilog模拟器,可编译 C、C++、Verilog、SystemVerilog 等文件,编译后生成 simv 可执行文件进行仿真。
1 VCS(Verilog Compiler Simulator)的makefile文件
VCS 仿真过程:编译(vcs_compile) + 仿真(vcs_simulate)。
#! /bin/csh
.PHONY: vcs cmp run clean verdi
top = tb_filter_top
cmp:
vcs -full64 \
+notimingchecks \
-sverilog \
-debug_access \
-f ./testbench.f \
-f ./vcs_files.f \
-l bitlet.log \
-top $(top) \
-fsdb \
-R
vcs:
./simv +vcs+lic+wait -l bitlet.simv.log
clean:
@-rm -rf *.log *.fsdb simv csrc ucli.key *.conf *.saif verdiLog simv* stack*
verdi:
verdi -sv +systemverilogext+sv -f vcs_files.f -f testbench.f -top $(top) -ssf $(top).fsdb
#-rcFile ~/novas.rc&
run: cmp vcs
解释:
-
.PHONY
后面跟的目标都被称为伪目标,也就是说我们 make 命令后面跟的参数如果出现在.PHONY 定义的伪目标中,那就直接在Makefile中就执行伪目标的依赖和命令。不管Makefile同级目录下是否有该伪目标同名的文件,即使有也不会产生冲突。另一个就是提高执行makefile时的效率。 -
cmp 是vcs的编译参数设置,testbench.f和vcs_files.f里放的是与编译相关的所有文件,包括testbench文件,top就是testbench文件的顶层名字
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 中 |
2 testbench文件需要加入的部分
2.1 产生fsdb波形文件
对于用于仿真的testbench,需要额外建立一个 initial 块,调用产生有关 fsdb 格式的波形文件:
-
首先调用 fsdbDumpfile 函数,产生一个叫 .fsdb 的波形文件
-
然后调用 fsdbDumpvars 函数,声明需要保存那些信号的波形,括号内不加任何参数,则默认全部保存。
`define FSDB
module tb_filter_top;
`ifdef FSDB
initial begin
$fsdbDumpfile("tb_filter_top.fsdb");
$fsdbDumpvars(0,tb_filter_top);
$fsdbDumpMDA();
end
`endif
2.1.1 fsdbDumpvars 函数的使用(https://blog.csdn.net/weixin_45270982/article/details/114155823)
1. $fsdbDumpfile
指定波形文件名,第二个参数可选择用来限制波形的大小(MB)。
其中文件名可能被$fsdbDumpvars覆盖,所以这俩最好设置为同一个名字
$fsdbDumpfile(fsdb_name[,limit_size])
$fsdbDumpfile(“tb_top.fsdb”,10240);
2. $fsdbDumpvars
$fsdbDumpvars([depth, instance][, “option”])
$fsdbDumpvars(0,tb_filter_top);
含义: 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文件名字。
3. $fsdbDumpon/$fsdbDumpoff
$fsdbDumpon/$fsdbDumpoff([“option”])
含义: 控制波形加载的开始和结束; $fsdbDumpoff之后,将停止记录信号值的变化,直到$fsdbDumpon,从当前时刻开始记录信号值的变化。 option—选项,如: +fsdbfile+filename – 指定将特定文件的波形加载打开与关闭,如果不指定,则默认指当前仿真所有的波形文件;
4. $fsdbDumpMDA
fsdb dump波形时会记录二维数组2D array signal的值,便于在verdi中debug查memory内部信号。
$fsdbDumpMDA()
5. $fsdbAutoSwitchDumpfile
$fsdbAutoSwitchDumpfile(file_size, “fsdb_name”, number_of_files[, “log_file_name”,“+fsdb+no_overwrite”])
含义: 当波形的大小达到限制后自动以一个新的波形文件起始加载波形; 在所有的波形文件加载完成后,会创建一个virtual FSDB文件,查看波形时只需要加载此文件就可以合并所有的波形文件。 file_size—波形文件大小限制,单位为MB,最小为10M,若值小于10M则默认10M; file_name—波形文件的名字,在实际加载波形时,文件名为file_name_000.fsdb file_name_001.fsdb…; number_of_files—最多可以加载多少个file_size这么大的波形文件,如果写为0,则默认没有限制; log_file_name—指定log文件的名字; +fsdb+no_overwrite—当number_of_files限制的个数达到时停止dump波形;
6. $fsdbDumpflush
在仿真过程中强制将信号值加载到波形中,便于在仿真过程中查看波形;
$fsdbDumpflush()
7. $fsdbDumpFinish
在仿真过程中调用,停止dump波形;
$fsdbDumpFinish()
8. $fsdbSwitchDumpfile
$fsdbSwitchDumpfile(“new_file_name”[, “+fsdbfile+src_file”])
关闭现有的波形文件,以一个新的文件名开始加载波形; new_file_name—创建一个新的波形文件,将波形加载到这个文件中; +fsdbfile+src_file—指定要停止加载并关闭的波形文件, 这个参数不指定时,将默认使用当前正在加载的波形文件;
9. $fsdbDumpvarsByFile
$fsdbDumpvarsByFile(“text_file_name”[, “option”])
类似于$fsdbDumpvars,这个方法支持将需要加载波形的instance写在文件中。 text_file_name—文本文件,指定要dump波形的instance; option—同$fsdbDumpvars中的option参数;
$fsdbDumpvarsByFile("xxx.xxx.dump.vh"); +all 1 tb_top +all 0 tb_top.xxx
2.1.2 产生saif文件用于综合分析功耗
参考文章:https://blog.csdn.net/l471094842/article/details/103631265
RTL backward SAIF文件的生成
用vcs生成,在testbench文件中需要添加以下话语
always @(posedge clk)begin
if(input_counter==TEST_NUMBER) begin
$display("simulation completed!");
$toggle_stop();
$toggle_report("tb_filter_top.saif", 1.0e-9, "tb_filter_top");
$finish;
end
end
initial
begin
$set_toggle_region(tb_filter_top.u_preprocessing_top);
$toggle_start();
rst_n <= 1'b0;
#(30*clock_freq);
#5;
rst_n <= 1'b1;
#(1000000*clock_freq);
#(1000000*clock_freq);
#(1000000*clock_freq);
$finish;
end
$set_toggle_region(tb_filter_top.u_preprocessing_top);即为产生到对应子模块的saif文件
·首先是PLI。使用VCS产生SAIF文件,需要用到程序设计语言接口(programming language interface,PLI)。通过PLI监测节点的翻转,得到节点的翻转率。主要需要下面的系统任务:
$set_gate_level_monitoring ( on|off|rtl_on);
$set_toggle_region (obj);
$read_ rtl_ saif(rtl_saif_file_name,tb_pathname);
$read_ lib_ saif(lib_saif_file_name);
$toggle_start;
$toggle_stop;
$toggle_reset();
$toggle_report(file_name,type,unit);
· RTL.v就是设计源文件了,然后RTL forward SAIF文件在前面也讲过了,这里就从略。
· 最后是testbench。testbench中调用RTL设计、调用一下上述的PLI系统函数、调用RTL forward SAIF文件等。一个简单的示例testbench文件如下所示:
module testbench;
top instl (a, b, c,s);//例化顶层设计
initial begin
$read_rtl_saif ("myrtl.saif")
$set_toggle_region (u1);
$toggle_start;
#120 a=0;
#STEP in_a=temp_in_a;
······
$toggle_stop;
$toggle_report("rtl.saif",1.0e-9,"top");
end
endmodule
上面的测试平台中,用了系统任务程序$read_rtl_saif ("myrtl. saif"),该命令读入综合不变物体文件——RTL forward SAIF。因此,仿真时,仿真器仅仅监视这些综合不变物体的开关行为。向量中$set_toggle_region (u1)命令选择要监视的模块。$toggle_start和$toggle_stop命令用于控制监视的起始和终止时间。$toggle_report("rtl. saif",1. 0e-9,"top")命令输出SAIF信息到指定的文件。
一起都准备就绪了,下面就可以使用VCS运行仿真:
vcs -R rtl. v testbench. v
注意,这里我们进行的是RTL设计文件的仿真,仿真完成后,就可以得到rtl.saif 文件,这个文件就是RTL backward SAIF文件。
Verdi常用快捷键
参考:https://www.cnblogs.com/wt-seu/p/10422967.html
1 Verdi代码界面的基本操作小结
1.1 添加波形
在vedi左侧层次浏览器窗格按g,可以进行选择添加波形
ctrl+A可以全选当前模块下的所有信号
点击Apply即可完成添加
1.2 快速定位某个模块
在vedi左侧层次浏览器窗格鼠标右键 -> Show Search/Filter(CTRL+F) -> 输入字符串搜索(例如*ircu*)-> 回车(多按几次)
1.3 搜索源代码
在源代码框按
-
Find Scope(Shift+S) #搜索模块的名字
-
Find Signal/Instance/instport (Shift+A) #搜索模块中的信号
-
find string(/)
1.4 Makefile中的启动verdi时指定波形和rc
top = tb_filter_top
verdi:
verdi -sv +systemverilogext+sv -f vcs_files.f -f testbench.f -top $(top) -ssf $(top).fsdb
verdi参数
-ssf 指定波形FSDB文件
-sswr 指定波形restore文件,可以将已保存的信号恢复
2 Verdi看波形的基本操作小结
2.1 快捷键:(大写字母=Shift+小写)
g get, signlas添加信号,显示波形 n next, Search Forward选定信号按指定的值(上升沿,下降沿,both,指定Value)向前跳转 N 与n功能相同,方向向后 c color,调整所选信号的波形显示颜色,线的粗细和类型,非常方便Debug f full, Zoom All波形全部显示 z Zoom Out波形缩小,一般配合鼠标放大非常方便 Z Zoom In 波形放大 l last view,上次波形位置,相当于Vim里的``或'' L 重新加载波形或设计文件,这个很方便,在新一次仿真完成之后Roload即可 b begin移动Cursor到波形开头 e end移动Cursor到波形结尾 r restore signals 保存波形信号列表 h hierarchy显示信号的绝对路径 H Highlight(开关)是否高亮显示所选信号 m move将信号移动到左边信号列表的黄线位置 Delete 删除所选信号 Ctrl+Right Arrow 向右移动半屏 Ctrl+Left Arrow 向左移动半屏
鼠标中键选择位置+鼠标左键选择信号+m键 移动信号
2.2 鼠标:
左键:用于选择信号 右键:调出菜单 中间:单击移动黄线,拖动信号可移动位置排列顺序 滑轮:上下滚屏,按住shift键可实现左右滚屏 左键圈定波形范围:按选定缩放 双击信号波形: 跳转到代码,并用绿色高亮该信号 双击信号:按位展开(expand),Struct展开下一层。再双击折叠(collapse) 右键信号名->Bus Operations->Expand as Sub-bus->可以按指定位宽展开,比如512bits的信号分成4个128的,方便查看
菜单栏中的By:可以选择Search不同的值:Any Change, Rising Edge, Falling Edge, Bus Value等
信号可以分组,组合信号都可以Rename 右键 Add Blank 可以让信号分组看起来更清晰
定位signal的值进行训练,可以用waveform的Set Search Value和Set Search Constraint
2.3 波形属性调整:
改变波形进制:十进制,按住ALT,再依次按 W+R+D;二进制,按住ALT,再依次按 W+R+B
改变波形无符号和有符号: 无符号,按住ALT,再依次按W+N+U;有符号2的补码,按住ALT,再按W+N+2