# SPDX-License-Identifier: Apache-2.0 # Copyright 2019 Western Digital Corporation or its affiliates. # # 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. # # Check for RV_ROOT ifeq (,$(wildcard ${RV_ROOT}/configs/swerv.config)) $(error env var RV_ROOT does not point to a valid dir! Exiting!) endif # Allow snapshot override ifeq ($(strip $(snapshot)),) snapshot = default endif # Allow tool override SWERV_CONFIG = ${RV_ROOT}/configs/swerv.config IRUN = irun VCS = vcs VERILATOR = verilator GCC_PREFIX = riscv64-unknown-elf # Define test name ifeq ($(strip $(ASM_TEST)),) ASM_TEST = hello_world2 endif # Define test name ifeq ($(strip $(ASM_TEST_DIR)),) ASM_TEST_DIR = ${RV_ROOT}/testbench/asm endif defines = ${RV_ROOT}/configs/snapshots/$(snapshot)/common_defines.vh ${RV_ROOT}/design/include/build.h ${RV_ROOT}/design/include/global.h ${RV_ROOT}/design/include/swerv_types.sv includes = -I${RV_ROOT}/design/include -I${RV_ROOT}/design/lib -I${RV_ROOT}/design/dmi -I${RV_ROOT}/configs/snapshots/$(snapshot) # CFLAGS for verilator generated Makefiles. Without -std=c++11 it complains for `auto` variables CFLAGS += "-std=c++11" # Optimization for better performance; alternative is nothing for slower runtime (faster compiles) # -O2 for faster runtime (slower compiles), or -O for balance. VERILATOR_MAKE_FLAGS = OPT_FAST="" # Targets all: clean verilator clean: rm -rf obj_dir *.hex build ${RV_ROOT}/configs/snapshots/$(snapshot) verilator: ${RV_ROOT}/configs/snapshots/$(snapshot)/common_defines.vh echo '`undef ASSERT_ON' >> ${RV_ROOT}/configs/snapshots/$(snapshot)/common_defines.vh $(VERILATOR) '-UASSERT_ON' --cc -CFLAGS ${CFLAGS} $(defines) $(includes) ${RV_ROOT}/configs/snapshots/$(snapshot)/common_defines.vh \ -f ${RV_ROOT}/testbench/flist.verilator --top-module swerv_wrapper $(MAKE) -C obj_dir/ -f Vswerv_wrapper.mk $(VERILATOR_MAKE_FLAGS) vcs: ${RV_ROOT}/configs/snapshots/$(snapshot)/common_defines.vh $(VCS) -full64 -assert svaext -sverilog +define+RV_OPENSOURCE +error+500 +incdir+${RV_ROOT}/design/lib +incdir+${RV_ROOT}/design/include \ ${RV_ROOT}/configs/snapshots/$(snapshot)/common_defines.vh \ +incdir+${RV_ROOT}/design/dmi +incdir+${RV_ROOT}/configs/snapshots/$(snapshot) +libext+.v ${RV_ROOT}/configs/snapshots/$(snapshot)/common_defines.vh \ $(defines)-f ${RV_ROOT}/testbench/flist.vcs -l vcs.log irun: ${RV_ROOT}/configs/snapshots/$(snapshot)/common_defines.vh $(IRUN) -64bit -elaborate -ida -access +rw -q -sv -sysv -nowarn CUVIHR -nclibdirpath ${PWD} -nclibdirname swerv.build \ -incdir ${RV_ROOT}/design/lib -incdir ${RV_ROOT}/design/include -incdir ${RV_ROOT}/design/dmi -vlog_ext +.vh+.h\ $(defines) -incdir ${RV_ROOT}/configs/snapshots/$(snapshot) -f ${RV_ROOT}/testbench/flist.vcs -elaborate -snapshot default ${RV_ROOT}/configs/snapshots/$(snapshot)/common_defines.vh: $(SWERV_CONFIG) -snapshot=$(snapshot) verilator-run: program.hex snapshot=ahb_lite $(SWERV_CONFIG) -snapshot=$(snapshot) -ahb_lite echo '`undef ASSERT_ON' >> ${RV_ROOT}/configs/snapshots/$(snapshot)/common_defines.vh $(VERILATOR) '-UASSERT_ON' --cc -CFLAGS ${CFLAGS} $(defines) $(includes) ${RV_ROOT}/configs/snapshots/$(snapshot)/common_defines.vh \ ${RV_ROOT}/testbench/tb_top.sv -I${RV_ROOT}/testbench \ -f ${RV_ROOT}/testbench/flist.verilator --top-module tb_top -exe test_tb_top.cpp --trace --autoflush cp ${RV_ROOT}/testbench/test_tb_top.cpp obj_dir/ $(MAKE) -C obj_dir/ -f Vtb_top.mk $(VERILATOR_MAKE_FLAGS) ./obj_dir/Vtb_top irun-run: program.hex snapshot=ahb_lite $(SWERV_CONFIG) -snapshot=$(snapshot) -ahb_lite $(IRUN) -64bit -ida -access +rw -q -sv -sysv -nowarn CUVIHR -nclibdirpath ${PWD} -nclibdirname swerv.build \ -incdir ${RV_ROOT}/design/lib -incdir ${RV_ROOT}/design/include -incdir ${RV_ROOT}/design/dmi -vlog_ext +.vh+.h\ $(defines) -top tb_top ${RV_ROOT}/testbench/tb_top.sv -I${RV_ROOT}/testbench ${RV_ROOT}/testbench/ahb_sif.sv\ -incdir ${RV_ROOT}/configs/snapshots/$(snapshot) -f ${RV_ROOT}/testbench/flist.vcs -snapshot default vcs-run: program.hex snapshot=ahb_lite $(SWERV_CONFIG) -snapshot=$(snapshot) -ahb_lite cp ${RV_ROOT}/testbench/hex/*.hex . $(VCS) -full64 -assert svaext -sverilog +define+RV_OPENSOURCE +error+500 +incdir+${RV_ROOT}/design/lib +incdir+${RV_ROOT}/design/include \ ${RV_ROOT}/configs/snapshots/$(snapshot)/common_defines.vh \ +incdir+${RV_ROOT}/design/dmi +incdir+${RV_ROOT}/configs/snapshots/$(snapshot) +libext+.v \ $(defines) -f ${RV_ROOT}/testbench/flist.vcs ${RV_ROOT}/testbench/tb_top.sv -I${RV_ROOT}/testbench ${RV_ROOT}/testbench/ahb_sif.sv -l vcs.log ./simv program.hex: $(ASM_TEST_DIR)/$(ASM_TEST).s ${RV_ROOT}/configs/snapshots/$(snapshot)/common_defines.vh @echo Building $(ASM_TEST) ifeq ($(shell which $(GCC_PREFIX)-as),) @echo " !!! No $(GCC_PREFIX)-as in path, using canned hex files !!" cp ${RV_ROOT}/testbench/hex/*.hex . else cp $(ASM_TEST_DIR)/$(ASM_TEST).s . $(GCC_PREFIX)-cpp -I${RV_ROOT}/configs/snapshots/$(snapshot) $(ASM_TEST).s > $(ASM_TEST).cpp.s $(GCC_PREFIX)-as -march=rv32imc $(ASM_TEST).cpp.s -o $(ASM_TEST).o $(GCC_PREFIX)-ld -m elf32lriscv --discard-none -T${RV_ROOT}/testbench/link.ld -o $(ASM_TEST).exe $(ASM_TEST).o $(GCC_PREFIX)-objcopy -O verilog --only-section ".data*" --only-section ".rodata*" $(ASM_TEST).exe data.hex $(GCC_PREFIX)-objcopy -O verilog --only-section ".text*" --set-start=0x0 $(ASM_TEST).exe program.hex $(GCC_PREFIX)-objdump -dS $(ASM_TEST).exe > $(ASM_TEST).dis $(GCC_PREFIX)-nm -f posix -C $(ASM_TEST).exe > $(ASM_TEST).tbl @echo Completed building $(ASM_TEST) endif help: @echo Make sure the environment variable RV_ROOT is set. @echo Possible targets: verilator vcs irun help clean all verilator-run irun-run vcs-run program.hex .PHONY: help clean verilator vcs irun verilator-run irun-run vcs-run