Skip to content

backend: Support OBI buses without rready (#48)#132

Draft
DanielKellerM wants to merge 1 commit into
develfrom
fix/obi-rready-optional
Draft

backend: Support OBI buses without rready (#48)#132
DanielKellerM wants to merge 1 commit into
develfrom
fix/obi-rready-optional

Conversation

@DanielKellerM

Copy link
Copy Markdown
Collaborator

Closes #48.

Problem

Some OBI configurations omit the optional rready signal (obi_cfg_t.UseRReady = 0), so the subordinate cannot be back-pressured on the R channel. iDMA's OBI read/write managers drive and rely on rready to throttle responses (idma_obi_read.sv:120, idma_obi_write.sv:168), making them incompatible with such buses — exactly as reported in #48.

Approach

Reuse the upstream, already-verified obi_rready_converter (OBI package) rather than reworking iDMA's datapath:

  • New backend parameter ObiUseRReady (default 1'b1), threaded idma_backendidma_transport_layer → the OBI DB template. Emitted only for variants that use OBI.
  • ObiUseRReady = 1byte-identical to today (direct connect; existing users and tests unaffected).
  • ObiUseRReady = 0 → a generate branch inserts obi_rready_converter on each OBI manager port. It buffers responses in a FALL_THROUGH FIFO (depth NumAxInFlight) and credit-throttles the A channel, so the subordinate is never back-pressured, while iDMA's managers keep using rready internally (left completely untouched).
  • The converter's obi_a_chan_t/obi_r_chan_t are derived locally via the SV type() operator, so no new type parameters leak into the backend interface (no break for integrators).

Why the converter and not a credit counter inside the iDMA managers: an in-manager credit that returns on buffer push over-issues (the buffer may still hold undrained data, dropping a later response). The converter buffers the raw response before the byte-masking stage, which is correct regardless of buffer occupancy — and it's already verified upstream.

Verification

  • make idma_hw_all regenerates all OBI variants; the ObiUseRReady = 1 branch is the previous instantiation verbatim.
  • Elaboration (slang, full design via bender script flist-plus):
    • default path: idma_backend_synth_{rw_obi,r_obi_w_axi,r_axi_w_obi} → 0 errors;
    • ObiUseRReady = 0 path (converter live): 0 errors — obi_rready_converter, credit_counter, and the type()-derived channel types all resolve.
  • obi_rready_converter/credit_counter are pulled from the existing obi/common_cells deps — no Bender.yml change.

Remaining before merge (why this is a draft)

  • Directed simulation against a no-rready subordinate. The OBI backend TB currently bridges the OBI port to AXI (obi2axi_bridgeaxi_sim_mem); the proper test threads ObiUseRReady = 0 to the DUT and drives it from obi_sim_mem configured UseRReady = 0 (upstream-supported), checking data integrity + no dropped responses across the simple/medium/error_simple jobs. The converter itself is upstream-verified, but iDMA should prove the integration in sim.

Part of the iDMA 0.7.0 enhancement set; additive and default-off, so it does not gate the release.

Some OBI configurations omit the optional rready signal, so the
subordinate cannot be back-pressured on the R channel. The OBI read and
write managers relied on rready to throttle responses, making them
incompatible with such buses.

Add an ObiUseRReady backend parameter (default 1, unchanged behaviour).
When 0, insert the upstream obi_rready_converter on each OBI manager
port: it absorbs responses into a FIFO and credit-throttles requests to
NumAxInFlight, so the bus is never back-pressured. The iDMA OBI managers
are left untouched and the default path is byte-identical.
@DanielKellerM DanielKellerM linked an issue Jun 16, 2026 that may be closed by this pull request
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Not all OBI configurations support rready

1 participant