Hello everyone,
I am trying to use Scatter-Gather (SG) mode of the AXI DMA on an RFSoC 4x2 board running PYNQ v3.0.1.
Setup
- Board: RFSoC 4x2 (XCZU48DR)
- PYNQ image: v3.0.1
- Vivado: 2025.1
- AXI DMA configured as:
-
MM2S only
-
Scatter-Gather enabled
-
32-bit AXI Stream
-
M_AXI_MM2S connected to DDR (HP port)
-
M_AXI_SG connected to DDR (HP port)
- Address editor is correctly configured for both MM2S and SG masters.
Goal
I would like to transmit a waveform continuously (cyclic playback) from DDR to the RFDC DAC.
What works
If I disable Scatter-Gather and use the standard AXI DMA, everything works correctly:
- DMA transfer completes.
- The waveform is transmitted correctly.
- My RF ranging experiment works as expected.
What does not work
After enabling Scatter-Gather, PYNQ creates an “_SGDMAChannel”, and I use:
tx_dma.sendchannel.transfer(tx_buffer, cyclic=True)
or
tx_dma.sendchannel.transfer(tx_buffer, cyclic=False)
In both cases I observe:
- “running = True”
- “idle = False”
- “halted = False”
- no DMA error bits are set
- descriptor ring is created correctly
- descriptor status remains “[0, 0]”
- “CURDESC” never advances
- “wait()” never returns in non-cyclic mode
- the receiver only captures noise
I also inspected the descriptor ring from Python, and it appears valid. The DMA creates two descriptors for the contiguous buffer, but neither descriptor is ever completed.
Question
Has anyone successfully used the PYNQ “_SGDMAChannel” with an AXI DMA generated by Vivado 2025.1?
Is there any known incompatibility between PYNQ v3.0.1 and the Scatter-Gather AXI DMA, or is there an additional hardware/software requirement that I may be missing?
My end goal is simply continuous (cyclic) transmission from DDR without repeatedly launching DMA transfers from Python.
Any suggestions or examples would be greatly appreciated.