Roadmap
Current Status — v6 (GPU / AIPU vector ALU)
| Suite | Tests | Status |
|---|---|---|
| Regression (tb_server_dispatch_unit) | 15 | PASS |
| MOESI integration (tb_moesi_integration) | 3 | 1 PASS / 2 FAIL — BUG-006 open |
| Total | 18 | 16 PASS / 2 FAIL |
Both results are unchanged from the pre-split v4 baseline — see chiplets.md.
Run both suites: ./run_sims.command
Completed
- RV32IM assembler (
scripts/riscv_asm.py) — real mnemonics, labels, pseudo-ops, and NPU/GPU custom-opcode pseudo-instructions, replacing hand-computed hex in.asmtest files. Testbench now always dumps the full register file after halt ([OUTPUT]section), not just checked registers, so a program's actual output is visible without needing assertions. Found and fixed BUG-008 (BLT/BGE/BLTU/BGEU used the wrong ALU op) and BUG-009 (taken branch/JAL/JALR's delay-slot instruction executed once before being flushed) while building the first assembler-generated regression test; also found and fixed BUG-010 and documented (but left open, cosmetic) BUG-011, both instances of hand-encoded hex silently disagreeing with its own comment. See toolchain.md. - GPU / AIPU internal micro-architecture — minimum viable 16-lane INT32 vector ALU (ADD/SUB/AND/XOR), restored the previously-reserved NoC routing slot (custom-0,
0x57). See gpu.md. - Chiplet disaggregation + UCIe —
system_topsplit intobase_die_top/cpu_chiplet_top/npu_chiplet_top, connected by modeled UCIe links (link training + credit-based channels). Found and fixed BUG-007 (halt detection race exposed by decoupling network ingestion from CPU stall). See chiplets.md. - RV32IM ALU — MUL (3-cycle), DIV/DIVU/REM/REMU (34-cycle iterative)
- NoC router replacing SDU —
cpu_acceptsingle-pulse write protocol - L2 write-back cache — 4-way, 16 sets, 8-word lines, 2 KiB, burst fill
- NPU INT16 mixed-precision —
SET_PRECcommand, data at [31:18] - NPU ping-pong weight banks —
SWAPcommand, zero-bubble tile reuse - MOESI coherency controller — 2-master (CPU + NPU DMA), M→S flush
- MOESI integration testbench — TC-MOESI-1/2/3
- Structured issue log —
docs/issues/
Near-term
- Fix BUG-006 — TC-MOESI-1/TC-MOESI-2 fail again (NPU DMA reads 0 instead of the CPU-written value) despite the BUG-003
ST_NPU_GAPfix already being present induck_coherency_ctrl.sv. Needs waveform-level investigation; seedocs/issues/BUG-006.md. Roadblocked after two automated runs — parked indocs/unsolved/UNSOLVED-001.mdfor a human to fix on a branch. - GPU vector ALU: more ops — v1 covers ADD/SUB/AND/XOR; a real vector ALU would add OR, shifts, and min/max/compare (useful for future NoC-level reductions).
- Wireless peripheral driver — packages NPU result frames and transmits to remote displays. Currently a no-op output port.
- Multi-word NPU DMA — current DMA port reads one word at a time. Extend to burst-load a full weight tile (256 words) in a single DMA transaction.
- Formal verification of MOESI FSM — use
sby(SymbiYosys) to prove the FSM never deadlocks and thatnpu_dma_ackpulses exactly once per request. - MULHSU/MULHU — the only two RV32M instructions the ALU doesn't implement (
alu_controlis a full 4 bits with all 16 codes already assigned). See reference.md#known-isa-gaps. - Disassembler — the inverse of
scripts/riscv_asm.py: hex/.hexfile → readable assembly with resolved labels, for debugging register-dump output or an unfamiliar.asmfixture without hand-decoding bit fields. - ECALL-based console I/O — a couple of syscall numbers in
a7(print-int, print-char) decoded directly inriscv_core.sv's EX stage and surfaced as a new top-level signal (same pattern as the existinghaltoutput), so simple programs can print without touching the memory/coherency path at all. Much lower risk than the MMIO console below — worth doing first.
Medium-term
- Convolution support in NPU — add im2col pre-processing so the MAC array can be reused for conv layers without software tiling.
- Out-of-order execution for CPU — scoreboard + register rename for the RV32IM core; needed when DIV latency stalls block shorter downstream instructions.
- FPGA synthesis target — map
pe.svMAC cells to DSP48 slices on Xilinx/Intel. Add timing constraints and a place-and-route Makefile target. - Multi-master DRAM arbiter — right now CPU has strict priority over NPU DMA. Add a fair arbiter (round-robin or weighted) to prevent NPU DMA starvation under heavy CPU miss traffic.
- Memory-mapped console/UART — a real
sw-to-an-address console needs an uncacheable-address range recognized byl2_cache.sv/duck_coherency_ctrl.sv(otherwise a "print" write just sits dirty in the write-back L2 until eviction, instead of being visible immediately). Deferred until BUG-006 — already open in that exact subsystem — is resolved, to avoid compounding an unresolved coherency bug with a new feature in the same code.
Long-term
- Multi-core CPU cluster — 2–4 RV32IM cores sharing the MOESI L2. Extend
duck_coherency_ctrlto a full directory-based protocol (MESI or MESIF) with per-core snoop ports. - Full DLA-style pipeline — add conv/pool/activation/normalise stages after the MAC array, inspired by NVDLA's convolution buffer architecture.
- Network-on-chip (NoC) mesh — replace the current single-router NoC with a 2D mesh topology for multi-tile scaling.
- OpenLane tape-out — run the RTL through the OpenLane/Sky130 flow to get area, power, and timing numbers on a real process node.