do文件解释
questasim do文件解释
do文件
#开头的是comments;
DO文件实质上是Tcl脚本。可以包含很多Tcl结构,比如程序,条件运算符,数学和三角函数,正则表达式等等。
vsim的参数
- 参数“-novopt”禁止优化(no vopt),可能会因为vopt的缘故使得一些不重要signal被modelsim自动忽略,一般会保留该参数;
- -classdebug
- 参数“-c”表示进入命令行模式,如果没有该参数,则表示进行GUI模式。
- 参数“-L altera_ver”是添加仿真库,该处是直接使用逻辑库名称,也可以像后面一样使用物理库的名称及路径;若是库与源文件一起编译到work库中的,则不需要该参数;
- vlog -sv abc.v 按照sv进行编译;
- -l 小写L, 输出log文件 vsim -l sim.log
- -do “run 10us” 或者-do vsim.do
- -wlf保存仿真结果为一个WLF文件。调试时可在GUI查看仿真结果。
- 在系统提示符后输入vsim –view counter.wlf。
- +UVM_TESTNAME=my_case0
+UVM_NO_RELNOTES
+UVM_TIMEOUT=100000000
log /* -r //该命令可以让modelsim/Questa Sim在进行仿真中,对所有信号同步进行仿真,
从而解决新加入的观测信号没有仿真结果的问题;
在终端> 直接输入 vsim -c 会进入没有gui的questasim
if [file exists "work"] {vdel -all} #有work这个目录 则删除
vlib work #vlib work ---- 在工作目录下建立一个work目录
#vcom 编译vhd;如果是verilog 则使用vlog
vcom -f dut.f
vlog -f tb.f
vopt top -o top_optimized +acc +cover=sbfec+tinyalu(rtl).
vsim top_optimized -coverage +UVM_TESTNAME=random_test
set NoQuitOnFinish 1
onbreak {resume}
log /* -r //该命令可以让modelsim/Questa Sim在进行仿真中,对所有信号同步进行仿真,从而解决新加入的观测信号没有仿真结果的问题;
run -all
coverage exclude -src ../../tinyalu_dut/single_cycle_add_and_xor.vhd -line 49 -code s
coverage exclude -src ../../tinyalu_dut/single_cycle_add_and_xor.vhd -scope /top/DUT/add_and_xor -line 49 -code b
coverage save random_test.ucdb
vsim top_optimized -coverage +UVM_TESTNAME=add_test
set NoQuitOnFinish 1
onbreak {resume}
log /* -r
run -all
coverage exclude -src ../../tinyalu_dut/single_cycle_add_and_xor.vhd -line 49 -code s
coverage exclude -src ../../tinyalu_dut/single_cycle_add_and_xor.vhd -scope /top/DUT/add_and_xor -line 49 -code b
coverage save add_test.ucdb
vcover merge tinyalu.ucdb random_test.ucdb add_test.ucdb
vcover report tinyalu.ucdb -cvg -details
quit
#vcom 编译vhd;如果是verilog 则使用vlog
dut.f #设计的文件路径
tinyalu_dut/single_cycle_add_and_xor.vhd
tinyalu_dut/three_cycle_mult.vhd
tinyalu_dut/tinyalu.vhd
tb.f #仿真的文件路径
+incdir+ #意思是include dir 包含一个目录进来
tinyalu_pkg.sv
tinyalu_bfm.sv
top.sv
+incdir+tb_classes
wave.do
在wave窗口 ctrl+s
/home/userid/rst_uvc/rst_agent/wave.do
makefile:makefile其实就是shell一种
makefile其实就是shell;
makefile是另外一种形式替代do,这个可能更加方便;
只要编写一个文件名问Makefile,内容如下
在linux下边可以终端上测试看是否识别vsim命令
如果识别 , 直接 make 就可以运行; 加-c 不启动gui
#前边还可以加参数,参考下边图片
all: create_lib compile simulate #是后边三个命令的合成
create_lib: # 可以>make create_lib
vlib work
compile:
vlog -timescale "10ps/10ps" -l comp.log -sv ../test_pkg.sv param_pkg.sv rst_agent_pkg.sv dut.sv top_tb.sv
simulate:
vsim -l sim.log -c top_tb -novopt -do "run 10000ns" +UVM_TESTNAME=my_case0
#run -all
#+UVM_TESTNAME=my_case0
clean:
rm -rf work
rm *.log transcript vsim.* *.ucdb
makefile参数
使用下边方法可以动态传递参数到Makefile中
> make all verbosity=UVM_HIGH
Makefile例子a
> make all
> make clean
IFILES = consumer.sv producer.sv sequence_item.sv
FILES=env.sv
UVM_FLAGS=#+incdir+${UVM_HOME}/src ${UVM_HOME}/src/uvm_pkg.sv
VCS_FLAGS= -sverilog -ntb_opts uvm -timescale=1ns/1ns
all: simv
./simv -l xx.log
simv: ${FILES} ${IFILES}
vcs ${UVM_FLAGS} ${VCS_FLAGS} ${FILES}
clean:
@rm -rf simv* csr* *.log *.key core.* *.vpd *.vcd
Makefile例子b
TESTNAME ?= my_comp1
all: work tb sim
tb:
vlog -f filelist.f
sim:
vsim tb +UVM_TESTNAME=$(TESTNAME) -do "run -all;exit " -c -l $(TESTNAME).log -voptargs=+acc
clean:
rm -r work
rm *.log transcript vsim.* *.ucdb
filelist.f例子
例子c
例子d
Makefile中变量的定义和使用
TEST、N_ERRS、N_FATALS这三个变量在CHECK中被使用,
CHECK主要的目的是,在仿真结束后检查有没有UVM_ERROR和UVM_FATAL;
TEST = /usr/bin/test
N_ERRS = 0
N_FATALS = 0
vlog -timescale "10ps/10ps" -l comp.log -sv ../test_pkg.sv param_pkg.sv
CHECK = \
@$(TEST) \( `grep -c 'UVM_ERROR : $(N_ERRS)' test_pkg.log` -eq 1 \) -a \
\( `grep -c 'UVM_FATAL : $(N_FATALS)' test_pkg.log` -eq 1 \)
- 换行:行尾加
表示下一行和这一行是一个命令行,后面不能有注释、空格。
例子e
张强的例子
#!/bin/csh
source /cad/release/etc/cshrc.mentor
setenv QUESTA_HOME /cad/release/mentor/questasim/10.2/questasim
setenv UVM_HOME ~/uvm/uvm-1.1d
setenv WORK_HOME `pwd`
setenv SIM_TOOL QUESTA
set path = (/cad/release/mentor/questasim/10.2/questasim/bin ${WORK_HOME}/bin $path)
#setenv UVM_HOME /cad/release/mentor/questasim/10.2/questasim/verilog_src/uvm-1.1c
#setenv UVM_DPI_DIR /cad/release/mentor/questasim/10.2/questasim/uvm-1.1c/linux
setenv UVM_DPI_DIR $WORK_HOME/uvm_dpi
mkdir $UVM_DPI_DIR -p
g++ $UVM_HOME/src/dpi/uvm_dpi.cc -D QUESTA -I$UVM_HOME/src/dpi -I$QUESTA_HOME/include -shared -Bsymbolic -o $UVM_DPI_DIR/uvm_dpi.so
#!/bin/csh
if ( $SIM_TOOL == "QUESTA" ) then
vlib work
vlog -f filelist.f
vsim -novopt -sv_lib $UVM_DPI_DIR/uvm_dpi -do $WORK_HOME/bin/vsim.do -c top_tb +UVM_TESTNAME=$1
#vsim -novopt -sv_lib $UVM_DPI_DIR/uvm_dpi -do $WORK_HOME/bin/vsim.do -c top_tb +UVM_TESTNAME=my_case0 +UVM_OBJECTION_TRACE
#vsim -novopt -sv_lib $UVM_DPI_DIR/uvm_dpi -do $WORK_HOME/bin/vsim.do -c top_tb +UVM_TESTNAME=my_case0 +UVM_PHASE_TRACE
#vsim -novopt -sv_lib $UVM_DPI_DIR/uvm_dpi -do $WORK_HOME/bin/vsim.do -c top_tb +uvm_set_config_int="uvm_test_top.env.i_agt.drv,pre_num,'h8" +UVM_TESTNAME=my_case0
#vsim -novopt -sv_lib $UVM_DPI_DIR/uvm_dpi -do $WORK_HOME/bin/vsim.do -c top_tb +UVM_TESTNAME=my_case0 +UVM_CONFIG_DB_TRACE
endif
if ( $SIM_TOOL == "VCS" ) then
vcs +acc +vpi -sverilog $UVM_HOME/src/dpi/uvm_dpi.cc -CFLAGS -DVCS -timescale=1ns/1ps -f filelist.f
./simv +UVM_TESTNAME=$1
#./simv +UVM_TESTNAME=my_case0 +uvm_set_type_override="my_monitor,new_monitor"
#./simv +UVM_TESTNAME=my_case0 +uvm_set_inst_override="my_monitor,new_monitor,uvm_test_top.env.o_agt.mon"
#./simv +UVM_TESTNAME=my_case0 +UVM_TIMEOUT="300ns, YES"
#./simv +UVM_TESTNAME=my_case0 +UVM_VERBOSITY=UVM_DEBUG
endif
Makefile中@作用
- @echo不能被shell解析,shell也不存在命令回显;Makefile还是和shell有一些轻微差异
- @echo能被Makefile解析,@echo和echo都能正常执行命令;
- @vsim 则不会打印vsim这行命令到屏幕上; vsim则会打印 vsim xxxx 到屏幕上;
- ()是命令组合
@(cd ..;\ tar -zcf uvm_ac_config_db.tgz rtl sfr_agent tb sfr_test_pkg sim README.txt )
编译代码时,会进程接触makefile,会涉及到一些符号,由于不明白有些意思经常出现问题,在此归纳一下。
‘@’ 符号的使用
通常makefile会将其执行的命令行在执行前输出到屏幕上。如果将‘@’添加到命令行前,这个命令将不被make回显出来。
例如:@echo --compiling module----; // 屏幕输出 --compiling module----
echo --compiling module----; // 没有@ 屏幕输出echo --compiling module----