前言

  • 这篇文章就主要归纳一下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 种方法

  1. 在原文件中加入 :`define INC_COUNTER。
  2. 在头文件中加入:新建一个文件,在文件中加入 `define INC_COUNTER 并在原文件中引用这个文件

`include "file"需要启用+incdir+选项指定目录。

  1. 在命令行中加入:编译时启用选项+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学习中有涉及的