Skip to content

AMBA AXI · Module 5

RLAST & RRESP

The two R-channel control signals — per-beat RRESP (OKAY/EXOKAY/SLVERR/DECERR) and RLAST, the burst terminator — and the rule that an error beat never truncates the burst.

Two R-channel signals deserve their own chapter because they govern how a read ends and how each beat is qualified: RLAST (the burst terminator) and RRESP (the per-beat status). RLAST is the read analogue of WLAST; RRESP shares its encoding with the write's BRESP — but with a twist that trips people up: RRESP is reported per beat, and a beat that errors does not truncate the burst. The subordinate still returns all ARLEN+1 beats and asserts RLAST. This chapter decodes RRESP, explains why it's per-beat, details RLAST, and nails the error-doesn't-truncate rule that catches both designers and verifiers.

1. The Two Signals That Close and Qualify a Read

A read burst needs two things beyond the data: a way to mark the end and a way to report status. RLAST does the first — asserted on the final beat, it tells the manager the burst is complete. RRESP does the second — on every beat, it reports whether that beat was a clean read or an error. Together they let the manager know both when the read is done and whether each part of it succeeded.

The subtlety, and the theme of this chapter: these two are independent. RRESP reporting an error on some beat does not change RLAST's job — the burst still runs to its full ARLEN+1 beats and RLAST still lands on the last. Error qualifies a beat; RLAST terminates the burst; neither overrides the other.

2. RRESP — Per-Beat Status

RRESP is a 2-bit code on each R beat, with the same four values as the write's BRESP:

RRESPCodeMeaning
OKAY2'b00Normal read succeeded
EXOKAY2'b01Exclusive read succeeded (only for exclusive reads)
SLVERR2'b10Slave error — a real target returned this beat with an error
DECERR2'b11Decode error — no target at that address

