目录
引言
按照视频的讲解进度,继续学习 VCS的使用。
前两篇文章:
本文主要学习VCD+文件的后处理。
本系列文章建议电脑端查看~~
VCD文件及生成
VCD文件是 VCS 原来版本的波形文件格式,VCD+在此基础上做了压缩处理,降低了内存处理的压力。
影响速度的关系:
1、设计代码的质量;2、编译选项的选项;3、运行环境性能;4、是否保存波形
·
在设计源代码或者仿真源代码中加入系统任务 : $vcdpluson
波形文件后缀 .vpd
系统任务使用:
解释:
在上面的层级关系中:
如果指定 level_number 参数为 0 ,module_instance 为 B,那么将记录 模块 B C D的波形;
如果指定 level_number 参数为 2 ,module_instance 为 A,那么将记录 模块 A B 的波形;
例子:
编译选项:
例子:
宏定义应用:
实际操作
makefile
1、在工程目录下创建新文件,命名为:Makefile
2、打开编辑:
此处先放上我的文件内容。这个折腾了好久。参考并致谢以下:
ln: failed to create symbolic link ‘/usr/bin/mysql’: File exists
.PHONY: com cov clean debug
OUTPUT = simv_FSM
VPD_SW_DEFINE = +define+VPD_TEST
INC_C_DIR = ./RTL/my_printf.c
# code coverage command
CM = -cm line+cond+fsm+branch+tgl
CM_NAME = -cm_name $(OUTPUT)
CM_DIR = -cm_dir ./$(OUTPUT).vdb
# vpdfile name
VPD_NAME = simv_FSM.vpd
# compile command
VCS = vcs -full64 -cpp g++-4.8 -cc gcc-4.8 -LDFLAGS -Wl,--no-as-needed \
$(INC_C_DIR) \
-sverilog +v2k -timescale=1ns/1ns \
-debug_access+r \
-Mupdate \
+notimingcheck \
+nospecify \
+vcs+flush+all \
$(VPD_SW_DEFINE) \
-o $(OUTPUT) \
-l compile.log
# +notimingcheck \
# +nospecify \
# +vcs+flush+all \
# $(CM) \
# $(CM_NAME) \
# $(CM_DIR) \
# simulation command
SIM = ./$(OUTPUT) \
-l $(OUTPUT).log
# $(CM) $(CM_NAME) $(CM_DIR) \
# $(VPD_NAME) \
# start complie
com:
find -name "*.v" >filelist.f
$(VCS) -f filelist.f
# start simulation
sim:
$(SIM)
mv vcdplus.vpd $(VPD_NAME)
# show the coverage
cov:
dve -covdir -vdb &
debug:
dve -vpd $(OUTPUT).vpd &
# start clean
clean:
rm -rf ./csrc *.daidir *.log *.vpd *.vdb simv* *.key *race.out* *.so.*
问题说明:
问题1:
error while loading shared libraries: libelf.so.1: cannot open shared object file: No such file or directory
因为没有增加以下指令:
当时我就纳闷了,终端直接输入 vcs 就能直接运行,为啥换到makefile就不行。
感谢上面第三个链接给了提醒,我去 .bashrc 文件里面看了一下,原来vcs的别名里面有这个:
那么我瞬间就明白了。。。
问题2:
Error-[P1ARGS-CANTOPN-F] Cannot open file
Unable to open 'filelist.f' due to 'No such file or directory'.
感谢上面第二个链接给的思路我在makefile里面增加这个就可以了,建立 filelist.f 文件
当然也可以手写路径
编译没问题:
编译仿真
在本系列的第一篇博文的有限状态机模块的模块基础上,增加宏定义,控制VPD文件的生成。为例方便,此处将仿真文件再次贴出来:
// |--------------------------------- VCS test testbench file -------------------------------
// |Description : a simple fsm testbench.
// |Author : Xu Y. B.
// |Date : 2022-11-06
// |
// |----------------------------------------------------------------------------------------
`timescale 1ns/1ns
module TB();
// --------------module parameters specify ----------------
parameter P_DATA_WIDTH = 10;
// --------------input / output ports specify--------------
// input ports
reg I_CLK_100M;
reg I_RSTN;
reg I_FSM_START;
// output ports
wire O_DATA_VAL;
wire [P_DATA_WIDTH-1:0] O_DATA;
// --------------clock setting-----------------------------
`define CLK_PRD 10
initial I_CLK_100M = 1'b0;
always #(`CLK_PRD/2) I_CLK_100M = ~I_CLK_100M;
// --------------control signals setting-------------------
initial
begin
I_RSTN = 1'b0;
I_FSM_START = 1'b0;
#(`CLK_PRD*10);
I_RSTN = 1'b1;
#(`CLK_PRD*5);
I_FSM_START = 1'b1;
@(negedge O_DATA_VAL);
#(`CLK_PRD*10);
$finish;
end
// DPI test
import "DPI" function void my_printf(string str);
initial
begin
my_printf("DPI test successfully!");
end
// VPD test
initial
begin
`ifdef VPD_TEST
$vcdpluson();
`endif
end
// --------------initiate module---------------------------
FSM #(
.P_DATA_WIDTH(P_DATA_WIDTH)
) FSM_INST (
.I_CLK_100M (I_CLK_100M),
.I_RSTN (I_RSTN),
.I_FSM_START (I_FSM_START),
.O_DATA_VAL (O_DATA_VAL),
.O_DATA (O_DATA)
);
endmodule
主要的变化(增加):
重新演示一遍:
清理、编译:
打开波形文件
方式1:通过 dve
1、终端输入:
dve &
2、打开图形界面后:
3、而后的操作和第一篇说的过程相同,此处不再赘述。
4、debug
如果通过波形定位到出错的波形位置,那可以通过鼠标左键双击有问题的波形将对应的源代码调出来查看。
方式2:直接在终端打开
dve -vpd vcdplus.vpd &
其他
1、$vcdpluson() 参数更改
关于 vcdplus 相关的其他操作,比如只保存某一层或者某基层模块的信号波形,可以通过源代码修改参数即可 ,如:
这样仅记录了 TB 模块的信号:
2、 $vcdplusmemon()
如果不打开此任务,波形文件无法记录 memory 类型信号的波形。
3、__FILE__ , __LINE__
这两个宏可以帮助定位代码执行所在的文件和行。
例:
在源代码中加入:
仿真时:
问题遗留:
vpd文件名更改:
在makfile文件中已经使用了如下命令,但是还是生成了默认名为 vcdplus.vpd 的vpd文件,尝试从终端直接输入命令还是改不了名字。不知为何还在解决中。
但是呢,我这里有一个下策,那就是执行完仿真后,强行改名字:
欢迎交流~~~~