“The DMA should be fast and handle backpressure.”
“Fast” has no unit, traffic model, measurement boundary, or correctness clause. The team cannot tell whether peak issue rate, accepted bytes, or completion rate is intended.
Product intent to buildable machine
Follow one realistic DMA subsystem from an ambiguous product request to measurable requirements, executable interface contracts, a block architecture, and an evidence-ready handoff.
Learn to expose missing assumptions early, budget throughput and buffering with units, choose structures deliberately, and preserve bidirectional traceability through RTL and verification.
One requirement · six owned contracts
Measurable requirement anatomy
The DMA subsystem shall sustain at least 12 GB/s of accepted payload across four continuously active channels, using legal 16-beat transfers on a 256-bit, 500 MHz downstream interface, while preserving per-channel ordering and propagating backpressure without data loss.
“Fast” has no unit, traffic model, measurement boundary, or correctness clause. The team cannot tell whether peak issue rate, accepted bytes, or completion rate is intended.
The rewritten requirement creates testable conditions and exposes missing decisions: allowed latency, downstream service guarantee, error policy, reset behavior, and implementation margin.
These worked-example targets show the review depth expected before architecture freeze; project values must come from the real product and signoff plan.
| Requirement | Concrete contract | Architecture consequence | Required evidence |
|---|---|---|---|
| NFR-CLKClock + reset | clk_dma is a defined 500 MHz generated clock. Every asynchronous crossing is classified, and reset deasserts locally only after its clock is stable. | Generated-clock constraints, CDC structures, reset synchronizers, and domain_ready gating are part of the block interface. | STA clock coverage · CDC/RDC · reset-sequence assertions |
| NFR-PWRPower | Illustrative active power is capped at 120 mW for the named workload and PVT view; idle admission stops before clocks gate. | Activity assumptions, clock-gating eligibility, wake latency, isolation, and retained state are budgeted before freeze. | Power analysis · gate checks · power-aware sleep/wake tests |
| NFR-DFTDFT | Sequential state is scan-visible unless waived; SRAMs have an MBIST path; test controls can override functional clock gates and resets safely. | Test muxing, scan modes, macro wrappers, and at-speed capture clocks are architectural ports, not late netlist patches. | Scan/MBIST rules · test-mode STA · coverage report |
| NFR-SECSecurity | Every descriptor is checked against its programmed privilege and address window before any fabric transaction is issued. | Unauthorized work creates no downstream side effect and retires with precise, auditable status. | Negative-access tests · formal range proof · audit-status coverage |
| NFR-SAFESafety + reliability | Descriptor and response state detect corruption; a bounded timeout converts a lost response into one fail-stop completion. | Parity/ECC choice, timeout ownership, first-error capture, recovery, and diagnostic observability are explicit. | Fault injection · timeout/liveness assertions · diagnostic coverage |
| NFR-PHYPhysical feasibility | The 500 MHz path budget, memory ports, block-boundary registers, macro placement, and congestion margin close in an early floorplan. | Pipeline cuts and replicated state are chosen while architecture can still change, with PPA ownership attached. | Early synthesis · floorplan/congestion · MMMC timing · power estimate |
Scenario before block diagram
Four legal descriptors become eligible.
Arrival synchrony creates the worst arbitration instant.One burst from each channel enters the issue window.
A fixed-priority policy can satisfy aggregate rate while starving C3.Accepted beats average 0.75 per cycle.
Counting VALID without READY overstates delivered bandwidth.Per-channel completions become visible in legal order.
Global order is unnecessary; per-channel precision is mandatory.Measure accepted bytes, not issued requests. Fair service and 75% average fabric utilization must coexist without one channel carrying all of the progress.
Partition by ownership
| State | Allocate | Mutate | Retire | Observable evidence |
|---|---|---|---|---|
| Descriptor context | Channel front | Channel front | Channel front | accepted / active / completed counters |
| Fabric credit | Response ledger | Issue + response | Response ledger | outstanding high-water mark |
| Burst progress | Burst engine | Burst engine | Response ledger | channel, descriptor, burst, beat identity |
| First error | Response ledger | write-once until retire | Channel front | cause, address, bytes committed, epoch |
Interface and state contracts
Refine the same conservation equation for bursts, beats, credits, and response IDs. After quiescence, every active count must reach zero.
Budgets before optimism
Sustained payload service is below the raw peak and above the target. The latency window sizes accepted in-flight context; the stall backlog separately assumes zero service while an upstream source continues and cannot be backpressured.
Illustrative normalized estimates
Evidence before RTL
Block boundaries, state machines, widths, pipeline stages, interface contracts, reset values, and illegal-state behavior.
Requirement IDs, scenarios, reference behavior, assertions, coverage, error injection, counters, and closure criteria.
Register semantics, ownership, completion, error recovery, reset/quiesce, interrupt behavior, and performance counters.
Clock and power domains, memories, multicycle intent, floorplan pressure, target corners, activity assumptions, and PPA budgets.
Reasoning checkpoints
It names an observable subject, a measurable behavior or limit, the operating conditions, and an unambiguous pass condition. “High performance” is an aspiration; “sustain 12 GB/s for legal 256-byte bursts at 500 MHz while honoring downstream backpressure” can be designed, constrained, and tested.
Buffering absorbs finite bursts and latency variation, but it cannot repair a sustained arrival rate that exceeds sustained service rate. First compare long-term rates, then size finite storage from the maximum permitted burst and response-latency envelope with explicit backpressure assumptions.
Include requirements traceability, block and clock/reset/power boundaries, interface contracts, state ownership, ordering and error rules, cycle-level scenarios, performance and storage calculations, configuration and status behavior, observability hooks, unresolved risks, and a verification strategy for every important invariant.
Keep practicing
Continue the system