AMBA AXI · Module 3
The VALID/READY Handshake
The single transfer contract every AXI channel uses — VALID, READY, transfer on both-high, the stability rule, and the cardinal rule that VALID must never wait for READY.
There is exactly one transfer mechanism in AXI, and every channel on every memory-mapped variant uses it: the VALID/READY handshake. Learn it once — truly, precisely — and you know how AW, W, B, AR, and R all move data; the channels differ only in their payload. This chapter nails the contract: the source asserts VALID when it has something to send, the destination asserts READY when it can take it, and a single beat transfers on the clock edge where both are high. Then come the two rules that separate engineers who use AXI from those who only recognise it — the stability rule and the cardinal rule that VALID must never wait for READY. The deadlock dependency graph across channels is Module 3.5; here we make the single-channel contract exact.
1. One Handshake, Every Channel
Every AXI channel is a one-directional pipe with two control signals and a payload:
VALID— driven by the source (the side sending information on this channel). It means "the payload is valid right now; take it."READY— driven by the destination (the receiving side). It means "I can accept a payload this cycle."- The payload — the channel's actual content (an address on AW/AR, data on W/R, a response on B).
A transfer — one beat — happens on the rising clock edge where VALID and READY are both high. That's the entire mechanism. It is identical on all five channels; only who is the source changes (the manager sources AW/W/AR; the subordinate sources B/R) and what the payload is. Internalise this once and four-fifths of "learning AXI signals" is already done.
2. The Transfer Condition
Say it as a single line, because everything else builds on it:
A beat transfers on the rising clock edge where
VALID && READYare both asserted.
Not when VALID rises. Not when READY rises. On the edge where both are simultaneously high. If VALID is high but READY is low, nothing transfers — the source is offering, the destination isn't taking. If READY is high but VALID is low, nothing transfers — the destination is willing, the source has nothing. Only the coincidence of both high moves a beat. (Exactly when in the cycle this is sampled — the rising-edge timing — is Chapter 3.2's focus; here, the logical condition is what matters.)
3. The Stability Rule
The contract has a crucial obligation on the source: once you assert VALID, you must keep it asserted — and keep the payload stable — until the transfer happens. You cannot offer a beat, then change your mind or change the data before the destination has taken it.
Concretely: if a source raises VALID with address A, and the destination's READY is low for three cycles, the source must hold VALID high and keep the address at A for all three cycles, until the cycle where READY is finally high and the beat transfers. Dropping VALID early, or mutating the payload mid-wait, breaks the contract and corrupts or loses the transfer.
This is what makes the handshake robust: the destination can take its time, confident the offered payload won't vanish or mutate underneath it.
In RTL, correct source behaviour is short — and the wrong version is the classic bug:
// Conceptual — correct source: VALID comes from having data, never from READY.
assign valid = have_data; // ✅ assert when I have something to send
// hold `valid` AND the payload stable until the beat moves:
wire transfer = valid && ready; // one beat moves on this edge
// ❌ WRONG — VALID must never be a function of READY:
// assign valid = ready; // can deadlock (see §6) and breaks the contract4. A Normal Transfer
The clean case: the destination is ready, so beats move back-to-back, one per cycle.
Normal transfer — both high, one beat per cycle
6 cycles5. A Stalled Transfer
Now the destination isn't ready immediately. The source asserts VALID with D0 and holds it stable while READY is low; the beat transfers only when READY finally rises.
Stalled transfer — VALID held stable until READY rises
7 cyclesThe destination holding READY low to delay a transfer is backpressure — the universal flow-control mechanism — and it's the subject of Chapter 3.3. The point here is narrower: whatever the destination does, the source's job during a stall is to hold steady.
6. The Cardinal Rule — VALID Must Not Wait for READY
Now the rule that prevents the single most common AXI hang. The two sides are not symmetric:
- The destination's
READYmay depend onVALID. It's legal for a destination to wait until it seesVALIDbefore assertingREADY(e.g., "I'll only signal ready when there's actually something to take"). - The source's
VALIDmust never depend onREADY. A source must assertVALIDbased only on its own data being available — never "I'll assertVALIDonce I seeREADY."
The reason is deadlock. If the source waits for READY before asserting VALID, and the destination waits for VALID before asserting READY, then neither ever fires — both sides wait forever for the other to move first. By forbidding the source from waiting, AXI guarantees at least one side always makes the first move, so the handshake can always complete.
Hold this as a one-line guardrail: a source asserts VALID from its own readiness; a destination may key READY off VALID; never the reverse. The full cross-channel dependency graph (which VALID/READY pairs may legally depend on which, across AW/W/B/AR/R) builds on exactly this and is Chapter 3.5.
7. Why One Contract Is So Powerful
It's worth pausing on the design elegance, because it explains why AXI is learnable at all. By making every channel use the identical handshake:
- You learn it once. Understand
VALID/READYhere and you can read transfers on any channel of any memory-mapped AXI variant — the payload changes, the handshake doesn't. - Backpressure is universal. Every channel can be throttled the same way (destination lowers
READY), so flow control composes across the whole interconnect. - The building blocks are reusable. Skid buffers, FIFOs, and pipeline registers built around
VALID/READYwork on any channel (Module 15) — and the same monitor/assertion ideas verify any channel (Module 16).
The handshake is the atom. Decoupling (Chapter 2.4) is what you get by running five of these atoms independently; everything else in the protocol is payload and rules layered on top.
8. Common Misconceptions
9. Debugging Insight
10. Verification Insight
11. Interview Questions
12. Summary
Every AXI channel moves data with one contract: the source asserts VALID when its payload is valid, the destination asserts READY when it can accept, and a beat transfers on the rising clock edge where both are high. Two rules make it robust. The stability rule: once VALID is asserted, the source holds VALID and the payload steady until the transfer completes — no withdrawing, no mutating. The cardinal rule: VALID must never depend on READY (though READY may depend on VALID), because a mutual wait deadlocks — this single banned dependency keeps the handshake alive.
Read a channel by its two control signals: VALID high with READY low means the destination is blocking; the reverse means the source has nothing; both low forever is the VALID-waits-for-READY deadlock; payload changing under a held VALID is a stability violation. Verify it with a small, reusable set of stability, independence, and liveness assertions plus per-channel READY-delay stimulus. Because this one handshake is identical on AW, W, B, AR, and R, mastering it here is most of "knowing AXI signals." Next we sharpen the timing of the transfer itself — exactly when, on the clock edge, the beat is considered to have moved.
13. What Comes Next
You have the contract. Module 3 now refines it — the precise transfer instant, then backpressure, throughput, and the cross-channel dependency rules:
- 3.2 — The Transfer Event (coming next) — exactly when a beat transfers (VALID && READY sampled on the rising edge) and why the sampling instant matters.
- 3.3 — Backpressure & Stalls (coming soon) — how READY de-assertion throttles a channel and propagates upstream.
Previous: 2.5 — AXI4 vs AXI3 vs AXI4-Lite vs AXI4-Stream. For the broader protocol catalog, see the AMBA family overview doc.