
This project is a TinyQV RISC-V SoC wrapped for Tiny Tapeout with a Wishbone interconnect.
Main blocks:
TinyQV/*)TinyQV/wb_bridge.v) from CPU data bus to peripheralsPeripherals/GPIO/*)Peripherals/UART16550/*)The top-level module is tt_um_TSARKA_TinyQV in src/project.v.
Top-level pin behavior:
ui[7] is the UART RX input.uio[7:0] carry the QSPI flash/RAM interface.uo[0] always mirrors UART TX.ui[0] selects the visible uo[7:1] bank:
0: uo[7:1] show gpio_out[7:1]1: uo[7:2] show fixed debug/status signals and uo[1] shows one selected debug probeui[4:1] select which debug probe is driven onto uo[1] while still feeding the GPIO input peripheral.ui[1:0] also act as the external interrupt request inputs consumed by the core.Debug-mode output map:
uo[7] = interrupt_pendinguo[6] = data_readyuo[5] = fetch_restartuo[4] = branchuo[3] = instr_readyuo[2] = instr_completeuo[1] = debug_bus[ui[4:1]]uo[0] = uart_txThe 16-entry selectable debug probe bus is:
0: instr_complete1: instr_ready2: instr_valid3: fetch_restart4: data_ready5: interrupt_pending6: branch7: gpio_irq8: early_branch9: ret10: reg_wen11: counter_012: data_continue13: stall_txn14: stop_txn15: uart_irqClocking:
clock_hz: 40000000 in info.yaml).CLOCK_PERIOD: 25 ns in src/config.json).6x2 Tiny Tapeout macro because the
full TinyQV + Wishbone + UART16550 + GPIO SoC does not fit in a single tile.Run RTL verification locally with cocotb + Icarus:
python3 -m venv test/.venv
. test/.venv/bin/activate
pip install -r test/requirements.txt
make firmware
make test-golden
make test-rtl
make test-comprehensive
make synth-gate-netlist
make test-gatelevel-smoke
make test-gatelevel
Current tests cover:
1/2/3, fixed-seed randomized ALU and memory stress, and full-program firmware sweeps on the stable lower latenciesUseful verification targets:
make test-firmware
make stage-gate-netlist
make test-gatelevel
make test-rtl-seeds
make test-comprehensive-seeds
make test-firmware-seeds
make test-gatelevel-smoke
make test-gatelevel-smoke-seeds
Notes:
make test-gatelevel-smoke is the quick local confidence pass.make test-gatelevel is the deeper signoff-oriented pass and is intentionally much slower.gds gl_test job is intended to exercise the deep signoff-style gate-level flow, not only the smoke checks.CI signoff is wired through repo-level targets in Makefile and the workflow files under .github/workflows/.
Optional external hardware for bring-up/demo:
ui[7] as UART RX input to SoCuo[0] as UART TX output from SoCuio[7:0] pins as documented in info.yaml pinout.ui[7:0] / uo[7:0].ui[0] to flip between GPIO view and debug view on uo[7:1].ui[4:1] to step through the 16 debug probes exposed on uo[1] in debug mode.| # | Input | Output | Bidirectional |
|---|---|---|---|
| 0 | GPIO IN[0] / ext IRQ0 / uo mode select (0=GPIO, 1=debug) | UART TX (always) | QSPI Flash CS |
| 1 | GPIO IN[1] / ext IRQ1 / debug probe select bit 0 | GPIO OUT[1] / selected debug probe in debug mode | QSPI SD0 |
| 2 | GPIO IN[2] / debug probe select bit 1 | GPIO OUT[2] / DEBUG instr_complete | QSPI SD1 |
| 3 | GPIO IN[3] / debug probe select bit 2 | GPIO OUT[3] / DEBUG instr_ready | QSPI SCK |
| 4 | GPIO IN[4] / debug probe select bit 3 | GPIO OUT[4] / DEBUG branch | QSPI SD2 |
| 5 | GPIO IN[5] | GPIO OUT[5] / DEBUG fetch_restart | QSPI SD3 |
| 6 | GPIO IN[6] | GPIO OUT[6] / DEBUG data_ready | QSPI RAM A CS |
| 7 | GPIO IN[7] / UART RX | GPIO OUT[7] / DEBUG interrupt_pending | QSPI RAM B CS |