AXI DMA is a general purpose direct memory access IP using AXI4 AMBA interface with the following features:
- AXI4-Lite
Slave
interface to program the CSRs (Control and Status registers) - AXI4
Master
interface to fetch/read and write data - Support for unaligned xfers (see below)
- Configurable number of descriptors (default to 2)
- Abort processing available
- Transfers up to 4GB of data per descriptor
- Two modes of data access, Fixed [FIFO] and Incremental
- Programmable number of bursts, to support simpler slaves
- Status of error during DMA operation
- Configurable
bus width
option between 32-bit / 64-bit
Read the microarchitecture section to understand the unaligned access restriction.
This repository contains a set of tests implementing different types of scenarios using the AXI DMA
. The tests were developed using Cocotb project and Verilator. The list of tests can be found here. To run all the tests and generate the waveforms, please run the following command, the only requirements are make
and docker
.
make run
Once finished, you should be able to open the logs and the generated waveforms at run_dir
. This project makes use of Rggen project for CSR generation and the input file is the csr_dma.xlsx
excel sheet.
Here is listed all the tests that were implemented to check the DMA features. Although it does not check all possible combinations, it covers most of the basic usage and possible options. The variants
are the additional runs of the same tests but with different scenarios like idle cycles and backpressure on the bus. For the Flavors
, there are three types which 32b maps to AXI_ADDR/DATA_WIDTH == 32 bits
and 64b to AXI_ADDR_WIDTH == 32 bits
/ AXI_DATA_WIDTH == 64 bits
, the small
flavor stands for a reduced dma 32b version with 8x beats burst, non-support for unaligned txns and no max burst control.
No | Test name | Quick description | Variants | Flavor |
---|---|---|---|---|
1 | test_dma_csrs | Run some simple write/read in the RW CSRs | idle_inserter/backpressure_inserter | 32b/64b/small |
2 | test_dma_single_desc | Move 4KB of data using a single descriptor | idle_inserter/backpressure_inserter | 32b/64b/small |
3 | test_dma_full_desc | Programs all descriptors with different addresses | idle_inserter/backpressure_inserter | 32b/64b/small |
4 | test_dma_abort | Assert the abort CSR during DMA operation | -- | 32b/64b/small |
5 | test_dma_max_burst | Configures all possible bursts through the DMA | -- | 32b/64b/small |
6 | test_dma_error | Checks if AXI error was captured correctly | -- | 32b/64b/small |
7 | test_dma_modes | Check for the different running modes / INCR/FIXED | -- | 32b/64b/small |
8 | test_dma_unaligned | Test different unaligned addresses in the descriptors. | -- | 32b/64b |
The AXI DMA
microarchitecture is quite simple without anything complex to understand, the design is divided in two main flows, read and write data path. The block in violet is auto-generated using Rggen and it contains all the CSRs used and the other modules are original designs.
Starting by the DMA FSM
, it controls the managing of processing all the descriptors by the Streamers
, thus dispatching new ones as soon as it each streamers finishes with the transfer. The streamers
are responsible for breaking the transactions into multiple AXI
transfers respecting the protocol as 4KB address boundary or the numbers of bursts per burst type, i.e 16-FIFO / 256-INCR. On the Master AXI I/F
, it waits for requests from the streamers
and if available, it tries to dispatch through the correspondent address channel till the maximum of outstanding transfers defined in the included file (rd/wr).
As the main buffer for the data that is read and written through the DMA, the FIFO
can be configured to any size in depth with width
equal to the AXI data bus width.
Although the DMA can be programmed with unaligned source/dest addresses, the support for unaligned is limited to the bus width i.e the smallest xfer through rd/wr channel must match the defined AXI bus width and internal masking will be applied to match the source/dest addresses. Thus it is up to the user to correctly program the descriptors considering symmetric alignment in the src/dest address. This is a design decision to simplify the interface between the modules and fine grain memory moving can usually be done by CPUs instead of a DMA.
For more details on the CSRs like address and access policy, please read the generated file available at CSR list.
AXI DMA
is licensed under the permissive MIT license. Please refer to the LICENSE file for details.