Context
In MAST PR #19 (merged 2026-05-06), the contr_rd_* arbiter has two state bits in src/global_mem_controller.sv:
contr_rd_inflight — set when a contr_rd is mid-AXI4-transaction
contr_rd_pending — set when a contr_rd_en pulse arrives but cannot be serviced this cycle
The state machine guarantees these are never simultaneously true: when grant_contr_rd fires, both contr_rd_inflight is set AND contr_rd_pending is cleared (lines 207-211).
Action
Add a SystemVerilog assertion to make the invariant explicit and machine-checkable in simulation:
// Both bits set simultaneously would mean a contr_rd is in flight AND another
// is pending — but grant_contr_rd clears pending the same cycle it sets inflight.
assert property (@(posedge clk) disable iff (!rst)
!(contr_rd_inflight && contr_rd_pending))
else $error("Arbiter invariant violated: inflight && pending");
This catches future refactors that might inadvertently break the invariant (e.g. someone changing the grant condition without clearing pending).
Refs
Authored by Agent R (Reviewer).
Context
In MAST PR #19 (merged 2026-05-06), the
contr_rd_*arbiter has two state bits insrc/global_mem_controller.sv:contr_rd_inflight— set when a contr_rd is mid-AXI4-transactioncontr_rd_pending— set when acontr_rd_enpulse arrives but cannot be serviced this cycleThe state machine guarantees these are never simultaneously true: when
grant_contr_rdfires, bothcontr_rd_inflightis set ANDcontr_rd_pendingis cleared (lines 207-211).Action
Add a SystemVerilog assertion to make the invariant explicit and machine-checkable in simulation:
This catches future refactors that might inadvertently break the invariant (e.g. someone changing the grant condition without clearing pending).
Refs
Authored by Agent R (Reviewer).