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:
| Variable | Definition |
|---|---|
Start_Address | AxADDR — the address the manager issued. |
Number_Bytes | 2^AxSIZE — bytes per beat (the transfer size). |
Burst_Length | AxLEN + 1 — number of beats. |
Aligned_Address | (INT(Start_Address / Number_Bytes)) × Number_Bytes — Start_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.
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_NreachesWrap_Boundary + (Number_Bytes × Burst_Length), set it back toWrap_Boundaryand 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.
| # | Type | Start | Per-beat addresses | Note |
|---|---|---|---|---|
| 1 | INCR (aligned) | 0x00 | 0x00, 0x04, 0x08, 0x0C | clean increment |
| 2 | INCR (unaligned) | 0x02 | 0x02, 0x04, 0x08, 0x0C | beat 1 partial; beats 2+ aligned |
| 3 | WRAP | 0x08 | 0x08, 0x0C, 0x00, 0x04 | wraps at 16-byte block top |
| 4 | FIXED | 0x40 | 0x40, 0x40, 0x40, 0x40 | same 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 cycles4. Choosing the Formula
The whole calculation reduces to: derive the variables, branch on AxBURST, apply the formula:
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:
- 7.6 — The 4KB Boundary Rule (coming next) — why no burst may cross a 4 KB boundary, and how masters split transfers to obey it.
- 7.7 — Narrow & Unaligned Transfers (coming soon) — the partial-beat and lane behavior the unaligned cases here imply.
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.