async def run_stress_test(dut, idle_inserter=None, backpressure_inserter=None): tb = TB(dut) byte_lanes = tb.source[0].byte_lanes id_count = 2**len(tb.source[0].bus.tid) cur_id = 1 await tb.reset() tb.set_idle_generator(idle_inserter) tb.set_backpressure_generator(backpressure_inserter) test_frames = [[list() for y in tb.sink] for x in tb.source] for p in range(len(tb.source)): for k in range(128): length = random.randint(1, byte_lanes * 16) test_data = bytearray( itertools.islice(itertools.cycle(range(256)), length)) test_frame = AxiStreamFrame(test_data) test_frame.tid = cur_id test_frame.tdest = random.randrange(len(tb.sink)) test_frames[p][test_frame.tdest].append(test_frame) await tb.source[p].send(test_frame) cur_id = (cur_id + 1) % id_count for lst in test_frames: while any(lst): rx_frame = await tb.sink[[x for x in lst if x][0][0].tdest].recv() test_frame = None for lst_a in test_frames: for lst_b in lst_a: if lst_b and lst_b[0].tid == rx_frame.tid: test_frame = lst_b.pop(0) break assert test_frame is not None assert rx_frame.tdata == test_frame.tdata assert rx_frame.tid == test_frame.tid assert rx_frame.tdest == test_frame.tdest assert not rx_frame.tuser assert all(s.empty() for s in tb.sink) await RisingEdge(dut.clk) await RisingEdge(dut.clk)
async def run_test(dut, payload_lengths=None, payload_data=None, idle_inserter=None, backpressure_inserter=None, s=0, m=0): tb = TB(dut) id_width = len(tb.source[0].bus.tid) id_count = 2**id_width id_mask = id_count - 1 src_width = (len(tb.source) - 1).bit_length() src_mask = 2**src_width - 1 if src_width else 0 src_shift = id_width - src_width max_count = 2**src_shift count_mask = max_count - 1 cur_id = 1 await tb.reset() tb.set_idle_generator(idle_inserter) tb.set_backpressure_generator(backpressure_inserter) test_frames = [] for test_data in [payload_data(x) for x in payload_lengths()]: test_frame = AxiStreamFrame(test_data) test_frame.tid = cur_id | (s << src_shift) test_frame.tdest = m test_frames.append(test_frame) await tb.source[s].send(test_frame) cur_id = (cur_id + 1) % max_count for test_frame in test_frames: rx_frame = await tb.sink[m].recv() assert rx_frame.tdata == test_frame.tdata assert (rx_frame.tid & id_mask) == test_frame.tid assert ((rx_frame.tid >> src_shift) & src_mask) == s assert (rx_frame.tid >> id_width) == s assert rx_frame.tdest == test_frame.tdest assert not rx_frame.tuser assert all(s.empty() for s in tb.sink) await RisingEdge(dut.clk) await RisingEdge(dut.clk)
async def run_test(dut, payload_lengths=None, payload_data=None, idle_inserter=None, backpressure_inserter=None, port=0): tb = TB(dut) id_width = len(tb.source.bus.tid) id_count = 2**id_width id_mask = id_count - 1 dest_width = len(tb.sink[0].bus.tid) dest_count = 2**dest_width dest_mask = dest_count - 1 cur_id = 1 await tb.reset() tb.set_idle_generator(idle_inserter) tb.set_backpressure_generator(backpressure_inserter) test_frames = [] dut.enable.setimmediatevalue(1) dut.drop.setimmediatevalue(0) dut.select.setimmediatevalue(port) for test_data in [payload_data(x) for x in payload_lengths()]: test_frame = AxiStreamFrame(test_data) test_frame.tid = cur_id test_frame.tdest = cur_id | (port << dest_width) test_frames.append(test_frame) await tb.source.send(test_frame) cur_id = (cur_id + 1) % id_count for test_frame in test_frames: rx_frame = await tb.sink[port].recv() assert rx_frame.tdata == test_frame.tdata assert rx_frame.tid == test_frame.tid assert rx_frame.tdest == (test_frame.tdest & dest_mask) assert not rx_frame.tuser assert tb.sink[port].empty() await RisingEdge(dut.clk) await RisingEdge(dut.clk)
async def run_arb_test(dut): tb = TB(dut) byte_lanes = tb.source[0].byte_lanes id_count = 2**len(tb.source[0].bus.tid) cur_id = 1 await tb.reset() test_frames = [] length = byte_lanes * 16 test_data = bytearray(itertools.islice(itertools.cycle(range(256)), length)) for k in range(5): test_frame = AxiStreamFrame(test_data, tx_complete=Event()) test_frame.tid = cur_id test_frame.tdest = 0 src_ind = 0 if k == 0: src_ind = 0 elif k == 4: await test_frames[1].tx_complete.wait() for j in range(8): await RisingEdge(dut.clk) src_ind = 0 else: src_ind = 1 test_frames.append(test_frame) await tb.source[src_ind].send(test_frame) cur_id = (cur_id + 1) % id_count for k in [0, 1, 2, 4, 3]: test_frame = test_frames[k] rx_frame = await tb.sink[0].recv() assert rx_frame.tdata == test_frame.tdata assert rx_frame.tid == test_frame.tid assert rx_frame.tdest == test_frame.tdest assert not rx_frame.tuser assert all(s.empty() for s in tb.sink) await RisingEdge(dut.clk) await RisingEdge(dut.clk)
async def run_test(dut, payload_lengths=None, payload_data=None, idle_inserter=None, backpressure_inserter=None): tb = TB(dut) id_count = 2**len(tb.source.bus.tid) cur_id = 1 await tb.reset() tb.set_idle_generator(idle_inserter) tb.set_backpressure_generator(backpressure_inserter) test_frames = [] for test_data in [payload_data(x) for x in payload_lengths()]: test_frame = AxiStreamFrame(test_data) test_frame.tid = cur_id test_frame.tdest = cur_id await tb.source.send(test_frame) test_frames.append(test_frame) cur_id = (cur_id + 1) % id_count for test_frame in test_frames: rx_frame = await tb.sink.recv() assert rx_frame.tdata == test_frame.tdata assert rx_frame.tid == test_frame.tid assert rx_frame.tdest == test_frame.tdest assert not rx_frame.tuser mon_rx_frame = await tb.monitor.recv() assert mon_rx_frame.tdata == test_frame.tdata assert mon_rx_frame.tid == test_frame.tid assert mon_rx_frame.tdest == test_frame.tdest assert not mon_rx_frame.tuser assert rx_frame.sim_time_start == mon_rx_frame.sim_time_start assert rx_frame.sim_time_end == mon_rx_frame.sim_time_end assert tb.sink.empty() assert tb.monitor.empty() await RisingEdge(dut.clk) await RisingEdge(dut.clk)
async def run_test(dut, payload_lengths=None, payload_data=None, idle_inserter=None, backpressure_inserter=None, rate=(1, 1)): tb = TB(dut) id_count = 2**len(tb.source.bus.tid) cur_id = 1 await tb.reset() tb.set_idle_generator(idle_inserter) tb.set_backpressure_generator(backpressure_inserter) dut.rate_num.value = rate[0] dut.rate_denom.value = rate[1] await RisingEdge(dut.clk) test_frames = [] for test_data in [payload_data(x) for x in payload_lengths()]: test_frame = AxiStreamFrame(test_data) test_frame.tid = cur_id test_frame.tdest = cur_id test_frames.append(test_frame) await tb.source.send(test_frame) cur_id = (cur_id + 1) % id_count for test_frame in test_frames: rx_frame = await tb.sink.recv() assert rx_frame.tdata == test_frame.tdata assert rx_frame.tid == test_frame.tid assert rx_frame.tdest == test_frame.tdest assert not rx_frame.tuser assert tb.sink.empty() await RisingEdge(dut.clk) await RisingEdge(dut.clk)
async def run_test(dut, payload_lengths=None, payload_data=None, idle_inserter=None, backpressure_inserter=None, s=0, m=0): tb = TB(dut) id_count = 2**len(tb.source[s].bus.tid) cur_id = 1 await tb.reset() tb.set_idle_generator(idle_inserter) tb.set_backpressure_generator(backpressure_inserter) test_frames = [] for test_data in [payload_data(x) for x in payload_lengths()]: test_frame = AxiStreamFrame(test_data) test_frame.tid = cur_id test_frame.tdest = m test_frames.append(test_frame) await tb.source[s].send(test_frame) cur_id = (cur_id + 1) % id_count for test_frame in test_frames: rx_frame = await tb.sink[m].recv() assert rx_frame.tdata == test_frame.tdata assert rx_frame.tid == test_frame.tid assert rx_frame.tdest == test_frame.tdest assert not rx_frame.tuser assert all(s.empty() for s in tb.sink) await RisingEdge(dut.clk) await RisingEdge(dut.clk)
async def run_stress_test(dut, idle_inserter=None, backpressure_inserter=None): tb = TB(dut) byte_lanes = tb.source.byte_lanes id_count = 2**len(tb.source.bus.tid) cur_id = 1 await tb.reset() tb.set_idle_generator(idle_inserter) tb.set_backpressure_generator(backpressure_inserter) test_frames = [] for k in range(128): length = random.randint(1, byte_lanes * 16) test_data = bytearray( itertools.islice(itertools.cycle(range(256)), length)) test_frame = AxiStreamFrame(test_data) test_frame.tid = cur_id test_frame.tdest = cur_id test_frames.append(test_frame) await tb.source.send(test_frame) cur_id = (cur_id + 1) % id_count for test_frame in test_frames: rx_frame = await tb.sink.recv() assert rx_frame.tdata == test_frame.tdata assert rx_frame.tid == test_frame.tid assert rx_frame.tdest == test_frame.tdest assert not rx_frame.tuser assert tb.sink.empty() await RisingEdge(dut.clk) await RisingEdge(dut.clk)
async def run_stress_test(dut, idle_inserter=None, backpressure_inserter=None): tb = TB(dut) byte_lanes = tb.source[0].byte_lanes id_width = len(tb.source[0].bus.tid) id_count = 2**id_width id_mask = id_count - 1 src_width = (len(tb.source) - 1).bit_length() src_mask = 2**src_width - 1 if src_width else 0 src_shift = id_width - src_width max_count = 2**src_shift count_mask = max_count - 1 cur_id = 1 await tb.reset() tb.set_idle_generator(idle_inserter) tb.set_backpressure_generator(backpressure_inserter) test_frames = [list() for x in tb.source] for p in range(len(tb.source)): for k in range(128): length = random.randint(1, byte_lanes * 16) test_data = bytearray( itertools.islice(itertools.cycle(range(256)), length)) test_frame = AxiStreamFrame(test_data) test_frame.tid = cur_id | (p << src_shift) test_frame.tdest = cur_id test_frames[p].append(test_frame) await tb.source[p].send(test_frame) cur_id = (cur_id + 1) % max_count while any(test_frames): rx_frame = await tb.sink.recv() test_frame = None for lst in test_frames: if lst and lst[0].tid == (rx_frame.tid & id_mask): test_frame = lst.pop(0) break assert test_frame is not None assert rx_frame.tdata == test_frame.tdata assert (rx_frame.tid & id_mask) == test_frame.tid assert ((rx_frame.tid >> src_shift) & src_mask) == (rx_frame.tid >> id_width) assert rx_frame.tdest == test_frame.tdest assert not rx_frame.tuser assert tb.sink.empty() await RisingEdge(dut.clk) await RisingEdge(dut.clk)
async def run_arb_test(dut): tb = TB(dut) byte_lanes = tb.source[0].byte_lanes id_width = len(tb.source[0].bus.tid) id_count = 2**id_width id_mask = id_count - 1 src_width = (len(tb.source) - 1).bit_length() src_mask = 2**src_width - 1 if src_width else 0 src_shift = id_width - src_width max_count = 2**src_shift count_mask = max_count - 1 cur_id = 1 await tb.reset() test_frames = [] length = byte_lanes * 16 test_data = bytearray(itertools.islice(itertools.cycle(range(256)), length)) for k in range(5): test_frame = AxiStreamFrame(test_data, tx_complete=Event()) src_ind = 0 if k == 0: src_ind = 0 elif k == 4: await test_frames[1].tx_complete.wait() for j in range(8): await RisingEdge(dut.clk) src_ind = 0 else: src_ind = 1 test_frame.tid = cur_id | (src_ind << src_shift) test_frame.tdest = 0 test_frames.append(test_frame) await tb.source[src_ind].send(test_frame) cur_id = (cur_id + 1) % max_count for k in [0, 1, 2, 4, 3]: test_frame = test_frames[k] rx_frame = await tb.sink.recv() assert rx_frame.tdata == test_frame.tdata assert (rx_frame.tid & id_mask) == test_frame.tid assert ((rx_frame.tid >> src_shift) & src_mask) == (rx_frame.tid >> id_width) assert rx_frame.tdest == test_frame.tdest assert not rx_frame.tuser assert tb.sink.empty() await RisingEdge(dut.clk) await RisingEdge(dut.clk)