Skip to content
WIP: parts of this documentation are AI-generated and may contain factual errors.

iDMA

What iDMA Is

iDMA moves data between memories and peripherals across different bus protocols (AXI, OBI, TileLink) and supports multi-dimensional transfers. It splits the problem into three layers so you can mix and match integration styles without changing the core engine.

  • Frontend: software-visible interface for requests (selectable register interface, Snitch ISA, descriptor rings).
  • Midend: optional ND/RT decomposition and multicore split.
  • Backend: protocol execution on the bus, with optional on-the-fly compute.

Architecture Overview

Start Here

If you are integrating iDMA into an SoC, read these in order:

If you are deep-diving the design:

Supported Protocols

The backend supports these protocols via protocol_e in idma_pkg.sv:

Enum ValueProtocolDescriptionTypical Use
0AXIFull AXI4Main memory, high bandwidth
1OBIOBISimple peripherals, low area
2AXILITEAXI4-LiteRegister access
3TILELINKTileLink-UHTL-based SoCs (via TLToAXI4)
4INITInit protocolEfficient zeroing (Occamy)
5AXI_STREAMAXI StreamStreaming endpoints

On-the-Fly Compute

The backend can optionally transform data as it moves, in the transport datapath, with no extra memory traffic. One operation is applied per transfer:

  • Transpose: tiled matrix transpose (idma_otf_transpose).
  • MX quantize / dequantize: OCP microscaling between FP32/FP16 and MXFP8 (E5M2 elements with an E8M0-labelled block scale, 32-element / 33 B blocks). These are size-changing transfers, legalized in the legalizer.

Enabled via EnableCompute plus a per-op ComputeOps mask. See Compute.

Code Generation (High Level)

iDMA uses the MARIO generator to produce protocol-specific RTL from templates and YAML capability databases. This is how a single codebase produces many backend variants.

Key locations:

  • src/db/*.yml - protocol capability databases
  • src/backend/tpl/ - backend templates
  • src/frontend/reg/tpl/ - register frontend templates
  • util/gen_idma.py - generator entry point
  • util/mario/ - generator modules

Where to Find Details