Files
retroSoC/rtl/tiny/integration/clock_reset_domains.json
T
maksyuki 31daf3e84c feat(spi): implement SPI-P3 Tiny GPIO RCU and SDK integration
Integrate the SPI-P2 shared-DMA ABI into the Tiny product: SPI0 at
0x1001D000 with IRQ25 and RCU target16, the four frozen Gen1 ALT routes,
latched four-bit source qualification through the fabric and APB CDC, GPIO
readiness/ownership guard, and the bounded rs_spi_* HAL with the
TINY_SPI_P3_ACCEPTANCE ci_smoke image. Tiny DMA enables V2.2 requests 16/17
with exact fixed FIFO MMIO checks; Mini remains default-disabled and
unchanged. Review closure: the DMA AXI4 master stages the origin channel with
each burst so final and contended SPI alias bursts stay qualified, the RCU
spare feedback bit is tied off for four-state simulators, and the
clock-switch quiescence now includes the SPI session.

Validation: full Pytest 2097 passed, 0 failed, 1 skipped (optional pypdf);
both Tiny profiles pass the SPI-P3 Verilator acceptance (SIM_TEST_PASS
cycles=1030088); R2-P7 Verilator acceptance, Mini DMA formal prove and
cover, Mini/Tiny lint, Tiny Yosys synthesis, netsim-boot and OpenSTA pass;
C format/policy/host tests and RTL format/style checks clean. Evidence and
remaining obligations are recorded in docs/ip/spi-verification.md.

Tiny Icarus behavioral remains blocked by the pre-existing observer/sv2v
defect (routed to the R2 DV owners); Mini smoke synthesis host timeout is
skipped per maintainer decision. Human phase acceptance and SPI-P4/P5
remain outstanding; phase_accepted stays false.
2026-10-22 11:57:29 +08:00

497 lines
16 KiB
JSON

