Skip to content

AMBA AXI · Module 7

Burst Address Calculation

The exact per-beat address arithmetic for AXI bursts — the spec's Start/Aligned address and Number_Bytes variables, the FIXED/INCR/WRAP formulas, and fully worked examples for aligned, unaligned, and wrapping cases.

This chapter consolidates the arithmetic behind the three burst types into one place: given AxADDR, AxSIZE, AxLEN, and AxBURST, what address does each beat target? FIXED, INCR, and WRAP each have a precise formula, and the edge cases — unaligned starts, the wrap boundary — are where real designs go wrong. We'll define the spec's variables, give the per-type equations, and work four examples end to end (aligned INCR, unaligned INCR, WRAP, FIXED). This is the reference you'll come back to; the 4 KB rule (Chapter 7.6) and strobe behavior (Chapter 7.8) build directly on it.

1. The Variables

The AXI specification frames burst addressing with a small set of derived values:

VariableDefinition
Start_AddressAxADDR — the address the manager issued.
Number_Bytes2^AxSIZE — bytes per beat (the transfer size).
Burst_LengthAxLEN + 1 — number of beats.
Aligned_Address(INT(Start_Address / Number_Bytes)) × Number_BytesStart_Address rounded down to a Number_Bytes boundary.

Aligned_Address is the key idea: it's the start address with its sub-size offset removed. For an aligned start it equals Start_Address; for an unaligned start it's the next-lower size-aligned address. The per-beat formulas are expressed in terms of these.

Inputs AxADDR, AxSIZE, AxLEN, AxBURST derive Start_Address, Number_Bytes, Burst_Length, Aligned_Address; AxBURST selects the per-beat formula.AxADDR/SIZE/LENburst inputsNumber_Bytes2^AxSIZE per beatAligned_AddressStart floored toNumber_BytesAxBURSTFIXED / INCR / WRAPPer-beat addresstype-specific formula12
Figure 1 — the address-calculation inputs and derived values. From AxADDR, AxSIZE, AxLEN, AxBURST the spec derives Start_Address, Number_Bytes (2^AxSIZE), Burst_Length (AxLEN+1), and Aligned_Address (Start_Address floored to a Number_Bytes boundary). The burst type then selects which per-beat formula applies.

2. The Per-Type Formulas

