Files
retroSoC/rtl/mini/mk/software.mk
T
maksyuki 8276903600 feat: refactor user extension handling and update MPW generation
- Updated README.md to clarify the status of KianV RV32IMA and PicoRV32 in the user-extension map.
- Modified Makefile to include USER_EXTENSIONS_SOURCE in MPW variant stamp dependencies.
- Enhanced integration README.md to better describe the relationship between user_extensions.json and mpw.toml.
- Updated generate_user_extensions.py to include design_id in ExtensionTarget and enforce unique design IDs.
- Changed user_extensions.json schema version to 2 and added design_id fields for core and IP targets.
- Refactored generate_mpw.py to support the new manifest structure and validate design selections.
- Adjusted sysctrl_tb.sv test cases to reflect changes in user core reset states.
- Enhanced test_opipsram.py to utilize ccache for improved compilation performance.
- Updated test_script_tools.py to include new tests for active manifest generation.
- Modified test_user_extensions.py to validate isolated scalar bindings and reject duplicate design selections.
2026-08-22 10:53:03 +08:00

218 lines
9.0 KiB
Makefile

# Software SDK and application build
CROSS ?= riscv32-unknown-elf-
CP = $(CROSS)cpp
CC = $(CROSS)gcc
OBJC = $(CROSS)objcopy
DUMP = $(CROSS)objdump
GCC_FLAGS := -std=gnu11 -Wall -Wextra \
-Wl,-Bstatic,-T,$(LINK_TYPE).lds,--strip-debug,--gc-sections -O3 \
-ffreestanding -nostdlib -ffunction-sections -fdata-sections
SW_WARN_FLAGS := -Wformat=2 -Wshadow -Wstrict-prototypes -Wmissing-prototypes \
-Wcast-align -Werror=implicit-function-declaration \
-Werror=return-type -Werror=incompatible-pointer-types \
-Werror=int-conversion -Werror=format
ifeq ($(ISA),RV32E)
ISA_FLAGS := -mabi=ilp32e
else
ISA_FLAGS := -mabi=ilp32
endif
ifeq ($(ISA),RV32E)
ifeq ($(HAVE_CSR),YES)
ISA_FLAGS += -march=rv32e_zicsr
else
ISA_FLAGS += -march=rv32e
endif
else ifeq ($(ISA),RV32I)
ifeq ($(HAVE_CSR),YES)
ISA_FLAGS += -march=rv32i_zicsr
else
ISA_FLAGS += -march=rv32i
endif
else ifeq ($(ISA),RV32IM)
ifeq ($(HAVE_CSR),YES)
ISA_FLAGS += -march=rv32im_zicsr
else
ISA_FLAGS += -march=rv32im
endif
endif
DEF_VAL += -DAPP_$(APP)
DEF_VAL += -DCOMPILER_NAME='"$(CC)"'
DEF_VAL += -DCOMPILER_CFLAGS='"$(GCC_FLAGS) $(SW_WARN_FLAGS)"'
DEF_VAL += -DCOMPILER_ISA='"$(ISA_FLAGS)"'
DEF_VAL += -DRS_CLINT_TIMEBASE_HZ=$(CLINT_TIMEBASE_HZ)U
DEF_VAL += -DRS_RTC_CLOCK_HZ=$(AUD_CLK_HZ)U
ifeq ($(HAVE_CSR),YES)
DEF_VAL += -DCSR_ENABLE
endif
CFLAGS := $(GCC_FLAGS) $(SW_WARN_FLAGS) $(ISA_FLAGS) $(DEF_VAL)
CRT_SRCS := $(ROOT_PATH)/crt/arch/riscv/startup.S \
$(ROOT_PATH)/crt/arch/riscv/libgcc/clzsi2.c \
$(ROOT_PATH)/crt/arch/riscv/libgcc/divdi3.c \
$(ROOT_PATH)/crt/arch/riscv/libgcc/ffssi2.c \
$(ROOT_PATH)/crt/arch/riscv/libgcc/udivdi3.c \
$(ROOT_PATH)/crt/arch/riscv/libgcc/umoddi3.c \
$(ROOT_PATH)/crt/src/lib/stdlib.c \
$(ROOT_PATH)/crt/src/lib/string.c \
$(ROOT_PATH)/crt/src/lib/console.c \
$(ROOT_PATH)/crt/src/lib/printf.c \
$(ROOT_PATH)/rtl/managed/clusterip/archinfo/sw/src/archinfo.c \
$(ROOT_PATH)/rtl/managed/clusterip/crc/sw/src/crc.c \
$(ROOT_PATH)/rtl/managed/clusterip/rng/sw/src/rng.c \
$(ROOT_PATH)/rtl/managed/clusterip/rtc/sw/src/rtc.c \
$(ROOT_PATH)/rtl/managed/clusterip/wdg/sw/src/wdg.c \
$(ROOT_PATH)/rtl/managed/clusterip/pwm/sw/src/pwm.c \
$(ROOT_PATH)/rtl/managed/clusterip/ps2/sw/src/ps2.c \
$(ROOT_PATH)/rtl/managed/clusterip/ps2/sw/src/ps2_keyboard.c \
$(ROOT_PATH)/rtl/managed/clusterip/ps2/sw/src/ps2_mouse.c \
$(ROOT_PATH)/crt/src/core/archinfo.c \
$(ROOT_PATH)/crt/src/service/bench.c \
$(ROOT_PATH)/crt/src/service/booter.c \
$(ROOT_PATH)/crt/src/service/test.c \
$(ROOT_PATH)/crt/src/hal/clint.c \
$(ROOT_PATH)/crt/src/hal/clock.c \
$(ROOT_PATH)/crt/src/hal/sysctrl.c \
$(ROOT_PATH)/crt/src/hal/uart_math.c \
$(ROOT_PATH)/crt/src/hal/uart.c \
$(ROOT_PATH)/crt/src/hal/gpio_math.c \
$(ROOT_PATH)/crt/src/hal/gpio.c \
$(ROOT_PATH)/crt/src/hal/timer_math.c \
$(ROOT_PATH)/crt/src/hal/timer.c \
$(ROOT_PATH)/crt/src/hal/pwm.c \
$(ROOT_PATH)/crt/src/hal/rtc.c \
$(ROOT_PATH)/crt/src/hal/watchdog.c \
$(ROOT_PATH)/crt/src/hal/crc.c \
$(ROOT_PATH)/crt/src/hal/rng.c \
$(ROOT_PATH)/crt/src/hal/ps2.c \
$(ROOT_PATH)/crt/src/hal/i2c_math.c \
$(ROOT_PATH)/crt/src/hal/i2c.c \
$(ROOT_PATH)/crt/src/hal/i2s_math.c \
$(ROOT_PATH)/crt/src/hal/i2s.c \
$(ROOT_PATH)/crt/src/hal/ws2812_math.c \
$(ROOT_PATH)/crt/src/hal/ws2812.c \
$(ROOT_PATH)/crt/src/hal/dma_math.c \
$(ROOT_PATH)/crt/src/hal/dma.c \
$(ROOT_PATH)/crt/src/hal/crypto.c \
$(ROOT_PATH)/crt/src/hal/dvp.c \
$(ROOT_PATH)/crt/src/hal/perf.c \
$(ROOT_PATH)/crt/src/hal/lcd.c \
$(ROOT_PATH)/crt/src/hal/psram_math.c \
$(ROOT_PATH)/crt/src/hal/psram.c \
$(ROOT_PATH)/crt/src/hal/opipsram_math.c \
$(ROOT_PATH)/crt/src/hal/opipsram.c \
$(ROOT_PATH)/crt/src/hal/sdram_math.c \
$(ROOT_PATH)/crt/src/hal/sdram.c \
$(ROOT_PATH)/crt/src/hal/sdio_math.c \
$(ROOT_PATH)/crt/src/hal/sdio.c \
$(ROOT_PATH)/crt/src/hal/usb2_math.c \
$(ROOT_PATH)/crt/src/hal/usb2.c \
$(ROOT_PATH)/crt/src/hal/spisd_math.c \
$(ROOT_PATH)/crt/src/hal/spisd.c \
$(ROOT_PATH)/crt/src/hal/xpi.c \
$(ROOT_PATH)/crt/src/hal/user_ip.c \
$(ROOT_PATH)/crt/src/hal/user_core.c
ifeq ($(HAVE_CSR),YES)
CRT_SRCS += $(ROOT_PATH)/crt/arch/riscv/system_irq.S
CRT_SRCS += $(ROOT_PATH)/crt/src/core/system_irq_handler.c
CRT_SRCS += $(ROOT_PATH)/crt/src/core/irq.c
endif
APP_SRCS :=
APP_INC_DIRS :=
APP_CFLAGS :=
APP_CRT_SRCS :=
APP_MK := $(ROOT_PATH)/app/apps/$(APP)/app.mk
ifeq ($(wildcard $(APP_MK)),)
$(error Application profile not found: $(APP_MK))
endif
include $(APP_MK)
ifneq ($(strip $(APP_CRT_SRCS)),)
CRT_SRCS := $(APP_CRT_SRCS)
endif
CFLAGS += $(APP_CFLAGS)
APP_INC_DIRS += $(MPW_OUTPUT_DIR)
ifneq ($(filter RV32E RV32I,$(ISA)),)
CRT_SRCS += $(ROOT_PATH)/crt/arch/riscv/libgcc/div.S
CRT_SRCS += $(ROOT_PATH)/crt/arch/riscv/libgcc/muldi3.S
CRT_SRCS += $(ROOT_PATH)/crt/arch/riscv/libgcc/mulsi3.c
endif
INC_PATH := -I$(SW_BUILD_DIR)/include \
-I$(MEMORY_MAP_C_DIR) \
-I$(USER_EXTENSIONS_DIR)/include \
-I$(ARCHINFO_METADATA_DIR) \
-I$(ROOT_PATH)/rtl/managed/clusterip/archinfo/sw/include \
-I$(ROOT_PATH)/rtl/managed/clusterip/crc/sw/include \
-I$(ROOT_PATH)/rtl/managed/clusterip/rng/sw/include \
-I$(ROOT_PATH)/rtl/managed/clusterip/rtc/sw/include \
-I$(ROOT_PATH)/rtl/managed/clusterip/wdg/sw/include \
-I$(ROOT_PATH)/rtl/managed/clusterip/pwm/sw/include \
-I$(ROOT_PATH)/rtl/managed/clusterip/ps2/sw/include \
-I$(ROOT_PATH)/crt/include \
$(addprefix -I,$(APP_INC_DIRS))
SRC_PATH := $(CRT_SRCS) $(APP_SRCS)
LDS_PATH := $(ROOT_PATH)/crt/linker/$(LINK_TYPE).lds
MEMORY_REGIONS_LD := $(MEMORY_MAP_LINKER_DIR)/memory_regions.ld
VERSION_HEADER := $(SW_BUILD_DIR)/include/socver.h
FIRMWARE_ELF := $(SW_BUILD_DIR)/firmware
ASM_FIRMWARE_NAME ?= retrosoc_asm
SW_HEADERS := $(shell find $(ROOT_PATH)/crt/include $(ROOT_PATH)/app -type f \
\( -name '*.h' -o -name '*.hpp' \) 2>/dev/null)
SW_HEADERS += $(shell find $(ROOT_PATH)/rtl/managed/clusterip/archinfo/sw/include \
-type f -name '*.h' 2>/dev/null)
SW_HEADERS += $(shell find $(ROOT_PATH)/rtl/managed/clusterip/crc/sw/include \
-type f -name '*.h' 2>/dev/null)
SW_HEADERS += $(shell find $(ROOT_PATH)/rtl/managed/clusterip/rng/sw/include \
-type f -name '*.h' 2>/dev/null)
SW_HEADERS += $(shell find $(ROOT_PATH)/rtl/managed/clusterip/rtc/sw/include \
-type f -name '*.h' 2>/dev/null)
SW_HEADERS += $(shell find $(ROOT_PATH)/rtl/managed/clusterip/wdg/sw/include \
-type f -name '*.h' 2>/dev/null)
SW_HEADERS += $(shell find $(ROOT_PATH)/rtl/managed/clusterip/pwm/sw/include \
-type f -name '*.h' 2>/dev/null)
SW_HEADERS += $(shell find $(ROOT_PATH)/rtl/managed/clusterip/ps2/sw/include \
-type f -name '*.h' 2>/dev/null)
$(VERSION_HEADER): FORCE_VERSION $(ROOT_PATH)/crt/ver.py $(ROOT_PATH)/crt/ver.tmpl
@mkdir -p $(dir $@)
python3 $(ROOT_PATH)/crt/ver.py --root $(ROOT_PATH) --output $@
FORCE_VERSION:
upd_ver_info: $(VERSION_HEADER)
asm: $(MPW_VARIANT_STAMP) $(MEMORY_MAP_STAMP)
@mkdir -p $(SW_BUILD_DIR)/asm
$(MAKE) -C $(ROOT_PATH)/app/asm OUT_DIR=$(SW_BUILD_DIR)/asm \
GENERATED_INCLUDE=$(MEMORY_MAP_C_DIR)
cp $(SW_BUILD_DIR)/asm/hello-asm.flash $(SW_BUILD_DIR)/$(ASM_FIRMWARE_NAME).hex
cp $(SW_BUILD_DIR)/asm/hello-asm.bin $(SW_BUILD_DIR)/$(ASM_FIRMWARE_NAME).bin
cp $(SW_BUILD_DIR)/asm/hello-asm.txt $(SW_BUILD_DIR)/$(ASM_FIRMWARE_NAME)_all.txt
$(FIRMWARE_ELF): $(MPW_VARIANT_STAMP) $(MEMORY_MAP_STAMP) $(USER_EXTENSIONS_STAMP) $(ARCHINFO_METADATA_STAMP) $(VERSION_HEADER) $(SRC_PATH) $(SW_HEADERS) $(LDS_PATH) \
$(ROOT_PATH)/rtl/mini/mk/software.mk
@mkdir -p $(SW_BUILD_DIR)
cd $(SW_BUILD_DIR) && $(CP) -P -o $(LINK_TYPE).lds $(LDS_PATH)
cp $(MEMORY_REGIONS_LD) $(SW_BUILD_DIR)/memory_regions.ld
cd $(SW_BUILD_DIR) && $(CC) $(CFLAGS) $(INC_PATH) -o $(@F) $(SRC_PATH)
cd $(SW_BUILD_DIR) && $(OBJC) -O verilog $(@F) $(FIRMWARE_NAME).hex
cd $(SW_BUILD_DIR) && $(OBJC) -O binary $(@F) $(FIRMWARE_NAME).bin
cd $(SW_BUILD_DIR) && $(DUMP) -d $(@F) > $(FIRMWARE_NAME).txt
cd $(SW_BUILD_DIR) && $(DUMP) -D $(@F) > $(FIRMWARE_NAME)_all.txt
firmware: $(FIRMWARE_ELF)
firmware asm: | manifest
.PHONY: FORCE_VERSION