1+ # Verilator Makefile for WALLY
2+ # Kunlin Han, Rose Thompson, David Harris 2024
3+ # SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
4+
5+ SHELL := /bin/bash
6+ WALLY ?= /opt/openhwgroup/cvw
7+ LABS344 ?= /workspaces/labs344
8+
9+ .PHONY : profile run clean
10+
11+ # verilator configurations
12+ OPT =--assert
13+ PARAMS? =--no-trace-top
14+ NONPROF? =--stats
15+ VERILATOR_DIR =${LABS344}/sim/verilator
16+ PLUS_ARGS =
17+ PARAM_ARGS =
18+ DEFINE_ARGS =
19+ EXPANDED_PARAM_ARGS: =$(patsubst % ,-G% ,$(PARAM_ARGS ) )
20+
21+ WALLYCONF? =rv64gc
22+ TEST? =arch64i
23+ TESTBENCH? =testbench
24+
25+ # constants
26+ # assume WALLY variable is correctly configured in the shell environment
27+ # INCLUDE_PATH are paths that Verilator should search for files it needs
28+ INCLUDE_PATH ="-I${WALLY}/config/shared" "-I${WALLY}/config/$(WALLYCONF ) " "-I${WALLY}/config/deriv/$(WALLYCONF ) " "-I/usr/share/verilator/include"
29+ # SOURCES are source files
30+ SOURCES =${WALLY}/src/cvw.sv ${WALLY}/testbench/${TESTBENCH}.sv ${WALLY}/testbench/common/*.sv ${WALLY}/src/*/*.sv ${WALLY}/src/*/*/*.sv ${WALLY}/addins/verilog-ethernet/*/*.sv ${WALLY}/addins/verilog-ethernet/*/*/*/*.sv
31+ # DEPENDENCIES are configuration files and source files, which leads to recompilation of executables
32+ DEPENDENCIES =${WALLY}/config/shared/*.vh $(SOURCES )
33+
34+ WORKDIR = $(VERILATOR_DIR ) /wkdir/$(WALLYCONF ) _$(TEST )
35+
36+ # regular testbench requires a wrapper defining getenvval
37+ ifeq ($(TESTBENCH ) , testbench)
38+ WRAPPER=${WALLY}/sim/verilator/wrapper.c
39+ ARGTEST=+TEST=$(TEST)
40+ else
41+ WRAPPER=
42+ ARGTEST=
43+ endif
44+
45+ default : run
46+
47+ run : $(WORKDIR ) /V${TESTBENCH}
48+ mkdir -p $(VERILATOR_DIR ) /logs
49+ $(WORKDIR ) /V${TESTBENCH} ${ARGTEST} $(PLUS_ARGS )
50+
51+ profile : obj_dir_profiling/V${TESTBENCH}_$(WALLYCONF )
52+ $(VERILATOR_DIR ) /obj_dir_profiling/V${TESTBENCH} _$(WALLYCONF ) ${ARGTEST}
53+ mv gmon.out gmon_$(WALLYCONF ) .out
54+ gprof $(VERILATOR_DIR ) /obj_dir_profiling/V${TESTBENCH} _$(WALLYCONF ) gmon_$(WALLYCONF ) .out > gmon_$(WALLYCONF ) .log
55+ verilator_profcfunc gmon_$(WALLYCONF ) .log > gmon_$(WALLYCONF ) .log2
56+ mkdir -p $(VERILATOR_DIR ) /logs_profiling
57+ mv gmon_$(WALLYCONF ) * $(VERILATOR_DIR ) /logs_profiling
58+ echo " Please check $( VERILATOR_DIR) /logs_profiling/gmon_$( WALLYCONF) * for logs and output files."
59+
60+ $(WORKDIR ) /V${TESTBENCH} : $(DEPENDENCIES )
61+ mkdir -p $(WORKDIR )
62+ verilator \
63+ --Mdir $(WORKDIR ) -o V${TESTBENCH} \
64+ --binary --trace \
65+ $(OPT ) $(PARAMS ) $(NONPROF ) \
66+ --top-module ${TESTBENCH} --relative-includes \
67+ $(INCLUDE_PATH ) \
68+ ${WRAPPER} \
69+ ${DEFINE_ARGS} \
70+ ${EXPANDED_PARAM_ARGS} \
71+ $(SOURCES )
72+
73+ obj_dir_profiling/V${TESTBENCH}_$(WALLYCONF ) : $(DEPENDENCIES )
74+ mkdir -p obj_dir_profiling
75+ verilator \
76+ --Mdir obj_dir_profiling -o V${TESTBENCH} _$(WALLYCONF ) \
77+ --binary \
78+ --prof-cfuncs $(OPT ) $(PARAMS ) \
79+ --top-module ${TESTBENCH} --relative-includes \
80+ $(INCLUDE_PATH ) \
81+ ${WRAPPER} \
82+ ${DEFINE_ARGS} \
83+ ${EXPANDED_PARAM_ARGS} \
84+ $(SOURCES )
85+
86+ clean :
87+ rm -rf $(VERILATOR_DIR ) /wkdir $(VERILATOR_DIR ) /obj_dir_profiling $(VERILATOR_DIR ) /logs $(VERILATOR_DIR ) /logs_profiling
0 commit comments