I encounter to a strange behaviour of AXI CDMA IP. I am transferring data between two BRAMs (each is located in own AXI4 customized IP). Source address is fixed (key hole feature is enabled), on the destination side it is not. Max. burst size of AXI CDMA is set to 16 (according to datasheet). "Store and Forward" feature is also enabled.
I have implemented the exact same approach in two my designs, where the only difference is the customized IP on the source side. Everything else is the same. In one design, CDMA works as expected. Let say, if I want to transfer 128 bytes, it executes two burst transactions of 16 beats (each beat is 4 bytes wide).
In SDK I am using simple, polling method. Immediately after writing to BTT register, I started to poll for IDLE status to become true (which indicates that transfer is completed). As I said, in one design this works as expected. But in other it doesn't. Here, it successfully transfer 72 bytes (one burst + 8 bytes), but in case of 80 bytes, it never becomes idle anymore. I checked that with ILA and it actually transfers only one burst and then stops and IDLE flag is never set.
BUT... Then I added a simple delay (empty for loop which counts up to 100) between writing to BTT register and starting to poll for IDLE status. And in this scenario it works. CDMA executes all the bursts needed. This is very strange to me. Does anyone have any advice on that?