前言
- 这篇文章就主要归纳一下VCS工具的一些使用!
1. VCS介绍
- VCS的全称是: verilog compiled simulator
- vcs主要用来动态仿真,检查功能问题;
- pt是静态时序分析,只是分析!
- dc将综合出来的代码,用来后仿真!会出现延迟(建立时间、保持时间!)
2. VCS实战操作
拿到vcs工具,要做的就是怎么把它用好!比如我们要编译仿真adder.v和adder_tb.v,
- 就可以使用下面命令进行编译!
vcs adder.v adder_tb.v +v2k
- 然后使用下面命令进行仿真:
./simv -gui &
脚本文件示例
在大型soc项目中,编译的文件肯定很多,肯定需要多个选项的配合,用到的命令很多,往往需要如下类似的脚本文件:
.PHONY:com sim cov clean
OUTPUT = simv_dff_exp
ALL_DEFINE = +define+DUMP_FSDB
ALL_DEFINE += +define+DFF_STYLE22
#code coverage command
CM = -cm line+cond+fsm+branch+tgl
CM_NAME = -cm_name $(OUTPUT)
CM_DIR = -cm_dir ./$(OUTPUT).vdb
# vpd file name
VPD_NAME = +vpdfiles+$(OUTPUT).vpd
#coompile command
vcs = vcs -sverilog +v2k -timescale=1ns/1ns \
-debug_all \
+nontimingcheck \
+nospecify \
+vcs+flush+all \
$(CM) \
$(CM_NAME) \
$(CM_DIR) \
$(ALL_DEFINE) \
$(VPD_NAME) \
-o $(OUTPUT) \
-l compile.log
#simulation command
SIM = ./$(OUTPUT) \
$(CM) $(CM_NAME) $(CM_DIR) \
$(VPD_NAME) \
-l $(OUTPUT).log
# start compile
com:
$(vcs) -f file_list.f
#start simulation
sim:
$(SIM)
# show the coverage
cov:
dve -covdir *.vdb &
debug:
dve -vpd $(OUTPUT).vpd &
# start clean
clean:
rm -rf ./csrc *.daidir ./csrc *.log *.vdb *.vdb simv* *.key
3.选项功能
- 其实vcs的基本功能都已经包含在这个脚本文件中了!但是,再聊聊一些比较常用的选项!
- rad选项,可以对设计文件进行优化,加快仿真速度,在编译的时候就加上!
+rad //快速仿真
- prof选项(后面版本变为-simprofile),可以自动代码生成性能分析,可能也需要-lca开关的配合!
- simprofile -lca
- debug相关的选项,-debug_all打开所有命令,会影响仿真速度,老手一般会使用-debug_pp?
-debug_pp //允许转储到VPD并使用UCLI命令和DVE;
-debug //启用UCLI命令和DVE;
-debug_all //启用UCLI命令和DVE,也使线路步进;
- -o选项可以在指定生成不同测试场景的文件名,方便后期合并等处理!
-o <name> //指定输出可执行文件的文件名,默认为 simv
加入宏定义有3 种方法
- 在原文件中加入 :`define INC_COUNTER。
- 在头文件中加入:新建一个文件,在文件中加入 `define INC_COUNTER 并在原文件中引用这个文件
`include "file"需要启用+incdir+选项指定目录。
- 在命令行中加入:编译时启用选项+define+INC_COUNTER
+define+宏 //定义全局的VCS,编译器在编译时如果源文件有类似`ifdef 宏 等字样,那么会执行定义之后的代码。
关闭覆盖率的方法
- 第一种
// vcs coverage off
中间包住的代码,不统计覆盖率
//vcs coverage on
- 第二种
// synopsys translate off
中间包住的代码,不统计覆盖率
// synopsys translate on
其他选项!
-help //vcs帮助,有各编译选项意义;
+incdir+<directory> //指定包含使用`include 编译器指令指定的文件的目录,可以指定多个目录,用+字符分隔每个路径名称;
+libext+<extension> //指定VCS仅在具有指定扩展名的Verilog库目录中搜索源文件,可以指定多个扩展名,用+字符分隔每个扩展名。例如+libext++.v指定搜索没有扩展名和库扩展名为.v的库文件。 输入-y选项时输入此选项。
-full64 //以64位模式编译设计并创建64位可执行文件用于64位模式下的模拟;
-vpi //允许使用vpi PLI访问例程;
-sverilog //允许在Accellera systemVerilog规范中使用Verilog语言扩展;
-v2k //使用Verilog 1364-2001标准;
-cpp //使用c++编译器;
-notice //启用详细的诊断消息;
+lint=[no]ID|none|all,... //使能或者禁用verilog的lint消息;
+vcs+lic+wait //如果没有可用的通知,则告诉VCS等待网络许可证;
-f <filename> //指定一个文件,其中包含源文件和编译时选项的路径名列表;
-R //该选项告诉VCS在编译完后直接运行可执行程序,若没有该选项,那么vcs在编译后直接退出;
-l <filename> //(小写字母L)如果包含-R,-RI或-RIG选项,则指定VCS记录编译消息和运行时消息的日志文件;
-Mupdate[=0]:默认情况下,VCS会在编译之间覆盖Makefile。 如果希望在编译之间保存Makefile,请输入此内容选项与0参数。输入不带0参数的参数,指定默认情况下,增量编译和更新Makefile文件;
-CFLAGS <options> //将选项传递给C编译器,允许多个-CFLAGS,允许传递C编译器优化级别。
-timescale=<time_unit>/<time_precision> //指明时间精度;
-ucli //在运行时指定UCLI模式;
+systemverilogext+<ext> //指定包含SystemVerilog源代码的源文件的文件扩展名;
-gui[=<dve|verdi>] //启动用户指定的图形用户界面,如果未提供参数,则在检测到有效的VCS_HOME环境变量时,VCS将启动Verdi。 否则DVE将默认启动;
-vcd <filename> //将输出VCD文件名设置为指定文件。默认文件名为verilog.dump。Verilog源代码中的$dumpfile系统任务将覆盖此选项;
+vcdfile+<filename> //指定想要用于后期处理的VCD文件;
-vpd_file <filename> //在运行时,定义VCS写入的VPD文件的替代名称,而不是缺省名称vcdplus.vpd;
+vcs+vcdpluson //编译选项,加入后会使能产生vpd文件,默认文件名vcdplus.vpd
后记
设计问题:
- 如何一次例化1000次模块?
使用generate 和for来配合使用!
localparam MEM_DEPTH = 1000;
genvar indx;
generate
for(indx = 0;index < MEM_DEPTH;indx = indx+1)begin:loop
dut dut(.a[indx],.b[indx]);
end
endgenerate
- $display选项的应用
$display("Hello everone!","__FILE__","__LINE__");//顺便打印出所在文件及行数
$display("\033[31;5m Hello everone!\033[0m");//就是显示出自己定义的颜色,大小等;python学习中有涉及的