UART验证之Makefile

本文详细介绍了Makefile中关于UART验证环境的配置,包括UVM版本管理、测试用例选择、编译选项设置、覆盖率收集以及仿真过程的控制,以确保代码的兼容性和调试效率。
摘要由CSDN通过智能技术生成

# Makefile for UART

## Variables and scripts
SEED = $(shell date +%s) #使用当前日期时间作为随机种子

#这个变量用于控制仿真过程中`uvm_info的显示级别
#现在是只有UVM_MEDIUM,UVM_LOW,UVM_NONE会被显示
#在run_options中,通过+UVM_VERBOSITY = ${VB} 就调用了这一个变量
VB = UVM_MEDIUM

#这个变量是用来指定uvm版本的指定UVM版本的作用包括:兼容性:确保你的验证环境(包括测试台、检查器、驱动程序等)
#与你使用的UVM库版本兼容。不同版本的UVM可能在API和功能上有所不同,所以明确指定版本可以避免兼容性问题。
#依赖管理:在编译时,编译器会根据这个版本号来查找和链接正确的UVM库。这意味着你需要有对应版本的UVM库文件,编译器才能正确地编译你的代码。
#环境配置:在某些情况下,UVM版本可能会影响仿真环境的配置,比如特定的编译选项或者仿真器的设置。
#团队协作:在团队开发环境中,所有成员都需要使用相同版本的UVM库。通过在Makefile中指定版本,可以确保团队成员之间的代码兼容性。
UVM_VER = uvm-1.1 

#这个变量用于指定测试用例的名称
TC = tc_uart_reg

#这行代码是定义了一个宏,在编译时传递给编译器,用于在编译时控制UVM库的行为
#UVM_OBJECT_MUST_HAVE_CONSTRUCTOR:当定义了这个宏后,UVM框架要求所有的UVM对象必须有一个构造函数。这意味着在创建UVM对象时,必须显式地调用构造函数(build_phase)
#这有助于确保对象在创建时被正确初始化。如果尝试创建对象而不调用构造函数,编译器将会报错。
#UVM_DEPRECATED_STARTING_PHASE:这是另一个UVM宏,它用于标记某些UVM阶段(phases)已经被弃用。在UVM中,阶段是验证过程中的不同阶段,
#例如构造、运行、结束等。当一个阶段被标记为弃用时,它提醒用户在未来的版本中,这个功能可能会被移除,建议用户更新他们的代码以使用新的替代方案。
#在compile_options中,通过+define+$(uvm_defines)调用这个变量
#在Makefile中,+号是编译器选项的前缀。这个符号告诉编译器,接下来的字符串是一个编译器选项。
UVM_DEFINES = UVM_OBJECT_MUST_HAVE_CONSTRUCTOR + UVM_DEPRECATED_STARTING_PHASE

#这几个变量在一起用于指定文件存放的路径
#所有文件的路径都写入到了INCLUDEFILE这个变量中 += 就相当于是在末尾加新值
#+incdir是编译器的特殊选项,用于指定编译时的目录
WORKAREA = ../..
LAB_DIR =${WORKAREA}/lab
INCLUDEFILE += +incdir+$(LAB_DIR)/env/apb_uvc/
INCLUDEFILE += +incdir+$(LAB_DIR)/env/uart_uvc/
INCLUDEFILE += +incdir+$(LAB_DIR)/env/uart_ctrl/sv/
INCLUDEFILE += +incdir+$(LAB_DIR)/env/uart_ctrl/tb/
INCLUDEFILE += +incdir+$(LAB_DIR)/env/uart_ctrl/test/
INCLUDEFILE += +incdir+$(LAB_DIR)/rtl/




COV_DIR = cov

CMP_L0G ?= $(TC)_cmp.log
SIM_LOG ?= $(TC)_run.log

#这两个是用于指定收集覆盖率时的参数的,通过COV变量的值决定是否收集覆盖率
#如果要收集覆盖率再为这两个变量赋值
run_cov =
com_cov =

COV ?= 0
ifeq($(COV),1)
#-cm是编译器的选项,用于启用覆盖率收集。line+cond+tgl+branch+fsm 指定了要收集的覆盖率类型
#line:行覆盖率,记录代码中每行的执行情况。
#cond:条件覆盖率,记录决策点(如if语句)的执行情况。
#tgl:触发器覆盖率,记录触发器的激活情况。
#branch:分支覆盖率,记录分支的执行情况。
#fsm:有限状态机覆盖率,记录状态机状态的转换情况。
#-cm_name 是覆盖率管理器的名称选项,用于指定覆盖率数据文件的名称,这里是以case名_随机种子名作为命名,产生的所有文件都会放到这个文件夹下
#-cm_log 选项指定了覆盖率日志文件的名称,这里设置为 cm.log。
#-cm_dir 选项指定了覆盖率数据文件的存储目录。把这个名字定义为了cov,所以数据会存在cov.vdb文件夹里,vdb是verdi存数据库的后缀
#-cm_hier cov_file:-cm_hier 表示启用层次化覆盖率(hierarchical coverage),
#这允许覆盖率数据按照模块层次结构进行组织。cov_file 是指定的覆盖率数据文件的名称。
#在收集覆盖率的时候还存在一个问题就是如何把多个case的覆盖率数据合并到一起看总的情况
#这里的处理方式,是把所有case覆盖率文件都放到了一个cov.vdv目录下,这样工具就会自动把数据merge到一起
#但如果是一个case生成了一个vdb文件那还需要一个命名,将这些vdb文件合并到一起	
	run_cov = -cm line+cond+tgl+branch+fsm\ 
			  -cm_name $(TC)_$(SEED)\
			  -cm_log cm.log
			  -cm_dir $(COV_DIR)
	com_cov = $(run_cov) -cm_hier cov_file
