43def _check_mux(conn: AcceleratorConnection, dut_name: str,
44 num_inputs: int) ->
None:
45 """Drive an N-input host mux and check every value is delivered exactly
46 once and every input is served."""
47 acc = conn.build_accelerator()
48 dut = acc.children[esiaccel.AppID(dut_name)]
49 ins = [dut.ports[esiaccel.AppID(f
"in_{i}")]
for i
in range(num_inputs)]
50 out = dut.ports[esiaccel.AppID(
"out")]
59 ((i << 16) | r, ins[i])
for r
in range(rounds)
for i
in range(num_inputs)
70 while len(recv) < len(writes):
71 while wi < len(writes)
and (len(sent) - len(recv)) < max_in_flight:
72 value, port = writes[wi]
76 recv.append(out.read().result())
78 assert sorted(recv) == sorted(sent), \
79 "arbiter dropped, duplicated or corrupted a value"
82 by_src = Counter(v >> 16
for v
in recv)
83 for i
in range(num_inputs):
84 assert by_src[i] == rounds, \
85 f
"input {i} served {by_src[i]} times, expected {rounds}"
88@cosim_test(HW_DIR / "channel_arbiter.py")