# rtl/dmac EE DMAC. Matches `docs/contracts/dmac.md`. ## Wave 2 / Wave 2.5 contents - `dmac_reg_stub.sv` — channel-2-focused register shell + single-transfer state machine. Wave 2.5 revision is memory-backed: DMAC now issues real memory reads via the `mem_rd_*` port (connected directly to `ee_ram_stub` in the current topology; routing through `ee_memory_map_stub` is deferred). State flow: IDLE → FETCH_WAIT → ACTIVE_SEND → DONE. MADR is the real fetch source address. See `docs/wave25_memory_backed_dma_plan.md`. **EE-core chapter 3** added a CPU write path: the EE memory map's new `ee_dmac_ch2_wr_*` port drives `reg_wr_en` / `reg_offset` / `reg_wr_data`, so the EE core can program MADR/QWC/CHCR from a MIPS bootstrap via `SW`. **EE-core chapter 4** added a CPU read path (`reg_rd_en` / `reg_rd_data` / `reg_rd_valid`, 1-cycle latency) plus a DONE_COUNT monotonic counter at offset 0x40. CHCR/MADR/QWC/TADR read back their stored values; DONE_COUNT increments each time the state machine enters S_DONE. The EE map forwards CPU reads in the same DMAC window through a new `ee_dmac_ch2_rd_*` pair, so software can now poll CHCR.start or compare DONE_COUNT before/after a transfer without needing INTC. ## Explicit non-goals (Wave 2 / 2.5) - Multi-channel arbitration or fairness. - Chain mode (normal / chain / interleaved transfer modes). - Stall / ring / suspend semantics. - Interrupt routing to INTC. - QWC > 1 multi-beat transfers (state machine is shaped for it; initial signoff is QWC == 1 per Wave 2.5 plan). - Routing through `ee_memory_map_stub` (current topology is direct to `ee_ram_stub`). Each of these is a future-wave concern, not a stub-plan shortcut.