mirror of
https://github.com/retroSoC/retroSoC.git
synced 2026-11-04 22:32:36 +00:00
Integrate RNG, CRC, WS2812, Crypto, I2S master and the SDIO private AXI owner on SAFE24. Preserve the 128 KiB main SRAM and six private Crypto macros, add product-specific DMA assignments and reject unsupported SDK operations.
Correct APB read strobes, I2S receive assembly and SDIO command timing, backpressure and descriptor retirement. Add pin-level workloads, source-bound evidence checks and publication/commercial consumer compatibility.
Validation of the final P6 worktree: 1726 pytest tests passed with one optional pypdf skip (exit 0, 4021.61 seconds; terminal session 36439). Both PDKs passed both RTL simulators, netlist boot and 38-macro binding checks. Shared formal, Mini compatibility and software/source quality gates passed.
Evidence remains attributed to the retained dirty-worktree snapshots based on b3b30a72cd under build/ics55-tiny-2026-10-12-11-50-2eb98c0e1fae/meta/tiny-r2-p6/. Timing is negative and warning observations are not promoted. This commit does not accept P6, qualify physical operation or enable P7.
238 lines
13 KiB
Makefile
238 lines
13 KiB
Makefile
export CCACHE_DIR := $(CACHE_ROOT)/ccache/verilator
|
|
export CCACHE_TEMPDIR := $(CACHE_ROOT)/ccache/verilator/tmp
|
|
|
|
TINY_GENERATED_DIR := $(VARIANT_ROOT)/generated/tiny
|
|
GENERATED_FL_DIR := $(FLOW_FILELIST_DIR)
|
|
FILELIST_STAMP := $(GENERATED_FL_DIR)/.stamp
|
|
MEMORY_MAP_DIR := $(TINY_GENERATED_DIR)/memory_map
|
|
MEMORY_MAP_C_DIR := $(MEMORY_MAP_DIR)/include
|
|
MEMORY_MAP_LINKER_DIR := $(MEMORY_MAP_DIR)/linker
|
|
MEMORY_MAP_STAMP := $(FILELIST_STAMP)
|
|
PIN_MAP_DIR := $(TINY_GENERATED_DIR)/pin_map
|
|
SOC_TOPOLOGY_INCLUDE_DIR := $(TINY_GENERATED_DIR)/include
|
|
SOC_TOPOLOGY_STAMP := $(FILELIST_STAMP)
|
|
SOC_IRQ_METADATA := $(SOC_TOPOLOGY_INCLUDE_DIR)/retrosoc/generated/irq_metadata.h
|
|
USER_EXTENSIONS_DIR := $(TINY_GENERATED_DIR)
|
|
USER_EXTENSIONS_STAMP := $(FILELIST_STAMP)
|
|
ARCHINFO_METADATA_DIR := $(TINY_GENERATED_DIR)/archinfo
|
|
ARCHINFO_METADATA_SCRIPT := $(ROOT_PATH)/rtl/managed/clusterip/archinfo/scripts/generate_metadata.py
|
|
ARCHINFO_METADATA_STAMP := $(ARCHINFO_METADATA_DIR)/.stamp
|
|
TINY_MAPS := $(wildcard $(RTL_PATH)/address_map/*.json $(RTL_PATH)/pin_map/*.json $(RTL_PATH)/integration/*.json)
|
|
TINY_TEMPLATES := $(wildcard $(RTL_PATH)/filelist/*.fl)
|
|
TINY_TOOLS := $(ROOT_PATH)/scripts/generate_tiny.py $(wildcard $(ROOT_PATH)/scripts/rtl/*.py)
|
|
|
|
$(ARCHINFO_METADATA_STAMP): $(LOCK_FILE) $(wildcard $(ARCHINFO_METADATA_SCRIPT))
|
|
@test -f $(ARCHINFO_METADATA_SCRIPT) || { echo "Run Tiny setup first" >&2; exit 1; }
|
|
$(PYTHON) $(ARCHINFO_METADATA_SCRIPT) --repo-root $(ROOT_PATH) --lock $(LOCK_FILE) \
|
|
--config-digest $(CONFIG_DIGEST) $(if $(filter YES,$(BUILD_RELEASE)),--release) \
|
|
--output-sv $(ARCHINFO_METADATA_DIR)/archinfo_integration_metadata.svh \
|
|
--output-c $(ARCHINFO_METADATA_DIR)/archinfo_integration_metadata.h
|
|
@touch $@
|
|
|
|
$(FILELIST_STAMP): $(ROOT_PATH)/Makefile $(RTL_PATH)/Makefile $(TINY_MAPS) $(TINY_TEMPLATES) $(TINY_TOOLS) $(ARCHINFO_METADATA_STAMP)
|
|
$(PYTHON) $(ROOT_PATH)/scripts/generate_tiny.py --output $(TINY_GENERATED_DIR) \
|
|
--filelists $(GENERATED_FL_DIR) --pdk $(PDK) --simulator $(SIMU) --synthesis $(SYNTH) \
|
|
$(foreach define,$(DEF_LIST),--define $(define))
|
|
@touch $@
|
|
|
|
$(SOC_IRQ_METADATA): $(FILELIST_STAMP)
|
|
@test -f $@
|
|
|
|
generate_filelist memory-map pin-map soc-topology user-extensions: $(FILELIST_STAMP)
|
|
archinfo-metadata: $(ARCHINFO_METADATA_STAMP)
|
|
check-memory-map:
|
|
$(PYTHON) $(ROOT_PATH)/scripts/rtl/generate_memory_map.py --map $(RTL_PATH)/address_map/memory_map.json --check
|
|
check-pin-map:
|
|
$(PYTHON) $(ROOT_PATH)/scripts/rtl/generate_pin_map.py --map $(RTL_PATH)/pin_map/pin_map.json --check
|
|
check-soc-topology:
|
|
$(PYTHON) $(ROOT_PATH)/scripts/generate_tiny.py --check
|
|
check-clock-reset-domains:
|
|
$(PYTHON) $(ROOT_PATH)/scripts/check_clock_reset_domains.py --map $(RTL_PATH)/integration/clock_reset_domains.json --root $(ROOT_PATH)
|
|
|
|
RTL_FILELISTS := $(addprefix $(GENERATED_FL_DIR)/,def.fl inc.fl commonip.fl clusterip.fl ip.fl tech.fl core_hazard3.fl top.fl)
|
|
RTL_FLIST := $(foreach filelist,$(RTL_FILELISTS),-f $(filelist))
|
|
PDK_FILELIST := $(GENERATED_FL_DIR)/pdk_selected.fl
|
|
TINY_TB_FLIST := -f $(GENERATED_FL_DIR)/tb.fl
|
|
TOP_DESIGN := retrosoc_tiny_asic
|
|
RTL_NAME := retrosoc_tiny_asic
|
|
OPENSTA_NETLIST := $(SYN_BUILD_ROOT)/out/$(RTL_NAME)_yosys.v
|
|
OPENSTA_CONFIG := $(SYN_BUILD_ROOT)/out/$(RTL_NAME)_yosys.config
|
|
NETLIST_PATH := $(OPENSTA_NETLIST)
|
|
TINY_CONVERTED := $(SIM_BUILD_ROOT)/converted_soc.v
|
|
TINY_DEPFILE := $(SIM_BUILD_ROOT)/sources.d
|
|
TINY_TB_DEPFILE := $(SIM_BUILD_ROOT)/testbench.d
|
|
TINY_LINT_LOG := $(VARIANT_ROOT)/lint/verilator/lint.log
|
|
SOC_SIM_TIME ?= 1800
|
|
TINY_SIM_TIMEOUT ?= 20000000
|
|
TINY_SIM_ARGS ?=
|
|
VERILATOR ?= verilator
|
|
IVERILOG ?= iverilog
|
|
VVP ?= vvp
|
|
|
|
include $(ROOT_PATH)/rtl/mk/software.mk
|
|
-include $(TINY_DEPFILE) $(TINY_TB_DEPFILE)
|
|
|
|
$(TINY_CONVERTED): $(FILELIST_STAMP)
|
|
@mkdir -p $(@D)
|
|
$(PYTHON) $(ROOT_PATH)/scripts/rtl/convt_sv2v.py $(RTL_FLIST) --output $@
|
|
$(PYTHON) $(ROOT_PATH)/scripts/rtl/filelist_deps.py $(RTL_FLIST) \
|
|
--target $@ --output $(TINY_DEPFILE)
|
|
|
|
ifeq ($(SIMU),VERILATOR)
|
|
$(SIM_BUILD_ROOT)/emu: $(FILELIST_STAMP) $(wildcard $(RTL_PATH)/dv/*.sv)
|
|
@mkdir -p $(SIM_BUILD_ROOT) $(CCACHE_TEMPDIR)
|
|
$(PYTHON) $(ROOT_PATH)/scripts/run_flow.py --tool verilator \
|
|
--log $(SIM_BUILD_ROOT)/compile.log --result $(SIM_BUILD_ROOT)/result-compile.json -- \
|
|
$(VERILATOR) --binary --timing --assert -j $(JOBS) --top-module $(RTL_TOP) \
|
|
-Wno-fatal --timescale 1ns/1ps --Mdir $(SIM_BUILD_ROOT)/obj_dir -o $(SIM_BUILD_ROOT)/emu \
|
|
$(RTL_FLIST) -f $(PDK_FILELIST) $(TINY_TB_FLIST)
|
|
$(PYTHON) $(ROOT_PATH)/scripts/rtl/filelist_deps.py $(RTL_FLIST) $(TINY_TB_FLIST) \
|
|
--target $@ --output $(TINY_DEPFILE)
|
|
comp: $(SIM_BUILD_ROOT)/emu
|
|
TINY_RUN := timeout --foreground $(SOC_SIM_TIME)s $(SIM_BUILD_ROOT)/emu
|
|
else
|
|
$(SIM_BUILD_ROOT)/simv: $(TINY_CONVERTED) $(wildcard $(RTL_PATH)/dv/*.sv)
|
|
$(PYTHON) $(ROOT_PATH)/scripts/run_flow.py --tool iverilog \
|
|
--log $(SIM_BUILD_ROOT)/compile.log --result $(SIM_BUILD_ROOT)/result-compile.json -- \
|
|
$(IVERILOG) -g2012 -gno-specify -s $(RTL_TOP) -o $@ -f $(GENERATED_FL_DIR)/def.fl \
|
|
-f $(GENERATED_FL_DIR)/inc.fl -f $(PDK_FILELIST) $(TINY_TB_FLIST) $(TINY_CONVERTED)
|
|
$(PYTHON) $(ROOT_PATH)/scripts/rtl/filelist_deps.py -f $(GENERATED_FL_DIR)/def.fl \
|
|
-f $(GENERATED_FL_DIR)/inc.fl $(TINY_TB_FLIST) \
|
|
--target $@ --output $(TINY_TB_DEPFILE)
|
|
comp: $(SIM_BUILD_ROOT)/simv
|
|
TINY_RUN := $(VVP) $(SIM_BUILD_ROOT)/simv
|
|
endif
|
|
|
|
rtl-lint: $(FILELIST_STAMP) | manifest
|
|
$(PYTHON) $(ROOT_PATH)/scripts/run_flow.py --tool rtl-lint \
|
|
--log $(TINY_LINT_LOG) --result $(VARIANT_ROOT)/lint/verilator/result-rtl-lint.json -- \
|
|
$(VERILATOR) --lint-only --timing --assert --timescale 1ns/1ps --Wall -Wno-fatal \
|
|
--top-module retrosoc_tiny_asic $(RTL_FLIST) -f $(PDK_FILELIST)
|
|
check-rtl-lint: rtl-lint
|
|
$(PYTHON) $(ROOT_PATH)/scripts/analyze_warnings.py check --root $(ROOT_PATH) \
|
|
--profile $(PROFILE_NAME) --variant-root $(VARIANT_ROOT) --tool rtl-lint \
|
|
--output $(META_DIR)/rtl-lint-warnings.json
|
|
|
|
sim: comp firmware | manifest
|
|
$(PYTHON) $(ROOT_PATH)/scripts/run_flow.py --tool $(SIM_TOOL_NAME)-sim \
|
|
--log $(SIM_BUILD_ROOT)/sim.log --result $(SIM_BUILD_ROOT)/result-sim.json -- \
|
|
$(TINY_RUN) +firmware=$(SW_BUILD_DIR)/$(SIM_FIRMWARE_NAME).hex +max_cycles=$(TINY_SIM_TIMEOUT) $(TINY_SIM_ARGS)
|
|
$(PYTHON) $(ROOT_PATH)/scripts/check_simulation.py --log $(SIM_BUILD_ROOT)/sim.log \
|
|
--result $(SIM_BUILD_ROOT)/result-sim-check.json --require '$(SIM_SUCCESS_MARKER)'
|
|
|
|
netcomp: $(FILELIST_STAMP)
|
|
@mkdir -p $(NETLIST_SIM_ROOT)
|
|
$(PYTHON) $(ROOT_PATH)/scripts/run_flow.py --tool iverilog \
|
|
--log $(NETLIST_SIM_ROOT)/compile.log --result $(NETLIST_SIM_ROOT)/result-compile.json -- \
|
|
$(IVERILOG) -g2012 -gno-specify -DRETROSOC_SOC__TINY_NETLIST -s $(RTL_TOP) -o $(NETLIST_SIM_ROOT)/simv \
|
|
-f $(GENERATED_FL_DIR)/def.fl -f $(GENERATED_FL_DIR)/inc.fl -f $(PDK_FILELIST) \
|
|
$(TINY_TB_FLIST) $(NETLIST_PATH)
|
|
netsim: netcomp firmware | manifest
|
|
$(PYTHON) $(ROOT_PATH)/scripts/run_flow.py --tool iverilog-sim \
|
|
--log $(NETLIST_SIM_ROOT)/sim.log --result $(NETLIST_SIM_ROOT)/result-sim.json -- \
|
|
$(VVP) $(NETLIST_SIM_ROOT)/simv +firmware=$(SW_BUILD_DIR)/$(SIM_FIRMWARE_NAME).hex +max_cycles=$(TINY_SIM_TIMEOUT)
|
|
$(PYTHON) $(ROOT_PATH)/scripts/check_simulation.py --log $(NETLIST_SIM_ROOT)/sim.log \
|
|
--result $(NETLIST_SIM_ROOT)/result-sim-check.json --require '$(SIM_SUCCESS_MARKER)'
|
|
|
|
.PHONY: generate_filelist memory-map pin-map soc-topology user-extensions archinfo-metadata \
|
|
check-memory-map check-pin-map check-soc-topology check-clock-reset-domains comp sim \
|
|
rtl-lint check-rtl-lint netcomp netsim netsim-boot
|
|
|
|
TINY_BOOT_ELF := $(SW_BUILD_DIR)/tiny_boot.elf
|
|
$(TINY_BOOT_ELF): $(ROOT_PATH)/app/asm/tiny_boot.S $(FILELIST_STAMP)
|
|
@mkdir -p $(SW_BUILD_DIR)
|
|
$(CC) -march=rv32im_zicsr -mabi=ilp32 -nostdlib -I$(MEMORY_MAP_C_DIR) -I$(SOC_TOPOLOGY_INCLUDE_DIR) \
|
|
-Wl,-Ttext=0x0,--entry=_start,--build-id=none -o $@ $<
|
|
$(OBJC) -O verilog $@ $(SW_BUILD_DIR)/tiny_boot.hex
|
|
$(OBJC) -O binary $@ $(SW_BUILD_DIR)/tiny_boot.bin
|
|
|
|
tiny-boot-image: $(TINY_BOOT_ELF)
|
|
netsim-boot: netcomp tiny-boot-image | manifest
|
|
$(PYTHON) $(ROOT_PATH)/scripts/run_flow.py --tool iverilog-sim \
|
|
--log $(NETLIST_SIM_ROOT)/sim.log --result $(NETLIST_SIM_ROOT)/result-sim.json -- \
|
|
$(VVP) $(NETLIST_SIM_ROOT)/simv +firmware=$(SW_BUILD_DIR)/tiny_boot.hex +max_cycles=100000
|
|
$(PYTHON) $(ROOT_PATH)/scripts/check_simulation.py --log $(NETLIST_SIM_ROOT)/sim.log \
|
|
--result $(NETLIST_SIM_ROOT)/result-sim-check.json --require 'SIM_TEST_PASS'
|
|
|
|
.PHONY: tiny-boot-image
|
|
|
|
# R2-P1 verification image: normal APP selection and the flat linker stay intact.
|
|
# Image creation always compiles and snapshots inputs before retaining a binary.
|
|
# Simulation rebuilds its model once, then replays the same image three times.
|
|
TINY_BASELINE_TOOL := $(ROOT_PATH)/scripts/tiny_r2_baseline.py
|
|
TINY_BASELINE_HEX ?=
|
|
TINY_BASELINE_MAX_CYCLES ?= 100000000
|
|
|
|
tiny-r2-baseline-image: firmware
|
|
$(PYTHON) $(TINY_BASELINE_TOOL) --root $(ROOT_PATH) --variant-root $(VARIANT_ROOT) image \
|
|
--objcopy $(OBJC) --objdump $(DUMP) --nm $(CROSS)nm --size $(CROSS)size -- \
|
|
$(CC) $(CFLAGS) $(INC_PATH) $(CRT_SRCS) $(ROOT_PATH)/app/apps/ci_smoke/tiny_baseline.c
|
|
|
|
tiny-r2-baseline-sim: | manifest
|
|
$(PYTHON) $(TINY_BASELINE_TOOL) --root $(ROOT_PATH) --variant-root $(VARIANT_ROOT) simulate \
|
|
--simulator $(SIM_TOOL_NAME) --vvp $(VVP) --timeout $(SOC_SIM_TIME) --jobs $(JOBS) \
|
|
--max-cycles $(TINY_BASELINE_MAX_CYCLES) $(if $(TINY_BASELINE_HEX),--hex $(TINY_BASELINE_HEX)) -- \
|
|
make --no-print-directory -j1 -B CONFIG=$(CONFIG_PATH) BUILD_TIMESTAMP=$(BUILD_TIMESTAMP) \
|
|
$(foreach var,$(CONFIG_KEY_VARS),$(var)=$($(var))) SIMU=$(SIMU) SYNTH=NONE STA=NONE comp
|
|
|
|
tiny-r2-baseline-report:
|
|
$(PYTHON) $(TINY_BASELINE_TOOL) --root $(ROOT_PATH) --variant-root $(VARIANT_ROOT) report
|
|
|
|
.PHONY: tiny-r2-baseline-image tiny-r2-baseline-sim tiny-r2-baseline-report
|
|
|
|
# Independent P3 experiment protocol; never rewrite or relabel a P1 image.
|
|
TINY_P3_TOOL := $(ROOT_PATH)/scripts/tiny_r2_p3.py
|
|
TINY_P3_IMAGE ?=
|
|
TINY_P3_RESUME ?= NO
|
|
tiny-r2-p3-image: firmware
|
|
$(PYTHON) $(TINY_P3_TOOL) --root $(ROOT_PATH) --variant-root $(VARIANT_ROOT) image -- \
|
|
$(CC) $(CFLAGS) $(INC_PATH) $(CRT_SRCS) \
|
|
$(ROOT_PATH)/app/apps/ci_smoke/tiny_r2_p3.c $(ROOT_PATH)/app/apps/ci_smoke/tiny_r2_p3_isa.S
|
|
|
|
tiny-r2-p3-sim: | manifest
|
|
$(PYTHON) $(TINY_P3_TOOL) --root $(ROOT_PATH) --variant-root $(VARIANT_ROOT) simulate \
|
|
--simulator $(SIM_TOOL_NAME) --timeout $(SOC_SIM_TIME) --jobs $(JOBS) \
|
|
$(if $(TINY_P3_IMAGE),--image $(TINY_P3_IMAGE)) -- \
|
|
make --no-print-directory -j1 -B CONFIG=$(CONFIG_PATH) BUILD_TIMESTAMP=$(BUILD_TIMESTAMP) \
|
|
$(foreach var,$(CONFIG_KEY_VARS),$(var)=$($(var))) SIMU=$(SIMU) SYNTH=NONE STA=NONE comp
|
|
|
|
tiny-r2-p3-matrix: | manifest
|
|
$(PYTHON) $(TINY_P3_TOOL) --root $(ROOT_PATH) --variant-root $(VARIANT_ROOT) matrix \
|
|
--timestamp $(BUILD_TIMESTAMP) --timeout $(SOC_SIM_TIME) --jobs $(JOBS) \
|
|
$(if $(filter YES,$(TINY_P3_RESUME)),--resume)
|
|
|
|
tiny-r2-p3-report:
|
|
$(PYTHON) $(TINY_P3_TOOL) --root $(ROOT_PATH) --variant-root $(VARIANT_ROOT) report
|
|
|
|
.PHONY: tiny-r2-p3-image tiny-r2-p3-sim tiny-r2-p3-matrix tiny-r2-p3-report
|
|
|
|
# P4 preserves old image identity and replays each selected image exactly once.
|
|
TINY_P4_REFERENCE ?=
|
|
TINY_P4_CASES ?= perf-o2-plain-flat,perf-o2-plain-banked
|
|
tiny-r2-p4-replay: | manifest
|
|
$(PYTHON) $(ROOT_PATH)/scripts/tiny_r2_p4.py --root $(ROOT_PATH) --variant-root $(VARIANT_ROOT) \
|
|
--reference $(TINY_P4_REFERENCE) --cases $(TINY_P4_CASES) --simulator $(SIM_TOOL_NAME) \
|
|
--vvp $(VVP) --timeout $(SOC_SIM_TIME) -- \
|
|
make --no-print-directory -j1 -B CONFIG=$(CONFIG_PATH) BUILD_TIMESTAMP=$(BUILD_TIMESTAMP) \
|
|
$(foreach var,$(CONFIG_KEY_VARS),$(var)=$($(var))) SIMU=$(SIMU) SYNTH=NONE STA=NONE comp
|
|
|
|
tiny-r2-p4-report:
|
|
$(PYTHON) $(ROOT_PATH)/scripts/tiny_r2_p4.py --root $(ROOT_PATH) --variant-root $(VARIANT_ROOT) --report
|
|
|
|
.PHONY: tiny-r2-p4-replay tiny-r2-p4-report
|
|
|
|
# P5 compares the same P3 binaries to retained P4 observations, with its own
|
|
# phase identity and evidence root. The historical P3/P4 commands stay intact.
|
|
TINY_P5_REFERENCE ?=
|
|
TINY_P5_CASES ?= perf-o2-plain-flat,perf-o2-plain-banked
|
|
tiny-r2-p5-replay: | manifest
|
|
$(PYTHON) $(ROOT_PATH)/scripts/tiny_r2_p5.py --root $(ROOT_PATH) --variant-root $(VARIANT_ROOT) \
|
|
--reference $(TINY_P5_REFERENCE) --cases $(TINY_P5_CASES) --simulator $(SIM_TOOL_NAME) \
|
|
--vvp $(VVP) --timeout $(SOC_SIM_TIME) -- \
|
|
make --no-print-directory -j1 -B CONFIG=$(CONFIG_PATH) BUILD_TIMESTAMP=$(BUILD_TIMESTAMP) \
|
|
$(foreach var,$(CONFIG_KEY_VARS),$(var)=$($(var))) SIMU=$(SIMU) SYNTH=NONE STA=NONE comp
|
|
|
|
tiny-r2-p5-report:
|
|
$(PYTHON) $(ROOT_PATH)/scripts/tiny_r2_p5.py --root $(ROOT_PATH) --variant-root $(VARIANT_ROOT) --report
|
|
|
|
.PHONY: tiny-r2-p5-replay tiny-r2-p5-report |