1

I'm currently writing an AXI4 master that is supposed to support AXI4 Lite (AXI4L) as well.

My AXI4 master is receiving data from a 16-bit interface. This is on a Xilinx Spartan 6 FPGA and I plan on using the EDK AXI4 Interconnect IP, which has a minimum WDATA width of 32 bits.

At first I wanted to use narrow burst, i.e. AWSIZE = x"01" (2 bytes in transfer). However, I found that Xilinx' AXI Reference Guide UG761 states "narrow bursts [are] supported but [...] not recommended." Unaligned transactions are supposed to be supported.

This had me thinking. Say I start an unaligned burst:

  • AWLEN = x"01" (2 beats)
  • AWSIZE = x"02" (4 bytes in transfer")

And do the following:

AX (32-bit word #0: send hi16)
XB (32-bit word #1: send lo16)

Where A, B are my 16 bit words that start off at an unaligned (2-byte aligned) address. X means WSTRB is deasserted for the indicated 16 bit.

  • Is this supported or does this fall under the category "narrow burst" even through AWSIZE = x"02" (4 bytes in transfer) as opposed to AWSIZE = x"01" (2 bytes in transfer)?

Now, if this was just for AXI4, I would probably not care as much about this use case, because AXI4 peripherals are required to use the WSTRB signals. However, the AXI Reference Guide UG761 states "[AXI4L] Slaves interface can elect to ignore WSTRB (assume all bytes valid)."

I read here that many (but not all; and there is not list?) Xilinx AXI4L peripherals do elect to ignore WSTRB.

  • Does this mean that I'm essentially barred from doing narrow burst ("not recommended") as well as unaligned bursts ("WSTRB can be ignored") or is there an easy way to unload some of the implementation work from my master into the interconnect, guaranteeing proper system behavior when accessing AXI4L peripherals?
FRob
  • 3,883
  • 2
  • 27
  • 40

1 Answers1

3

Your example is not a narrow burst, and should work.

The reason narrow burst is not recommended is that it gives sub-optimal performances. Both narrow-burst and data realignement cost in area and are not recommended IMHO. However, DRE has minimal bandwidth cost, while narrow burst does. If your AXI port is 100MHz 32 bits, you have 3.2GBits maximum throughput, if you use narrow burst of 16 bits 50% of the time, than your maximum throughput is reduced to 2.4GBits (32bits X 50MHz + 16bits X 50Mhz). Also, I'm not sure AXI-Lite support narrow burst or data realignement.

Your example has 2 major flaws. First, it requires 3 data-beats to transfer 32 bits, which is worst than narrow-burst (I don't think AXI is smart enough to cancel the last burst with WSTRB to 0). Second, you can't burst more than 2 16-bits at a time, which will hang your AXI infrastructure's performances if you have a lot of data to transfer.

The best way to deal with this is concatenate the 16 bits together to form a 32 bits in your block. Then you buffer these 32 bits and burst them when you have enough. This is the AXI high performance way to do this.

However, if you receive data as 16-bits, it seems you would be better using AXI-Stream, which support 16-bits but doesn't have the notion of addresses. You can map an AXI-Stream to AXI-4 using Xilinx's IP cores. Either AXI-Datamover or AXI-DMA can do that. Both do the same (in fact, AXI-DMA includes a datamover), but AXI-DMA is controlled trough an AXI-Lite interface while Datamover is controlled through additionals AXI-Streams.

As a final note, the Xilinx cores never requires narrow-burst or DRE. If you need DRE in AXI-DMA, it's done by the AXI-DMA core and not the AXI Interconnect. Also, these cores are clear-source, so you can checkout how they operate easily.

Jonathan Drolet
  • 3,318
  • 1
  • 12
  • 23
  • Thanks for your answer. I'm not too concerned about throughput, but I'm concerned about AXI4L. AXI4S is not applicable, because I do have addresses for the 16-bit data bursts, so the mover would likely have to push to memory-mapped BRAM which will then have to be interpreted again anyway :-/ If doing upsizing in my core is considered better (in terms of area, speed), I might do DRE in there as well -- especially when AXI4L does not allow unaligned writes. – FRob May 22 '15 at 12:05
  • If performances are not an issue, I would say use narrow burst and save yourself some headaches. But since you need AXI-Lite, which doesn't support WSTRB, it might not work as you already figured out. If you have some control over your source, you can force it to write burst of even data length to simplify the upsizing. – Jonathan Drolet May 22 '15 at 12:59