# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
# Makefile option groups that can be enabled by test Makefile / command line.
# These are generic set of option groups that apply to all testbenches.
# Simulator too specific options
# Mandatory items to set (these are used by rules.mk):
# SIMCC       - Simulator compiler used to build / elaborate the bench
# SIMX        - Simulator executable used to run the tests

SIMCC       := xrun -elaborate
SIMX        ?= xrun
SIM_SETUP   ?= ${MAKE_ROOT}/xcelium/xcelium.tcl

# max number of errors before the run is stopped
ERROR_MAX   := 50
# set standard build options
BUILD_OPTS  += -l ${BUILD_LOG}
BUILD_OPTS  += -access +r
BUILD_OPTS  += -messages
BUILD_OPTS  += -errormax ${ERROR_MAX}
BUILD_OPTS  += -sv
BUILD_OPTS  += -timescale 1ns/1ps
BUILD_OPTS  += -uvmhome ${UVM_HOME}
BUILD_OPTS  += -xmlibdirname ${SV_FLIST_GEN_DIR}/xcelium.d
BUILD_OPTS  += -f ${SV_FLIST}
BUILD_OPTS  += -64bit
BUILD_OPTS  += -xprop F # -xverbose  << add to see which modules does not have xprop enabled


# set standard run options
RUN_OPTS    += -input ${SIM_SETUP}
RUN_OPTS    += +SVSEED=${SEED}
RUN_OPTS    += +UVM_VERBOSITY=${UVM_VERBOSITY}
RUN_OPTS    += +UVM_TESTNAME=${UVM_TEST}
RUN_OPTS    += +UVM_TEST_SEQ=${UVM_TEST_SEQ}
RUN_OPTS    += -l ${RUN_LOG}
RUN_OPTS    += -xmlibdirname ${SV_FLIST_GEN_DIR}/xcelium.d -R
RUN_OPTS    += -64bit


#########################
## Tool Specific Modes ##
#########################
# Enable simulation profiling
XCELIUM_SIMPROFILE ?= 0
ifeq (${XCELIUM_SIMPROFILE},1)
endif

# Enable coverage
XCELIUM_COV ?= 0
ifeq (${XCELIUM_COV},1)
endif
