Skip to content

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.
  • Midend: optional ND/RT decomposition.
  • Backend: protocol execution on the bus.

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

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/tpl/ — register frontend templates
  • util/gen_idma.py — generator entry point
  • util/mario/ — generator modules

Where to Find Details