# Color definitions ------------------------------- NO_COLOR="\033[0m" RED="\033[38;5;009m" GREEN="\033[38;5;010m" YELLOW="\033[38;5;011m" ORANGE="\033[38;5;214m" LIGHTPURPLE="\033[38;5;177m" PURPLE="\033[38;5;135m" CYAN="\033[38;5;014m" LIGHTBLUE="\033[38;5;39m" BLUE="\033[38;5;75m" DARKBLUE="\033[38;5;33m" LIGHTGRAY="\033[38;5;252m" DARKGRAY="\033[38;5;242m" BRIGHTRED="\033[91m" BOLD="\033[1m" # PATHS (adapt to your system)---------------------- PATH_RISCV=/opt/riscv/ PATH_RISC_BIN=$(PATH_RISCV)bin/ PATH_VERILATOR_BIN?=/usr/local/bin/verilator PREFIX?=$(PATH_RISC_BIN)riscv64-unknown-elf # TOOLS -------------------------------------------- AR?=$(PREFIX)-ar GCC?=$(PREFIX)-gcc CLANG=clang GDB?=$(PREFIX)-gdb OBJDUMP?=$(PREFIX)-objdump OBJCOPY?=$(PREFIX)-objcopy RISCVPATH=$(PATH_RISCV)riscv64-unknown-elf OPENOCD?=$(PATH_RISC_BIN)openocd ECHO?=echo # GCC FLAGS --------------------------------------- CC=$(GCC) GCC_CFLAGS_COMMON := -g \ -O3 \ -fno-builtin-printf \ -Wno-unused-parameter \ -Wall -Wextra -Wredundant-decls \ -Wshadow -Wno-unused-function \ -fno-common \ -I$(RISCVPATH)/include GCC_CFLAGS_MURAX=-fstrict-volatile-bitfields --specs=nosys.specs RISCV_ARCH?=rv32im RISCV_ABI?=ilp32 RISCV_CMODEL?=medany RISCV_ARCHFLAGS +=-march=$(RISCV_ARCH) RISCV_ARCHFLAGS +=-mabi=$(RISCV_ABI) RISCV_ARCHFLAGS +=-mcmodel=$(RISCV_CMODEL) GCC_RISCV_ARCHFLAGS=$(RISCV_ARCHFLAGS) CFLAGS += $(GCC_CFLAGS_COMMON) \ $(GCC_CFLAGS_MURAX) \ $(GCC_RISCV_ARCHFLAGS) # Linker flags -------------------------------------- PLATFORM ?= pqvexriscvsim LDSCRIPT = $(PLATFORM).ld LDFLAGS = -L$(RISCVPATH)/lib/rv32imac/ilp32 LDFLAGS += $(GCC_RISCV_ARCHFLAGS) LDFLAGS += --specs=nosys.specs LDFLAGS += -Wl,-T$(LDSCRIPT) LDFLAGS += -nostartfiles -ffreestanding -Wl,--gc-sections LDFLAGS += -L. LDFLAGS += -Wl,--start-group -l$(PLATFORM)bsp -lc -Wl,--end-group # Object files -------------------------------------- SDK_ASM_SRCS := $(wildcard *.S) SDK_C_SRCS := $(wildcard *.c) SDK_C_OBJS := $(SDK_C_SRCS:.c=.o) SDK_ASM_OBJS := $(SDK_ASM_SRCS:.S=.o) SDK_OBJS := $(SDK_C_OBJS) $(SDK_ASM_OBJS) # Target all ---------------------------------------- .PHONY: all all: main.hex main.bin # LIBWRAP include vexriscv/vexriscv.mk # Targets -------------------------------------------- main.bin: main @$(ECHO) $(PURPLE)"obj "$@""$(LIGHTGRAY) $(OBJCOPY) -O binary $< $@ main.hex: main @$(ECHO) $(PURPLE)"obj "$@""$(LIGHTGRAY) $(OBJCOPY) -O ihex $< $@ main: $(LIBWRAP) $(SDK_OBJS) $(LDSCRIPT) @$(ECHO) $(LIGHTPURPLE)"building "$@""$(LIGHTGRAY) $(GCC) $(GCC_RISCV_ARCHFLAGS) $(GCC_CFLAGS_COMMON) $(SDK_OBJS) -o $@ $(LDFLAGS) %.o: %.S @$(ECHO) $(ORANGE)"building "$@" (.S)"$(LIGHTGRAY) $(CC) $(CFLAGS) -c -o $@ $^ %.o: %.c @$(ECHO) $(ORANGE)"building "$@" (.c)"$(LIGHTGRAY) $(CC) $(CFLAGS) -c -o $@ $^ .PHONY: clean clean: @$(ECHO) $(RED)"cleaning..."$(LIGHTGRAY) rm -f main main.bin main.hex $(SDK_OBJS) $(LIBWRAP_OBJS) $(LIBWRAP) help: @$(ECHO) $(RED)"Compile & Simulate"$(LIGHTGRAY) @$(ECHO) $(LIGHTGRAY)"1. "$(CYAN)"make"$(LIGHTGRAY) @$(ECHO) $(LIGHTGRAY)"2. open 3 terminals"$(LIGHTGRAY) @$(ECHO) $(LIGHTGRAY)"3. Terminal 2: "$(CYAN)"make startsim"$(LIGHTGRAY) @$(ECHO) $(LIGHTGRAY)"4. Terminal 3: "$(CYAN)"make openocd"$(LIGHTGRAY) @$(ECHO) $(LIGHTGRAY)"5. Terminal 1: "$(CYAN)"make flash"$(LIGHTGRAY) # Targets for starting simulation, openocd and gdb ---------------------------- # startsim: # cd ../Building_Tools/pqriscv-vexriscv/ ; sbt "runMain mupq.PQVexRiscvSim --ram 256,128" # openocd: # cd ../Building_Tools/pqriscv-vexriscv/ ; /opt/verilator/bin/openocd --file pqvexriscvsim.cfg #flash: # /opt/riscv/bin/riscv64-unknown-elf-gdb -ex 'set remotetimeout 15' -ex 'target remote :3333' -ex 'load' -ex 'break main' -ex 'continue' main