xref: /XiangShan/Makefile (revision ab3aa7eedc9c70d560572701ea30e863011452a8)
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
58
59# Verilator trace support
60VEXTRA_FLAGS  = --trace
61
62# Verilator multi-thread support
63EMU_THREADS  ?= 1
64VEXTRA_FLAGS += --threads $(EMU_THREADS) --threads-dpi none
65
66# Verilator savable
67EMU_SNAPSHOT ?= 0
68ifeq ($(EMU_SNAPSHOT),1)
69VEXTRA_FLAGS += --savable
70EMU_CXXFLAGS += -DVM_SAVABLE
71endif
72
73# --trace
74VERILATOR_FLAGS = --top-module $(SIM_TOP) \
75  +define+VERILATOR=1 \
76  +define+PRINTF_COND=1 \
77  +define+RANDOMIZE_REG_INIT \
78  +define+RANDOMIZE_MEM_INIT \
79  $(VEXTRA_FLAGS) \
80  --assert \
81  --stats-vars \
82  --output-split 5000 \
83  --output-split-cfuncs 5000 \
84  -I$(abspath $(BUILD_DIR)) \
85  --x-assign unique -O3 -CFLAGS "$(EMU_CXXFLAGS)" \
86  -LDFLAGS "$(EMU_LDFLAGS)"
87
88EMU_MK := $(BUILD_DIR)/emu-compile/V$(SIM_TOP).mk
89EMU_DEPS := $(EMU_VFILES) $(EMU_CXXFILES)
90EMU_HEADERS := $(shell find $(EMU_CSRC_DIR) -name "*.h")
91EMU := $(BUILD_DIR)/emu
92
93$(EMU_MK): $(SIM_TOP_V) | $(EMU_DEPS)
94	@mkdir -p $(@D)
95	verilator --cc --exe $(VERILATOR_FLAGS) \
96		-o $(abspath $(EMU)) -Mdir $(@D) $^ $(EMU_DEPS)
97
98REF_SO := $(NEMU_HOME)/build/riscv64-nemu-interpreter-so
99$(REF_SO):
100	$(MAKE) -C $(NEMU_HOME) ISA=riscv64 SHARE=1
101
102$(EMU): $(EMU_MK) $(EMU_DEPS) $(EMU_HEADERS) $(REF_SO)
103ifeq ($(REMOTE),localhost)
104	CPPFLAGS=-DREF_SO=\\\"$(REF_SO)\\\" $(MAKE) VM_PARALLEL_BUILDS=1 OPT_FAST="-O3" -C $(abspath $(dir $(EMU_MK))) -f $(abspath $(EMU_MK))
105else
106	ssh -tt $(REMOTE) 'CPPFLAGS=-DREF_SO=\\\"$(REF_SO)\\\" $(MAKE) -j200 VM_PARALLEL_BUILDS=1 OPT_FAST="-O3" -C $(abspath $(dir $(EMU_MK))) -f $(abspath $(EMU_MK))'
107endif
108
109SEED ?= $(shell shuf -i 1-10000 -n 1)
110
111
112# log will only be printed when (B<=GTimer<=E) && (L < loglevel)
113# use 'emu -h' to see more details
114B ?= 0
115E ?= -1
116SNAPSHOT ?=
117
118# enable this runtime option if you want to generate a vcd file
119# use 'emu -h' to see more details
120#WAVEFORM = --dump-wave
121
122ifeq ($(SNAPSHOT),)
123SNAPSHOT_OPTION =
124else
125SNAPSHOT_OPTION = --load-snapshot=$(SNAPSHOT)
126endif
127
128
129EMU_FLAGS = -s $(SEED) -b $(B) -e $(E) $(SNAPSHOT_OPTION) $(WAVEFORM)
130
131emu: $(EMU)
132	ls build
133	$(EMU) -i $(IMAGE) $(EMU_FLAGS)
134
135cache:
136	$(MAKE) emu IMAGE=Makefile
137
138clean:
139	git submodule foreach git clean -fdx
140	git clean -fd
141
142init:
143	git submodule update --init
144
145bump:
146	git submodule foreach "git fetch origin&&git checkout master&&git reset --hard origin/master"
147
148bsp:
149	mill -i mill.contrib.BSP/install
150.PHONY: verilog emu clean help init bump bsp $(REF_SO)
151