Skip to content

AMBA AXI · Module 6

AxADDR, AxLEN & AxSIZE

The three AXI signals that size every transfer — AxADDR (start address), AxLEN (beats − 1), and AxSIZE (bytes per beat = 2^AxSIZE) — and how they combine into total transfer size.

Module 6 dissects the AXI signals one group at a time, starting with the three that size every transfer: AxADDR (where it starts), AxLEN (how many beats), and AxSIZE (how many bytes per beat). The Ax prefix means both address channels — these are AWADDR/AWLEN/AWSIZE on writes and ARADDR/ARLEN/ARSIZE on reads, identical in meaning. Together they answer "start here, move this many beats of this width," which fixes the transfer's geometry and its total byte count. Getting their encodings exact — especially AxLEN's minus-one and AxSIZE's power-of-two — is foundational, and off-by-one or off-by-power errors here corrupt entire bursts.

1. Three Signals, One Geometry

A memory-mapped transfer is fully sized by three numbers on the address channel:

  • AxADDR — the start address (the address of the first beat).
  • AxSIZE — the bytes per beat, encoded as a power of two: bytes = 2^AxSIZE.
  • AxLEN — the number of beats minus one: beats = AxLEN + 1.

From these, the (aligned, INCR) total is beats × bytes_per_beat = (AxLEN+1) × 2^AxSIZE. They're declared once at the AR/AW handshake and govern the entire W or R burst that follows. The AxBURST type (next chapter) then says how the address steps between beats; these three say how big the transfer is.

AxADDR sets the start address, AxSIZE sets the bytes per beat as 2 to the power AxSIZE, AxLEN sets the number of beats as AxLEN plus one; together they define the total transfer size.AxADDRstart address (first beat)AxSIZEbytes/beat = 2^AxSIZEAxLENbeats = AxLEN + 1Transfer size(AxLEN+1) × 2^AxSIZE bytes12
Figure 1 — the three sizing signals. AxADDR is the start; AxSIZE is the width of each beat (2^AxSIZE bytes); AxLEN is the number of beats (AxLEN+1). Multiply width × beats for the total bytes. These fix the transfer's size at the address handshake, before any data moves.

2. AxADDR — The Start Address

AxADDR is the byte address where the transfer begins, as wide as the address bus (commonly 32, 40, or 64 bits). For a burst it is the address of the first beat only; the addresses of subsequent beats are derived from AxADDR, AxSIZE, and AxBURST — they are not sent on the bus. So a 16-beat INCR burst transmits one address and the subordinate computes the rest (Module 7 covers the per-beat address math).

AxADDR interacts with AxSIZE through alignment: an INCR burst is normally expected to start at an address aligned to AxSIZE (the beat width). An unaligned start is legal but has specific narrow-transfer/strobe consequences (Chapter 7.7). For now: AxADDR is the single start address; everything else about where each beat lands is computed from it.

3. AxSIZE — Bytes Per Beat

AxSIZE is a 3-bit field encoding the number of bytes transferred per beat as a power of two — bytes_per_beat = 2^AxSIZE:

AxSIZEBytes per beat
3'b0001
3'b0012
3'b0104
3'b0118
3'b10016
3'b10132
3'b11064
3'b111128

Two rules govern it. First, AxSIZE must not exceed the data-bus width: a 64-bit (8-byte) bus allows AxSIZE up to 3'b011 (8 bytes); requesting AxSIZE=3'b100 (16 bytes) on it is illegal. Second, AxSIZE selects which byte lanes carry data each beat — a beat of 2^AxSIZE bytes occupies that many lanes (positioned by the address). When AxSIZE equals the full bus width, every lane is used each beat (the common case); when it's smaller, the transfer is narrow (only some lanes active — Chapter 7.7).

4. AxLEN — Beats Minus One

AxLEN encodes the burst length as beats − 1, so the actual beat count is AxLEN + 1:

  • AxLEN = 0 → 1 beat (a single transfer)
  • AxLEN = 7 → 8 beats
  • AxLEN = 255 → 256 beats

The field is 8 bits in AXI4 (so 1–256 beats for INCR) and 4 bits in AXI3 (1–16 beats) — a key AXI3→AXI4 difference (Chapter 2.5). And the burst type constrains it: WRAP bursts are limited to lengths of 2, 4, 8, or 16 beats, while FIXED bursts are capped at 16 beats; only INCR uses the full 1–256 range.

The minus-one encoding is the perennial trap: AxLEN=15 is 16 beats, not 15. The W/R channel must deliver exactly AxLEN+1 beats with LAST on the final one (Chapters 4.4/5.3), so an off-by-one between the AxLEN you set and the beats you send malforms the burst.

5. Putting Them Together — Transfer Size

The three combine into the transfer's byte count. For an aligned INCR burst:

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
// Conceptual — the three signals define the transfer geometry.
localparam int BYTES_PER_BEAT = 1 << axsize;   // 2^AxSIZE
localparam int NUM_BEATS      = axlen + 1;      // AxLEN + 1
// total bytes (aligned INCR) = NUM_BEATS * BYTES_PER_BEAT
 
// Legality:
//   BYTES_PER_BEAT <= DATA_BUS_BYTES          (AxSIZE within the bus width)
//   AxBURST==WRAP → NUM_BEATS in {2,4,8,16}    (and addr aligned to the burst)

