Files
2026-03-06 16:22:17 +08:00

228 lines
8.2 KiB
Tcl

#quit -sim
#ATTTION : MODIFY THIS FILE AS YOU WANT
#ATTTION : MODIFY THIS FILE AS YOU WANT
#ATTTION : MODIFY THIS FILE AS YOU WANT
#ATTTION : MODIFY THIS FILE AS YOU WANT
#ATTTION : MODIFY THIS FILE AS YOU WANT
#unbound the the "work" lib dir from vsim,to remove it
#when error do not save wave list
if {![string compare [runStatus] "ready" ] || ![string compare [runStatus] "break" ]} {
source savewave.tcl
}
#catch {q -sim} res
#dataset close -all
echo on
.main clear
puts "+++++++++++++++++++++++++++++++++++++++$CASE_NAME start+++++++++++++++++++++++++++++++++++++++"
vmap std $SIM_TOOL_PATH/std ;
vmap ieee $SIM_TOOL_PATH/ieee ;
set FUNC_SOURCE_DIR ../../../01_source/01_func
set TIMING_SOURCE_DIR ../../../01_source/02_timing
set source_vhdl false
set source_verilog false
set LIB_OPTION ""
set LOG_OPTION ""
#if {[string match -nocase {libero*} $FPGA_KIT_VER]} {
# #-----------actel----------
# #puts "IDE IS $FPGA_KIT_VER!"
# foreach file [glob -nocomplain -directory $FUNC_SOURCE_DIR *.vhd] {
# set LOG_OPTION "-vhdlvariablelogging"
# }
# if {[string equal -nocase vhd $TOP_FILE_LANG]} {
# vmap ${ACTEL_FAMILY} $VHDL_LIB/${ACTEL_FAMILY};
# } else {
# vmap ${ACTEL_FAMILY} $VLOG_LIB/${ACTEL_FAMILY};
# }
# set LIB_OPTION "-L ${ACTEL_FAMILY}"
#
#} elseif {[string match -nocase {ise*} $FPGA_KIT_VER]} {
# #puts "IDE IS $FPGA_KIT_VER!"
# foreach file [glob -nocomplain -directory $FUNC_SOURCE_DIR *.vhd] {
# set source_vhdl true
# set LOG_OPTION "-vhdlvariablelogging"
# }
# foreach file [glob -nocomplain -directory $FUNC_SOURCE_DIR *.v] {
# set source_verilog true
# }
# if { [string equal -nocase true $source_vhdl] } {
# #-----------xilinx vhdl----------
# #puts "vhdl file exist!"
# vmap simprim $VHDL_LIB/simprim
# vmap unisim $VHDL_LIB/unisim
# vmap xilinxcorelib $VHDL_LIB/xilinxcorelib
# vmap unimacro $VHDL_LIB/unimacro
# set LIB_OPTION "-L simprim -L unisim -L xilinxcorelib -L unimacro"
# }
#
# if { [string equal -nocase true $source_verilog] } {
# #-----------xilinx verilog----------
# #puts "verilog file exist!"
# vmap unisims_ver $VLOG_LIB/unisims_ver
# vmap simprims_ver $VLOG_LIB/simprims_ver
# vmap xilinxcorelib_ver $VLOG_LIB/xilinxcorelib_ver
# vmap unimacro_ver $VLOG_LIB/unimacro_ver
# vmap secureip $VLOG_LIB/secureip
# set LIB_OPTION "-L unisims_ver -L simprims_ver -L xilinxcorelib_ver -L unimacro_ver -L secureip"
# }
#}
set defs [dict create;] ;
dict append defs CASE_NAME $CASE_NAME;
dict append defs TOP_ENTITY $TOP_ENTITY;
dict append defs TOP_INSTANCE $TOP_INSTANCE;
dict append defs timing;
dict append defs SIM_TIME $SIM_TIME ;
set def_string "";
dict for {def_name def_value} $defs {
set def_string [format "%s+define+%s=%s" $def_string $def_name $def_value;];
}
puts "the define string is:$def_string"
#file delete -force work ;
vlib $WORK_LIB_DIR/${CASE_DIR};
vmap work $WORK_LIB_DIR/${CASE_DIR};
catch { file delete -force $WORK_LIB_DIR/${CASE_DIR}/_lock } res;
catch {file delete -force $WORK_LIB_DIR/${CASE_DIR}/ } res;
#if {![info exists SIM_TYPE]} {set SIM_TYPE func}
#if {![info exists CORNER_TYPE]} {set CORNER_TYPE 03_max}
#if {[info exists 1]} {
# set SIM_TIME $1
#} elseif {![info exists SIM_TIME]} {set SIM_TIME -all}
#by default,all cases use the same source file list
set VLOG_SOURCE_LIST ../file_ver.f;
set VHDL_SOURCE_LIST ../file_vhd.f;
#we specify individual file list for single case
if {[file exists file_ver.f ]} {
puts "---->using case dependent verilog file list"
set VLOG_SOURCE_LIST file_ver.f;
}
if {[file exists file_vhd.f ]} {
puts "---->using case dependent vhdl file list"
set VHDL_SOURCE_LIST file_vhd.f;
}
if {![string equal vhd $TOP_FILE_LANG]} {
set GLBL glbl
}
if {$SIM_TYPE == "timing"} {
set SDF_TYPE "-sdfmax";
set SDFCOM_TYPE "-maxdelays";
puts "*************************timing simulation for CORNER_TYPE= $CORNER_TYPE*************************"
if {[string equal $CORNER_TYPE "01_min" ]} {
set SDF_TYPE "-sdfmin";
set SDFCOM_TYPE "-mindelays";
puts "++++++++++ set SDF_TYPE = -sdfmin ++++++++++";
} elseif {[string equal $CORNER_TYPE "02_type" ]} {
set SDF_TYPE "-sdftyp";
set SDFCOM_TYPE "-typdelays";
puts "++++++++++ set SDF_TYPE = -sdftyp ++++++++++";
} elseif {[string equal $CORNER_TYPE "03_max" ]} {
set SDF_TYPE "-sdfmax";
set SDFCOM_TYPE "-maxdelays";
puts "++++++++++ set SDF_TYPE = -sdfmax ++++++++++";
}
if {[string match -nocase "libero*" $FPGA_KIT_VER]} {
puts "++++++++++ develop kit is libero ++++++++++";
} else {
puts "++++++++++ develop kit is not libero ++++++++++";
set TIMING_SOURCE_DIR ${TIMING_SOURCE_DIR}/${CORNER_TYPE}
}
sdfcom $SDFCOM_TYPE $TIMING_SOURCE_DIR/${TOP_ENTITY}.sdf $TIMING_SOURCE_DIR/${TOP_ENTITY}.sdfcom
#in timing simulation ,here only glbl may be compiled seperately
if {[file exists ${VLOG_SOURCE_LIST}]} {
vlog -incr -quiet -sv +cover=${COVERAGE_OPTION} +incdir+../ -work work -f ${VLOG_SOURCE_LIST} $def_string
}
vlog -quiet +cover=${COVERAGE_OPTION} -work work ${TIMING_SOURCE_DIR}/*.v
vlog -quiet -sv +cover=${COVERAGE_OPTION} -work work tb.sv $def_string
eval vopt ${GLBL} ${CASE_NAME} +acc=npr ${LIB_OPTION} -o ${CASE_NAME}_opt \
+initmem+0 +initreg+0 +initwire+0;
eval vsim -batch -quiet ${LIB_OPTION} -t 100ps -wlfopt -wlfcompress -nostdout \
+no_notifier +no_tchk_msg\
work.${CASE_NAME}_opt -wlf ${WAVE_OUTPUT_DIR}/${CASE_NAME}_timing.wlf +notimingchecks \
${SDF_TYPE} ${CASE_NAME}/${TOP_INSTANCE}=${TIMING_SOURCE_DIR}/${TOP_ENTITY}.sdfcom;
do ../suppresswarning.tcl
catch {run ${SIM_TIME} } res
} else {
#compile source files
if {[file exists ${VLOG_SOURCE_LIST}]} {
puts "---->compile verilog source files ,testbench and models using $VLOG_SOURCE_LIST........"
# vlog -incr -quiet +cover=${COVERAGE_OPTION} +incdir+../ -work work -f ${VLOG_SOURCE_LIST} $def_string -suppress 12003
vlog -sv -vmake -quiet +cover=${COVERAGE_OPTION} +incdir+../ -work work -f ${VLOG_SOURCE_LIST} $def_string -suppress 12003
}
if {[file exists ${VHDL_SOURCE_LIST}]} {
puts "---->compile vhdl files using $VHDL_SOURCE_LIST........"
vcom -vmake -nocoverudp -2008 -explicit -quiet +cover=${COVERAGE_OPTION} -work work -f ${VHDL_SOURCE_LIST}
}
# eval vopt ${GLBL} ${CASE_NAME} +acc -o ${CASE_NAME}_opt ${LIB_OPTION} \
# +cover=bcsf+/${CASE_NAME}/${TOP_INSTANCE} -nocoverudp -nocovercells \
# +initmem+0 +initreg+0 +initwire+0 \
# -suppress 2912 \
# -suppress 1127
#to mask 211 error
catch {
if { [string compare [runStatus] "ready" ] && [string compare [runStatus] "break" ]} {
eval vsim ${LOG_OPTION} -batch -quiet -coverage -voptargs="+acc=npr" ${LIB_OPTION} \
-t 1ps -wlfopt -wlfcompress -nostdout \
+initmem+0 +initreg+0 +initwire+0 \
+no_notifier +no_tchk_msg -suppress 3009 -suppress 12110 \
-classdebug \
glbl work.${CASE_NAME} \
-wlf ${WAVE_OUTPUT_DIR}/${CASE_DIR}_timeing.wlf
} else {
restart -f
}
} res;
do ../suppresswarning.tcl
catch {do wave.tcl} res
set TEMP_REF_FILES info.txt;
write report -l $TEMP_REF_FILES
catch {run ${SIM_TIME} } res
do ../saveucdb.tcl
#}
set current_path [pwd]
puts "+++++++++++++++++++++++++++current path=$current_path++++++++++++++++++++++++++++++++"