Files
retroSoC/rtl/tiny/Makefile
T
maksyuki 952b060a70 feat(tiny): integrate P6 shared IP and eight-channel DMA
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.
2026-10-12 21:43:30 +08:00

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