Numbering beats N = 1 … Burst_Length (the spec's 1-based convention):

Beat 1 (all types): Address_1 = Start_Address — the very first beat always uses the issued address (which may be unaligned).

FIXED: every beat uses the same address.

Address_N = Start_Address (for all N)

INCR: after the first beat, addresses step by Number_Bytes from the aligned address.

Address_N = Aligned_Address + (N − 1) × Number_Bytes (for N ≥ 2)

WRAP: like INCR, but the address wraps at the upper edge of an aligned block.

Wrap_Boundary = (INT(Start_Address / (Number_Bytes × Burst_Length))) × (Number_Bytes × Burst_Length)

Use the INCR formula; whenever Address_N reaches Wrap_Boundary + (Number_Bytes × Burst_Length), set it back to Wrap_Boundary and continue.

The subtlety: for INCR/WRAP the first beat is Start_Address (possibly unaligned), but beat 2 onward uses Aligned_Address — so an unaligned start produces a partial first beat and aligned beats thereafter.

3. Worked Examples

Four examples on a bus wide enough that Number_Bytes is the transfer size (not lane-limited). Number_Bytes = 4 (AxSIZE = 2), Burst_Length = 4 (AxLEN = 3) throughout except FIXED.

#TypeStartPer-beat addressesNote
1INCR (aligned)0x000x00, 0x04, 0x08, 0x0Cclean increment
2INCR (unaligned)0x020x02, 0x04, 0x08, 0x0Cbeat 1 partial; beats 2+ aligned
3WRAP0x080x08, 0x0C, 0x00, 0x04wraps at 16-byte block top
4FIXED0x400x40, 0x40, 0x40, 0x40same address each beat

Example 2 (unaligned INCR), step by step: Aligned_Address = INT(0x02 / 4) × 4 = 0x00. Beat 1 = Start_Address = 0x02 (transfers only bytes 2–3, a partial beat). Beat 2 = 0x00 + 1×4 = 0x04. Beat 3 = 0x00 + 2×4 = 0x08. Beat 4 = 0x00 + 3×4 = 0x0C. So 0x02, 0x04, 0x08, 0x0C.

Example 3 (WRAP), step by step: block size = 4 × 4 = 16, Wrap_Boundary = INT(0x08 / 16) × 16 = 0x00. Beat 1 = 0x08, beat 2 = 0x0C. Beat 3 would be 0x10 = Wrap_Boundary + 16 → wrap to 0x00. Beat 4 = 0x04. So 0x08, 0x0C, 0x00, 0x04.

address-progression — unaligned INCR read from 0x02, 4 bytes/beat

6 cycles
An unaligned INCR read: beat 0 at 0x02 (partial), then aligned beats at 0x04, 0x08, 0x0C, RLAST on the fourth.Start 0x02, then Aligned 0x04/08/0Cbeat 0 @ 0x02 (partial, Start_Address)beat 0 @ 0x02 (partial…beat 1 @ 0x04 (Aligned_Address + 4)beat 1 @ 0x04 (Aligned…aclkaraddr000200020002000200020002arburst01 INCR01 INCR01 INCR01 INCR01 INCR01 INCRrvalidrdataXM[02]M[04]M[08]M[0C]M[0C]rlastt0t1t2t3t4t5
Figure 2 — address-progression: an unaligned INCR read (Example 2), base 0x02, 4 bytes/beat. Beat 0 targets the issued address 0x02 (a partial beat transferring bytes 2–3); beats 1–3 use the aligned progression 0x04, 0x08, 0x0C. The first-beat-at-Start, rest-at-Aligned rule is what produces the partial leading beat.
INCR aligned 0x00,04,08,0C; INCR unaligned 0x02,04,08,0C; WRAP 0x08,0C,00,04; FIXED 0x40 four times.INCR aligned0x00 · 04 · 08 · 0CINCR unaligned0x02 · 04 · 08 · 0C (beat 0 partial)WRAP0x08 · 0C · 00 ↩ · 04FIXED0x40 · 40 · 40 · 4012
Figure 3 — the four worked examples side by side. Aligned INCR steps cleanly; unaligned INCR starts at the issued 0x02 then snaps to the aligned progression; WRAP starts at 0x08 and wraps at the 16-byte block top back to 0x00; FIXED holds 0x40 every beat. Same inputs (4 bytes/beat, 4 beats) — the burst type alone changes the address sequence.

4. Choosing the Formula

The whole calculation reduces to: derive the variables, branch on AxBURST, apply the formula:

Compute variables; beat 1 is Start_Address; branch on AxBURST to FIXED (hold), INCR (step), or WRAP (step and wrap).FIXEDINCRWRAPDeriveNumber_Bytes,Aligned_Address,Burst_LengthBeat 1 =Start_AddressFIXED: holdStart_AddressINCR: Aligned +(N−1)·Number_BytesWRAP: step, wrapat block top
Figure 4 — the address-calculation decision flow. Compute Number_Bytes, Burst_Length, Aligned_Address; beat 1 is always Start_Address; then branch on AxBURST — FIXED holds the address, INCR steps from Aligned_Address, WRAP steps and wraps at the block boundary. Every per-beat address in AXI comes from this one procedure.

5. Common Misconceptions

6. Debugging Insight

7. Verification Insight

8. Interview Questions

9. Summary

Burst addressing reduces to one procedure. Derive Number_Bytes = 2^AxSIZE, Burst_Length = AxLEN+1, and Aligned_Address = INT(Start/Number_Bytes) × Number_Bytes. Beat 1 is always Start_Address (possibly unaligned → partial). Then branch on AxBURST: FIXED holds Start_Address; INCR uses Aligned_Address + (N−1)·Number_Bytes; WRAP does the same but wraps at Wrap_Boundary + Number_Bytes×Burst_Length back to the block-aligned Wrap_Boundary. The four canonical results — aligned INCR 0x00,04,08,0C; unaligned INCR 0x02,04,08,0C; WRAP-from-0x08 0x08,0C,00,04; FIXED 0x40×4 — capture every case.

The recurring subtleties are the Start vs Aligned split (the partial first beat) and the wrap-boundary math; both are where implementations and verification environments slip. The discipline for both debug and verification is identical: build a golden per-beat address model from these equations and diff it against observed beat addresses, beat by beat. Everything downstream — the 4 KB boundary rule and strobe progression — is computed from these addresses. Next: the 4 KB boundary rule, the one placement constraint a burst's address range must never violate.

10. What Comes Next

You've got the exact addressing arithmetic; next, the constraint it must respect:

Previous: 7.4 — WRAP Bursts. Related: 7.1 — Burst Length, Size & Beats for the underlying quantities. For the broader protocol catalog, see the AMBA family overview doc.