| SHELL = /bin/bash | |
| include Makefrag | |
| V_SRC_DIR = src/main/verilog | |
| V_TEST_DIR = src/test/verilog | |
| CXX_TEST_DIR = src/test/cxx | |
| SIM_DIR = sim | |
| MEM_DIR = src/test/inputs | |
| OUT_DIR = output | |
| VERILATOR = verilator | |
| VERILATOR_OPTS = \ | |
| -Wall \ | |
| -Wno-WIDTH \ | |
| -Wno-UNUSED \ | |
| -Wno-BLKSEQ \ | |
| --cc \ | |
| -I$(V_SRC_DIR) \ | |
| +1364-2001ext+v \ | |
| -Wno-fatal \ | |
| --Mdir sim \ | |
| --trace \ | |
| VERILATOR_MAKE_OPTS = OPT_FAST="-O3" | |
| VCS = vcs -full64 | |
| VCS_OPTS = -PP -notice -line +lint=all,noVCDE,noUI +v2k -timescale=1ns/10ps -quiet \ | |
| +define+DEBUG -debug_pp \ | |
| +incdir+$(V_SRC_DIR) -Mdirectory=$(SIM_DIR)/csrc \ | |
| +vc+list -CC "-I$(VCS_HOME)/include" \ | |
| -CC "-std=c++11" \ | |
| MAX_CYCLES = 1000000 | |
| SIMV_OPTS = -k $(OUT_DIR)/ucli.key -q | |
| DESIGN_SRCS = $(addprefix $(V_SRC_DIR)/, \ | |
| vscale_core.v \ | |
| vscale_hasti_bridge.v \ | |
| vscale_pipeline.v \ | |
| vscale_ctrl.v \ | |
| vscale_regfile.v \ | |
| vscale_src_a_mux.v \ | |
| vscale_src_b_mux.v \ | |
| vscale_imm_gen.v \ | |
| vscale_alu.v \ | |
| vscale_mul_div.v \ | |
| vscale_csr_file.v \ | |
| vscale_PC_mux.v \ | |
| ) | |
| SIM_SRCS = $(addprefix $(V_TEST_DIR)/, \ | |
| vscale_sim_top.v \ | |
| vscale_dp_hasti_sram.v \ | |
| ) | |
| VCS_TOP = $(V_TEST_DIR)/vscale_hex_tb.v | |
| VERILATOR_CPP_TB = $(CXX_TEST_DIR)/vscale_hex_tb.cpp | |
| VERILATOR_TOP = $(V_TEST_DIR)/vscale_verilator_top.v | |
| HDRS = $(addprefix $(V_SRC_DIR)/, \ | |
| vscale_ctrl_constants.vh \ | |
| rv32_opcodes.vh \ | |
| vscale_alu_ops.vh \ | |
| vscale_md_constants.vh \ | |
| vscale_hasti_constants.vh \ | |
| vscale_csr_addr_map.vh \ | |
| ) | |
| TEST_VPD_FILES = $(addprefix $(OUT_DIR)/,$(addsuffix .vpd,$(RV32_TESTS))) | |
| VERILATOR_VCD_FILES = $(addprefix $(OUT_DIR)/,$(addsuffix .verilator.vcd,$(RV32_TESTS))) | |
| default: $(SIM_DIR)/simv | |
| run-asm-tests: $(TEST_VPD_FILES) | |
| verilator-sim: $(SIM_DIR)/Vvscale_verilator_top | |
| verilator-run-asm-tests: $(VERILATOR_VCD_FILES) | |
| $(OUT_DIR)/%.vpd: $(MEM_DIR)/%.hex $(SIM_DIR)/simv | |
| mkdir -p output | |
| $(SIM_DIR)/simv $(SIMV_OPTS) +max-cycles=$(MAX_CYCLES) +loadmem=$< +vpdfile=$@ && [ $$PIPESTATUS -eq 0 ] | |
| $(OUT_DIR)/%.verilator.vcd: $(MEM_DIR)/%.hex $(SIM_DIR)/Vvscale_verilator_top | |
| mkdir -p output | |
| $(SIM_DIR)/Vvscale_verilator_top +max-cycles=$(MAX_CYCLES) +loadmem=$< --vcdfile=$@ && [ $$PIPESTATUS -eq 0 ] | |
| $(SIM_DIR)/simv: $(VCS_TOP) $(SIM_SRCS) $(DESIGN_SRCS) $(HDRS) | |
| mkdir -p sim | |
| $(VCS) $(VCS_OPTS) -o $@ $(VCS_TOP) $(SIM_SRCS) $(DESIGN_SRCS) | |
| $(SIM_DIR)/Vvscale_verilator_top: $(VERILATOR_TOP) $(SIM_SRCS) $(DESIGN_SRCS) $(HDRS) $(VERILATOR_CPP_TB) | |
| $(VERILATOR) $(VERILATOR_OPTS) $(VERILATOR_TOP) $(SIM_SRCS) $(DESIGN_SRCS) --exe ../$(VERILATOR_CPP_TB) | |
| cd sim; make $(VERILATOR_MAKE_OPTS) -f Vvscale_verilator_top.mk Vvscale_verilator_top__ALL.a | |
| cd sim; make $(VERILATOR_MAKE_OPTS) -f Vvscale_verilator_top.mk Vvscale_verilator_top | |
| clean: | |
| rm -rf $(SIM_DIR)/* $(OUT_DIR)/* | |
| .PHONY: clean run-asm-tests verilator-run-asm-tests |