The decode mirrors the write side exactly (Chapter 4.5): DECERR = no subordinate at the address (the interconnect's default slave answers — fix the address/map); SLVERR = a real subordinate signalled an error for this beat (fix inside the target); EXOKAY = exclusive-read success (only valid for exclusive reads). What's different is the granularity: there's an RRESP for each beat, not one for the whole transaction.

OKAY use the data; EXOKAY exclusive read success; SLVERR the target errored this beat so its data is invalid; DECERR this beat mapped to no target.OKAYUse the data —beat is validEXOKAYExclusive readsucceededSLVERRBeat invalid →target errored,investigate itDECERRBeat invalid →no target, fixaddress/map
Figure 1 — decoding an RRESP value into action (per beat). OKAY: use the data. EXOKAY: exclusive read succeeded (only valid for exclusive reads). SLVERR: a real target errored on this beat — its data is invalid, investigate the target. DECERR: this beat's address mapped to nothing — fix the address/map. Each beat is judged on its own code.

3. Why RRESP Is Per Beat

A write gets one BRESP because it's acknowledged as a single completed operation. A read is different: its status travels with the data, beat by beat, and different beats can meet different conditions. A burst might begin in a valid region and cross into an unmapped one; a memory might fault on one location but not its neighbors; an interconnect might down-size a burst so some beats route differently. Per-beat RRESP lets the subordinate report exactly which beats were good and which weren't.

A write returns one BRESP for the whole transaction; a read returns an RRESP on every R beat, so different beats of a read burst can carry different status codes.WRITE — one BRESPsingle verdict for the whole writeAcknowledged oncestatus is a separate, single event(B)READ — RRESP per beateach beat carries its own statusStatus rides the datadifferent beats → different codes12
Figure 2 — per-beat RRESP (read) vs single BRESP (write). A write is acknowledged once: one BRESP covers the whole transaction. A read carries status with each data beat: every R beat has its own RRESP, so a burst can report OKAY on some beats and SLVERR/DECERR on others. The granularity follows where the status lives.

4. RLAST — The Burst Terminator

RLAST is asserted by the subordinate on the final R beat of the burst — beat number ARLEN+1. It is the read analogue of WLAST, and the manager relies on it to know the read is complete (it does not maintain a private beat counter as the source of truth — RLAST is). A single-beat read (ARLEN=0) asserts RLAST on its one beat.

RLAST must align with the ARLEN declared on AR: the subordinate must return exactly ARLEN+1 beats and put RLAST on the last. A burst that returns fewer beats than ARLEN+1, or never asserts RLAST, leaves the manager waiting forever for a beat that never comes — a hung read, the read-side counterpart of the missing-WLAST hang.

5. Errors Don't Truncate the Burst

Here is the rule that surprises people: an error on a beat does not end the burst early. If the subordinate returns SLVERR or DECERR on some beat, it must still return all ARLEN+1 beats and assert RLAST on the last one. The burst length is fixed by ARLEN at the AR handshake; an error qualifies individual beats but does not change the count or move RLAST.

Why: the manager has committed to receiving ARLEN+1 beats — its buffers, counters, and the channel's framing all assume that count. If a subordinate truncated the burst on an error (stopped early, asserted RLAST prematurely), the manager and subordinate would disagree on how many beats are coming, desynchronizing the channel. So even a fully-failed read returns the promised number of beats, each typically marked with the error code, with RLAST on the last. The manager reads the data as invalid (per the RRESP codes) but the framing stays intact.

A read burst returns all ARLEN+1 beats and asserts RLAST on the last, even when one or more beats carry an error response; the error does not truncate the burst.yes — don't truncatefinish the countnoRead launchedARLEN+1 beatsexpectedReturn each beatwith its RRESPA beaterrors?(SLVERR/DECERR)Still returnremaining beatsRLAST on beatARLEN+1 (burstcomplete)
Figure 3 — an error never shortens the burst. A read declared ARLEN+1 beats; even if a beat returns SLVERR/DECERR, the subordinate still returns the full ARLEN+1 beats and asserts RLAST on the last. The error qualifies beats; it does not truncate the burst. Truncating on error would desync the manager's beat count.

6. RLAST & RRESP on a Waveform

A 4-beat read where one beat errors: every beat carries its own RRESP, the bad beat shows SLVERR, and the burst still completes all four beats with RLAST on the last.

RLAST & RRESP — a 4-beat read with one error beat

7 cycles
A four-beat read returns RRESP OKAY on beats 0, 1, and 3 and RRESP SLVERR on beat 2; all four beats are returned and RLAST is asserted on the fourth beat at cycle 4.all 4 beats returned despite the errorbeat 0: RRESP=OKAYbeat 0: RRESP=OKAYbeat 2: RRESP=SLVERR (per-beat error)beat 2: RRESP=SLVERR (…RLAST on beat 3 — burst still completesRLAST on beat 3 — burs…aclkrvalidrreadyrdataXD0D1D2D3XXrrespXOKOKSLVERROKXXrlastt0t1t2t3t4t5t6
Figure 4 — per-beat RRESP with a mid-burst error. Beats 0, 1, 3 return RRESP=OKAY; beat 2 returns RRESP=SLVERR (that location/access failed). The burst is not truncated — all four beats return and RLAST asserts on beat 3 (cycle 4). The manager treats beat 2's data as invalid (per its code) but the channel framing stays intact.

Handling it in code means checking RRESP per beat and always honoring RLAST to close the burst:

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
// Conceptual — per-beat status, burst always closes on RLAST.
if (rvalid && rready) begin
  data[beat] = rdata;
  if (rresp inside {2'b10, 2'b11})           // SLVERR or DECERR on THIS beat
    note_beat_error(rid, beat, rresp);
  if (rlast) finish_read(rid);               // closes even if a beat errored
  beat = rlast ? 0 : beat + 1;
end

7. Common Misconceptions

8. Debugging Insight

9. Verification Insight

10. Interview Questions

11. Summary

RLAST and RRESP are the R channel's control signals, and they do independent jobs. RRESP is the per-beat statusOKAY/EXOKAY/SLVERR/DECERR, the same decode as the write's BRESP (DECERR = no target; SLVERR = a real target errored; EXOKAY = exclusive-read success) — reported on every beat because a read's status rides its data and different beats can meet different conditions. RLAST is the burst terminator, asserted on beat ARLEN+1; the manager relies on it, and it must match the ARLEN contract from AR.

The rule that ties them together and trips people up: an error beat never truncates the burst. A read with a SLVERR/DECERR beat still returns all ARLEN+1 beats and asserts RLAST on the last — the error qualifies a beat, RLAST terminates the burst, and truncating on error would desync the manager. Debug by scanning RRESP per beat (which beat, where) and counting to RLAST (framing intact); verify with the error-doesn't-truncate assertion plus region-crossing/negative reads. Next: where read latency comes from across a system.

12. What Comes Next

The read's status and terminator are covered; next, its timing:

Previous: 5.2 — The Read Data (R) Channel. For the broader protocol catalog, see the AMBA family overview doc.