儿童节快乐
今天,整理了一下VCS编译和仿真常用的选项,需要的转走。
VCS的仿真选项分编译(compile-time)选项和运行(run-time)选项。常用编译选项
选项 | 说明 |
-debug_pp | 产生vdp文件,enable DVE 后处理 |
-debug | 相对-debug_pp,使能UCLI命令行 |
-debug_all | 相对-debug,多了单步调试功能 |
-f | 指定文件列表的文件名,文件中可包括源代码文件的路径和名称,也可以包括编译选项参数 |
-sverilog | 支持SystemVerilog语法 |
-l | 指定记录VCS编译和运行信息的log文件名 |
+define+= | 定义一个文本宏,与源文件中的`ifdef配合。如果value是字符串,需要用双引号括起来 |
+incdir+ | 指定VCS搜索`include指令使用的包含文件的目录,可以用“+”定义多个目录。 |
-fsdb | Dump fsdb格式波形文件,通过$fsdbDumpfile()来设置fsdb文件的名称。 |
+v2k | 支持Verilog-2001标准 |
-timescale=/ | 源代码文件中有的包括`timescale编译指令,有的不包括,如果在VCS命令行中,不包括`timescale的源代码文件在最前面,VCS会停止编译。使用-timescale选项为这些在前面且又没有`timescale的源文件指定timescale |
-override_timescale= / | 让源文件统一使用指定的timescale |
-o | 指定编译生成的可执行文件的名称,默认是simv |
-R | 在编译之后立即执行产生的可执行文件 |
-y | 指定verilog库路径 |
+libext+ | 让VCS在verilog库路径下搜索指定的扩展名文件,与-y配合 |
-v | 指定verilog库文件名(如果不使用-y指定库路径,这里需要给出相对路径) |
-sdf max/min:dut_top_name: | 后仿,在编译中反标SDF文件,只是编译选项。其中,max和min表示最差和最优的延时文件,对应worst和best这两种Corner。 |
+sdfverbose | 显示SDF反标时的详细告警和错误信息 |
+sdf_nocheck_celltype | SDF反标时不检查SDF文件中的CELLTYPE的一致性 |
-pvalue +parameter_hierarchical_name=value | 改变设计中的参数值,例如: vcs -pvalue+test.d1.paraml=32 |
-parameters filename | 通过文件的方式改变参数的值,参数的路径和改变的值均在文件中定义 |
-notice | 给出详细的编译信息 |
-q | 不在终端输出编译时的信息 |
-gui | 在仿真时,使用dve调试。 |
+vcs+flush+log | 加速编译仿真时log文件缓存的刷新频率 |
+vcs+flush+all | +vcs+flush+log,+vcs+flush+dump和+vcs+flush+fopen的集合 |
-full64 | 在64-bit模式下编译,生成64-bit模式仿真的可执行文件 |
-ntb | 使能ntb(Native TestBench),支持OpenVera验证平台语言结构。 |
VCS -- 脉冲控制 | |
+transport_path_delays +pulse_e/num1+pulse_r/num2 +transport_int_delays +pulse_e/num1 +pulse_r/num2 VCS默认的路径延迟(module path delay)、sdf文件反标的互联延迟(interconnect delay)为惯性延迟;原语门、开关、连续赋值语句和MIPD(module input port delay)的延迟则只能是惯性延迟。上述两个选项开启了传输延迟模式,后面的两个选项是必须的:num1和num2都是延时的百分比,小于num2的脉冲会被过滤掉(filter out),大于num2但小于num1的脉冲会被x值代替。如果想要实现真正的传输延迟,将num1和num2设置为0即可。 | |
+pulse_e/num1 +pulse_r/num2 +pulse_int_e/num1 +pulse_int_r/num2 窄脉冲的尾沿安排的时间会取消起始沿安排的时间,若想使sdf反标的网线不适用原语、连续赋值、MIPD的惯性延迟模型,要加上+multisource_int_delays选项,否则使用MIPD的惯性延迟模型。对于惯性延迟,num1=0和num2=0并不表示传输延迟,而是指小于延时的脉冲宽度都被忽略。这两个选项对分布延迟不起作用。 | |
+pulse_on_detect | 探测到脉冲宽度小于延时,立即在对应时刻给出x,该选项对分布延迟不起作用。 |
+no_pulse_msg | 当脉冲宽度小于延时的时候,不给出信息 |
+pulse_on_event | 对上升、下降延时不同的情况,给出x |
VCS -- 延时说明 不指定延时模式时,VCS使用路径延时和分布延时中的最大值。 | |
+delay_mode_path | 模块的延时适用路径延时 |
+delay_mode_distributed | 模块的延时使用分布延时,对分布延时,只要脉冲宽度小于#后面的数字,直接滤掉(针对惯性延时) |
+delay_mode_unit | 模块的延时使用所有的时间精度中的最小值,specify中的延迟不起作用,#后面的所有数字变为1,单位使用最小精度。 |
+delay_mode_zero | 模块的延时使用0延时 |
涉及vmm验证环境的编译和仿真选项
-ntb_opts rvm | 实现验证环境时,使用RVM(Reference Verification Methology)。该选项仅仅是包含vmm的库文件(vmm.sv),在采用VMM验证方法学搭建TestBench时,需要加该选项。 |
+vmm_opts+var_name=value | 编译时,通过选项传入vmm_opts::get(“var_name”,defaule_value)所获取的值。功能与vmm_opts::set_int/string/bit(“var_name”,value)类似 |
+define+VMM+LOG_FORMAT_FILE_LINE | 编译时,显示消息的文件,行信息 |
+vmm_test= | 在使用vmm_test类创建不同tc时,通过vmm_test指定仿真tc的名称 |
+vmm_force_verbosity=DEBUG/NOTE | 指定仿真时,显示消息严重性值小于设定值得消息 |
+vmm_log_default= | 控制仿真时,显示消息严重性值小于设定值得消息,功能与选项+vmm_force_verbosity类似 |
涉及覆盖率选项
选项 | 说明 |
-cm | 指定覆盖率的类型,包括:line(行覆盖)、cond(条件覆盖)、fsm(状态机覆盖)、tgl(翻转率覆盖)、path(路径覆盖)、branch(分支覆盖)和assert(断言覆盖)。 如果包括两种或以上的覆盖率类型,可用“+”,如-cm line+cond+fsm+tgl |
-cm_dir | 指定覆盖率统计结果的存放路径,默认是simv.cm |
-cm_log | 指定仿真过程中记录覆盖率的log文件名 |
-cm_name | 指定保存覆盖率结果的文本文件的名称 |
-cm_hier | 指定覆盖率统计的范围,范围在文件中定义,可以指定module名、层次名和源文件等。 |
-cm_cond | 进一步细化条件覆盖率的统计方式,包括:basic, std, full, allops, event, anywidth, for, tf, sop等选项。 |
-cm_count | 在统计是否覆盖的基础上,进一步统计覆盖的次数 |
-cm_name | 指定保存覆盖率结果的文本文件的名称 |
涉及仿真选项
选项 | 说明 |
-l sim.log | 生产仿真日志文件,名称为sim.log |
-sverilog | 支持sv语法 |
-gui | 启动dve |
+ntb_random_seed_automatic | 不指定随机化种子,自动随机 |
+ntb_random_seed=value | 指定随机化种子 |
…/project_sim
----|tests 所有test case的存放目录
----|run_dir 所有testcase的运行目录
----|urg_data 每个tc运行之后覆盖率*vdb文件存放目录
----|cov_report 最终覆盖率报告文件
----|其他目录或者文件是 Testbench所需要的目录结构
default: check mov run: com sim ###### Global Var---MODE and SPEED select ###### USB_MODE = HOST_MODE USB_SPEED = HIGH_SPEED TC_NAME = tc_basic ######COMMON ###### TC_NAME_SUF = $(USB_MODE)_$(USB_SPEED)_$(shell date +”%m_%d_%H_%M”) VCS = vcs -sverilog +v2k+pulse_r/0 + pulse_e/0 + transport_path_delays INC = +incdir + ./dir_1+./dir_2+… RTL = if/usb_if.sv -f rtl.lst COM_OPT = -sverilog -ntb_opts rvm -l com.log -fsdb -lca \ -timescale = 1ns/1ps \ +lint=TFIPC-L +lint=PCWM RUN_OPT = +ntb_random_seed_automatic - l sim.log \ +vmm_force_verbosity=DEBUG DEF = +define+HOST_MODE+HIGH_SPEED+USB_ADDR=10 ###### COVERAGE ###### COV_OPT = -cm line+cond+tgl+assert+path #产生覆盖率vdb文件的名称 COV_OPT += -cm_dir ./urg_data/$(TC_NAME)_$(TC_NAME_SUF) COV_DATA_DIR = ./urg_data/*.vdb #覆盖率报告存放目录 COV_REP_DIR = ./cov_report ###### VCS ###### com: $(VCS) $(INC) $(COM_OPT) $(COV_OPT) $(DEF) $(RTL) test/test.sv sim: ./simv $(RUN_OPT) $(DEF) $(COV_OPT) ###### clean ###### clean: @rm -rf *.log csrc* *.db ###### wave -- verdi ###### verdi: verdi -2001 -ntb_opts vmm -sv (RTL) -ssf ./xx.fsdb & ###### Coverage ###### cov: urg -dir $(COV_DATA_DIR) -report $(COV_REP_DIR) -format both cov_view: firefox ./cov_report/dashboard.html & #######Check the var in Makefile### check: ifneq ($(USB_MODE),HOST_MODE) ifneq ($(USB_MODE),DEVICE_MODE) $(error “The USB_MODE=$(USB_MODE) is error, must be HOST_MODE or DEVICE_MODE”) else @echo “DEVICE_MODE” endif else @echo “HOST_MODE” endif ifneq ($(USB_SPEED),HIGH_SPEED) ifneq ($(USB_SPEED),FULL_SPEED) $(error “The USB_SPEED=$(USB_SPEED) is error, must be HIGH_SPEED or DEVICE_SPEED”) else @echo “FULL_SPEED” endif else @echo “HIGH_SPEED” endif ####### OTHERS ### TC_RUN_DIR=./run_dir/$(TC_NAME)/$(TC_NAME_SUF) mov: @rm -rf $(TC_DIR) @mkdir -p $(TC_DIR) @cp -rf dir_1 dir_2 if tb_top.v rtl.lst env Makefile tests $(TC_RUN_DIR) @sed -i ‘/default/d’ $( TC_RUN_DIR)/Makefile @sed -i ‘/OTHERS/, $$d’ $(TC_DIR)/Makfile @echo “Finish the pre-run work” @cd $(TC_RUN_DIR) && $(MAKE) |
使用说明:
编译: make com
仿真: make sim
编译之后,自动运行:make
生产覆盖率文件: make cov
查看覆盖率报告:make cov_view
Makefile中的ifneq主要是对全局变量的书写判断,仿真手误,在Makefile中,将全局变量设置错误。
mov后的代码是实现,每次运行tc,生产一个单独的目录,保留不同testcase的运行情况,以作后续分析。
end