xref: /XiangShan/Makefile (revision a9ecfa67572f9dc8d32a66b8924cfc8e21bbda0c)
1TOP = TopMain
2FPGATOP = FPGANOOP
3BUILD_DIR = ./build
4TOP_V = $(BUILD_DIR)/$(TOP).v
5SCALA_FILE = $(shell find ./src/main/scala -name '*.scala')
6TEST_FILE = $(shell find ./src/test/scala -name '*.scala')
7MEM_GEN = ./scripts/vlsi_mem_gen
8
9SIMTOP = top.TestMain
10IMAGE ?= temp
11
12# remote machine with more cores to speedup c++ build
13REMOTE ?= localhost
14
15.DEFAULT_GOAL = verilog
16
17help:
18	mill XiangShan.test.runMain top.$(TOP) --help
19
20$(TOP_V): $(SCALA_FILE)
21	mkdir -p $(@D)
22	mill XiangShan.runMain top.$(TOP) -X verilog -td $(@D) --output-file $(@F) --infer-rw $(FPGATOP) --repl-seq-mem -c:$(FPGATOP):-o:$(@D)/$(@F).conf
23	$(MEM_GEN) $(@D)/$(@F).conf >> $@
24	sed -i -e 's/_\(aw\|ar\|w\|r\|b\)_\(\|bits_\)/_\1/g' $@
25	@git log -n 1 >> .__head__
26	@git diff >> .__diff__
27	@sed -i 's/^/\/\// ' .__head__
28	@sed -i 's/^/\/\//' .__diff__
29	@cat .__head__ .__diff__ $@ > .__out__
30	@mv .__out__ $@
31	@rm .__head__ .__diff__
32
33deploy: build/top.zip
34
35
36build/top.zip: $(TOP_V)
37	@zip -r $@ $< $<.conf build/*.anno.json
38
39.PHONY: deploy build/top.zip
40
41verilog: $(TOP_V)
42
43SIM_TOP = XSSimTop
44SIM_TOP_V = $(BUILD_DIR)/$(SIM_TOP).v
45SIM_ARGS =
46$(SIM_TOP_V): $(SCALA_FILE) $(TEST_FILE)
47	mkdir -p $(@D)
48	mill XiangShan.test.runMain $(SIMTOP) -X verilog -td $(@D) --full-stacktrace --output-file $(@F) $(SIM_ARGS)
49
50EMU_CSRC_DIR = $(abspath ./src/test/csrc)
51EMU_VSRC_DIR = $(abspath ./src/test/vsrc)
52EMU_CXXFILES = $(shell find $(EMU_CSRC_DIR) -name "*.cpp")
53EMU_VFILES = $(shell find $(EMU_VSRC_DIR) -name "*.v" -or -name "*.sv")
54
55EMU_CXXFLAGS  = -std=c++11 -static -Wall -I$(EMU_CSRC_DIR)
56EMU_CXXFLAGS += -DVERILATOR -Wno-maybe-uninitialized
57EMU_LDFLAGS   = -lpthread -lSDL2 -ldl
58EMU_THREADS   = 1
59ifeq ($(EMU_THREADS), 1)
60	VTHREAD_FLAGS = --threads 1
61else
62	VTHREAD_FLAGS = --threads $(EMU_THREADS) --threads-dpi none
63endif
64
65# --trace
66VERILATOR_FLAGS = --top-module $(SIM_TOP) \
67  +define+VERILATOR=1 \
68  +define+PRINTF_COND=1 \
69  +define+RANDOMIZE_REG_INIT \
70  +define+RANDOMIZE_MEM_INIT \
71  $(VTHREAD_FLAGS) \
72  --trace \
73  --assert \
74  --savable \
75  --stats-vars \
76  --output-split 5000 \
77  --output-split-cfuncs 5000 \
78  -I$(abspath $(BUILD_DIR)) \
79  --x-assign unique -O3 -CFLAGS "$(EMU_CXXFLAGS)" \
80  -LDFLAGS "$(EMU_LDFLAGS)"
81
82EMU_MK := $(BUILD_DIR)/emu-compile/V$(SIM_TOP).mk
83EMU_DEPS := $(EMU_VFILES) $(EMU_CXXFILES)
84EMU_HEADERS := $(shell find $(EMU_CSRC_DIR) -name "*.h")
85EMU := $(BUILD_DIR)/emu
86
87$(EMU_MK): $(SIM_TOP_V) | $(EMU_DEPS)
88	@mkdir -p $(@D)
89	verilator --cc --exe $(VERILATOR_FLAGS) \
90		-o $(abspath $(EMU)) -Mdir $(@D) $^ $(EMU_DEPS)
91
92REF_SO := $(NEMU_HOME)/build/riscv64-nemu-interpreter-so
93$(REF_SO):
94	$(MAKE) -C $(NEMU_HOME) ISA=riscv64 SHARE=1
95
96$(EMU): $(EMU_MK) $(EMU_DEPS) $(EMU_HEADERS) $(REF_SO)
97ifeq ($(REMOTE),localhost)
98	CPPFLAGS=-DREF_SO=\\\"$(REF_SO)\\\" $(MAKE) VM_PARALLEL_BUILDS=1 OPT_FAST="-O3" -C $(abspath $(dir $(EMU_MK))) -f $(abspath $(EMU_MK))
99else
100	ssh -tt $(REMOTE) 'CPPFLAGS=-DREF_SO=\\\"$(REF_SO)\\\" $(MAKE) -j80 VM_PARALLEL_BUILDS=1 OPT_FAST="-O3" -C $(abspath $(dir $(EMU_MK))) -f $(abspath $(EMU_MK))'
101endif
102
103SEED ?= $(shell shuf -i 1-10000 -n 1)
104
105
106# log will only be printed when (B<=GTimer<=E) && (L < loglevel)
107# use 'emu -h' to see more details
108B ?= 0
109E ?= -1
110SNAPSHOT ?=
111
112# enable this runtime option if you want to generate a vcd file
113# use 'emu -h' to see more details
114#WAVEFORM = --dump-wave
115
116ifeq ($(SNAPSHOT),)
117SNAPSHOT_OPTION =
118else
119SNAPSHOT_OPTION = --load-snapshot=$(SNAPSHOT)
120endif
121
122EMU_FLAGS = -s $(SEED) -b $(B) -e $(E) $(SNAPSHOT_OPTION) $(WAVEFORM)
123
124emu: $(EMU)
125	ls build
126	$(EMU) -i $(IMAGE) $(EMU_FLAGS)
127
128cache:
129	$(MAKE) emu IMAGE=Makefile
130
131clean:
132	rm -rf $(BUILD_DIR)
133
134init:
135	git submodule update --init
136	@# do not use a recursive init to pull some not used submodules
137	cd ./rocket-chip/ && git submodule update --init api-config-chipsalliance hardfloat
138
139.PHONY: verilog emu clean help init $(REF_SO)
140