package MemArbiter_Test; import Assert::*; import StmtFSM::*; import Testing::*; import Printf::*; import List::*; import Vector::*; import BuildVector::*; import MemArbiter::*; typedef UInt#(4) Addr; typedef struct { String name; Vector#(n, Maybe#(MemArbiterOp#(Addr))) reqs; Maybe#(MemArbiterOp#(Addr)) conflict; Vector#(n, Bool) want_grants; Maybe#(MemArbiterOp#(Addr)) want_conflict_out; } TestCase#(numeric type n) deriving (Bits, Eq); function Maybe#(MemArbiterOp#(Addr)) read(Addr addr); return tagged Valid MemArbiterOp{write: False, addr: addr}; endfunction function Maybe#(MemArbiterOp#(Addr)) write(Addr addr); return tagged Valid MemArbiterOp{write: True, addr: addr}; endfunction function Maybe#(MemArbiterOp#(Addr)) idle(); return tagged Invalid; endfunction function Maybe#(MemArbiterOp#(Addr)) noConflict(); return tagged Invalid; endfunction function Vector#(n, Bool) grant(Integer granted); function gen(idx); return idx == granted; endfunction return genWith(gen); endfunction function Vector#(n, Bool) noGrant(); return replicate(False); endfunction function TestCase#(n) testCase(String name, Vector#(n, Maybe#(MemArbiterOp#(Addr))) reqs, Maybe#(MemArbiterOp#(Addr)) conflict, Vector#(n, Bool) want_grants, Maybe#(MemArbiterOp#(Addr)) want_conflict_out); return TestCase{ name: name, reqs: reqs, conflict: conflict, want_grants: want_grants, want_conflict_out: want_conflict_out }; endfunction interface TB; method Action start(); (* always_ready *) method Bool done(); endinterface module mkArbiterTB(MemArbiter#(n, Addr) dut, Vector#(m, TestCase#(n)) tests, TB ifc); let cycles <- mkCycleCounter(); Reg#(Bit#(TLog#(m))) idx <- mkReg(0); Reg#(Bool) running <- mkReg(False); for (Integer i=0; i