So a burst with AxSIZE=3'b011 (8 bytes/beat) and AxLEN=15 (16 beats) moves 16 × 8 = 128 bytes, starting at AxADDR. Change AxSIZE to 3'b010 (4 bytes/beat) and the same AxLEN moves 16 × 4 = 64 bytes in narrower beats. The product (AxLEN+1) × 2^AxSIZE is the number to carry in your head — and the two factors are independent levers: more beats or wider beats both increase the transfer.

AxSIZE decodes to bytes per beat as 2 to the AxSIZE, AxLEN decodes to AxLEN plus one beats, and their product is the total transfer size in bytes starting at AxADDR.AxSIZE →2^AxSIZEbytes/beatAxLEN → AxLEN+1beats× (multiply)Total bytes(AxLEN+1) ×2^AxSIZE @AxADDR
Figure 2 — computing transfer size from the three signals. Decode AxSIZE to bytes-per-beat (2^AxSIZE), decode AxLEN to beats (AxLEN+1), and multiply for the total bytes — all starting at AxADDR. The two decoded factors are independent, so the same total can come from wide-short or narrow-long bursts.

axsize-beats — 4 beats × 4 bytes = 16 bytes

9 cycles
An address handshake carries AxADDR 0x100, AxSIZE 2 meaning 4 bytes per beat, and AxLEN 3 meaning 4 beats; then four data beats B0 to B3 of 4 bytes each transfer, 16 bytes total.4 beats × 4 bytes = 16 bytesAxSIZE=2 (4B/beat), AxLEN=3 (4 beats)AxSIZE=2 (4B/beat), Ax…beat 0 @ 0x100beat 0 @ 0x100beat 3 — total 16 bytesbeat 3 — total 16 bytesaclkaxvalidaxaddrX0x1000x100XXXXXXaxsizeX2 (4B)2 (4B)XXXXXXaxlenX3 (4)3 (4)XXXXXXdataXXXB0B1B2B3XXt0t1t2t3t4t5t6t7t8
Figure 3 — the axsize-beats relationship. With AxSIZE=2 (4 bytes/beat) and AxLEN=3 (4 beats) starting at 0x100, the burst delivers four beats B0–B3 of 4 bytes each — 16 bytes total (0x100–0x10F for an INCR burst). AxSIZE sets each beat's width; AxLEN sets how many; their product is the transfer size.

6. AxSIZE vs the Data-Bus Width

The relationship between AxSIZE and the physical bus width is worth isolating because it's where two concepts meet:

  • AxSIZE == bus width — the normal, full-width case: every byte lane is used each beat, peak per-beat data movement.
  • AxSIZE < bus width — a narrow transfer: each beat moves fewer bytes than the bus can carry, so only some lanes are active (which lanes depends on the address). This is legal and useful (e.g., a small peripheral on a wide bus), but it under-utilizes the bus and has specific strobe/lane behavior — the subject of Chapter 7.7.
  • AxSIZE > bus widthillegal. A beat can't carry more bytes than the bus has lanes.

So AxSIZE is bounded above by the bus, and choosing it below the bus width is a deliberate (narrow) decision with bandwidth consequences. The interconnect may also down-size a transfer when crossing from a wide master to a narrow slave, changing the effective AxSIZE/beat-count on the far side.

AxSIZE equal to the bus width uses all lanes (full width); AxSIZE smaller than the bus is a narrow transfer using some lanes; AxSIZE larger than the bus is illegal.AxSIZE = busfull width — all lanes(peak)AxSIZE < busnarrow — some lanes (7.7)AxSIZE > busILLEGAL — exceeds the bus12
Figure 4 — AxSIZE relative to the data-bus width. Equal to the bus: full-width beats, all lanes used (peak). Smaller than the bus: a narrow transfer, only some lanes active per beat (under-utilized, detailed in 7.7). Larger than the bus: illegal — a beat can't exceed the bus width.

7. Common Misconceptions

8. Debugging Insight

9. Verification Insight

10. Interview Questions

11. Summary

Three address-channel signals size every AXI transfer: AxADDR (the start address — the only address sent; per-beat addresses are derived), AxSIZE (bytes per beat as 2^AxSIZE, a 3-bit power-of-two field bounded by the data-bus width), and AxLEN (beats minus one, so AxLEN+1 beats — 8 bits/256-beat in AXI4, 4 bits/16-beat in AXI3). Their product, (AxLEN+1) × 2^AxSIZE, is the total byte count, and the two factors are independent levers on beat count and beat width.

The encodings are where bugs live: AxLEN's minus-one (15 means 16 beats), AxSIZE's power-of-two (and the must-not-exceed-the-bus rule), and AxADDR alignment to AxSIZE. Debug sizing problems by recomputing the geometry from the three signals and comparing to reality; verify by constraining to legal and covering the AxSIZE × AxLEN cross-product. With how big settled, the next chapter covers how the address stepsAxBURST (FIXED/INCR/WRAP).

12. What Comes Next

You can size any transfer; next, how its address advances:

  • 6.2 — AxBURST (coming next) — the burst-type encoding (FIXED / INCR / WRAP) and what each is for.
  • 6.3 — AxID (coming soon) — transaction-ID semantics and how IDs route and order traffic.

Previous: 5.6 — Read Transaction Waveforms. For the broader protocol catalog, see the AMBA family overview doc.