{
"schema_version": 2,
"external_fabric": {
"phase": "TINY-R2-P7",
"clock_domain": "system",
"target_controllers": "u_soc.u_fabric.gen_target[%d].u_controller",
"target_count": 29,
"apb_bridges": "SYS frontends; acknowledged per-endpoint crossings to AON, PCLK and MEM",
"fabric_reset": "fabric leaf; target reset blocks admission and aborts accepted target work with DECERR",
"hart_reset": "CPU-only accepted-work drain; DMA and all target responses stay active",
"runtime_peripheral_reset": "RCU blocks admissions, drains accepted work, holds reset for five local edges, waits for local release and bus barriers"
},
"local_memory": {
"phase": "TINY-R2-P4",
"clock_domain": "system",
"cpu_instance": "u_soc.u_cpu.u_hazard3_cpu_2port",
"frontend_instance": "u_soc.u_cpu_mem",
"macro_instance": "u_soc.u_sram.gen_group[{group}].u_group.gen_bank[{bank}].u_ram.u_mem",
"groups": 4,
"macros_per_group": 8,
"hart_reset": "halt then drain accepted I/D and slow responses; SRAM/DMA stay active",
"main_sram_payload_reset": "none",
"local_uncontended_max_cycles": 3
},
"reset_ports": [
"ext_rst_n_i_pad",
"jtag_trst_n_i_pad"
],
"domains": [
{
"name": "aon",
"clock": "s_ref_clk",
"reset": "ref_rst_n_o",
"reset_source": "rst_n_i",
"reset_primitive": "rst_sync",
"path": "rtl/tiny/top/tiny_clock_reset_subsystem.sv",
"instance": "u_ref_rst",
"sta": {
"source_port": "extclk_i_pad",
"pin": "u_clock_buffer/clk_o",
"period_ns": 41.666666667,
"async_group": "core"
}
},
{
"name": "system",
"clock": "s_backend_sys_clk",
"reset": "system_rst_n_o",
"reset_source": "s_system_req_n",
"reset_primitive": "rst_sync",
"path": "rtl/tiny/top/tiny_reset_tree.sv",
"instance": "u_system_rst_sync",
"sta": {
"source_domain": "aon",
"pin": "u_soc.u_clock_backend.u_sys_mux/clk_o",
"period_ns": 41.666666667,
"async_group": "core"
}
},
{
"name": "memory",
"clock": "s_backend_mem_clk",
"reset": "s_backend_mem_rst_n",
"reset_source": "rst_n_i",
"reset_primitive": "rst_sync",
"path": "rtl/tiny/top/tiny_clock_reset_subsystem.sv",
"instance": "u_mem_rst",
"sta": {
"source_domain": "system",
"pin": "u_soc.u_clock_backend.u_mem_mux/clk_o",
"period_ns": 41.666666667,
"async_group": "core"
}
},
{
"name": "peripheral",
"clock": "s_backend_pclk",
"reset": "pclk_rst_n_o",
"reset_source": "rst_n_i",
"reset_primitive": "rst_sync",
"path": "rtl/tiny/top/tiny_clock_reset_subsystem.sv",
"instance": "u_pclk_rst",
"sta": {
"source_domain": "system",
"pin": "u_soc.u_clock_backend.u_pclk_mux/clk_o",
"period_ns": 41.666666667,
"async_group": "core"
}
},
{
"name": "jtag",
"clock": "s_jtag_tck_buf",
"reset": "s_jtag_trst_n_sync",
"reset_source": "jtag_trst_n_i",
"reset_primitive": "rst_sync",
"path": "rtl/ip/core/mgmt_debug_wrapper.sv",
"instance": "u_jtag_rst_sync",
"sta": {
"source_port": "jtag_tck_i_pad",
"object_type": "port",
"period_ns": 100,
"async_group": "jtag"
}
},
{
"name": "audio",
"clock": "s_audio_clk",
"reset": "s_audio_rst_n",
"reset_source": "s_i2s_rst_n",
"reset_primitive": "rst_sync",
"path": "rtl/tiny/top/retrosoc_tiny.sv",
"instance": "u_audio_rst_sync",
"sta": {
"source_port": "gpio_17_io_pad",
"pin": "u_soc.u_audio_clock_buffer/clk_o",
"period_ns": 54.253472222,
"async_group": "audio"
}
},
{
"name": "dvp_pixel",
"clock": "dvp_pixel_clk",
"reset": "dvp_pixel_rst_n",
"reset_source": "gpio_20_io_pad",
"reset_primitive": "rst_sync",
"path": "rtl/ip/multimedia/axi4s_dvp.sv",
"instance": "u_dvp_pclk_rst_sync",
"sta": {
"source_port": "gpio_20_io_pad",
"object_type": "port",
"period_ns": 83.333333333,
"async_group": "dvp_pixel"
}
}
],
"reset_distribution": {
"release_edges": 5,
"por": "u_soc.u_reset_tree.u_por_rst_sync",
"system": "u_soc.u_reset_tree.u_system_rst_sync",
"system_source": "por_rst_n_o && !watchdog_reset_req_i && backend_reset_n_i",
"leaf_instance_pattern": "u_soc.u_reset_tree.gen_leaf[%d].u_leaf_rst_sync",
"leaf_names": [
"fabric",
"gpio",
"uart0",
"timer0",
"timer1",
"i2c0",
"xpi",
"dma",
"sysctrl",
"clint",
"sram",
"archinfo",
"pwm",
"rtc",
"wdg",
"rng",
"crc",
"ws2812",
"crypto",
"i2s",
"sdio",
"dvp",
"spi"
],
"cpu_prerequisite": "all global leaf resets and actual APB/DMA/XPI/RCU barriers; boot readiness latches until the next system reset",
"hart": "u_soc.u_cpu.u_mgmt_debug_wrapper.u_mgmt_debug_reset.u_core_rst_sync",
"jtag": "u_soc.u_cpu.u_mgmt_debug_wrapper.u_jtag_rst_sync",
"dmi": "u_soc.u_cpu.u_mgmt_debug_wrapper.u_dmi_rst_sync",
"watchdog_functional_reset": "REF24 five-edge release after backend retains the watchdog reset event; PCLK APB uses the wdg leaf",
"main_sram_payload_reset": "none",
"crypto": "six private macro banks; reset invalidates then scrubs/readbacks; CPU does not wait for READY",
"clock_domain": "domain-specific",
"peripheral": "tiny_peripheral_leaf; five running hold edges and five release edges; I2S additionally requires actual audio-side barrier readiness"
},
"crossings": [
{
"name": "debug_pclk_status",
"source": "system", "destination": "peripheral", "primitive": "cdc_sync",
"path": "rtl/tiny/top/retrosoc_tiny.sv", "instance": "u_debug_pclk_sync"
},
{
"name": "debug_aon_status",
"source": "system", "destination": "aon", "primitive": "cdc_sync",
"path": "rtl/tiny/top/retrosoc_tiny.sv", "instance": "u_debug_ref_sync"
},
{
"name": "rtc_wake",
"source": "aon", "destination": "system", "primitive": "cdc_sync",
"path": "rtl/tiny/top/retrosoc_tiny.sv", "instance": "u_rtc_wake_sync"
},
{
"name": "hart_reset_event",
"source": "system", "destination": "aon", "primitive": "cdc_2phase",
"path": "rtl/tiny/top/retrosoc_tiny.sv", "instance": "u_hart_event_cdc"
},
{
"name": "peripheral_interrupts",
"source": "peripheral", "destination": "system", "primitive": "cdc_sync",
"path": "rtl/tiny/top/retrosoc_tiny.sv", "instance": "u_irq_sync",
"notes": "sticky interrupt levels; this vector also contains AON/MEM and synchronous SYS bits"
},
{
"name": "wfi_permission",
"source": "aon", "destination": "system", "primitive": "cdc_sync",
"path": "rtl/tiny/top/retrosoc_tiny.sv", "instance": "u_wfi_gate_sync"
},
{
"name": "admission_block_system",
"source": "aon", "destination": "system", "primitive": "cdc_sync",
"path": "rtl/tiny/top/retrosoc_tiny.sv", "instance": "u_block_sys"
},
{
"name": "admission_block_dma",
"source": "aon", "destination": "peripheral", "primitive": "cdc_sync",
"path": "rtl/tiny/top/retrosoc_tiny.sv", "instance": "u_block_pclk"
},
{
"name": "gate_reset_disabled",
"source": "aon", "destination": "system", "primitive": "cdc_sync",
"path": "rtl/tiny/top/retrosoc_tiny.sv", "instance": "u_disabled_sync"
},
{
"name": "peripheral_idle",
"source": "peripheral", "destination": "aon", "primitive": "cdc_sync",
"path": "rtl/tiny/top/retrosoc_tiny.sv", "instance": "u_periph_idle_sync"
},
{
"name": "xpi_idle",
"source": "memory", "destination": "aon", "primitive": "cdc_sync",
"path": "rtl/tiny/top/retrosoc_tiny.sv", "instance": "u_xpi_idle_sync"
},
{
"name": "dma_ready",
"source": "peripheral", "destination": "system", "primitive": "cdc_sync",
"path": "rtl/tiny/top/retrosoc_tiny.sv", "instance": "u_dma_ready_sync"
},
{
"name": "dma_retirement",
"source": "peripheral", "destination": "system", "primitive": "cdc_sync",
"path": "rtl/tiny/top/retrosoc_tiny.sv", "instance": "u_dma_idle_sync"
},
{
"name": "fabric_retirement",
"source": "system", "destination": "aon", "primitive": "cdc_sync",
"path": "rtl/tiny/top/retrosoc_tiny.sv", "instance": "u_bus_idle_ref"
},
{
"name": "gate_acknowledgements",
"source": "peripheral", "destination": "aon", "primitive": "cdc_sync",
"path": "rtl/tiny/top/retrosoc_tiny.sv", "instance": "u_gate_feedback"
},
{
"name": "reset_hold_acknowledgements",
"source": "peripheral", "destination": "aon", "primitive": "cdc_sync",
"path": "rtl/tiny/top/retrosoc_tiny.sv", "instance": "u_held_feedback"
},
{
"name": "reset_release_acknowledgements",
"source": "system", "destination": "aon", "primitive": "cdc_sync",
"path": "rtl/tiny/top/retrosoc_tiny.sv", "instance": "u_ready_feedback"
},
{
"name": "debug_dmi",
"source": "jtag",
"destination": "system",
"primitive": "hazard3_apb_async_bridge",
"path": "rtl/managed/hazard3/hdl/debug/dtm/hazard3_jtag_dtm_core.v",
"instance": "inst_hazard3_apb_async_bridge"
},
{
"name": "xpi_mem_axi",
"source": "system",
"destination": "memory",
"primitive": "tiny_axi4_async_bridge",
"path": "rtl/tiny/top/retrosoc_tiny.sv",
"instance": "u_xpi_mem_cdc",
"source_reset": "s_fabric_rst_n",
"destination_reset": "s_xpi_rst_n",
"reset_semantics": "five-edge link release; source-owned held responses survive destination reset; drain remaining W before B and synthesize only missing R beats with DECERR; unfinished warm clear requires destination reset before re-admission"
},
{
"name": "debug_hard_reset",
"source": "jtag",
"destination": "system",
"primitive": "cdc_sync",
"path": "rtl/ip/core/mgmt_debug_wrapper.sv",
"instance": "u_dmihardreset_cdc_sync"
},
{
"name": "i2s_configuration",
"source": "peripheral",
"destination": "audio",
"primitive": "cdc_2phase",
"path": "rtl/ip/serial/apb4_i2s.sv",
"instance": "u_i2s_cfg_cdc"
},
{
"name": "i2s_commands",
"source": "peripheral",
"destination": "audio",
"primitive": "cdc_2phase",
"path": "rtl/ip/serial/apb4_i2s.sv",
"instance": "u_i2s_cmd_cdc"
},
{
"name": "i2s_tx_samples",
"source": "peripheral",
"destination": "audio",
"primitive": "cdc_fifo_warm_flush",
"path": "rtl/ip/serial/apb4_i2s.sv",
"instance": "u_tx_cdc_fifo"
},
{
"name": "i2s_rx_samples",
"source": "audio",
"destination": "peripheral",
"primitive": "cdc_fifo_warm_flush",
"path": "rtl/ip/serial/apb4_i2s.sv",
"instance": "u_rx_cdc_fifo"
},
{
"name": "i2s_tx_occupancy",
"source": "audio",
"destination": "peripheral",
"primitive": "cdc_2phase",
"path": "rtl/ip/serial/apb4_i2s.sv",
"instance": "u_tx_pop_cnt_cdc"
},
{
"name": "i2s_rx_occupancy",
"source": "audio",
"destination": "peripheral",
"primitive": "cdc_2phase",
"path": "rtl/ip/serial/apb4_i2s.sv",
"instance": "u_rx_push_cnt_cdc"
},
{
"name": "dvp_configuration",
"source": "peripheral",
"destination": "dvp_pixel",
"primitive": "cdc_2phase",
"path": "rtl/ip/multimedia/axi4s_dvp.sv",
"instance": "u_dvp_config_cdc"
},
{
"name": "dvp_commands",
"source": "peripheral",
"destination": "dvp_pixel",
"primitive": "cdc_2phase",
"path": "rtl/ip/multimedia/axi4s_dvp.sv",
"instance": "u_dvp_command_cdc"
},
{
"name": "dvp_error_clear",
"source": "peripheral",
"destination": "dvp_pixel",
"primitive": "cdc_2phase",
"path": "rtl/ip/multimedia/axi4s_dvp.sv",
"instance": "u_error_clear_cdc"
},
{
"name": "dvp_status",
"source": "dvp_pixel",
"destination": "peripheral",
"primitive": "cdc_2phase",
"path": "rtl/ip/multimedia/axi4s_dvp.sv",
"instance": "u_status_cdc"
},
{
"name": "dvp_errors",
"source": "dvp_pixel",
"destination": "peripheral",
"primitive": "cdc_2phase",
"path": "rtl/ip/multimedia/axi4s_dvp.sv",
"instance": "u_error_events_cdc"
},
{
"name": "dvp_payload",
"source": "dvp_pixel",
"destination": "peripheral",
"primitive": "cdc_fifo_warm_flush",
"path": "rtl/ip/multimedia/axi4s_dvp.sv",
"instance": "u_dvp_payload_fifo"
},
{
"name": "dvp_statistics",
"source": "dvp_pixel",
"destination": "peripheral",
"primitive": "cdc_2phase",
"path": "rtl/ip/multimedia/axi4s_dvp.sv",
"instance": "u_dvp_stats_cdc"
},
{
"name": "dma_axi",
"source": "peripheral",
"destination": "system",
"primitive": "tiny_axi4_async_bridge",
"path": "rtl/tiny/top/retrosoc_tiny.sv",
"instance": "u_dma_cdc",
"source_reset": "s_dma_rst_n",
"destination_reset": "s_fabric_rst_n",
"reset_semantics": "five-edge link release; source-owned held responses survive destination reset; drain remaining W before B and synthesize only missing R beats with DECERR; unfinished warm clear requires destination reset before re-admission"
},
{
"name": "rcu_commands",
"source": "system",
"destination": "aon",
"primitive": "tiny_apb_async_bridge",
"path": "rtl/tiny/top/tiny_sysctrl.sv",
"instance": "u_rcu_cdc"
},
{
"name": "system_rate",
"source": "aon",
"destination": "system",
"primitive": "cdc_2phase",
"path": "rtl/tiny/top/retrosoc_tiny.sv",
"instance": "u_sys_rate_cdc"
},
{
"name": "peripheral_rate",
"source": "aon",
"destination": "peripheral",
"primitive": "cdc_2phase",
"path": "rtl/tiny/top/retrosoc_tiny.sv",
"instance": "u_pclk_rate_cdc"
},
{
"name": "dma_done",
"source": "peripheral",
"destination": "memory",
"primitive": "cdc_2phase",
"path": "rtl/tiny/top/retrosoc_tiny.sv",
"instance": "u_dma_done_cdc"
},
{
"name": "xpi_requests",
"source": "memory",
"destination": "peripheral",
"primitive": "cdc_sync",
"path": "rtl/tiny/top/retrosoc_tiny.sv",
"instance": "u_xpi_stall_sync"
}
],
"clock_contract": "TINY-R2-P7",
"macros": {
"ics55_pll": {
"cell": "PLL_TOP",
"scope": "single RCU-owned macro; off after cold reset; selectors 5/7",
"active_clock_domain": true,
"qualification": "digital activity/rate qualification only; no analog LOCK or characterized timing arcs"
}
},
"generated_apb_crossings": {
"generator": "scripts/generate_tiny.py",
"template": "tiny_apb_bridges.svh",
"primitive": "tiny_apb_async_bridge",
"source": "system",
"destinations": {
"aon": [
"clint",
"archinfo"
],
"memory": [
"xpi"
],
"peripheral": [
"gpio",
"uart0",
"timer0",
"timer1",
"i2c0",
"dma",
"pwm",
"rtc",
"wdg",
"rng",
"crc",
"ws2812",
"crypto",
"i2s",
"dvp",
"spi"
]
},
"same_clock_isolation": [
"sdio"
],
"native_system": [
"sysctrl",
"sram"
]
}
}