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)
Beispiel #2
0
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)
Beispiel #3
0
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)
Beispiel #5
0
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)
Beispiel #6
0
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)
Beispiel #8
0
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)
Beispiel #9
0
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)
Beispiel #10
0
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)