Skip to content

AMBA AXI · Module 2

The Read Path

Walk an AXI read end-to-end across the AR and R channels — address out, data back, RRESP per beat, RLAST to close the burst, and where read latency comes from.

The last chapter named all five channels. Now we follow one read all the way through, across the two channels that carry it: AR (read address) out, R (read data) back. A read is the simpler of the two paths — two channels, no separate response — which makes it the right place to watch a transaction actually move: an address is accepted, time passes while the subordinate fetches, then data streams back one beat at a time until RLAST closes it. By the end you should be able to read a read off a waveform, explain where its latency went, and reconstruct it from the two channels. Signal-level detail is fair game now; the deep handshake rules are still Module 3.

1. A Read Is Two Channels — Address Out, Data Back

Strip a read to its essence and it is a question and an answer:

  • The manager asks on AR: "give me the data at this address."
  • The subordinate answers on R: the data, a per-beat response (RRESP), and a RLAST flag on the final beat.

That is the whole read. There is no separate response channel because the returning data is the acknowledgement — when R arrives, the read happened, and RRESP says whether each beat was clean. The two channels are independent in time: the address is accepted on AR at one moment, and the data comes back on R some cycles later, after the subordinate has actually fetched it. That gap between "address accepted" and "data returns" is read latency, and making it visible is half of what this chapter is about.

2. The Read Address Channel (AR) — Launching the Read

AR carries the read's intent: the read address plus the transaction attributes — how many beats (ARLEN), how wide each beat (ARSIZE), the burst type (ARBURST), the transaction ID (ARID), and protection/cache hints. One AR handshake launches one read transaction, which may return many beats of data.

Two things to hold:

  • AR carries no data — it is purely the request. The data comes back later on R.
  • One AR can request a whole burst. ARLEN says how many beats the single request will return, so a manager issues one address and receives many data beats — the efficiency Module 1 promised, now concrete.

Once the AR handshake completes, the manager's job for that read is essentially done; it now waits for R.

3. The Read Data Channel (R) — The Answer Comes Back

R carries the answer, and it carries three things per beat:

  • RDATA — the actual read data for this beat.
  • RRESP — a per-beat response code (OKAY / EXOKAY / SLVERR / DECERR). Note "per-beat": unlike a write's single BRESP, a read reports status on every beat, because different beats of a burst could hit different conditions.
  • RLAST — asserted on the final beat, telling the manager the burst is complete. Until RLAST, more data is coming.

So the subordinate streams beats on R, each with its own RRESP, and raises RLAST on the last one. A single-beat read is just the degenerate case: one R beat with RLAST already asserted.

