This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

AXI Wrap Bursts

In case of wrapped bursts, we need to calculate first the Aligned_Address, using:

Suppose start address is 55, assuming 32 - bit bus, burst length of 4

Aligned_Address = (INT(Start_Address / Number_Bytes) ) * Number_Bytes;

The value is :: 52 or 56 i.e. do we have round to lower or upper value.

Then we calculate the wrap boundary, using
Wrap_Boundary = ((INT(Start_Address / (Number_Bytes * Burst_Length))) * (Number_Bytes * Burst_Length);

What does this wrap boundary actually indicate,
1. The address from where wrapping will take place.
2. The address value after wrap.


Also, if anyone can let me know in a step-wise manner how the address are calculated using the same scenario above, would be great.

Hope to see the replies soon.
Parents
  • Note: This was originally posted on 29th May 2009 at http://forums.arm.com

    A wrap start address **must** be beat-aligned. It is illegal for a master to make an unaligned wrap request - it wouldn't be AXI conformant.

    There are two kinds of alignment in a wrap:

    Start_Address needs to be aligned on the beat-size, so for a 32-bit beat it needs 4-byte aligned, 16-bit beat needs to be 2-byte aligned, etc. In this case your start address (55) is not a valid Start_Address for a 32-bit beat  - ..., 52, 56, 60, 64, ... would be OK for example.

    > Aligned_Address = (INT(Start_Address / Number_Bytes) ) x Number_Bytes.

    Aligned_Address is the lowest address accessed by the wrap - and it is aligned on a boundary which matches the total number of bytes in the burst. So beat-size * number-of-beats. For a burst with 8 x 32-bit beats the Aligned_Address would be 256-bit aligned.

    Using my example earlier. If you had a 32-bit wrap of 4 beats starting at address 0x4 then you would get the following access pattern:
    0x4, 0x8, 0xc, 0x0

    Start Address = 0x4
    - this is allowed as it is aligned on a beat boundary.

    Aligned_Address = (INT(0x4 / 0x10)) * 0x10 = INT(0.25) *0x10 = 0 x 0x10 = 0
    - this is allowed as it is aligned on a total_bytes boundary.

    Note that INT() is a C style cast - it always truncates decimal parts (rounds down).
Reply
  • Note: This was originally posted on 29th May 2009 at http://forums.arm.com

    A wrap start address **must** be beat-aligned. It is illegal for a master to make an unaligned wrap request - it wouldn't be AXI conformant.

    There are two kinds of alignment in a wrap:

    Start_Address needs to be aligned on the beat-size, so for a 32-bit beat it needs 4-byte aligned, 16-bit beat needs to be 2-byte aligned, etc. In this case your start address (55) is not a valid Start_Address for a 32-bit beat  - ..., 52, 56, 60, 64, ... would be OK for example.

    > Aligned_Address = (INT(Start_Address / Number_Bytes) ) x Number_Bytes.

    Aligned_Address is the lowest address accessed by the wrap - and it is aligned on a boundary which matches the total number of bytes in the burst. So beat-size * number-of-beats. For a burst with 8 x 32-bit beats the Aligned_Address would be 256-bit aligned.

    Using my example earlier. If you had a 32-bit wrap of 4 beats starting at address 0x4 then you would get the following access pattern:
    0x4, 0x8, 0xc, 0x0

    Start Address = 0x4
    - this is allowed as it is aligned on a beat boundary.

    Aligned_Address = (INT(0x4 / 0x10)) * 0x10 = INT(0.25) *0x10 = 0 x 0x10 = 0
    - this is allowed as it is aligned on a total_bytes boundary.

    Note that INT() is a C style cast - it always truncates decimal parts (rounds down).
Children