blob: 44aa59f18890f4baa57eee8a4a318311ff732e5f [file] [log] [blame]
# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Makefile for Kelvin UVM Testbench (Integrates with MPACT-Sim)
# Check if ROOTDIR is set. If not, exit with an error.
ifndef ROOTDIR
$(error ROOTDIR is not set. Please define it, e.g., export ROOTDIR=$(abspath ../../../..))
endif
# User Configuration
VCS = vcs
CXX = clang++
# UVM DV Directories
RTL_DIR = ./rtl
COMMON_DIR = ./common
TB_DIR = ./tb
ENV_DIR = ./env
TESTS_DIR = ./tests
BIN_DIR = ./bin
# Simulation Work Directory
SIM_DIR = ./sim_work
LOG_DIR = $(SIM_DIR)/logs
WAVE_DIR = $(SIM_DIR)/waves
# MPACT-Sim Integration Paths
MPACT_DIR = $(ROOTDIR)/sim/kelvin
MPACT_BAZEL_BIN_DIR = $(MPACT_DIR)/bazel-bin/sim/cosim
MPACT_COSIM_LIB_NAME = kelvin_cosim_lib_static
# File List for VCS -f option
FILE_LIST = ./kelvin_dv.f
# Simulation Settings
SIM_EXEC = $(SIM_DIR)/simv
UVM_TESTNAME ?= kelvin_base_test
TEST_BINARY ?= $(BIN_DIR)/program.bin
UVM_VERBOSITY ?= UVM_MEDIUM
TEST_TIMEOUT_NS ?= 20000
PLUSARGS = +UVM_TESTNAME=$(UVM_TESTNAME) +TEST_BINARY=$(TEST_BINARY) \
+UVM_VERBOSITY=$(UVM_VERBOSITY) +TEST_TIMEOUT=$(TEST_TIMEOUT_NS)
# Waveform Dumping
DUMP_WAVES = 1
WAVE_FILE = $(WAVE_DIR)/$(UVM_TESTNAME).fsdb
# VCS Options
VCS_COMPILE_OPTS = \
-full64 \
-sverilog \
+define+UVM_NO_DEPRECATED \
-ntb_opts uvm-1.2 \
-debug_access+all \
-kdb \
-timescale=1ns/1ps \
-o $(SIM_EXEC)
# Add C++ compiler/linker options for MPACT-Sim
VCS_COMPILE_OPTS += \
-cpp $(CXX) \
-cppflags "-std=c++17" \
-CFLAGS "-I$(MPACT_DIR)" \
-L$(MPACT_BAZEL_BIN_DIR) \
-l$(MPACT_COSIM_LIB_NAME)
VCS_RUN_OPTS = \
$(PLUSARGS)
# Add define to COMPILE options for waveform dumping
ifeq ($(DUMP_WAVES),1)
VCS_COMPILE_OPTS += +define+DUMP_WAVES
VCS_RUN_OPTS += +fsdb+all \
+fsdbfile+$(WAVE_FILE)
endif
# Targets
.PHONY: all compile run clean dirs help build_mpact_lib
# Default target
all: run
# Create necessary directories
dirs:
@mkdir -p $(SIM_DIR) $(LOG_DIR) $(WAVE_DIR) $(BIN_DIR)
# Build the MPACT-Sim library using Bazel with CC=clang
build_mpact_lib:
@echo "--- Building MPACT-Sim Co-sim Library via Bazel ---"
cd $(MPACT_DIR) && CC=clang bazel build //sim/cosim:$(MPACT_COSIM_LIB_NAME)
# Compile the design
compile: dirs build_mpact_lib
@echo "--- Compiling with VCS ---"
$(VCS) $(VCS_COMPILE_OPTS) -l $(LOG_DIR)/compile.log -f $(FILE_LIST)
@echo "--- Compilation Finished ---"
# Run the simulation
run: compile
@echo "--- Running Simulation ---"
@echo "Test: $(UVM_TESTNAME)"
@echo "Binary: $(TEST_BINARY)"
@echo "Verbosity: $(UVM_VERBOSITY)"
@echo "Timeout: $(TEST_TIMEOUT_NS) ns"
@echo "Plusargs: $(PLUSARGS)"
@echo "Log File: $(LOG_DIR)/$(UVM_TESTNAME).log"
ifeq ($(DUMP_WAVES),1)
@echo "Wave File: $(WAVE_FILE)"
endif
./$(SIM_EXEC) $(VCS_RUN_OPTS) -l $(LOG_DIR)/$(UVM_TESTNAME).log
@echo "--- Simulation Finished ---"
# Clean up simulation files
clean:
@echo "--- Cleaning Simulation Files ---"
rm -rf $(SIM_DIR) simv* csrc* *.log* *.key *.vpd *.fsdb ucli.key DVEfiles/ verdiLog/ novas.*
@echo "--- Cleaning MPACT-Sim Bazel cache ---"
cd $(MPACT_DIR) && bazel clean
# Help
help:
@echo "Makefile Targets:"
@echo " make compile : Builds MPACT lib and compiles DUT/testbench"
@echo " make run : Builds and runs the full co-simulation"
@echo " : Override defaults: make run UVM_TESTNAME=<test> TEST_BINARY=<path> UVM_VERBOSITY=<level>"
@echo " make build_mpact_lib : Only builds the MPACT-Sim C++ library"
@echo " make clean : Removes generated simulation and MPACT-Sim files"
@echo " make dirs : Creates simulation directories"
@echo " make help : Shows this help message"