https://www.cnblogs.com/zhtxwd/archive/2012/03/30/2425180.html
SYNOPSYS VCS Makefile文件编写与研究
这个Makefile是synopsys提供的模板,看上去非常好用,你只要按部就班提供实际项目的参数就可以了。我们来看这个文件的头部说明:
makefile 其实完全可以用csh或其他脚本来编写,只是VCS使用的linux内置的make命令定义了一个标准的仿真脚本,make命令是专门用来
做项目的源文件管理和编译控制的命令。这篇文章重点看synpsys的标准仿真脚本都做了哪些操作,然后使用其他脚本来实现。这里主要是自己
写的一点东西,有些地方是猜测的或者不准确。
#---------------------------------------------------------------------------------------------------------------------------
# SYNOPSYS CONFIDENTIAL - This is an unpublished, proprietary work of
# Synopsys, Inc., and is fully protected under copyright and trade secret
# laws. You may not view, use, disclose, copy, or distribute this file or
# any information contained herein except pursuant to a valid written
# license from Synopsys.
# SYNOPSYS公司的版权声明,没有权限不可使用
#-----------------------------------------------------------------------------------------------------------------------------
# Filename : $Id: Makefile,v 1.0 2006/07/18 23:59:59 vangundy Exp $
# Created by : Synopsys Inc. 07/17/2006
# $Author : vangundy $
# Description : Demonstrates Verilog DUT and SVTB using VCS
# makefile文件头
#---------------------------------------------------------------------------------------------------------------------------
# The Makefile works on two seperate flows. The DEBUG flow is intended to be used
# During debugging of a testcase and/or the DUT. The REGRESSION flow is used
# During regression runs and collects coverage data.
# 该makefile模版包括两部分流程,debug(查错)流程和regress(回归测试)流程,两个流程大致步骤都相同都是:Compile,SIM(urg,覆盖
# 率的分析和采集),debug时主要是跑一个pattern,并dump VPD文件,SIM的同时可以打开DVE视图界面,结束后观察波形,regress主要用
# 于采集覆盖率,一般要跑多个pattern,这时就无需dump VPD文件(节约时间),由于是debug后有进行的重复运行,所以叫regress(回归)。
# 在我们的验证平台中,若不做代码覆盖率的功能,可以不写regress,只要写debug的流程和跑多个pattern的脚本就好了。
#---------------------------------------------------------------------------------------------------------------------
# The DEBUG flow turns on VPD dumping and turns off coverage collection. After
# building a testcase using the debug targets, you can debug the TB and the DUT
# source code using the testbench debugger and DVE. Of course, you can turn on
# coverage metrics and run in debug mode by changing compile and runtime options
# in the makefile. These changes are independent of the regression flow so that
# the regressions will still run optimally without the interference of VPD dumping.
# debug流程打开VPD文件的dump并关闭覆盖率在build了一个包含DUT的testcase后,可以使用VCS的debugger和DVE进行debug。当
# 然,你也以通过改变makefile文件中的compile和runtime选项参数来开启覆盖率功能。Debug流程和regress流程是各自独立的,regression
# 流程一般不生成VPD。
# --------------------------------------------------------------------------------------------------------------------------------
# The REGRESSION flow turns off VPD dumping and turns on Coverage Metrics and TB
# coverage collection. This flow is intended to support verification engineers who
# are working through the regression process and are interested in coverage
# collection and urg.
# REGRESSION流程关闭VPD dump并打开Coverage collection功能,该流程是为了支持验证引擎进行“流水线验证“(跑多个testcase)和
# 代码覆盖率功能。??在验证平台中可以将运行多个testcase的脚本命名为regress,运行单个testcase的脚本命名为regone??,这只是
# synopsys的模版,我们不必完全遵守,可以不区分debug和regress,然后将是否打开波形和coverage设置成参数。
# -------------------------------------------------------------------------------------------------------------------------------
# Command Line make命令行
# -----------------
# The Makefile supports the following command line
# makefile支持下列命令行
# % make target_name_* <SEED=xxx> <DEFINES=xxxx>
# makefile文件放在哪?放在仿真路径。make [-f makefile文件名][选项][宏定义][目标]
# -f 指定makefile 若没有则make程序首先在当前目录查找名为makefile的文件,如果没有找到,它就会转而查找名为Makefile的文件。
# Where target_name is the name of a testcase located in the test directory. Every
# test in the test directory is named using test_{test_name}. All of the test targets
# are listed in the TEST TARGETS section of the makefile.
# target_name是test路径下的一个testcase的名字,test路径下的testcase的名字使用test_{test_name}来命名,例如test_1
# 所有的test target 都在makefile文件中的TEST TARGETS部分列出
# ---------------------------------------------------------------------------------------------------------------------------
# Compile and Run Testcases 编译与运行testcase
# -------------------------------
# To compile and run a tescase use the test_* and regress_test_* targets.
# 编译与运行testcase,(test_1 就是执行了下面的两个命令先编译在运行) test_1 ==> compile_1 run_1 详见下面命令定义
# % make test_1 // Builds and runs test 1 with VPD dumping 其实就是debug的前边的流程
# % make regress_test_1 // Builds and runs test 1 with coverage turned on
# -------------------------------------------------------------------------------------------------------------------------
# Debugging Testcases Debug 实在上面命令之后在进行的
# ------------------------
# You can use DVE and the testbench debugger to visualize waveforms and testbench
# execution. You must first build the testbench using the make compile_* command.
# dubug必须是在DVE(VCS的debug工具,与debussy一样的功能)下进行,因为要看波形嘛,但是debug之前必须先compile
# % make compile_1 // Builds test 1 for debugging //需要重新编译一次吗?
# Once you have built the environment with the proper debug switches, you can use DVE and the testbench debugger.
# # testbench debugger 是否是指编译后的那个simv可执行文件呢? 其实gui_1 和上面test_1中的run_1是一样的只是增加了-gui项
# 即增加了打开gui界面的参数,其他雷同
# % make gui_1 // Debug test 1 with DVE
# % make tb_gui_1 // Debug test 1 with the testbench debugger
# % make both_guis_1 // Debug using both guis
# % make pp_1 // Debug using the VPD file VPD文件要在执行simv之后才有吧?
# If you want, you can turn on coverage for the DEBUG flow by uncommenting the
# coverage flag in the makefile. If you do this, you can still look at coverage.
# This may be useful in helping those who are debugging coverage related issues.
# 如果在makefile中的debug流程中使用了coverage功能,那么可以使用下面命令观察覆盖率
# % make urg // Visualize coverage data from debug runs
# -----------------------------------------------------------------------------------------------------------------------------
# Regression Testcases
# --------------------
# Regression tests are used to collect coverage information. To build a testcase
# for coverage collection use a command similar to the following.
# regress流程主要是为了收集代码覆盖率信息,在执行regress之前需要重新build testcase 类似debug时的compile
# % make regress_build_1 // Build and run a regression test with a default seed
# Once the test has been built, you can run it again with a new seed.
# 与debug不同的是regress需要重新run(使用新的SEED)一下,【还是debug的时候也要run一下?】
# % make regress_run_1 SEED=1234
# After running one or more regression runs, you can visualize the coverage data
# using urg and the following command
# run完之后可以用下面命令看代码覆盖率
# % make regress_urg
#----------------------------------------------------------------------------------------------------------------------------
# HOW TO REUSE THIS FILE ON ANOTHER DUT //如何重用该模版
# STEP 1: Update the file locations as required //设置file所属的路径
# STEP 2: Update the DUT section with directory and source location info//更新模版中DUT部分,指定DUT的路径和include的路径
# STEP 3: Update the TB section with directory and source location info//更新模版中TB部分,指定TB的路径和include的路径
# STEP 4: Update the Coverage section with name of dut top (eg top.dut) //跟新模版中Coverage部分,指定要测试代码覆盖率的dut的top
# STEP 5: Add test targets to the debug and regression targets section//将debug和regress的target加入模版中对应的部分
# STEP 5: Adjust the debug and regression compile and run time arguments//调整debug和regress的compile和runtime的命令参数
# STEP 7: Adjust command line options as required//调整命令行命令(后边带百分号和冒号的就表示可以在make命令行中使用的命令)
# STEP 8: Update the env class so that it extends dkm_env//更新env class(环境类)使得它可以提供dkm_env
# You will need to have a copy of the dkm directory and it should //dkm是什么?
# be located at $(TB_SRC_DIR)/dkm
# a) Add [`include "dkm_env.sv"]
# b) Add [extends dkm_env] to the environment class definition
# c) Call the super.new("name") from the constructor
# STEP 9: Run the debug and regression targets
# % make testbench_target_* // testbench_target_* 是指test_1之类的testcase
#-----------------------------------------------------------------------------
看了上文,大家应该可以简单了解这个Makefile的功能了。接下来就按照step1~9来填空即可:
.PHONY : default help clean regress_clean
default: help
#-----------------------------------------------------------------------------
# DIRECTORIES 总路径
#-----------------------------------------------------------------------------
OUTPUT_DIR = ./output //为什么debug和regress没有分开? debug和regress的Coverage在COV_DIR下是有区分的
COV_DIR = ./coverage //为什么没有VPD的路径?
LOG_DIR = ./logs //output是做什么的? VPD文件 simv文件 还有一写其他文件在这里
# Set this to the location where you installed the designware models. This
# depends on whether you ran the setup_vip_dw_home to install the models or
# the setup_vip_here script.
#DW_MODELS_DIR = $(DESIGNWARE_HOME)
DW_MODELS_DIR = /user/synopsys/designware //软件路径 VCS的路径?
#DESIGNWARE_HOME = ~synopsys/bk/designware
#DW_MODELS_DIR = ./designware
#----------------------------------------------------------------------------
# DEVICE UNDER TEST DUT路径
#-----------------------------------------------------------------------------
DUT_SRC_DIR = ./source/Verilog //SRC source
DUT_SRC = -f $(DUT_SRC_DIR)/rtl_list.f //待编译的rtl文件列表文件 SRC是什么意思?
DUT_INC += +incdir+/user/myproj/PROJECT/RTL/SRC/mymodule/
DUT_INC += +incdir+/user/myproj/PROJECT/RTL/SRC/mymodule/mymodule_inc.v
DUT_CMP_OPTIONS += +libext+.v+.V //这个参数是干什么的?指定VCS搜索文件时的文件后缀.v
#DUT_CMP_OPTIONS += -timescale=1ps/1ps //CMP是compile的意思 不是compare
#DUT_CMP_OPTIONS += -override_timescale=1ps/1ps
#-----------------------------------------------------------------------------
# TESTBENCH TB路径设置
#-----------------------------------------------------------------------------
TB_SRC_DIR = ./source/svtb
# AXI TESTBENCH, VIP Sources first
#TB_SRC += -f $(TB_SRC_DIR)/mac_if_tb/vip/gslv_model_package.f
TB_SRC += $(TB_SRC_DIR)/mpdu_trx_tb/tests/mpdu_tb_top.sv
TB_SRC += $(TB_SRC_DIR)/mpdu_trx_tb/tests/$(TB_TEST).sv //为什么有两个SV
TB_INC += +incdir+$(TB_SRC_DIR)/mpdu_trx_tb/vip
TB_INC += +incdir+$(TB_SRC_DIR)/mpdu_trx_tb/env
TB_INC += +incdir+$(TB_SRC_DIR)/mpdu_trx_tb/tests
TB_INC += +incdir+$(DW_MODELS_DIR)/include/svtb //这部分为了支持sv吗?
TB_INC += +incdir+$(DW_MODELS_DIR)/include/verilog
TB_INC += +incdir+$(DW_MODELS_DIR)/svtb
#TB_CMP_OPTIONS += -tb_timescale=1ns/1ps
#TB_CMP_OPTIONS += -lca Y-2006.06-SP2
TB_CMP_OPTIONS += +pkgdir+$(DW_MODELS_DIR)/include/svtb //TB的编译选项和DUT不同?sv 和verilog的区别吗?
TB_CMP_OPTIONS += -ntb_incdir $(DW_MODELS_DIR)/include/vera
TB_CMP_OPTIONS += -ntb_incdir $(DESIGNWARE_HOME)/vip/vmt/latest/vera/src
TB_CMP_OPTIONS += -ntb_incdir $(DESIGNWARE_HOME)/vip/amba/latest/vera/src
TB_CMP_OPTIONS += -ntb_incdir $(DESIGNWARE_HOME)/vip/amba/latest/axi_master_vmt/vera/src //TB中使用的一些模型
TB_CMP_OPTIONS += -ntb_incdir $(DESIGNWARE_HOME)/vip/amba/latest/axi_master_rvm_vera_vmt/vera/src
TB_CMP_OPTIONS += -ntb_incdir $(DESIGNWARE_HOME)/vip/amba/latest/axi_slave_vmt/vera/src
TB_CMP_OPTIONS += -ntb_incdir $(DESIGNWARE_HOME)/vip/amba/latest/axi_slave_rvm_vera_vmt/vera/src
TB_CMP_OPTIONS += -ntb_incdir $(DESIGNWARE_HOME)/vip/amba/latest/axi_monitor_vmt/vera/src
TB_CMP_OPTIONS += -ntb_incdir $(DESIGNWARE_HOME)/vip/amba/latest/axi_monitor_rvm_vera_vmt/vera/src
TB_CMP_OPTIONS += -ntb_incdir $(DESIGNWARE_HOME)/vip/amba/latest/axi_port_monitor_vmt/vera/src
TB_CMP_OPTIONS += -ntb_incdir $(DESIGNWARE_HOME)/vip/amba/latest/axi_port_monitor_rvm_vera_vmt/vera/src
TB_CMP_OPTIONS += -ntb_incdir $(DESIGNWARE_HOME)/vip/amba/latest/axi_interconnect_vmt/vera/src
TB_CMP_OPTIONS += -ntb_incdir $(DESIGNWARE_HOME)/vip/amba/latest/axi_interconnect_rvm_vera_vmt/vera/src
TB_CMP_OPTIONS += -ntb_incdir ${DESIGNWARE_HOME}/vip/amba/latest/ahb_master_vmt/vera/src
TB_CMP_OPTIONS += -ntb_incdir ${DESIGNWARE_HOME}/vip/amba/latest/ahb_slave_vmt/vera/src
TB_CMP_OPTIONS += -ntb_incdir ${DESIGNWARE_HOME}/vip/amba/latest/ahb_monitor_vmt/vera/src
TB_CMP_OPTIONS += -ntb_incdir ${DESIGNWARE_HOME}/vip/amba/latest/ahb_bus_vmt/vera/src
TB_CMP_OPTIONS += -ntb_incdir ${DESIGNWARE_HOME}/vip/amba/latest/ahb_master_rvm_vera_vmt/vera/src
TB_CMP_OPTIONS += -ntb_incdir ${DESIGNWARE_HOME}/vip/amba/latest/ahb_slave_rvm_vera_vmt/vera/src
TB_CMP_OPTIONS += -ntb_incdir ${DESIGNWARE_HOME}/vip/amba/latest/ahb_monitor_rvm_vera_vmt/vera/src
TB_CMP_OPTIONS += -ntb_incdir ${DESIGNWARE_HOME}/vip/amba/latest/ahb_bus_rvm_vera_vmt/vera/src
TB_CMP_OPTIONS += -ntb_define NTB
TB_CMP_OPTIONS += -ntb_define DW_VIP_AXI_MAX_NO_MSTRS=6
TB_CMP_OPTIONS += -ntb_define DW_VIP_AXI_MAX_NO_SLVS=2
TB_CMP_OPTIONS += +define+DW_VIP_AXI_MAX_NO_MSTRS_6
TB_CMP_OPTIONS += +define+DW_VIP_AXI_MAX_NO_SLVS_2
TB_CMP_OPTIONS += -ntb_opts rvm
TB_CMP_OPTIONS += -ntb_opts dtm
TB_CMP_OPTIONS += -ntb_opts use_sigprop
TB_CMP_OPTIONS += -ntb_opts interop
TB_CMP_OPTIONS += -ntb_opts dw_vip
TB_CMP_OPTIONS += +define+NT
# AIP Related files and compilation options
#TB_CMP_OPTIONS += +incdir+../BP062-BU-01000-r0p0-00rel0/sva \
+incdir+../BP062-BU-01000-r0p0-00rel0/verilog \
../BP062-BU-01000-r0p0-00rel0/sva/AxiPC.sv \
../BP062-BU-01000-r0p0-00rel0/verilog/Axi.v \
./source/svtb/platform_tb/env/Snps_ARMAXI_CheckerBind.sv
#${VCS_HOME}/packages/aip/DDR2_AIP/src/Snps_DDR2_Checker.sv \
-assert enable_diag \
+incdir+.+${VCS_HOME}/packages/aip/DDR2_AIP/src/ \
./source/svtb/platform_tb/env/Snps_DDR2_Bind.sv \
+incdir+../BP062-BU-01000-r0p0-00rel0/sva \
+incdir+../BP062-BU-01000-r0p0-00rel0/verilog \
../BP062-BU-01000-r0p0-00rel0/sva/AxiPC.sv \
../BP062-BU-01000-r0p0-00rel0/verilog/Axi.v \
./source/svtb/platform_tb/env/Snps_ARMAXI_CheckerBind.sv
#-----------------------------------------------------------------------------
# COVERAGE 覆盖率的设置
#-----------------------------------------------------------------------------
COV_TREE += '+tree mpdu_tb_top'
COV_CM_OPTIONS += -cm line+cond+fsm+assert 注意CM和CMP不一样
#-----------------------------------------------------------------------------
# TEST TARGETS 总命令
#-----------------------------------------------------------------------------
# debug targets
test_1: compile_1 run_1 与前边对应test_1 就是debug流程(debug还可以将run_1 换成 gui_1);regress_test_1就是regress流程
test_11: compile_11 run_11
test_12: compile_12 run_12
test_13: compile_13 run_13
test_14: compile_14 run_14
test_2: compile_2 run_2
test_perf: compile_perf run_perf
# regression targets
regress_test_1: regress_build_1 regress_run_1
regress_test_11: regress_build_11 regress_run_11
regress_test_12: regress_build_12 regress_run_12
regress_test_13: regress_build_13 regress_run_13
regress_test_14: regress_build_14 regress_run_14
regress_test_2: regress_build_2 regress_run_2
regress_test_perf: regress_build_perf regress_run_perf
#-----------------------------------------------------------------------------
# COMPILE AND RUN TIME ARGUMENTS 编译与运行时的参数设置(run和sim可以看成一个意思,run就是run simv)
#-----------------------------------------------------------------------------
# Debug compile time arguments
DBG_CMP += $(COV_CMP_OPTIONS) //debug 编译的参数
DBG_CMP += -debug_all //使能DVE debugging (包括 line stepping)
//DBG_CMP += -debug_pp //使能VPD dump 和assertion debug
DBG_CMP += +define+VPD_ON //debug compile的时候定义一个VPD_ON的宏,注意VPD是SIM时生成的
#DBG_CMP += +define+VPD_OFF //若CMP时参数把VPD关了,但是在SIM时输出一个VPD会怎么样?
#DBG_CMP += +define+LOG_FMT_OFF //应该是这样,在verilog代码中将VPD dump的代码写在 ifdefine VPD_ON 后面
# Debug run time arguments
DBG_RUN += $(COV_SIM_OPTIONS) //COV_SIM_OPTION 和 COV_CMP_OPTION的区别
# Regression compile time arguments
REG_CMP += $(COV_CMP_OPTIONS)
REG_CMP += +define+VPD_OFF //regress compile的时候定义了VPD_OFF, debug和regress的区别其实主要就是这,
//因为debug时也可以做urg,所以在CMP和SIM参数中关于覆盖率实际上是一致的
# Regression run time arguments //注意在debug和regress各自的流程中urg命令(make 命令行命令)是不同的
REG_RUN += $(COV_SIM_OPTIONS)
# Define where the coverage data is for URG //覆盖率数据,这个是给后边urg命令用的,产生覆盖率实在CMP和SIM之后进行的
COV_DBG_DATA += -dir $(COV_DIR)/debug/simv.vdb -dir $(COV_DIR)/debug/simv.cm
COV_REG_DATA += -dir $(COV_DIR)/regress/simv.vdb -dir $(COV_DIR)/debug/simv.cm
#-----------------------------------------------------------------------------
# COMMAND LINE ARGUMENTS make命令行参数
#-----------------------------------------------------------------------------
SEED = 766
#234567
#DEFINES = "+rvm_log_default=DEBUG"
DEFINES = "+vmm_log_default=DEBUG"
#DEFINES = "+vmm_log_default=NOTE"
#DEFINES = "+rvm_log_default=WARNING"
#DEFINES = "+vmm_log_default=ERROR"
##############################################################################
##############################################################################
# PRIVATE //私有部分,用户可以不改
# You should not need to modify anything below this point
# The following code supports a SV DUT and SVTB.
##############################################################################
##############################################################################
DIR = $(/user/synopsys/Gaon/Platform)
##########################################################################
# DEVICE UNDER TEST DUT CMP和SIM参数设置,之前已经设置过debug和regress在Compile时的参数
##########################################################################
DUT_CMP_OPTIONS += -sverilog +v2k
DUT_CMP_OPTIONS += -o $(DUT_SIM_EXEC)
DUT_CMP_OPTIONS += -Mdir=$(OUTPUT_DIR)/$(TB_TEST_ID)_csrc
DUT_CMP_OPTIONS += -l $(LOG_DIR)/$(TB_TEST).cmp_log
DUT_CMP_OPTIONS += +vcs+lic+wait +plusarg_save
DUT_CMP_OPTIONS += $(DUT_INC)
DUT_SIM_OPTIONS += -l $(LOG_DIR)/$(TB_TEST_ID).run_log
DUT_SIM_OPTIONS += +vcs+lic+wait
DUT_SIM_OPTIONS += +vpdfile+$(OUTPUT_DIR)/$(TB_TEST_ID).vpd
//vpd实在执行sim后生成的,但是在debugcompile的时候为什么有个vdp_on的参数呢?
#DUT_SIM_OPTIONS += +ntb_random_seed=$(SEED)
DUT_SIM_OPTIONS += +ntb_random_seed_automatic
DUT_SIM_OPTIONS += -assert nopostproc+report=$(LOG_DIR)/$(TB_TEST_ID).sva_log
DUT_SIM_OPTIONS += -cm_assert_name $(TB_TEST_ID)
DUT_SIM_OPTIONS += $(DEFINES)
DUT_SIM_EXEC += $(OUTPUT_DIR)/$(TB_TEST)_simv
##########################################################################
# TESTBENCH TB CMP和SIM参数设置,之前已经设置过debug和regress在Compile时的参数
##########################################################################
TB_TEST += test_$* //$*是什么意思,$* :去掉后缀的当前目标名(?)。例如,若当前目标是pro.o,则$*表示pro。
TB_TEST_ID += $(TB_TEST)_$(SEED)
# VK ENVIRONMENT
TB_INC += +incdir+$(TB_SRC_DIR)/vk
TB_CMP_OPTIONS += $(TB_INC)
##########################################################################
# COVERAGE 覆盖率设置
##########################################################################
#COV_CM_OPTIONS += +tb_cov_db_name=$(TB_TEST_ID)
COV_CM_OPTIONS += -cm_name $(TB_TEST_ID)
COV_CMP_OPTIONS += $(COV_CM_OPTIONS) -cm_hier $(COV_HIER)
COV_SIM_OPTIONS += $(COV_CM_OPTIONS)
COV_SIM_OPTIONS += -cm_log $(LOG_DIR)/$(TB_TEST_ID).cm_log
COV_HIER += $(OUTPUT_DIR)/vcm.cfg
# Coverage options for build and run with debug
COV_CM_DBG += -cm_dir $(COV_DIR)/debug/simv.cm
#COV_CM_DBG += -ova_dir $(COV_DIR)/debug/simv.vdb
#COV_CM_DBG += +tb_cov_db_dir=$(COV_DIR)/debug/simv.vdb
# Coverage options for build and run with regressions
COV_CM_REG += -cm_dir $(COV_DIR)/regress/simv.cm
COV_CM_REG += -ova_dir $(COV_DIR)/regress/simv.vdb
COV_CM_REG += +tb_cov_db_dir=$(COV_DIR)/regress/simv.vdb
##########################################################################
# DEBUG TARGETS
##########################################################################
compile_%:
echo $(COV_TREE) > $(COV_HIER); //debug 编译时主要有下面几个参数 TB_CMP DUT_CMP DBG_CMP COV_CM_DBG
vcs $(TB_CMP_OPTIONS) \ //请详细查看上面几个变量的设置
$(DUT_CMP_OPTIONS) \
$(DUT_SRC) \
$(TB_SRC) \
$(SVA_SRC) \
$(SVA_OPTIONS) \
$(COV_CM_DBG) \
$(DBG_CMP)
run_%:
$(DUT_SIM_EXEC) $(DUT_SIM_OPTIONS) $(DBG_RUN) $(COV_CM_DBG)
//run 是上面说的test_1中的第二步,属于debug流程,其实就是执行simv,参数有DUT_SIM和DBG_RUN
//注意TB在run(sim)时没有相关参数
gui_%: //gui_1和run_1的区别就是打开了视图界面,他们都是执行sim
$(DUT_SIM_EXEC) $(DUT_SIM_OPTIONS) $(DBG_RUN) $(COV_CM_DBG) \
-gui
tb_gui_%: //-tb_gui 和-gui的区别是什么(上文提到DVE和testbenchdebugeer的含义),猜测-gui是打开DVE软件,-tb_gui就不知道是神马
$(DUT_SIM_EXEC) $(DUT_SIM_OPTIONS) $(DBG_RUN) $(COV_CM_DBG) \
-tb_gui +ntb_debug_on_start
both_guis_%:
$(DUT_SIM_EXEC) $(DUT_SIM_OPTIONS) $(DBG_RUN) $(COV_CM_DBG) \
-gui \
-tb_gui +ntb_debug_on_start
new_gui_%: //打开一个新的 DVE软件窗口?
$(DUT_SIM_EXEC) $(DUT_SIM_OPTIONS) $(DBG_RUN) $(COV_CM_DBG) \
-gui \
-tbug
pp_%: //这个命令应该就是打开VPD波形
dve -vpd $(OUTPUT_DIR)/$(TB_TEST_ID).vpd
urg: //执行代码覆盖率操作? 代码覆盖律不是在sim的时候产生的吗(在CMP和SIM的时候都有COV的参数啊)? 这个要具体查一下
urg $(COV_DBG_DATA) -report $(COV_DIR)/debug/urgReport -lca
mozilla $(DIR)/$(COV_DIR)/debug/urgReport/dashboard.html &
dve_cov: //该命令应该是使用DVE软件查看coverage结果
@echo ""
@echo "WARNING: Did you run this command?"
@echo ""
@echo " % source ./utils/setup_dve_cov"
@echo ""
dve -cov &
##########################################################################
# REGRESSION TARGETS
##########################################################################
regress_clean: clean
@rm -rf $(COV_DIR)/*
@mkdir -p $(COV_DIR)/debug //怎么把debug的路径也给删除了?
@mkdir -p $(COV_DIR)/regress
@mkdir -p $(LOG_DIR)
@mkdir -p $(OUTPUT_DIR)
regress_build_%: //regress compile 的时候就$(REG_CMP)和debug不同仔细检查两者的差异
echo $(COV_TREE) > $(COV_HIER);
vcs $(TB_CMP_OPTIONS) $(DUT_CMP_OPTIONS) \
$(DUT_SRC) \
$(TB_SRC) \
$(SVA_SRC) \
$(SVA_OPTIONS) \
$(COV_CM_REG) \
$(REG_CMP)
regress_run_%: //观察各参数和debug流程的有什么差异
$(DUT_SIM_EXEC) $(DUT_SIM_OPTIONS) $(REG_RUN) $(COV_CM_REG)
regress_urg: //看来VPD是SIM时产生的,但是覆盖率不是SIM时产生的,可能因为覆盖律要跑多个case才有意义
urg $(COV_REG_DATA) -grade -report $(COV_DIR)/regress/urgReport
mozilla $(DIR)/$(COV_DIR)/regress/urgReport/dashboard.html &
regress_dve_cov:
@echo ""
@echo "WARNING: Did you run this command?"
@echo ""
@echo " % source ./utils/setup_dve_cov"
@echo ""
dve -cov &
# 综上,debug和regress流程类似,都是四步,compile,sim,urg,dve_cov
##########################################################################
# ADMINISTRATIVE 管理命令
##########################################################################
help:
@echo =======================================================================
@echo " "
@echo " USAGE: %make target_name_* <SEED=xxx> <DEFINES=xxxx> "
@echo " "
@echo " ------------------------ DEBUG TARGETS ----------------------------"
@echo " test_* => Compile TB and DUT files, runs the simulation. "
@echo " clean => Clean the intermediate files. "
@echo " compile_* => Compile the TB and DUT. "
@echo " run_* => Run the simulation. "
@echo " gui_* => Run simulation interactively with DVE. "
@echo " tb_gui_* => Runs simulation interactively with TB Debugger. "
@echo " both_guis_* => Run both debuggers. "
@echo " new_gui_* => Run new integrated debuggers. "
@echo " pp_* => Post process VPD with DVE. "
@echo " urg => Make a coverage report for debug runs. "
@echo " dve_cov => Brings up DVE for coverage reporting. "
@echo " "
@echo " ----------------------- REGRESSION TARGETS ------------------------"
@echo " regress_test_* => Compile and run with coverage. "
@echo " regress_clean => Remove all coverage files. "
@echo " regress_build_* => Build test_*. "
@echo " regress_run_* => Run test * collecting coverage information. "
@echo " regress_urg => Make a coverage report for regression runs. "
@echo " regress_dve_cov => Brings up DVE for coverage reporting. "
@echo " "
@echo " -------------------- ADMINISTRATIVE TARGETS -----------------------"
@echo " help => Displays this message. "
@echo " init => Clean all files, including coverage files. "
@echo " tar => Tar and zip kit and place at ../ "
@echo " "
@echo " e.g. gmake test_1 "
@echo =======================================================================
tar: clean
cd ..; \
tar cvf ${DIR}.tar ${DIR}; \
rm -f ${DIR}.tgz; \
gzip ${DIR}.tar; \
mv ${DIR}.tar.gz ${DIR}.tgz
clean:
@rm -rf $(OUTPUT_DIR)/* $(COV_DIR)/debug/* $(LOG_DIR)/* ./DVEfiles
@rm -rf urgReport *.tcl *.tcl.old vc_hdrs.h testbench_debugger_rc
@rm -rf ucli.key vcs.key vera_debugger_rc .vera_debugger_rc.lock
@rm -rf .test* .vlog* .dummyDir *.db *.vdb verilog.dump
@rm -rf ._* .dw* *.log
init: regress_clean
@rm -rf include
@rm -rf examples
总结:
经过研究,首先使用VCS验证的流程是:
1. 对各个源文件(包括DUT和TB)进行编译,生成可执行文件(默认名字为simv)
2. 执行simv文件进行仿真,这时会将testcase的仿真结果输出,包括VPD(若开启了VPD dumpping)文件等输出文件
3. 若进行代码覆盖率检查,在simv后可以使用urg命令收集覆盖率信息(须跑多个case)
Makefile 完成的功能是:
1. 对源文件的管理:主要是将DUT文件和TB文件以及一些必要的文件的路径写入变量($DUT_SRC_DIR $TB_SRC_DIR等),还有include的路径(供VCS搜索)。在使用VCS命令进行编译时,可以将该路径加入命令中。我们可以使用脚本将需要编译的文件输出为一个file_list.f文件,然后用vcs –f file_list.f 进行编译。
2. 对路径的管理:将源文件路径和输出文件路径写入各自的变量,一遍在后边使用vcs命令时调用。
3. 对VCS命令参数的调整:这部分是重要的步骤,根据需要的不同(debug和regress的需要就不相同),参数设置也有不同,但有一些参数是不管怎样的流程都需要的,在我们的验证平台中,我们可以将参数分为两部分,一部分是都需要的可以公用的,一部分是可以灵活使用的,可以更改的。
4. 对VCS命令的调整:这部分就是将VCS的几个主要命令(其实就是VCS 和 SIMV)加上对应的参数设置。我们的验证平台可以将不同的命令写成不同的脚本,然后写一个总的脚本进行调用。
5. 其实需要灵活配置的主要就是VPD文件和覆盖率的设置(VPD 在rtl级实际上应该每次都生成)
https://blog.csdn.net/gsjthxy/article/details/104660557
前言:下表所列為VCS常用的Command。
一、常用的編譯選項
No. 命令 描述
1 +define+<macro_name>=<value> 命令行进行宏定义,在代码中使用了`ifdef 编译指令
2 +mindelays 器件延时使用sdf 文件中的最小值(sdf 文件中的时序(min:typ:max))
3 +maxdelays 器件延时使用sdf 文件中的最大值
4 –v <filename> 导入库文件的verilog 模型(只编译使用到的module),-v 在verdi 中无法trace,被当作一个器件,不能追踪到内部Module 查找路径,在添加module 时,会在此目录下查找,当编译某文件,如果里面有例化某个module,则会编译这个文件下的内容
5 -y < directory > Module 查找路径,在添加module 时,会在此目录下查找,当编译某文件,如果里面有例化某个module,则会编译这个文件夹下的内容与-v 功能差不多,一个是指定文件,一个是指定文件夹
6 +incdir+directory+ 指定VCS 搜索`include 内文件的目录
7 -full64 支持64 位模式运行
8 -R 编译完后立刻运行
9 –sverilog 支持systemverilog 语法(vcs 用,verid 用-sv)
10 +v2k 支持verilog 2001 特性
11 -lca Limited Customer Availability,支持动态数据类型associative Array,dynamic Array,smart Queue,string,
event,class
12 –debug_all 支持所有debug 操作,DVE 选项,可以查看所有断点(line,time,value,event etc) all 就是加权限。+w 是写,+r 是读,+f 是force, +l 是支持ucli 的单步调试, +n 是对网表操作。具体可以看手册。+all 就是把所有的权限全开
13 –debug_acess+all 在VCS 编译的时候不用再加-p novas.tab pli.a 来定verdi 的路径。直接在simv 的ucli 脚本里面call $fsdbdumpfile想dump vpd 的时候至今换dump file XXX不用重新编译。版本有差异
14 –fsdb 调用Verdi PLI 库,支持fsdb 波形
15 +vcs+lic+wait 等待vcs license
16 +plusarg_save 将某些runtime options 加入到编译中,源代码中存在$test$plusargs(“name”),如果字符匹配则为真,反之为例:在tc 中有代码if($test$plusargs(“testcase0”)) $在Makefile 命令中加入make testcase0,则if 为真,打印
17 +libext+ 在库目录内搜索指定后缀名文件进行编译
18 +verilog2001ext+ Specifies a file name extension for Verilog2001 source file
19 +systemverilogext+ Specifies a file name extension for SystemVerilog source file
20 +warn=[no]ID|none|all… 打开或关闭warning 信息
21 +optconfigfile+<filename> 定义VCS 配置文件,第一级同步寄存器不检查看用一个文件输入
22 -o name 指定运行文件名称
23 -Mdir=directory_path 指定增量编译的目录(默认为csrc)
24 -l sim log 生成指定log 文件
25 +ntb_random_seed=value 指定仿真随机种子
26 +ntb_random_seed_automatic VCS 自动生成随机种子
27 -timescale=1ns/10ps 命令行定义仿真时间刻度,若rtl 中有timescale 的定义,则会覆盖makefile 中的定义
28 –override_timescale=1ns/10ps 覆盖源代码中的仿真时间单位和精度,最好别用,否则会把模型的时间单位覆盖,可能导致模型功能错误
29 -pvalue+tb_top.CYCLE=value 对指定参数进行赋值-pvalue+tb_top.CYCLE=${period} , 那么在命令行就可以使用vcs xxx period=yy 来改变CYCLE
30 –sv 支持systemverilog 语法(verdi 有此配置,vcs 没有)
31 –ssf 自动加载fsdb 文件
32 +neg_tchk 负延迟检查,P&R 后仿需要加上此选项,
33 +delay_mode_zero 去除仿真中的延迟信息,所有的延时为0,当使用了此选项,specify 中的$setup()检测失败,似乎把specparam 设置的变量改为0 了
34 -notimingcheck 忽略仿真中的时序检查,会忽略specify 语句中的检查,小心使用,有些模拟如flash 的时序检查是通过specify 语句来实现,如果使用了,则无法check时序Specify 里面的内容不起作用,相当于0 延时和不做时序检查
35 +maxdelays 选择sdf 文件中的max 延迟信息
36 +overlap SDF 反标后的精确时序检查
37 +sdfverbose 打印出详细的SDF 反标信息,超过10 个warning \error,
38 –negdelay 允许sdf 文件中iopath 和interconnect 的负延时反标,Pr 后仿需要加上此选项,很多工艺库的holdtime 为负值
39 -cm line+tgl+cond+fsm 指定覆盖率类型
40 -cm_dir directory_path (default: simv.cm 指定覆盖率文件名字和路径
41 -cm_hier vcm.cfg (+tree tb_top dut) 保存模块的层次信息
42 -cm_name test_name 定义覆盖率报告文件名
43 –cm_log 指定覆盖率log 文件名
44 -assert 定义支持断言
45 +delay_mode_path 模块的延时使用路径延时
46 +delay_mode_distributed 模块的延时使用分布延时,对于分布延时,只要脉冲宽度小直接过滤掉(针对惯性延时)
47 +delay_mode_unit 模块的延时使用所有时间精度中的最小值,specify 中的延迟不起作用,#后的所有数字变为1,单位使用最小精度,所有timescale 中的最小精度用于Tmax 产生的atpg 验证平台不带时序仿真Enables simulation of TetraMAX’s testbench in zero delay mode
48 +delay_mode_zero 模块的延时使用0 延时,不指定延时模式时,vcs 使用路径延时和分布延时中的最大值
49 +loopreport 高版本vcs 会报loop
50 +race 自动产生race.out 文件,列出竞争
51 +cli+1,2,3 使用ucli 模式,一般为3,默认模式
52 -ucli 仿真时,进入ucli 交互模式
一、VCS常用的編譯選項
編號
选项
说明
1
-assert dumpoff | enable_diag | filter_past
定义SystemVerilog断言(SVA)
dumpoff:禁止将SVA信息DUMP到VPD中
enable_diag:使能SVA结果报告由运行选项进一步控制
filter_past:忽略$past中的子序列
2
-cm <options>
指定覆盖率的类型,包括:line(行覆盖)、cond(条件覆盖)、fsm(状态机覆盖)、tgl(翻转率覆盖)、path(路径覆盖)、branch(分支覆盖)和assert(断言覆盖)。
如果包括两种或以上的覆盖率类型,可用“+”,如-cm line+cond+fsm+tgl
3
-cm_assert_hier <filename>
将SVA覆盖率统计限定在文件列表中指定的module层次。
4
-cm_cond <arguments>
进一步细化条件覆盖率的统计方式,包括:basic,std,full,allops,event,anywidth,for,tf,sop等选项。
5
-cm_count
在统计是否覆盖的基础上,进一步统计覆盖的次数
6
-cm_dir <directory_path_name>
指定覆盖率统计结果的存放路径,默认是simv.cm
7
-cm_hier <filename>
指定覆盖率统计的范围,范围在文件中定义,可以指定module名、层次名和源文件等。
8
-cm_log <filename>
指定仿真过程中记录覆盖率的log文件名
9
-cm_name <filename>
指定保存覆盖率结果的文本文件的名称
10
-cm obc
使能可观察(observed)覆盖率的编译。传统的覆盖率跟功能的正确性毫无关联,可观察覆盖率通过设置观察点,一定程度上将代码行覆盖率与功能正确性关联起来。
11
-comp64
在64-bit模式下对设计进行编译,并生成32-bit格式的可执行文件用于32-bit模式仿真
12
-debug 或 -debug_all
使能UCLI命令行
13
-e <new_name_for_main>
指定PLI应用时main()程序的名称
14
-f <filename>
指定文件列表的文件名,文件中可包括源代码文件的路径和名称,也可以包括编译选项参数
15
-file filename
类似于-f,但文件内容更灵活,可以包含PLI选项和对象文件,可以使用转义字符等
16
-full64
在64-bit模式下编译,生成64-bit模式仿真的可执行文件
17
-h or -help
列举常用的编译选项和运行选项的参数
18
-I
交互模式的编译,让VCS自动包括+cli,-P virsims.tab选项,并支持VirSim后处理模式下生成VCD+文件。
19
-ID
显示及其的hostid或dongle ID
20
-ignore <keyword_argument>
屏蔽SV中unique/priority型的if或case语句的告警信息,参数包括:unique_checks、priority_checks、all。
21
-j<number_of_processes>
设定并行编译的进程数,“j”后面没有空格
22
-l <filename>
指定记录VCS编译和运行信息的log文件名
23
-line
使能VriSim中的单步运行
24
-lmc-swift
使能LMC SWIFT接口
25
-Mdir=<directory>
指定一个目录让VCS存储编译产生的文件,默认是csrc
26
-Mlib=<directory>
指定一个目录让VCS搜索某个模块是否需要重新编译。
与-Mdir配合,可以实现不同模块的增量编译。
27
-Mmakeprogram=<program>
指定用于make对象的程序,默认是make
28
-Mupdate[=0]
默认情况下,VCS编译时会覆盖上次编译生成的makefile。如果想保留上次的makefile,使用-Mupdate=0;如果不带=0,则进行增量编译,并覆盖上次的makefile。
29
-noIncrComp
关闭增量编译
30
-notice
显示详细的诊断信息
31
-ntb
使能ntb(Native TestBench),支持OpenVera验证平台语言结构。
32
-o <name>
指定编译生成的可执行文件的名称,默认是simv
33
-timescale=<time_unit>/<time_precision>
源代码文件中有的包括`timescale编译指令,有的不包括,如果在VCS命令行中,不包括`timescale的源代码文件在最前面,VCS会停止编译。使用-timescale选项为这些在前面且又没有`timescale的源文件指定timescale
34
-override_timescale=<time_unit>/<time_precision>
让源文件统一使用指定的timescale
35
-P <pli.tab>
指定PLI表文件
36
-pvalues+<parameter_name>=<value>
改变指定参数的值
37
-parameters <filename>
通过文件的方式改变参数的值,参数的路径和改变的值均在文件中定义
38
-q
安静模式,屏蔽VCS的编译信息
39
-R
在编译之后立即执行产生的可执行文件
40
-s
刚开始仿真时即停止,一般与-R和+cli配合使用
41
-V
使能verbose模式
42
-v <filename>
指定verilog库文件
43
-y <dir_pathname>
指定verilog库路径
44
+libext+<extension>
让VCS在verilog库路径下搜索指定的扩展名文件,与-y配合
45
-vera
指定标准的Vera PLI表文件和对象库
46
+acc+1|2|3|4
使能PLI中的ACC(PLI 1.0的一种方式)
47
+cli+[<module_name>=]1|2|3|4
使能CLI调试功能
48
+autoprotect[<file_suffix>]
生成一个加密的源文件
49
+protect[<file_suffix>]
生成一个加密的源文件,只加密`protect/`endprotect部分
50
+putprotect+<target_dir>
指定加密文件存放的目录
51
+csdf+precompile
在VCS编译源代码时预先SDF文件
52
+define+<macro_name>=<value>
定义一个文本宏,与源文件中的`ifdef配合
53
+error+<n>
将编译时运行的NTB错误增加到N
54
+incdir+<directory>
指定VCS搜索`include指令使用的包含文件的目录,可以用“+”定义多个目录。
55
+maxdelays
使用SDF文件中的max值
56
+mindelays
使用SDF文件中的min值
57
+typdelays
使用SDF文件中的typ值
58
+nbaopt
删除非阻塞赋值语句中的延时
59
+neg_tchk
使能时序检查中的负延时
60
+nospecify
屏蔽specify块中的路径延时和时序检查
61
+notimingcheck
屏蔽specify块中的时序检查
62
+nowarnTFMPC
屏蔽编译时的“Too few module port connections”告警信息
63
+no_notifier
屏蔽一些时序检查系统任务中定义的notifier寄存器的翻转(toggling),但不影响时序violation的报告
64
+no_tchk_msg
屏蔽时序检查的告警信息,但不关闭时序检查时notifier寄存器的翻转(toggling)
65
+optconfigfile+<filename>
指定Radiant技术和二态仿真用到的配置文件名
66
+prof
让VCS在仿真过程中生成一个vcs.prof文件,记录设计中最耗CPU时间的module、层次和verilog结构
67
+race
让VCS在仿真过程中生成一个race.out文件,记录设计中所有的竞争冒险
68
+radincr
增量编译时使能Radiant技术
69
+sdf_nocheck_celltype
SDF反标时不检查SDF文件中的CELLTYPE的一致性
70
+sdfverbose
显示SDF反标时的详细告警和错误信息
71
+v2k
支持Verilog-2001标准
72
+vc[+abstract][+allhdrs][+list]
使用DirectC接口时,使能verilog直接调用C/C++函数
73
+vcs+flush+log
加速编译仿真时log文件缓存的刷新频率
74
+vcs+flush+all
+vcs+flush+log,+vcs+flush+dump和+vcs+flush+fopen的集合
75
+vcs+initmem+0|1|x|z
初始化设计中所有存储器的值
76
+vcs+initreg+0|1|x|z
初始化设计中所有寄存器的值
77
+vcs+lic+wait
一直等待license
78
+vpi
使能VPI
79
+warn=[no]ID|none|all,...
使能或关闭告警信息
二、VCS常用的运行选项
編號
选项
说明
1
-a <filename>
将仿真显示的log信息附件在指定文件尾部
2
-E <program>
执行指定的程序用来显示生成simv可执行文件时VCS使用的编译选项
3
-i <filename>
指定一个VCS执行仿真时包含CLI命令的文件,一般与-ucli配合
4
-k <filename> | off
指定一个文件,用来记录VCS仿真过程中的CLI和VirSim交互命令,默认是vcs.key,off选项是关闭记录。
5
-sverilog
支持SystemVerilog
6
-ucli
使能UCLI命令
7
-vcd <filename>
指定VCD波形文件名,默认是verilog.dump,会被源代码文件中的$dumpfile覆盖
8
+vcs+learn+pli
追踪当前仿真的ACC选项,记录在pli_learn.tab文件中,下次仿真时可以用+applylearn来重新编译。
9
+vcs+nostdout
关闭所有$monitor和$display的文本输出,但依然会记录在-l的log文件中。
10
+vera_load=<filename.vro>
定义Vera对象文件
11
+vera_mload=<filename>
定义一个包括多个Vera对象文件的文本文件
三、VCS调试模式常用选项
編號
选项
说明
1
-RI
编译完成之后马上启动VirSim,进入交互模式
2
-RIG
不编译,启动VirSim使用已有的可执行文件,进入交互调试模式。
3
+sim+<simv_name>
指定使用的可执行文件名,与-RIG配合
4
-RPP
运行后处理(Post-Processing)模式:启动VirSim,使用VCD+文件
5
-PP
支持在源代码文件中调用$vcdpluson生成VPD文件
6
+cfgfile+<filename>
定义一个VCS使用的已建好的场景配置文件
7
+vslogfile[+<filename>]
保存一个VirSim命令的log文件,默认是VirSim.log
————————————————
版权声明:本文为CSDN博主「gsithxy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gsjthxy/article/details/104660557
本文来自博客园,作者:{e_shannon},转载请注明原文链接:https://www.cnblogs.com/e-shannon/p/16275364.html