/
Makefrag
105 lines (80 loc) · 3.04 KB
/
Makefrag
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# See LICENSE for license details.
#
# Makefrag for generating MIDAS's synthesizable unit tests
# Compulsory arguments:
# ROCKETCHIP_DIR: Location of rocket chip source -- to grab verilog sources and simulation makefrags
# TODO: These are provided as resources -- fix.
# SBT: command to invoke sbt
# SBT_PROJECT: the project in which to run sbt commands
# GEN_DIR: Directory into which to emit generate verilog
DESIGN := TestHarness
CONFIG ?= AllUnitTests
OUT_DIR ?= $(GEN_DIR)
EMUL ?= vcs
default: $(GEN_DIR)/$(DESIGN).v
MAKEFRAG_DIR:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
sim_makefrag_dir := $(MAKEFRAG_DIR)/../rtlsim
vsrc := $(ROCKETCHIP_DIR)/src/main/resources/vsrc
csrc := $(ROCKETCHIP_DIR)/src/main/resources/csrc
# Stupidly guess what this test might depend on
src_path = src/main/scala
scala_srcs := $(shell find $(BASE_DIR) -name "*.scala")
# Rocket Chip stage requires a fully qualified classname for each fragment, whereas Chipyard's does not.
# This retains a consistent TARGET_CONFIG naming convention across the different target projects.
subst_prefix=,midas.unittest.
$(GEN_DIR)/$(DESIGN).fir $(GEN_DIR)/$(DESIGN).behav_srams.v: $(scala_srcs)
mkdir -p $(@D)
cd $(BASE_DIR) && $(SBT) "project $(SBT_PROJECT); runMain midas.chiselstage.Generator \
--target-dir $(GEN_DIR) \
--name $(DESIGN) \
--top-module freechips.rocketchip.unittest.TestHarness \
--configs midas.unittest.$(subst _,$(subst_prefix),$(CONFIG))"
touch $(GEN_DIR)/$(DESIGN).behav_srams.v
$(GEN_DIR)/$(DESIGN).v: $(GEN_DIR)/$(DESIGN).fir
cd $(BASE_DIR) && $(SBT) "project $(SBT_PROJECT); \
runMain firrtl.stage.FirrtlMain -i $< -o $@ \
-td $(GEN_DIR) \
-faf $(GEN_DIR)/$(DESIGN).anno.json -X verilog"
override CXXFLAGS += -std=c++20
emul_v := $(GEN_DIR)/$(DESIGN).v
emul_h :=
emul_cc :=
TB ?= TestDriver
CLOCK_PERIOD ?= 1.0
SIM_TIMESCALE ?= 1ps/1ps
SIM_PREPROC_DEFINES = \
+define+CLOCK_PERIOD=$(CLOCK_PERIOD) \
+define+RANDOMIZE_MEM_INIT \
+define+RANDOMIZE_REG_INIT \
+define+RANDOMIZE_GARBAGE_ASSIGN \
+define+RANDOMIZE_INVALID_ASSIGN \
+define+STOP_COND=!$(TB).reset \
+define+PRINTF_COND=!$(TB).reset \
+define+RANDOM=32\'b0 \
sim_wrapper_v := $(vsrc)/TestDriver.v
# Since we're reusing the makefrags we use to build metasimulators, we need to
# set DRIVER_NAME. We set it here so simulator binaries are named V$(DESIGN) / $(DESIGN)
DRIVER_NAME := $(DESIGN)
ifeq ($(EMUL),vcs)
# VCS Makefrag arguments
VCS_FLAGS = +verbose
include $(sim_makefrag_dir)/Makefrag-vcs
vcs = $(OUT_DIR)/$(DESIGN)
vcs_debug = $(OUT_DIR)/$(DESIGN)-debug
vcs: $(vcs)
vcs-debug: $(vcs_debug)
else
# Verilator Makefrag arguments
VERILATOR_FLAGS = -Wno-BLKSEQ # ignore TestDriver.v BLKSEQ warnings
include $(sim_makefrag_dir)/Makefrag-verilator
verilator = $(OUT_DIR)/V$(DESIGN)
verilator_debug = $(OUT_DIR)/V$(DESIGN)-debug
verilator: $(verilator)
verilator-debug: $(verilator_debug)
endif
# Run recipes
run-midas-unittests: $($(EMUL))
cd $(GEN_DIR) && $<
run-midas-unittests-debug: $($(EMUL)_debug)
cd $(GEN_DIR) && $<
.PHONY: run-midas-unittests run-midas-unittests-debug