endif

#指定编译选项
#-full64:用于指定编译器生成64位的代码
#-sverilog:使用SystemVerilog语言进行编译
#-ntb_opts ${UVM_VER} $(INCLUDEFILE):传递UVM的版本信息和文件路径
#+define+LITLE_ENDIAN:定义一个宏 LITLE_ENDIAN。在SV中,这通常用于指定字节序,这里指定为小端字节序。
#-lca:这个选项可以帮助识别和移除那些在仿真过程中从未被访问过的代码。这样可以减少仿真时的内存占用,
#提高仿真速度。对于大型设计尤其有用,因为它可以显著减少编译后的仿真二进制文件的大小。
#-kdb:这个选项用于启用内核调试(Kernel Debug)功能。当启用 -kdb 时,编译器会在编译过程中生成调试信息,这些信息可以被调试器(如 Verdi)
#使用来提供更深入的调试功能。这包括查看波形、设置断点、单步执行等。-kdb 选项通常用于开发和调试阶段,以便开发者能够更好地理解和调试他们的设计
#-debug_access+all:启用了所有类型的调试访问,允许在仿真过程中访问所有的信号和变量
#-timescale = "1ns/1ps":设置了仿真的时间单位
#-l $(CMP_L0G):指定了编译器日志文件的名称,这里使用变量 $(CMP_L0G)作为文件名
compile_options = -full64 -sverilog -ntb_opts ${UVM_VER} $(INCLUDEFILE)\
				  +define+LITLE_ENDIAN \
				  -lca -kdb \
				  -debug_access+all \
				  -timescale = "1ns/1ps" -l output_log/$(TC)_$(SEED)/$(CMP_L0G)
				  

#这一段代码根据是否启用DEBUG变量,来决定是否使用两个与DEBUG宏,他们可以在仿真后输出更多调试信息
DEBUG ?= θ
ifeq($(DEBUG),1) 
	DEBUG_OPT = UVM_PHASE_TRACE +UVM_OBJECTION_TRACE
endif

#设置仿真过程中的选项
#+UVHLTESTNANE = ${TC}:指定测试案例名称
#+ntb_random_seed = $(SEED)指定随机种子
#+UVM_VERBOSITY = ${VB}:指定输出信息的级别
#-l $(SIM_LOG):指定仿真日志文件的名称和路径
run_options = +UVHLTESTNANE = ${TC} +ntb_random_seed = $(SEED) +UVM_VERBOSITY = ${VB} +$(DEBUG_OPT) -l output_log/$(TC)_$(SEED)/$(SIM_LOG) 



all : compile run
#mkdir -p命令是生成一个用于存储日志文件的目录
#定义编译过程中执行的任务,这里面包括使用vcs编译器执行compile_options,com_cov(覆盖率选项)
#两个-f命令 告诉编译器去读取指定的文件列表,这里的文件列表再配合编译选项中指定的文件路径才可以顺利读取到文件
compile:
	mkdir -p output_log/$(TC)_$(SEED)
	vcs ${compile_options} ${com_cov} -f $(LAB_DIR)/scripts/filelist_rtl -f $(LAB_DIR)/scripts/filelist_tb

#./simv./simv 在这里的作用是执行当前目录下的 simv 程序,并传递给它在Makefile中定义的仿真运行选项。这是启动仿真过程的标准方式。
#需要注意覆盖率收集的选项run_cov和com_cov是分别要在编译和运行时都加上才能起作用的
run:
	./simv ${run_options} ${run_cov}

#这段命令用于运行仿真后,启动verdi工具查看波形
#-simflow:表示Verdi以流模式启动,可以实时地从仿真器接收波形数据,而不是等待仿真完成后一次性加载所有数据
#-simBin ./simv:这个选项指定了仿真器的二进制文件路径。在这个例子中,仿真器的可执行文件 simv 位于当前目录
#-ssf sim.fsdb:这个选项指定了仿真脚本文件(sim.fsdb)的路径。这个文件包含了Verdi在启动时需要执行的一系列命令,fsdb文件通常是在top.sv里用$fsdbDumpfile("sim.fsdb");这句话生成的
#-sswr signal.rc:这个选项指定了一个信号列表文件(signal.rc),它包含了Verdi在打开时需要加载的信号。
#&:这个符号用于将命令放到后台执行。允许用户继续在当前shell中执行其他命令。
verdi:
	verdi -simflow -simBin ./simv -ssf sim.fsdb -sswr signal.rc &
#-vpd vcdplus.vpd:这个选项指定了VCD波形文件的路径。在这个例子中,波形文件名为 vcdplus.vpd。-vpd 选项告诉DVE加载这个VCD文件。VCD文件通常由仿真器在仿真过程中生成,记录了仿真期间信号的变化。
dve:
	dve -vpd vcdplus.vpd &

#覆盖率数据查看使用dve工具
#-dir $(COV_DIR).vdb:这个选项指定了覆盖率数据库文件的目录。这个目录包含了仿真过程中收集的覆盖率数据
#-elfile uart.el:这个选项指定了仿真的ELF(Executable and Linkable Format)文件。这个文件通常包含了仿真的设计信息,DVE会使用它来关联波形和源代码。
coverage:
	dve -full64 -dir $(COV_DIR).vdb -elfile uart.el &

clean:
	rm -rf DVEfiles simv.daidir simv.vdb uvm-1.2 vcdplus.vpd vc_hdrs.h vcs_sim.log comp.log csrc inter.vpd ucli.key simv *.log merge.vdb novas.conf result.* sim.fsdb test topology urgReport vcsrun.sh verdiLog

#如果一个目录下有多个vdb文件,可以使用urg命令合并覆盖率数据
merge:
	urg -full64 -dir *.vdb -dbname merge.vdb

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值