The manager sends one read address on AR; the subordinate returns four read-data beats on R, each with a per-beat response, and asserts RLAST on the fourth beat to end the burst.A burst read — one AR, four R beatsA burst read — one AR, four R beatsManagerSubordinateAR — read address (ARLEN = 3 → 4 beats)AR — read address(ARLEN = 3 → 4…R — beat 0 (RDATA, RRESP)R — beat 0(RDATA,…R — beat 1 (RDATA, RRESP)R — beat 1(RDATA,…R — beat 2 (RDATA, RRESP)R — beat 2(RDATA,…R — beat 3 (RDATA, RRESP, RLAST)R — beat 3(RDATA, RRESP,…
Figure 1 — a 4-beat burst read, time downward. One AR handshake launches the read; the subordinate then returns four R beats, each carrying RDATA and a per-beat RRESP, with RLAST asserted on the final beat to close the burst. One address out, many data beats back.

4. A Single-Beat Read, End to End

Drop to the cycle level for the simplest case — a one-beat read — and watch the two handshakes and the latency between them.

valid / ready (per channel)

AXI4 single-beat read — AR → R

10 cycles
AXI read waveform: arvalid and arready are both high at cycle 3, transferring araddr; several cycles later rvalid and rready are both high at cycle 7, transferring rdata with rresp OKAY and rlast asserted. The gap between cycle 3 and cycle 7 is the read latency.address (AR)data (R)araddr acceptedaraddr acceptedrdata acceptedrdata acceptedaclkarvalidarreadyaraddrXX0x800x80XXXXXXrvalidrreadyrdataXXXXXX0xBE0xBEXXrrespXXXXXXOKOKXXrlastt0t1t2t3t4t5t6t7t8t9
Address accepted on the AR handshake; data returns several cycles later on the R handshake (rlast=1, rresp=OKAY). The cycles between them are read latency.
Figure 2 — a single-beat AXI read. The address transfers when arvalid and arready are both high (the AR handshake); some cycles later the data transfers when rvalid and rready are both high (the R handshake), with rresp=OKAY and rlast=1 on that single beat. The gap between the two markers is the read latency.

Walking it: the manager drives arvalid with the address; the subordinate raises arready; on the cycle both are high the address is accepted. The manager then waits. Several cycles later — after the subordinate has fetched the data — rvalid rises with rdata, rresp, and rlast; the manager accepts with rready; the data transfers and, because rlast=1, the read is complete. Two handshakes, one read, with the latency sitting visibly in the gap.

5. Where Read Latency Comes From

That gap is not waste — it is the real time it takes to get data, and a good engineer can name its parts. Read latency decomposes into roughly four contributors, in order:

Read latency contributors in order: AR address acceptance, interconnect routing, subordinate access time, and the return of the first R beat.AR acceptedaddresshandshakeInterconnect routesto the subordinateSubordinate access(SRAM fast · DRAMslow)First R beat travelsbackData available(rest of burststreams)
Figure 3 — the parts of read latency, in order. The address must be accepted on AR, routed through the interconnect to the owning subordinate, serviced (the actual access — fast for SRAM, slow for DRAM), and then the first R beat must travel back. Only after all of that does data appear; the rest of a burst then streams beat-by-beat.

The biggest term is usually the subordinate's own access time — a DRAM controller may take tens of cycles, an on-chip SRAM only a few. Crucially, this latency is paid once per transaction, not once per beat: after the first beat arrives, the remaining beats of a burst stream back with little or no extra delay. That is exactly why bursts and outstanding transactions matter — they amortize this latency, a thread that runs through the performance modules. The read path is where you first see the latency you will later learn to hide.

6. The Read Lifecycle

Stepping back up to the transaction level, a read moves through a small set of states, and the loop in the middle is the burst:

Read lifecycle: idle, then address accepted on AR, then the subordinate fetches, then R beats return in a loop until RLAST, which completes the read.no — more beatsyesIdleAddress accepted (ARhandshake)Subordinatefetches dataR beat returns(RDATA + RRESP)RLAST on thisbeat?Read complete
Figure 4 — the read lifecycle. After the AR handshake the subordinate fetches; then R beats return one at a time, looping until the beat carrying RLAST, which completes the read. A single-beat read takes the loop exactly once.

Reconstructing a read in code is exactly this lifecycle — capture the address when AR transfers, then collect R beats until RLAST:

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
// Conceptual — reconstruct one read transaction from its two channels.
if (arvalid && arready)               // AR handshake: the read is launched
  addr = araddr;
 
if (rvalid && rready) begin           // each R handshake: one data beat
  data.push_back(rdata);              // collect the beat
  if (rresp != OKAY) note_error(rresp); // per-beat status
  if (rlast) complete_read(addr, data); // RLAST closes the burst
end

This is the skeleton of a read monitor: one address in, beats collected until RLAST out. The same shape reappears in Module 16's verification components.

7. Common Misconceptions

8. Debugging Insight

9. Verification Insight

10. Interview Questions

11. Summary

A read is two channels: the manager launches it with one AR handshake (read address plus attributes, including ARLEN for burst length), and the subordinate answers on R with the data — each beat carrying its own RRESP, and RLAST marking the final beat. There is no separate response channel because the returning data is the acknowledgement. Between the AR handshake and the first R beat sits the read latency — address acceptance, interconnect routing, the subordinate's access time (usually dominant), and the return trip — paid once per transaction, after which burst beats stream back cheaply.

Read a read off a waveform as two handshakes and the gap between them; reconstruct it in code as capture the address, collect beats until RLAST; and debug it by checking the AR handshake, the arrival and timing of R, the RLAST termination, and the per-beat RRESP. The read is the simpler path on purpose — master it here and the write path is the same idea plus a separate response channel, which is exactly where we go next.

12. What Comes Next

You've followed a read end-to-end. The write path is next — same handshake, one more channel:

Previous: 2.1 — The Five AXI Channels. For the broader protocol catalog, see the AMBA family overview doc.