Wishbone · Module 3
Transaction Lifecycle
One Wishbone transaction from a master's decision to act through the slave's termination and back to the caller: what is fixed by the protocol, what every implementation may vary, and what a real simulation of the assembled system shows at each step.
Chapter 3.6 followed information through the blocks. This chapter follows a transaction through time, and closes Module 3 by running the assembled system.
What is the high-level lifetime of one Wishbone transaction, from a master's decision to act through slave termination and back to the caller?
This is deliberately not the handshake tutorial. Module 5 owns the cycle-by-cycle timing rules; what belongs here is the shape of a transaction's life and, crucially, which parts of it may vary between conforming implementations.
1. The Lifecycle
Two observations about the shape.
The only message the slave sends during the active phase is silence. That is not a drawing convenience — Classic has no stall signal, so withholding all three terminations is how a slave says not yet. A reader coming from a valid/ready protocol expects a signal here and there is none.
The master's contribution to the active phase is also passive: it holds. RULE 3.60 makes the request signals meaningful under STB_O, so the master's obligation for the whole duration is to not move.
2. What Is Fixed, and What May Vary
This is the distinction that makes the lifecycle useful rather than a description of one design.
| Fixed by the specification | Varies by implementation | |
|---|---|---|
| Qualifiers | CYC_O asserted whenever STB_O is (RULE 3.25) | how many transfers a cycle contains |
| Request validity | qualified by STB_O (RULE 3.60) | — |
| Who may terminate | only in response to CYC_I & STB_I (RULE 3.35) | — |
| How it ends | exactly one of three (RULE 3.45) | which one, and under what conditions |
| Active-phase length | — | one cycle to many |
| Termination timing | — | combinational from inputs, or registered |
| Read-data source | the addressed slave | combinational read mux, or registered |
| Selection | — | decode structure, topology |
| Unmapped behaviour | — | entirely the integrator's |
Read the right column as the list of things you cannot assume about someone else's Wishbone block. A master written against "slaves answer in one cycle" is not a Wishbone master; it is a master that works with the slaves it was tested against.
And note what is absent from the fixed column: any timeout. Nothing in the protocol bounds the active phase. A slave that never terminates hangs the master indefinitely, and the answer must come from the system — the default slave of Chapter 3.5 for unmapped addresses, and a deliberate design decision for everything else.
3. Waveform — The Same Transaction, Twice
Transaction life: immediate, then delayed
10 cyclesCycles 5 and 6 are the chapter. CYC_O and STB_O are asserted, ADR_O shows a continuation rather than a new value, and no termination signal exists to look at. The slave is working and the only evidence is the absence of an answer.
Compare the master's behaviour in the two transactions: it is identical. It established, it held, it captured on termination. The first took one cycle and the second took four, and nothing in the master knew or cared. That is the property the whole module has been building toward, and it is why Chapter 3.3 insisted the master must not know latency.
4. Running the Assembled System
Module 3's three modules — 3.3's master, 3.4's slave and 3.5's INTERCON — were composed in 3.6 as wb_soc. The whole system elaborates and runs.
The system under test. One wb_copy_master, one wb_intercon, three instances of wb_gpio_slave at 0x4000_0000, 0x4000_1000 and 0x4000_2000, 4 KiB each. gpio2's input pins are held at 0x5A.
Three scenarios, and the actual trace.
=== wb_copy_master -> wb_intercon -> 3x wb_gpio_slave ===
-- A: copy gpio2.IN (0x4000_2008) -> gpio1.OUT (0x4000_1004) --
t=65 ADR=40002008 WE=0 | s_stb=100 s_adr=008 | ack=1 err=0 DAT_I=0000005a
t=75 ADR=40001004 WE=1 | s_stb=010 s_adr=004 | ack=1 err=0 DAT_I=00000000
-> done, error_o=0
gpio1 pins_out = 5a
-- B: unmapped destination 0x5000_0000 --
t=115 ADR=40002008 WE=0 | s_stb=100 s_adr=008 | ack=1 err=0 DAT_I=0000005a
t=125 ADR=50000000 WE=1 | s_stb=000 s_adr=000 | ack=0 err=0 DAT_I=00000000
t=135 ADR=50000000 WE=1 | s_stb=000 s_adr=000 | ack=0 err=1 DAT_I=00000000
-> done, error_o=1
-- C: write to read-only gpio0.IN (0x4000_0008) --
t=175 ADR=40002008 WE=0 | s_stb=100 s_adr=008 | ack=1 err=0 DAT_I=0000005a
t=185 ADR=40000008 WE=1 | s_stb=001 s_adr=008 | ack=0 err=1 DAT_I=00000000
-> done, error_o=1
terminations: ACK=4 ERR=2 conformance violations: 0What each scenario demonstrates.
A — the architecture actually works. The read at t=65 strobed slave 2 only (s_stb=100), the address arrived as local offset 008, and DAT_I came back as 0x5A — the value physically present on gpio2's pins. The write at t=75 strobed slave 1, offset 004, and gpio1 pins_out became 0x5A. A value moved between two peripherals through decode, broadcast, selection and response merge, and no slave contains an address constant.
B — the default slave earns its place. At t=125 the address was unmapped: s_stb=000, nothing strobed, and no termination. One cycle later err=1 — the INTERCON's registered one-shot answering on behalf of nobody. The master received a termination and reported an error rather than hanging. Remove that logic and this scenario is a dead system.
C — termination is a three-way choice, and it is load-bearing. The write to a read-only register strobed the correct slave, which classified the access, declined to change state, and ended the transfer with ERR_O rather than ACK_O. The master's error_o reflected it. A design with only an acknowledge would have reported success on a write that did not happen.
Zero conformance violations across all three, with live checks on RULE 3.25 (CYC_O whenever STB_O), RULE 3.45 (at most one termination at the master), RULE 3.35 (no slave terminated unstrobed), and the INTERCON's one-hot-or-zero strobe.
5. The Module 3 Verification Checklist
Every architectural property Module 3 established, in one place, with what it protects and where it belongs.
| # | Property | Bound at | Protects against |
|---|---|---|---|
| 1 | `STB_O | -> CYC_O` (RULE 3.25) | master |
| 2 | request stable while presented and unterminated (RULE 3.60) | master | a transfer changing identity mid-flight |
| 3 | STB_O not withdrawn before termination | master | a slave completing into nothing |
| 4 | termination only under CYC_I & STB_I (RULE 3.35) | slave | a slave answering another slave's transfer |
| 5 | at most one of ACK/ERR/RTY (RULE 3.45) | slave | ambiguous endings |
| 6 | unselected slave drives zero read data | slave | corruption of a merged return path |
| 7 | read-only state unchanged by a terminating write | slave | reporting failure while changing state |
| 8 | at most one slave strobed | INTERCON | two slaves answering one transfer |
| 9 | no strobe without a qualified master transfer | INTERCON | slaves acting on nothing |
| 10 | master sees at most one termination | INTERCON and master | a merged response neither endpoint owns |
| 11 | unmapped transfer terminates within a bound | INTERCON | the hang |
| 12 | a termination corresponds to a strobed slave | INTERCON | a response from an unselected slave |
Two structural observations.
Property 10 is bound twice deliberately — at the INTERCON that could create the fault and at the master that suffers it. It is the one fault for which no endpoint is responsible, so binding it only where the obligation formally sits would leave it unchecked.
Property 11 is the only one with a time bound, because it is the only liveness claim. Eventually terminates cannot be refuted by a finite trace, so bounding it is what makes it checkable — and choosing the bound forces the default slave's latency to be stated.
6. What the Learner Should Now Be Able to Answer
Module 3's test is not signal recall. It is these nine questions.
| Question | Answer |
|---|---|
| Who owns each path? | Master: address, direction, selects, write data, both qualifiers. Slave: read data, termination. |
| Who starts? | Only a master. A slave never initiates. |
| Who selects? | The INTERCON, by strobing exactly one slave. Never the slave. |
| Who responds? | The strobed slave, and only it. |
| Where does data flow? | Request fans out; response fans in. One transformation: address → local offset, inside the INTERCON. |
| Where can a transfer stall? | Only in the active phase, and only because a slave withholds termination. |
| Where can a wrong response originate? | Two slaves strobed; an unstrobed slave driving data; or a response merged in the INTERCON. |
| What does the INTERCON know that the slave does not? | The address map, the topology, and which other slaves exist. |
| What does the slave know that the master does not? | What the local offset means, and how long the access will take. |
7. Common Mistakes
"A Wishbone transaction takes a fixed number of cycles."
Wrong mental model: the protocol defines a transfer's duration.
Concrete bug: a master that samples read data a fixed number of cycles after asserting its strobe, which works against the slave it was tested with and fails against any other.
Observable evidence: reads returning the previous transfer's data, or zero, when a new peripheral is added.
Correct model: the active phase has no fixed length. The master learns it is over by observing a termination, and read data is meaningful in that cycle only.
"There must be a signal that says the slave is busy."
Wrong mental model: every protocol has a stall or ready indication.
Concrete bug: a master waiting for a signal that does not exist, or an INTERCON inventing one and coupling both ends to a private convention.
Observable evidence: a master that never issues a second transfer, or a fabric that only works with its own slaves.
Correct model: in Wishbone Classic the absence of a termination is the wait. B4's optional pipelined mode does add a stall signal, and conflating the two modes is a common source of this error.
"An unmapped access will produce an error somewhere."
Wrong mental model: the system has a sensible default.
Concrete bug: no default slave. Nothing is strobed, nothing terminates, and the master waits forever on a stray pointer.
Observable evidence: a reproducible hang on one address with every slave's strobe low.
Correct model: unmapped behaviour is entirely the integrator's. The default slave is something you build, and whether it errors or returns zeros is a policy choice the specification does not make.
"Learning the signal names is learning Wishbone."
Wrong mental model: the protocol is a table.
Concrete bug: a block that drives every signal with correct names and violates RULE 3.35 by terminating on STB_I alone — passing point-to-point and corrupting a shared system.
Observable evidence: a peripheral that works in a demo and breaks on integration.
Correct model: the signals encode a set of responsibilities. Module 3 taught who owns what, who selects, who terminates and what may vary. Module 4 now names the signals, and they read as answers rather than as vocabulary.
8. Interview Reasoning
Three phases.
Establish. The master latches its request and asserts both qualifiers together with the address, direction, byte selects and write data. The INTERCON decodes, masks the address to a local offset, broadcasts the request and strobes exactly one slave.
Active. The cycle is open and the master holds every request signal unchanged, because RULE 3.60 makes them meaningful only under the strobe. The slave works. If it needs time it withholds all three terminations — in Classic there is no stall signal, so silence is the wait.
Terminate. The slave asserts exactly one of acknowledge, error or retry, and on a read drives data in that same cycle. The INTERCON routes it back, the master captures, closes the cycle and reports.
What varies: the length of the active phase, whether a slave produces its response combinationally or from a register, the decode structure, the topology, and — entirely — what happens on an unmapped address.
What does not: that the cycle qualifier is asserted whenever the strobe is; that the request is qualified by the strobe; that termination is generated only in response to both qualifiers; and that exactly one termination ends a transfer.
The point worth landing: nothing in the protocol bounds the active phase. A slave that never terminates hangs the master, and the answer has to come from the system rather than from the specification.
9. Understanding Check
10. What's Next
Module 3 is complete, and its argument is one chain.
Wishbone names four roles and specifies two of them as interfaces, leaving the fabric to the integrator. The model is two levels: a master opens a cycle, presents transfers inside it, and exactly one addressed slave ends each with one of three terminations — which is why describing it as valid/ready renamed is wrong rather than imprecise. A master owns its request and holds it while refusing to know the map, the latency, the internals or the topology. A slave observes, decides and terminates while refusing to know its own base. The INTERCON does the four jobs neither endpoint may. Data flows out with one transformation and back with none. And a transaction's life has three phases of which only the middle one varies.
The system built from all of that runs, moves real values between peripherals, errors rather than hangs on an unmapped address, and violates none of the rules cited along the way.
What Module 3 has not done is define the signals. They have been named where a real interface required it and explained only as far as the architecture needed — CYC_O as tenure, STB_O as qualification, ACK_O/ERR_O/RTY_O as the three endings. None has had its own treatment.
What exactly does each Wishbone signal encode — its width, its direction, its permitted values, when it may change, what a master must do with it, what a slave must do with it, and what goes wrong when it is misused?
Module 4 — Wishbone Signals Deep Dive answers that signal by signal, beginning with the clock every transfer is referenced to. Module 5 then owns the handshake that binds them in time; it has not shipped yet, which is why it is bold rather than linked. The full path is on the Wishbone curriculum index.
Continue learning
Related tutorials
- Related topic
Transaction Initiation
The boundary where a local client's request becomes a bus transaction, and why a master that does not latch its metadata produces transfers whose address changes mid-flight.
- Related topic
Need for Standardized Interconnects
An address map answers where a register lives. It says nothing about which wires carry the request, when they are valid, how the target reports completion, or what happens on an error. Three peripherals with three private interfaces produce three adapters, three verification efforts and three ways to be wrong — which is the argument for standardising the interface rather than the map.
- Related topic
Control Signals
Address and data are payload; they say what values are involved and nothing about what should happen to them. Control information is what makes a bus interpretable: a qualifier that says a request is real, a direction, lane enables, a completion and an error — each derived from a failure that occurs without it.
- Related topic
Bus Transactions
A transaction is the unit of bus work: one beginning, one ending, and an interval in between during which the request must not move. Making waiting expressible is what lets a slow target share a bus with a fast one, and it is what turns an initiator from a wire into a state machine with real failure modes.
Standards & specifications
- Governing standard
- Wishbone SoC Interconnection Architecture (OpenCores)(opens OpenCores in a new tab)
Defines the Wishbone signal set, the bus cycles built from it and the interface rules a portable IP core must follow. It deliberately leaves interconnect topology, address map and arbitration policy to the integrator, so those are system decisions rather than requirements of the specification.
This page also covers RTL structure, verification approach and debugging technique. Those are engineering practice built on the standard, not requirements the standard itself imposes.
Where this fits
Part of the Wishbone curriculum.
