| # 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" |