Example #1
0
    def parse_eth(self, data):
        self.eth_src_mac = data.eth_src_mac
        self.eth_dest_mac = data.eth_dest_mac
        self.eth_type = data.eth_type

        v = struct.unpack('B', data.payload.data[0:1])[0]
        self.ip_version = (v >> 4) & 0xF
        self.ip_ihl = v & 0xF
        v = struct.unpack('B', data.payload.data[1:2])[0]
        self.ip_dscp = (v >> 2) & 0x3F
        self.ip_ecn = v & 0x3
        self.ip_length = struct.unpack('>H', data.payload.data[2:4])[0]
        self.ip_identification = struct.unpack('>H', data.payload.data[4:6])[0]
        v = struct.unpack('>H', data.payload.data[6:8])[0]
        self.ip_flags = (v >> 13) & 0x7
        self.ip_fragment_offset = v & 0x1FFF
        self.ip_ttl = struct.unpack('B', data.payload.data[8:9])[0]
        self.ip_protocol = struct.unpack('B', data.payload.data[9:10])[0]
        self.ip_header_checksum = struct.unpack('>H',
                                                data.payload.data[10:12])[0]
        self.ip_source_ip = struct.unpack('>L', data.payload.data[12:16])[0]
        self.ip_dest_ip = struct.unpack('>L', data.payload.data[16:20])[0]

        self.payload = axis_ep.AXIStreamFrame(
            data.payload.data[20:self.ip_length])
Example #2
0
    def parse_ip(self, data):
        self.eth_src_mac = data.eth_src_mac
        self.eth_dest_mac = data.eth_dest_mac
        self.eth_type = data.eth_type
        self.ip_version = data.ip_version
        self.ip_ihl = data.ip_ihl
        self.ip_dscp = data.ip_dscp
        self.ip_ecn = data.ip_ecn
        self.ip_length = data.ip_length
        self.ip_identification = data.ip_identification
        self.ip_flags = data.ip_flags
        self.ip_fragment_offset = data.ip_fragment_offset
        self.ip_ttl = data.ip_ttl
        self.ip_protocol = data.ip_protocol
        self.ip_header_checksum = data.ip_header_checksum
        self.ip_source_ip = data.ip_source_ip
        self.ip_dest_ip = data.ip_dest_ip

        self.udp_source_port = struct.unpack('>H', data.payload.data[0:2])[0]
        self.udp_dest_port = struct.unpack('>H', data.payload.data[2:4])[0]
        self.udp_length = struct.unpack('>H', data.payload.data[4:6])[0]
        self.udp_checksum = struct.unpack('>H', data.payload.data[6:8])[0]

        self.payload = axis_ep.AXIStreamFrame(
            data.payload.data[8:self.udp_length])
Example #3
0
    def build_axis_fcs(self):
        if self.eth_fcs is None:
            self.update_fcs()

        data = self.build_axis().data

        data += struct.pack('<L', self.eth_fcs)

        return axis_ep.AXIStreamFrame(data)
    def check():
        yield delay(100)
        yield clk.posedge
        rst.next = 1
        yield clk.posedge
        rst.next = 0
        yield clk.posedge
        yield delay(100)
        yield clk.posedge

        # testbench stimulus

        yield clk.posedge
        print("test 1: test multiplier")
        current_test.next = 1

        test_frame1 = axis_ep.AXIStreamFrame()
        test_frame1.data = [[12, 56]] + [[0, 0]] * 4
        test_frame2 = axis_ep.AXIStreamFrame()
        test_frame2.data = [[34, 78]] + [[0, 0]] * 4

        input_a_source_queue.put(test_frame1)
        input_b_source_queue.put(test_frame2)

        yield clk.posedge
        yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        while output_sink_queue.empty():
            yield clk.posedge

        yield clk.posedge
        yield clk.posedge

        for i in range(4):
            rx_frame = output_sink_queue.get(False)

        rx_frame = output_sink_queue.get(False)
        assert rx_frame.data[0] == [12 * 34, 56 * 78]

        yield delay(100)

        raise StopSimulation
Example #5
0
    def build_axis(self):
        data = b''

        data += struct.pack('>Q', self.eth_dest_mac)[2:]
        data += struct.pack('>Q', self.eth_src_mac)[2:]
        data += struct.pack('>H', self.eth_type)

        data += self.payload.data

        return axis_ep.AXIStreamFrame(data)
Example #6
0
    def __init__(self, payload=b'', eth_dest_mac=0, eth_src_mac=0, eth_type=0):
        self._payload = axis_ep.AXIStreamFrame()
        self.eth_dest_mac = eth_dest_mac
        self.eth_src_mac = eth_src_mac
        self.eth_type = eth_type

        if type(payload) is dict:
            self.payload = axis_ep.AXIStreamFrame(payload['eth_payload'])
            self.eth_dest_mac = payload['eth_dest_mac']
            self.eth_src_mac = payload['eth_src_mac']
            self.eth_type = payload['eth_type']
        if type(payload) is bytes:
            payload = bytearray(payload)
        if type(payload) is bytearray or type(
                payload) is axis_ep.AXIStreamFrame:
            self.payload = axis_ep.AXIStreamFrame(payload)
        if type(payload) is EthFrame:
            self.payload = axis_ep.AXIStreamFrame(payload.payload)
            self.eth_dest_mac = payload.eth_dest_mac
            self.eth_src_mac = payload.eth_src_mac
            self.eth_type = payload.eth_type
Example #7
0
File: xfcp.py Project: yuan-hp/xfcp
    def build_axis(self):
        data = b''

        for p in self.path:
            data += struct.pack('B', p)

        if len(self.rpath) > 0:
            data += struct.pack('B', 0xFE)
            for p in self.rpath:
                data += struct.pack('B', p)

        data += struct.pack('B', 0xFF)

        data += struct.pack('B', self.ptype)

        data += self.payload.data

        return axis_ep.AXIStreamFrame(data)
Example #8
0
File: xfcp.py Project: yuan-hp/xfcp
    def __init__(self, payload=b'', path=[], rpath=[], ptype=0):
        self._payload = b''
        self.path = path
        self.rpath = rpath
        self.ptype = ptype

        if type(payload) is dict:
            self.payload = axis_ep.AXIStreamFrame(payload['xfcp_payload'])
            self.path = list(payload['xfcp_path'])
            self.rpath = list(payload['xfcp_rpath'])
            self.ptype = payload['xfcp_ptype']
        if type(payload) is bytes:
            payload = bytearray(payload)
        if type(payload) is bytearray or type(
                payload) is axis_ep.AXIStreamFrame:
            self.payload = payload
        if type(payload) is XFCPFrame:
            self.payload = payload.payload
            self.path = list(payload.path)
            self.rpath = list(payload.rpath)
            self.ptype = payload.ptype
Example #9
0
    def __init__(self,
                 payload='',
                 eth_dest_mac=0,
                 eth_src_mac=0,
                 eth_type=0,
                 ip_version=4,
                 ip_ihl=5,
                 ip_dscp=0,
                 ip_ecn=0,
                 ip_length=None,
                 ip_identification=0,
                 ip_flags=2,
                 ip_fragment_offset=0,
                 ip_ttl=64,
                 ip_protocol=0x11,
                 ip_header_checksum=None,
                 ip_source_ip=0xc0a80164,
                 ip_dest_ip=0xc0a80165):

        self._payload = axis_ep.AXIStreamFrame()
        self.eth_dest_mac = eth_dest_mac
        self.eth_src_mac = eth_src_mac
        self.eth_type = eth_type
        self.ip_version = ip_version
        self.ip_ihl = ip_ihl
        self.ip_dscp = ip_dscp
        self.ip_ecn = ip_ecn
        self.ip_length = ip_length
        self.ip_identification = ip_identification
        self.ip_flags = ip_flags
        self.ip_fragment_offset = ip_fragment_offset
        self.ip_ttl = ip_ttl
        self.ip_protocol = ip_protocol
        self.ip_header_checksum = ip_header_checksum
        self.ip_source_ip = ip_source_ip
        self.ip_dest_ip = ip_dest_ip

        if type(payload) is dict:
            self.payload = axis_ep.AXIStreamFrame(payload['ip_payload'])
            self.eth_dest_mac = payload['eth_dest_mac']
            self.eth_src_mac = payload['eth_src_mac']
            self.eth_type = payload['eth_type']
            self.ip_version = payload['ip_version']
            self.ip_ihl = payload['ip_ihl']
            self.ip_dscp = payload['ip_dscp']
            self.ip_ecn = payload['ip_ecn']
            self.ip_length = payload['ip_length']
            self.ip_identification = payload['ip_identification']
            self.ip_flags = payload['ip_flags']
            self.ip_fragment_offset = payload['ip_fragment_offset']
            self.ip_ttl = payload['ip_ttl']
            self.ip_protocol = payload['ip_protocol']
            self.ip_header_checksum = payload['ip_header_checksum']
            self.ip_source_ip = payload['ip_source_ip']
            self.ip_dest_ip = payload['ip_dest_ip']
        if type(payload) is bytes:
            payload = bytearray(payload)
        if type(payload) is bytearray or type(
                payload) is axis_ep.AXIStreamFrame:
            self.payload = axis_ep.AXIStreamFrame(payload)
        if type(payload) is IPFrame:
            self.payload = axis_ep.AXIStreamFrame(payload.payload)
            self.eth_dest_mac = payload.eth_dest_mac
            self.eth_src_mac = payload.eth_src_mac
            self.eth_type = payload.eth_type
            self.ip_version = payload.ip_version
            self.ip_ihl = payload.ip_ihl
            self.ip_dscp = payload.ip_dscp
            self.ip_ecn = payload.ip_ecn
            self.ip_length = payload.ip_length
            self.ip_identification = payload.ip_identification
            self.ip_flags = payload.ip_flags
            self.ip_fragment_offset = payload.ip_fragment_offset
            self.ip_ttl = payload.ip_ttl
            self.ip_protocol = payload.ip_protocol
            self.ip_header_checksum = payload.ip_header_checksum
            self.ip_source_ip = payload.ip_source_ip
            self.ip_dest_ip = payload.ip_dest_ip
    def check():
        yield delay(100)
        yield clk.posedge
        rst.next = 1
        yield clk.posedge
        rst.next = 0
        yield clk.posedge
        yield delay(100)
        yield clk.posedge

        yield clk.posedge
        tag.next = 1

        yield clk.posedge
        print("test 1: test packet")
        current_test.next = 1

        test_frame_0 = axis_ep.AXIStreamFrame(b'\x00\xAA\xBB\xCC\xDD\x00')
        test_frame_1 = axis_ep.AXIStreamFrame(b'\x01\xAA\xBB\xCC\xDD\x01')
        test_frame_2 = axis_ep.AXIStreamFrame(b'\x02\xAA\xBB\xCC\xDD\x02')
        test_frame_3 = axis_ep.AXIStreamFrame(b'\x03\xAA\xBB\xCC\xDD\x03')
        source_list[0].send(test_frame_0)
        source_list[1].send(test_frame_1)
        source_list[2].send(test_frame_2)
        source_list[3].send(test_frame_3)

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame.data == struct.pack(
            '<H', tag
        ) + test_frame_0.data + test_frame_1.data + test_frame_2.data + test_frame_3.data

        yield delay(100)

        yield clk.posedge
        print("test 2: longer packet")
        current_test.next = 2

        test_frame_0 = axis_ep.AXIStreamFrame(b'\x00' + bytearray(range(256)) +
                                              b'\x00')
        test_frame_1 = axis_ep.AXIStreamFrame(b'\x01\xAA\xBB\xCC\xDD\x01')
        test_frame_2 = axis_ep.AXIStreamFrame(b'\x02\xAA\xBB\xCC\xDD\x02')
        test_frame_3 = axis_ep.AXIStreamFrame(b'\x03\xAA\xBB\xCC\xDD\x03')
        source_list[0].send(test_frame_0)
        source_list[1].send(test_frame_1)
        source_list[2].send(test_frame_2)
        source_list[3].send(test_frame_3)

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame.data == struct.pack(
            '<H', tag
        ) + test_frame_0.data + test_frame_1.data + test_frame_2.data + test_frame_3.data

        yield delay(100)

        yield clk.posedge
        print("test 3: test packet with pauses")
        current_test.next = 3

        test_frame_0 = axis_ep.AXIStreamFrame(b'\x00\xAA\xBB\xCC\xDD\x00')
        test_frame_1 = axis_ep.AXIStreamFrame(b'\x01\xAA\xBB\xCC\xDD\x01')
        test_frame_2 = axis_ep.AXIStreamFrame(b'\x02\xAA\xBB\xCC\xDD\x02')
        test_frame_3 = axis_ep.AXIStreamFrame(b'\x03\xAA\xBB\xCC\xDD\x03')
        source_list[0].send(test_frame_0)
        source_list[1].send(test_frame_1)
        source_list[2].send(test_frame_2)
        source_list[3].send(test_frame_3)
        yield clk.posedge

        yield delay(64)
        yield clk.posedge
        source_pause_list[1].next = True
        yield delay(32)
        yield clk.posedge
        source_pause_list[1].next = False

        yield delay(64)
        yield clk.posedge
        sink_pause.next = True
        yield delay(32)
        yield clk.posedge
        sink_pause.next = False

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame.data == struct.pack(
            '<H', tag
        ) + test_frame_0.data + test_frame_1.data + test_frame_2.data + test_frame_3.data

        yield delay(100)

        yield clk.posedge
        print("test 4: back-to-back packets")
        current_test.next = 4

        test_frame_0a = axis_ep.AXIStreamFrame(b'\x00\xAA\xBB\xCC\xDD\x00')
        test_frame_0b = axis_ep.AXIStreamFrame(b'\x00\xAA\xBB\xCC\xDD\x00')
        test_frame_1a = axis_ep.AXIStreamFrame(b'\x01\xAA\xBB\xCC\xDD\x01')
        test_frame_1b = axis_ep.AXIStreamFrame(b'\x01\xAA\xBB\xCC\xDD\x01')
        test_frame_2a = axis_ep.AXIStreamFrame(b'\x02\xAA\xBB\xCC\xDD\x02')
        test_frame_2b = axis_ep.AXIStreamFrame(b'\x02\xAA\xBB\xCC\xDD\x02')
        test_frame_3a = axis_ep.AXIStreamFrame(b'\x03\xAA\xBB\xCC\xDD\x03')
        test_frame_3b = axis_ep.AXIStreamFrame(b'\x03\xAA\xBB\xCC\xDD\x03')
        source_list[0].send(test_frame_0a)
        source_list[0].send(test_frame_0b)
        source_list[1].send(test_frame_1a)
        source_list[1].send(test_frame_1b)
        source_list[2].send(test_frame_2a)
        source_list[2].send(test_frame_2b)
        source_list[3].send(test_frame_3a)
        source_list[3].send(test_frame_3b)

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame.data == struct.pack(
            '<H', tag
        ) + test_frame_0a.data + test_frame_1a.data + test_frame_2a.data + test_frame_3a.data

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame.data == struct.pack(
            '<H', tag
        ) + test_frame_0b.data + test_frame_1b.data + test_frame_2b.data + test_frame_3b.data

        yield delay(100)

        yield clk.posedge
        print("test 5: alternate pause source")
        current_test.next = 5

        test_frame_0a = axis_ep.AXIStreamFrame(b'\x00\xAA\xBB\xCC\xDD\x00')
        test_frame_0b = axis_ep.AXIStreamFrame(b'\x00\xAA\xBB\xCC\xDD\x00')
        test_frame_1a = axis_ep.AXIStreamFrame(b'\x01\xAA\xBB\xCC\xDD\x01')
        test_frame_1b = axis_ep.AXIStreamFrame(b'\x01\xAA\xBB\xCC\xDD\x01')
        test_frame_2a = axis_ep.AXIStreamFrame(b'\x02\xAA\xBB\xCC\xDD\x02')
        test_frame_2b = axis_ep.AXIStreamFrame(b'\x02\xAA\xBB\xCC\xDD\x02')
        test_frame_3a = axis_ep.AXIStreamFrame(b'\x03\xAA\xBB\xCC\xDD\x03')
        test_frame_3b = axis_ep.AXIStreamFrame(b'\x03\xAA\xBB\xCC\xDD\x03')
        source_list[0].send(test_frame_0a)
        source_list[0].send(test_frame_0b)
        source_list[1].send(test_frame_1a)
        source_list[1].send(test_frame_1b)
        source_list[2].send(test_frame_2a)
        source_list[2].send(test_frame_2b)
        source_list[3].send(test_frame_3a)
        source_list[3].send(test_frame_3b)
        yield clk.posedge

        while s_axis_tvalid or m_axis_tvalid:
            source_pause_list[0].next = True
            source_pause_list[1].next = True
            source_pause_list[2].next = True
            source_pause_list[3].next = True
            yield clk.posedge
            yield clk.posedge
            yield clk.posedge
            source_pause_list[0].next = False
            source_pause_list[1].next = False
            source_pause_list[2].next = False
            source_pause_list[3].next = False
            yield clk.posedge

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame.data == struct.pack(
            '<H', tag
        ) + test_frame_0a.data + test_frame_1a.data + test_frame_2a.data + test_frame_3a.data

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame.data == struct.pack(
            '<H', tag
        ) + test_frame_0b.data + test_frame_1b.data + test_frame_2b.data + test_frame_3b.data

        yield delay(100)

        yield clk.posedge
        print("test 6: alternate pause sink")
        current_test.next = 6

        test_frame_0a = axis_ep.AXIStreamFrame(b'\x00\xAA\xBB\xCC\xDD\x00')
        test_frame_0b = axis_ep.AXIStreamFrame(b'\x00\xAA\xBB\xCC\xDD\x00')
        test_frame_1a = axis_ep.AXIStreamFrame(b'\x01\xAA\xBB\xCC\xDD\x01')
        test_frame_1b = axis_ep.AXIStreamFrame(b'\x01\xAA\xBB\xCC\xDD\x01')
        test_frame_2a = axis_ep.AXIStreamFrame(b'\x02\xAA\xBB\xCC\xDD\x02')
        test_frame_2b = axis_ep.AXIStreamFrame(b'\x02\xAA\xBB\xCC\xDD\x02')
        test_frame_3a = axis_ep.AXIStreamFrame(b'\x03\xAA\xBB\xCC\xDD\x03')
        test_frame_3b = axis_ep.AXIStreamFrame(b'\x03\xAA\xBB\xCC\xDD\x03')
        source_list[0].send(test_frame_0a)
        source_list[0].send(test_frame_0b)
        source_list[1].send(test_frame_1a)
        source_list[1].send(test_frame_1b)
        source_list[2].send(test_frame_2a)
        source_list[2].send(test_frame_2b)
        source_list[3].send(test_frame_3a)
        source_list[3].send(test_frame_3b)
        yield clk.posedge

        while s_axis_tvalid or m_axis_tvalid:
            sink_pause.next = True
            yield clk.posedge
            yield clk.posedge
            yield clk.posedge
            sink_pause.next = False
            yield clk.posedge

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame.data == struct.pack(
            '<H', tag
        ) + test_frame_0a.data + test_frame_1a.data + test_frame_2a.data + test_frame_3a.data

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame.data == struct.pack(
            '<H', tag
        ) + test_frame_0b.data + test_frame_1b.data + test_frame_2b.data + test_frame_3b.data

        yield delay(100)

        yield clk.posedge
        print("test 7: tuser assert")
        current_test.next = 7

        test_frame_0 = axis_ep.AXIStreamFrame(b'\x00\xAA\xBB\xCC\xDD\x00')
        test_frame_1 = axis_ep.AXIStreamFrame(b'\x01\xAA\xBB\xCC\xDD\x01')
        test_frame_2 = axis_ep.AXIStreamFrame(b'\x02\xAA\xBB\xCC\xDD\x02')
        test_frame_3 = axis_ep.AXIStreamFrame(b'\x03\xAA\xBB\xCC\xDD\x03')
        test_frame_0.last_cycle_user = 1
        source_list[0].send(test_frame_0)
        source_list[1].send(test_frame_1)
        source_list[2].send(test_frame_2)
        source_list[3].send(test_frame_3)

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame.data == struct.pack(
            '<H', tag
        ) + test_frame_0.data + test_frame_1.data + test_frame_2.data + test_frame_3.data
        assert rx_frame.last_cycle_user

        yield delay(100)

        raise StopSimulation
Example #11
0
 def payload(self, value):
     self._payload = axis_ep.AXIStreamFrame(value)
    def check():
        yield delay(100)
        yield s_clk.posedge
        async_rst.next = 1
        yield s_clk.posedge
        yield s_clk.posedge
        yield s_clk.posedge
        async_rst.next = 0
        yield s_clk.posedge
        yield delay(100)
        yield s_clk.posedge

        yield s_clk.posedge

        yield s_clk.posedge
        print("test 1: test packet")
        current_test.next = 1

        test_frame = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=1,
            dest=1)

        s_status_overflow_asserted.next = 0
        s_status_bad_frame_asserted.next = 0
        s_status_good_frame_asserted.next = 0
        m_status_overflow_asserted.next = 0
        m_status_bad_frame_asserted.next = 0
        m_status_good_frame_asserted.next = 0

        source.send(test_frame)

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame == test_frame

        assert not s_status_overflow_asserted
        assert not s_status_bad_frame_asserted
        assert s_status_good_frame_asserted
        assert not m_status_overflow_asserted
        assert not m_status_bad_frame_asserted
        assert m_status_good_frame_asserted

        yield delay(100)

        yield s_clk.posedge
        print("test 2: longer packet")
        current_test.next = 2

        test_frame = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' + bytearray(range(256)),
            id=2,
            dest=1)

        s_status_overflow_asserted.next = 0
        s_status_bad_frame_asserted.next = 0
        s_status_good_frame_asserted.next = 0
        m_status_overflow_asserted.next = 0
        m_status_bad_frame_asserted.next = 0
        m_status_good_frame_asserted.next = 0

        source.send(test_frame)

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame == test_frame

        assert not s_status_overflow_asserted
        assert not s_status_bad_frame_asserted
        assert s_status_good_frame_asserted
        assert not m_status_overflow_asserted
        assert not m_status_bad_frame_asserted
        assert m_status_good_frame_asserted

        yield s_clk.posedge
        print("test 3: test packet with pauses")
        current_test.next = 3

        test_frame = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' + bytearray(range(256)),
            id=3,
            dest=1)

        s_status_overflow_asserted.next = 0
        s_status_bad_frame_asserted.next = 0
        s_status_good_frame_asserted.next = 0
        m_status_overflow_asserted.next = 0
        m_status_bad_frame_asserted.next = 0
        m_status_good_frame_asserted.next = 0

        source.send(test_frame)
        yield s_clk.posedge

        yield delay(64)
        yield s_clk.posedge
        source_pause.next = True
        yield delay(32)
        yield s_clk.posedge
        source_pause.next = False

        yield delay(64)
        yield m_clk.posedge
        sink_pause.next = True
        yield delay(32)
        yield m_clk.posedge
        sink_pause.next = False

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame == test_frame

        assert not s_status_overflow_asserted
        assert not s_status_bad_frame_asserted
        assert s_status_good_frame_asserted
        assert not m_status_overflow_asserted
        assert not m_status_bad_frame_asserted
        assert m_status_good_frame_asserted

        yield delay(100)

        yield s_clk.posedge
        print("test 4: back-to-back packets")
        current_test.next = 4

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x01\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=4,
            dest=1)
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x02\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=4,
            dest=2)

        s_status_overflow_asserted.next = 0
        s_status_bad_frame_asserted.next = 0
        s_status_good_frame_asserted.next = 0
        m_status_overflow_asserted.next = 0
        m_status_bad_frame_asserted.next = 0
        m_status_good_frame_asserted.next = 0

        source.send(test_frame1)
        source.send(test_frame2)

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame == test_frame1

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame == test_frame2

        assert not s_status_overflow_asserted
        assert not s_status_bad_frame_asserted
        assert s_status_good_frame_asserted
        assert not m_status_overflow_asserted
        assert not m_status_bad_frame_asserted
        assert m_status_good_frame_asserted

        yield delay(100)

        yield s_clk.posedge
        print("test 5: alternate pause source")
        current_test.next = 5

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x01\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=5,
            dest=1)
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x02\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=5,
            dest=2)

        s_status_overflow_asserted.next = 0
        s_status_bad_frame_asserted.next = 0
        s_status_good_frame_asserted.next = 0
        m_status_overflow_asserted.next = 0
        m_status_bad_frame_asserted.next = 0
        m_status_good_frame_asserted.next = 0

        source.send(test_frame1)
        source.send(test_frame2)
        yield s_clk.posedge

        while s_axis_tvalid or m_axis_tvalid:
            yield s_clk.posedge
            yield s_clk.posedge
            source_pause.next = False
            yield s_clk.posedge
            source_pause.next = True
            yield s_clk.posedge

        source_pause.next = False

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame == test_frame1

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame == test_frame2

        assert not s_status_overflow_asserted
        assert not s_status_bad_frame_asserted
        assert s_status_good_frame_asserted
        assert not m_status_overflow_asserted
        assert not m_status_bad_frame_asserted
        assert m_status_good_frame_asserted

        yield delay(100)

        yield s_clk.posedge
        print("test 6: alternate pause sink")
        current_test.next = 6

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x01\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=1,
            dest=6)
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x02\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=6,
            dest=2)

        s_status_overflow_asserted.next = 0
        s_status_bad_frame_asserted.next = 0
        s_status_good_frame_asserted.next = 0
        m_status_overflow_asserted.next = 0
        m_status_bad_frame_asserted.next = 0
        m_status_good_frame_asserted.next = 0

        source.send(test_frame1)
        source.send(test_frame2)
        yield s_clk.posedge

        while s_axis_tvalid or m_axis_tvalid:
            sink_pause.next = True
            yield m_clk.posedge
            yield m_clk.posedge
            yield m_clk.posedge
            sink_pause.next = False
            yield m_clk.posedge

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame == test_frame1

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame == test_frame2

        assert not s_status_overflow_asserted
        assert not s_status_bad_frame_asserted
        assert s_status_good_frame_asserted
        assert not m_status_overflow_asserted
        assert not m_status_bad_frame_asserted
        assert m_status_good_frame_asserted

        yield delay(100)

        yield s_clk.posedge
        print("test 7: tuser assert")
        current_test.next = 7

        test_frame = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=7,
            dest=1,
            last_cycle_user=1)

        s_status_overflow_asserted.next = 0
        s_status_bad_frame_asserted.next = 0
        s_status_good_frame_asserted.next = 0
        m_status_overflow_asserted.next = 0
        m_status_bad_frame_asserted.next = 0
        m_status_good_frame_asserted.next = 0

        source.send(test_frame)
        yield s_clk.posedge

        yield delay(1000)

        assert sink.empty()

        assert not s_status_overflow_asserted
        assert s_status_bad_frame_asserted
        assert not s_status_good_frame_asserted
        assert not m_status_overflow_asserted
        assert m_status_bad_frame_asserted
        assert not m_status_good_frame_asserted

        yield delay(100)

        yield s_clk.posedge
        print("test 8: single packet overflow")
        current_test.next = 8

        test_frame = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' + bytearray(range(256)) * 2,
            id=8,
            dest=1)

        s_status_overflow_asserted.next = 0
        s_status_bad_frame_asserted.next = 0
        s_status_good_frame_asserted.next = 0
        m_status_overflow_asserted.next = 0
        m_status_bad_frame_asserted.next = 0
        m_status_good_frame_asserted.next = 0

        source.send(test_frame)
        yield s_clk.posedge

        yield delay(10000)

        assert sink.empty()

        assert s_status_overflow_asserted
        assert not s_status_bad_frame_asserted
        assert not s_status_good_frame_asserted
        assert m_status_overflow_asserted
        assert not m_status_bad_frame_asserted
        assert not m_status_good_frame_asserted

        yield delay(100)

        yield s_clk.posedge
        print("test 9: initial sink pause")
        current_test.next = 9

        test_frame = axis_ep.AXIStreamFrame(bytearray(range(24)), id=9, dest=1)

        sink_pause.next = 1
        source.send(test_frame)
        yield s_clk.posedge
        yield s_clk.posedge
        yield s_clk.posedge
        yield s_clk.posedge
        sink_pause.next = 0

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame == test_frame

        yield delay(100)

        yield s_clk.posedge
        print("test 10: initial sink pause, assert reset")
        current_test.next = 10

        test_frame = axis_ep.AXIStreamFrame(bytearray(range(24)),
                                            id=10,
                                            dest=1)

        sink_pause.next = 1
        source.send(test_frame)
        yield s_clk.posedge
        yield s_clk.posedge
        yield s_clk.posedge
        yield s_clk.posedge

        async_rst.next = 1
        yield s_clk.posedge
        async_rst.next = 0

        sink_pause.next = 0

        yield delay(100)

        yield m_clk.posedge
        yield m_clk.posedge
        yield m_clk.posedge

        assert sink.empty()

        yield delay(100)

        yield s_clk.posedge
        print("test 11: backpressure test")
        current_test.next = 11

        test_frame = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' + bytearray(range(256)),
            id=11,
            dest=1)

        sink_pause.next = 1
        source.send(test_frame)
        source.send(test_frame)
        yield delay(1000)
        yield s_clk.posedge
        sink_pause.next = 0

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame == test_frame

        yield sink.wait()
        rx_frame = sink.recv()

        assert rx_frame == test_frame

        yield delay(100)

        raise StopSimulation
Example #13
0
    def check():
        yield delay(100)
        yield clk.posedge
        rst.next = 1
        yield clk.posedge
        rst.next = 0
        yield clk.posedge
        yield delay(100)
        yield clk.posedge

        yield clk.posedge
        enable.next = True

        yield clk.posedge
        print("test 1: select port 0")
        current_test.next = 1

        select.next = 0

        test_frame = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10'
        )
        source_queue.put(test_frame)
        yield clk.posedge

        while input_axis_tvalid:
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame = None
        if not sink_0_queue.empty():
            rx_frame = sink_0_queue.get()

        assert rx_frame == test_frame

        yield delay(100)

        yield clk.posedge
        print("test 2: select port 1")
        current_test.next = 2

        select.next = 1

        test_frame = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10'
        )
        source_queue.put(test_frame)
        yield clk.posedge

        while input_axis_tvalid:
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame = None
        if not sink_1_queue.empty():
            rx_frame = sink_1_queue.get()

        assert rx_frame == test_frame

        yield delay(100)

        yield clk.posedge
        print("test 3: back-to-back packets, same port")
        current_test.next = 3

        select.next = 0

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10'
        )
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10'
        )
        source_queue.put(test_frame1)
        source_queue.put(test_frame2)
        yield clk.posedge

        while input_axis_tvalid:
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame = None
        if not sink_0_queue.empty():
            rx_frame = sink_0_queue.get()

        assert rx_frame == test_frame1

        rx_frame = None
        if not sink_0_queue.empty():
            rx_frame = sink_0_queue.get()

        assert rx_frame == test_frame2

        yield delay(100)

        yield clk.posedge
        print("test 4: back-to-back packets, different ports")
        current_test.next = 4

        select.next = 1

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10'
        )
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10'
        )
        source_queue.put(test_frame1)
        source_queue.put(test_frame2)
        yield clk.posedge

        while input_axis_tvalid:
            yield clk.posedge
            select.next = 2
        yield clk.posedge
        yield clk.posedge

        rx_frame = None
        if not sink_2_queue.empty():
            rx_frame = sink_1_queue.get()

        assert rx_frame == test_frame1

        rx_frame = None
        if not sink_2_queue.empty():
            rx_frame = sink_2_queue.get()

        assert rx_frame == test_frame2

        yield delay(100)

        yield clk.posedge
        print("test 5: alterate pause source")
        current_test.next = 5

        select.next = 1

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10'
        )
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10'
        )
        source_queue.put(test_frame1)
        source_queue.put(test_frame2)
        yield clk.posedge

        while input_axis_tvalid:
            source_pause.next = True
            yield clk.posedge
            yield clk.posedge
            yield clk.posedge
            source_pause.next = False
            yield clk.posedge
            select.next = 2
        yield clk.posedge
        yield clk.posedge

        rx_frame = None
        if not sink_1_queue.empty():
            rx_frame = sink_1_queue.get()

        assert rx_frame == test_frame1

        rx_frame = None
        if not sink_2_queue.empty():
            rx_frame = sink_2_queue.get()

        assert rx_frame == test_frame2

        yield delay(100)

        yield clk.posedge
        print("test 6: alterate pause sink")
        current_test.next = 6

        select.next = 1

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10'
        )
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10'
        )
        source_queue.put(test_frame1)
        source_queue.put(test_frame2)
        yield clk.posedge

        while input_axis_tvalid:
            sink_0_pause.next = True
            sink_1_pause.next = True
            sink_2_pause.next = True
            sink_3_pause.next = True
            yield clk.posedge
            yield clk.posedge
            yield clk.posedge
            sink_0_pause.next = False
            sink_1_pause.next = False
            sink_2_pause.next = False
            sink_3_pause.next = False
            yield clk.posedge
            select.next = 2
        yield clk.posedge
        yield clk.posedge

        rx_frame = None
        if not sink_1_queue.empty():
            rx_frame = sink_1_queue.get()

        assert rx_frame == test_frame1

        rx_frame = None
        if not sink_2_queue.empty():
            rx_frame = sink_2_queue.get()

        assert rx_frame == test_frame2

        yield delay(100)

        raise StopSimulation
Example #14
0
    def check():
        yield delay(100)
        yield clk.posedge
        rst.next = 1
        yield clk.posedge
        rst.next = 0
        yield clk.posedge
        yield delay(100)
        yield clk.posedge

        # testbench stimulus

        yield clk.posedge
        print("test 1: coarse check")
        current_test.next = 1

        # check single cycle
        test_frame = axis_ep.AXIStreamFrame()
        test_frame.data = list(range(0, 2**18, 2**10)) + [0] * 6

        phase_source_queue.put(test_frame)

        yield clk.posedge
        yield clk.posedge

        while not phase_source_queue.empty() or input_phase_tvalid:
            yield clk.posedge

        yield clk.posedge
        yield clk.posedge

        # pipeline delay
        for j in range(6):
            sample_sink_queue.get(False)

        for j in range(len(test_frame.data) - 6):
            rx_frame = sample_sink_queue.get(False)
            x = test_frame.data[j]
            c, s = rx_frame.data[0]

            # sign bit
            if c >= 2**(OUTPUT_WIDTH - 1):
                c -= 2**OUTPUT_WIDTH
            if s >= 2**(OUTPUT_WIDTH - 1):
                s -= 2**OUTPUT_WIDTH

            # reference sine and cosine
            rc = int(
                np.cos(2 * np.pi *
                       (x - 2**((INPUT_WIDTH - 2) / 2 - 1)) / 2**INPUT_WIDTH) *
                (2**(OUTPUT_WIDTH - 1) - 1))
            rs = int(
                np.sin(2 * np.pi *
                       (x - 2**((INPUT_WIDTH - 2) / 2 - 1)) / 2**INPUT_WIDTH) *
                (2**(OUTPUT_WIDTH - 1) - 1))

            # assert error of two counts or less
            assert abs(c - rc) <= 2
            assert abs(s - rs) <= 2

        yield clk.posedge
        print("test 2: fine check")
        current_test.next = 2

        # check two zero crossing regions
        test_frame = axis_ep.AXIStreamFrame()
        test_frame.data = list(range(2**18 - 2**8, 2**18 - 1)) + list(
            range(0, 2**8)) + list(range(2**16 - 2**8, 2**16 + 2**8)) + [0] * 6

        phase_source_queue.put(test_frame)

        yield clk.posedge
        yield clk.posedge

        while not phase_source_queue.empty() or input_phase_tvalid:
            yield clk.posedge

        yield clk.posedge
        yield clk.posedge

        # pipeline delay
        for j in range(6):
            sample_sink_queue.get(False)

        for j in range(len(test_frame.data) - 6):
            rx_frame = sample_sink_queue.get(False)
            x = test_frame.data[j]
            c, s = rx_frame.data[0]

            # sign bit
            if c >= 2**(OUTPUT_WIDTH - 1):
                c -= 2**OUTPUT_WIDTH
            if s >= 2**(OUTPUT_WIDTH - 1):
                s -= 2**OUTPUT_WIDTH

            # reference sine and cosine
            rc = int(
                np.cos(2 * np.pi *
                       (x - 2**((INPUT_WIDTH - 2) / 2 - 1)) / 2**INPUT_WIDTH) *
                (2**(OUTPUT_WIDTH - 1) - 1))
            rs = int(
                np.sin(2 * np.pi *
                       (x - 2**((INPUT_WIDTH - 2) / 2 - 1)) / 2**INPUT_WIDTH) *
                (2**(OUTPUT_WIDTH - 1) - 1))

            # assert error of two counts or less
            assert abs(c - rc) <= 2
            assert abs(s - rs) <= 2

        yield delay(100)

        raise StopSimulation
    def check():
        yield delay(100)
        yield clk.posedge
        rst.next = 1
        yield clk.posedge
        rst.next = 0
        yield clk.posedge
        yield delay(100)
        yield clk.posedge

        yield clk.posedge
        rate_num.next = 1
        rate_denom.next = 4
        rate_by_frame.next = 1

        for frame_mode in (True, False):
            print("test frame mode %s" % frame_mode)
            rate_by_frame.next = frame_mode

            rate_num.next = 1
            rate_denom.next = 4

            yield clk.posedge
            print("test 1: test packet")
            current_test.next = 1

            test_frame = axis_ep.AXIStreamFrame(
                b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                b'\x5A\x51\x52\x53\x54\x55' +
                b'\x80\x00' +
                b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
                id=1,
                dest=1
            )

            source.send(test_frame)

            yield sink.wait()
            rx_frame = sink.recv()

            assert rx_frame == test_frame

            yield delay(100)

            yield clk.posedge
            print("test 2: longer packet")
            current_test.next = 2

            test_frame = axis_ep.AXIStreamFrame(
                b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                b'\x5A\x51\x52\x53\x54\x55' +
                b'\x80\x00' +
                bytearray(range(256)),
                id=2,
                dest=1
            )

            source.send(test_frame)

            yield sink.wait()
            rx_frame = sink.recv()

            assert rx_frame == test_frame

            yield clk.posedge
            print("test 3: test packet with pauses")
            current_test.next = 3

            test_frame = axis_ep.AXIStreamFrame(
                b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                b'\x5A\x51\x52\x53\x54\x55' +
                b'\x80\x00' +
                bytearray(range(256)),
                id=3,
                dest=1
            )

            source.send(test_frame)
            yield clk.posedge

            yield delay(64)
            yield clk.posedge
            source_pause.next = True
            yield delay(32)
            yield clk.posedge
            source_pause.next = False

            yield delay(64)
            yield clk.posedge
            sink_pause.next = True
            yield delay(32)
            yield clk.posedge
            sink_pause.next = False

            yield sink.wait()
            rx_frame = sink.recv()

            assert rx_frame == test_frame

            yield delay(100)

            yield clk.posedge
            print("test 4: back-to-back packets")
            current_test.next = 4

            test_frame1 = axis_ep.AXIStreamFrame(
                b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                b'\x5A\x51\x52\x53\x54\x55' +
                b'\x80\x00' +
                b'\x01\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
                id=4,
                dest=1
            )
            test_frame2 = axis_ep.AXIStreamFrame(
                b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                b'\x5A\x51\x52\x53\x54\x55' +
                b'\x80\x00' +
                b'\x02\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
                id=4,
                dest=2
            )

            source.send(test_frame1)
            source.send(test_frame2)

            yield sink.wait()
            rx_frame = sink.recv()

            assert rx_frame == test_frame1

            yield sink.wait()
            rx_frame = sink.recv()

            assert rx_frame == test_frame2

            yield delay(100)

            yield clk.posedge
            print("test 5: alternate pause source")
            current_test.next = 5

            test_frame1 = axis_ep.AXIStreamFrame(
                b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                b'\x5A\x51\x52\x53\x54\x55' +
                b'\x80\x00' +
                b'\x01\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
                id=5,
                dest=1
            )
            test_frame2 = axis_ep.AXIStreamFrame(
                b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                b'\x5A\x51\x52\x53\x54\x55' +
                b'\x80\x00' +
                b'\x02\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
                id=5,
                dest=2
            )

            source.send(test_frame1)
            source.send(test_frame2)
            yield clk.posedge

            while input_axis_tvalid or output_axis_tvalid:
                source_pause.next = True
                yield clk.posedge
                yield clk.posedge
                yield clk.posedge
                source_pause.next = False
                yield clk.posedge

            yield sink.wait()
            rx_frame = sink.recv()

            assert rx_frame == test_frame1

            yield sink.wait()
            rx_frame = sink.recv()

            assert rx_frame == test_frame2

            yield delay(100)

            yield clk.posedge
            print("test 6: alternate pause sink")
            current_test.next = 6

            test_frame1 = axis_ep.AXIStreamFrame(
                b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                b'\x5A\x51\x52\x53\x54\x55' +
                b'\x80\x00' +
                b'\x01\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
                id=6,
                dest=1
            )
            test_frame2 = axis_ep.AXIStreamFrame(
                b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                b'\x5A\x51\x52\x53\x54\x55' +
                b'\x80\x00' +
                b'\x02\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
                id=6,
                dest=2
            )

            source.send(test_frame1)
            source.send(test_frame2)
            yield clk.posedge

            while input_axis_tvalid or output_axis_tvalid:
                sink_pause.next = True
                yield clk.posedge
                yield clk.posedge
                yield clk.posedge
                sink_pause.next = False
                yield clk.posedge

            yield sink.wait()
            rx_frame = sink.recv()

            assert rx_frame == test_frame1

            yield sink.wait()
            rx_frame = sink.recv()

            assert rx_frame == test_frame2

            yield delay(100)

            yield clk.posedge
            print("test 7: tuser assert")
            current_test.next = 7

            test_frame = axis_ep.AXIStreamFrame(
                b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                b'\x5A\x51\x52\x53\x54\x55' +
                b'\x80\x00' +
                b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
                id=7,
                dest=1,
                last_cycle_user=1
            )

            source.send(test_frame)

            yield sink.wait()
            rx_frame = sink.recv()

            assert rx_frame == test_frame
            assert rx_frame.last_cycle_user

            yield delay(100)

            yield clk.posedge
            print("test 8: various lengths and delays")
            current_test.next = 8

            for rate in ((1,1), (1,2), (1,10), (2,3)):
                print("test 8 rate %d / %d" % rate)
                rate_num.next = rate[0]
                rate_denom.next = rate[1]

                yield delay(100)

                reset_stats.next = 1
                yield clk.posedge
                start_time = now()

                lens = [32, 48, 64, 96, 128, 256]
                test_frame = []

                for i in range(len(lens)):
                    test_frame.append(axis_ep.AXIStreamFrame(
                        b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                        b'\x5A\x51\x52\x53\x54\x55' +
                        b'\x80\x00' +
                        bytearray(range(lens[i])),
                        id=i,
                        dest=1
                    ))

                for f in test_frame:
                    source.send(f)

                rx_frame = []

                for i in range(len(lens)):
                    yield sink.wait()
                    rx_frame.append(sink.recv())

                yield clk.posedge

                while not input_axis_tready:
                    yield clk.posedge

                stop_time = now()

                assert len(rx_frame) == len(test_frame)

                for i in range(len(lens)):
                    assert rx_frame[i] == test_frame[i]

                cycle = (stop_time - start_time) / 8

                print("cycles %d" % cycle)
                print("tick count %d" % tick_count)
                print("byte count %d" % byte_count)
                print("frame count %d" % frame_count)

                assert tick_count == cycle*len(output_axis_tkeep)
                assert byte_count == sum(len(f.data) for f in test_frame)
                assert frame_count == len(test_frame)

                test_rate = float(rate_num) / float(rate_denom)
                meas_rate = float(byte_count) / float(tick_count)
                error = (test_rate - meas_rate) / test_rate

                print("test rate %f" % test_rate)
                print("meas rate %f" % meas_rate)
                print("error %f%%" % (error*100))

                assert abs(error) < 0.1

                yield delay(100)

        raise StopSimulation
    def check():
        yield delay(100)
        yield clk.posedge
        rst.next = 1
        yield clk.posedge
        rst.next = 0
        yield clk.posedge
        yield delay(100)
        yield clk.posedge

        length_min.next = 1
        length_max.next = 20

        for lmax in range(1, 18):
            for lmin in range(0, lmax + 1):
                length_min.next = lmin
                length_max.next = lmax

                for payload_len in range(1, 18):
                    yield clk.posedge
                    print("test 1: test packet, length %d" % payload_len)
                    current_test.next = 1

                    test_frame = axis_ep.AXIStreamFrame(
                        bytearray(range(payload_len)))

                    for wait in wait_normal, wait_pause_source, wait_pause_sink:
                        source.send(test_frame)
                        yield clk.posedge
                        yield clk.posedge

                        yield wait()

                        yield clk.posedge
                        yield clk.posedge
                        yield clk.posedge

                        rx_frame = sink.recv()

                        lrx = len(rx_frame.data)
                        lt = len(test_frame.data)
                        lm = min(lrx, lt)
                        assert lrx >= lmin
                        assert lrx <= lmax
                        assert rx_frame.data[:lm] == test_frame.data[:lm]

                        status = status_sink.recv()
                        assert status.data[0][0] == (lt < lmin)
                        assert status.data[0][1] == (lt > lmax)
                        assert status.data[0][2] == lrx
                        assert status.data[0][3] == lt

                        assert sink.empty()
                        assert status_sink.empty()

                        yield delay(100)

                    yield clk.posedge
                    print("test 2: back-to-back packets, length %d" %
                          payload_len)
                    current_test.next = 2

                    test_frame1 = axis_ep.AXIStreamFrame(
                        bytearray(range(payload_len)))
                    test_frame2 = axis_ep.AXIStreamFrame(
                        bytearray(range(payload_len)))

                    for wait in wait_normal, wait_pause_source, wait_pause_sink:
                        source.send(test_frame1)
                        source.send(test_frame2)
                        yield clk.posedge
                        yield clk.posedge

                        yield wait()

                        yield clk.posedge
                        yield clk.posedge
                        yield clk.posedge

                        rx_frame = sink.recv()

                        lrx = len(rx_frame.data)
                        lt = len(test_frame1.data)
                        lm = min(lrx, lt)
                        assert lrx >= lmin
                        assert lrx <= lmax
                        assert rx_frame.data[:lm] == test_frame1.data[:lm]

                        status = status_sink.recv()
                        assert status.data[0][0] == (lt < lmin)
                        assert status.data[0][1] == (lt > lmax)
                        assert status.data[0][2] == lrx
                        assert status.data[0][3] == lt

                        rx_frame = sink.recv()

                        lrx = len(rx_frame.data)
                        lt = len(test_frame2.data)
                        lm = min(lrx, lt)
                        assert lrx >= lmin
                        assert lrx <= lmax
                        assert rx_frame.data[:lm] == test_frame2.data[:lm]

                        status = status_sink.recv()
                        assert status.data[0][0] == (lt < lmin)
                        assert status.data[0][1] == (lt > lmax)
                        assert status.data[0][2] == lrx
                        assert status.data[0][3] == lt

                        assert sink.empty()
                        assert status_sink.empty()

                        yield delay(100)

                    yield clk.posedge
                    print("test 3: tuser assert, length %d" % payload_len)
                    current_test.next = 3

                    test_frame1 = axis_ep.AXIStreamFrame(
                        bytearray(range(payload_len)))
                    test_frame2 = axis_ep.AXIStreamFrame(
                        bytearray(range(payload_len)))

                    test_frame1.user = 1

                    for wait in wait_normal, wait_pause_source, wait_pause_sink:
                        source.send(test_frame1)
                        source.send(test_frame2)
                        yield clk.posedge
                        yield clk.posedge

                        yield wait()

                        yield clk.posedge
                        yield clk.posedge
                        yield clk.posedge

                        rx_frame = sink.recv()

                        lrx = len(rx_frame.data)
                        lt = len(test_frame1.data)
                        lm = min(lrx, lt)
                        assert lrx >= lmin
                        assert lrx <= lmax
                        assert rx_frame.data[:lm] == test_frame1.data[:lm]

                        assert rx_frame.user[-1]

                        status = status_sink.recv()
                        assert status.data[0][0] == (lt < lmin)
                        assert status.data[0][1] == (lt > lmax)
                        assert status.data[0][2] == lrx
                        assert status.data[0][3] == lt

                        rx_frame = sink.recv()

                        lrx = len(rx_frame.data)
                        lt = len(test_frame2.data)
                        lm = min(lrx, lt)
                        assert lrx >= lmin
                        assert lrx <= lmax
                        assert rx_frame.data[:lm] == test_frame2.data[:lm]

                        status = status_sink.recv()
                        assert status.data[0][0] == (lt < lmin)
                        assert status.data[0][1] == (lt > lmax)
                        assert status.data[0][2] == lrx
                        assert status.data[0][3] == lt

                        assert sink.empty()
                        assert status_sink.empty()

                        yield delay(100)

        raise StopSimulation
Example #17
0
    def check():
        yield delay(100)
        yield clk.posedge
        rst.next = 1
        yield clk.posedge
        rst.next = 0
        yield clk.posedge
        yield delay(100)
        yield clk.posedge

        yield clk.posedge

        yield clk.posedge
        print("test 1: test packet")
        current_test.next = 1

        test_frame = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                            b'\x5A\x51\x52\x53\x54\x55' +
                                            b'\x80\x00' +
                                            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10')
        source_queue.put(test_frame)
        yield clk.posedge

        yield output_axis_tlast.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame = None
        if not sink_queue.empty():
            rx_frame = sink_queue.get()

        assert rx_frame == test_frame

        yield delay(100)

        yield clk.posedge
        print("test 2: longer packet")
        current_test.next = 2

        test_frame = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                            b'\x5A\x51\x52\x53\x54\x55' +
                                            b'\x80\x00' +
                                            bytearray(range(256)))
        source_queue.put(test_frame)
        yield clk.posedge

        yield output_axis_tlast.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame = None
        if not sink_queue.empty():
            rx_frame = sink_queue.get()

        assert rx_frame == test_frame

        yield clk.posedge
        print("test 3: test packet with pauses")
        current_test.next = 3

        test_frame = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                            b'\x5A\x51\x52\x53\x54\x55' +
                                            b'\x80\x00' +
                                            bytearray(range(256)))
        source_queue.put(test_frame)
        yield clk.posedge

        yield delay(64)
        yield clk.posedge
        source_pause.next = True
        yield delay(32)
        yield clk.posedge
        source_pause.next = False

        yield delay(64)
        yield clk.posedge
        sink_pause.next = True
        yield delay(32)
        yield clk.posedge
        sink_pause.next = False

        yield output_axis_tlast.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame = None
        if not sink_queue.empty():
            rx_frame = sink_queue.get()

        assert rx_frame == test_frame

        yield delay(100)

        yield clk.posedge
        print("test 4: back-to-back packets")
        current_test.next = 4

        test_frame1 = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                             b'\x5A\x51\x52\x53\x54\x55' +
                                             b'\x80\x00' +
                                             b'\x01\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10')
        test_frame2 = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                             b'\x5A\x51\x52\x53\x54\x55' +
                                             b'\x80\x00' +
                                             b'\x02\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10')
        source_queue.put(test_frame1)
        source_queue.put(test_frame2)
        yield clk.posedge

        yield output_axis_tlast.posedge
        yield clk.posedge
        yield output_axis_tlast.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame = None
        if not sink_queue.empty():
            rx_frame = sink_queue.get()

        assert rx_frame == test_frame1

        rx_frame = None
        if not sink_queue.empty():
            rx_frame = sink_queue.get()

        assert rx_frame == test_frame2

        yield delay(100)

        yield clk.posedge
        print("test 5: alternate pause source")
        current_test.next = 5

        test_frame1 = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                             b'\x5A\x51\x52\x53\x54\x55' +
                                             b'\x80\x00' +
                                             b'\x01\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10')
        test_frame2 = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                             b'\x5A\x51\x52\x53\x54\x55' +
                                             b'\x80\x00' +
                                             b'\x02\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10')
        source_queue.put(test_frame1)
        source_queue.put(test_frame2)
        yield clk.posedge

        while input_axis_tvalid or output_axis_tvalid:
            source_pause.next = True
            yield clk.posedge
            yield clk.posedge
            yield clk.posedge
            source_pause.next = False
            yield clk.posedge

        yield clk.posedge
        yield clk.posedge

        rx_frame = None
        if not sink_queue.empty():
            rx_frame = sink_queue.get()

        assert rx_frame == test_frame1

        rx_frame = None
        if not sink_queue.empty():
            rx_frame = sink_queue.get()

        assert rx_frame == test_frame2

        yield delay(100)

        yield clk.posedge
        print("test 6: alternate pause sink")
        current_test.next = 6

        test_frame1 = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                             b'\x5A\x51\x52\x53\x54\x55' +
                                             b'\x80\x00' +
                                             b'\x01\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10')
        test_frame2 = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                             b'\x5A\x51\x52\x53\x54\x55' +
                                             b'\x80\x00' +
                                             b'\x02\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10')
        source_queue.put(test_frame1)
        source_queue.put(test_frame2)
        yield clk.posedge

        while input_axis_tvalid or output_axis_tvalid:
            sink_pause.next = True
            yield clk.posedge
            yield clk.posedge
            yield clk.posedge
            sink_pause.next = False
            yield clk.posedge

        yield clk.posedge
        yield clk.posedge

        rx_frame = None
        if not sink_queue.empty():
            rx_frame = sink_queue.get()

        assert rx_frame == test_frame1

        rx_frame = None
        if not sink_queue.empty():
            rx_frame = sink_queue.get()

        assert rx_frame == test_frame2

        yield delay(100)

        yield clk.posedge
        print("test 7: tuser assert")
        current_test.next = 7

        test_frame = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                            b'\x5A\x51\x52\x53\x54\x55' +
                                            b'\x80\x00' +
                                            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10')
        test_frame.user = 1
        source_queue.put(test_frame)
        yield clk.posedge

        yield output_axis_tlast.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame = None
        if not sink_queue.empty():
            rx_frame = sink_queue.get()

        assert rx_frame == test_frame
        assert rx_frame.user[-1]

        yield delay(100)

        yield clk.posedge
        print("test 8: initial sink pause")
        current_test.next = 8

        test_frame = axis_ep.AXIStreamFrame(bytearray(range(24)))

        sink_pause.next = 1
        source_queue.put(test_frame)
        yield clk.posedge
        yield clk.posedge
        yield clk.posedge
        yield clk.posedge
        sink_pause.next = 0

        yield output_axis_tlast.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame = None
        if not sink_queue.empty():
            rx_frame = sink_queue.get()

        assert rx_frame == test_frame

        yield delay(100)

        yield clk.posedge
        print("test 9: initial sink pause, reset")
        current_test.next = 9

        test_frame = axis_ep.AXIStreamFrame(bytearray(range(24)))

        sink_pause.next = 1
        source_queue.put(test_frame)
        yield clk.posedge
        yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        rst.next = 1
        yield clk.posedge
        rst.next = 0

        sink_pause.next = 0

        yield delay(100)

        yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        assert sink_queue.empty()

        yield delay(100)

        raise StopSimulation
Example #18
0
 def parse_axis_fcs(self, data):
     self.parse_axis(data)
     data = self.payload.data
     self.payload = axis_ep.AXIStreamFrame(data[:-4])
     self.eth_fcs = struct.unpack('<L', data[-4:])[0]
    def check():
        yield delay(100)
        yield clk.posedge
        rst.next = 1
        yield clk.posedge
        rst.next = 0
        yield clk.posedge
        yield delay(100)
        yield clk.posedge

        yield clk.posedge

        yield clk.posedge
        print("test 1: 0123 -> 0123")
        current_test.next = 1

        output_0_select.next = 0
        output_1_select.next = 1
        output_2_select.next = 2
        output_3_select.next = 3

        test_frame0 = axis_ep.AXIStreamFrame(b'\x01\x00\x00\xFF\x01\x02\x03\x04')
        test_frame1 = axis_ep.AXIStreamFrame(b'\x01\x01\x01\xFF\x01\x02\x03\x04')
        test_frame2 = axis_ep.AXIStreamFrame(b'\x01\x02\x02\xFF\x01\x02\x03\x04')
        test_frame3 = axis_ep.AXIStreamFrame(b'\x01\x03\x03\xFF\x01\x02\x03\x04')
        source_0.send(test_frame0)
        source_1.send(test_frame1)
        source_2.send(test_frame2)
        source_3.send(test_frame3)
        yield clk.posedge

        while input_0_axis_tvalid or input_1_axis_tvalid or input_2_axis_tvalid or input_3_axis_tvalid:
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame0 = sink_0.recv()

        assert rx_frame0 == test_frame0

        rx_frame1 = sink_1.recv()

        assert rx_frame1 == test_frame1

        rx_frame2 = sink_2.recv()

        assert rx_frame2 == test_frame2

        rx_frame3 = sink_3.recv()

        assert rx_frame3 == test_frame3

        yield delay(100)

        yield clk.posedge
        print("test 2: 0123 -> 3210")
        current_test.next = 2

        output_0_select.next = 3
        output_1_select.next = 2
        output_2_select.next = 1
        output_3_select.next = 0

        test_frame0 = axis_ep.AXIStreamFrame(b'\x02\x00\x03\xFF\x01\x02\x03\x04')
        test_frame1 = axis_ep.AXIStreamFrame(b'\x02\x01\x02\xFF\x01\x02\x03\x04')
        test_frame2 = axis_ep.AXIStreamFrame(b'\x02\x02\x01\xFF\x01\x02\x03\x04')
        test_frame3 = axis_ep.AXIStreamFrame(b'\x02\x03\x00\xFF\x01\x02\x03\x04')
        source_0.send(test_frame0)
        source_1.send(test_frame1)
        source_2.send(test_frame2)
        source_3.send(test_frame3)
        yield clk.posedge

        while input_0_axis_tvalid or input_1_axis_tvalid or input_2_axis_tvalid or input_3_axis_tvalid:
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame0 = sink_0.recv()

        assert rx_frame0 == test_frame3

        rx_frame1 = sink_1.recv()

        assert rx_frame1 == test_frame2

        rx_frame2 = sink_2.recv()

        assert rx_frame2 == test_frame1

        rx_frame3 = sink_3.recv()

        assert rx_frame3 == test_frame0

        yield delay(100)

        yield clk.posedge
        print("test 3: 0000 -> 0123")
        current_test.next = 3

        output_0_select.next = 0
        output_1_select.next = 0
        output_2_select.next = 0
        output_3_select.next = 0

        test_frame0 = axis_ep.AXIStreamFrame(b'\x03\x00\xFF\xFF\x01\x02\x03\x04')
        source_0.send(test_frame0)
        yield clk.posedge

        while input_0_axis_tvalid or input_1_axis_tvalid or input_2_axis_tvalid or input_3_axis_tvalid:
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame0 = sink_0.recv()

        assert rx_frame0 == test_frame0

        rx_frame1 = sink_1.recv()

        assert rx_frame1 == test_frame0

        rx_frame2 = sink_2.recv()

        assert rx_frame2 == test_frame0

        rx_frame3 = sink_3.recv()

        assert rx_frame3 == test_frame0

        yield delay(100)

        raise StopSimulation
Example #20
0
    def check():
        yield delay(100)
        yield clk.posedge
        rst.next = 1
        yield clk.posedge
        rst.next = 0
        yield clk.posedge
        yield delay(100)
        yield clk.posedge

        # testbench stimulus

        yield clk.posedge
        print("test 1: test sequence")
        current_test.next = 1

        i_data = list(range(20))
        q_data = list(range(20, 40))

        test_frame_i = axis_ep.AXIStreamFrame(i_data)
        test_frame_q = axis_ep.AXIStreamFrame(q_data)

        input_i_source_queue.put(test_frame_i)
        input_q_source_queue.put(test_frame_q)
        yield clk.posedge
        yield clk.posedge

        while input_i_tvalid or input_q_tvalid or output_tvalid:
            yield clk.posedge

        yield clk.posedge
        yield clk.posedge

        lst = []

        while not output_sink_queue.empty():
            lst += output_sink_queue.get(False).data

        assert lst == [list(f) for f in zip(i_data, q_data)]

        yield delay(100)

        yield clk.posedge
        print("test 2: pause source")
        current_test.next = 2

        i_data = list(range(20))
        q_data = list(range(20, 40))

        test_frame_i = axis_ep.AXIStreamFrame(i_data)
        test_frame_q = axis_ep.AXIStreamFrame(q_data)

        input_i_source_queue.put(test_frame_i)
        input_q_source_queue.put(test_frame_q)
        yield clk.posedge
        yield clk.posedge

        while input_i_tvalid or input_q_tvalid or output_tvalid:
            input_i_source_pause.next = True
            yield clk.posedge
            yield clk.posedge
            yield clk.posedge
            input_i_source_pause.next = False
            yield clk.posedge

        yield clk.posedge
        yield clk.posedge

        lst = []

        while not output_sink_queue.empty():
            lst += output_sink_queue.get(False).data

        assert lst == [list(f) for f in zip(i_data, q_data)]

        yield delay(100)

        yield clk.posedge
        print("test 3: pause both sources")
        current_test.next = 3

        i_data = list(range(20))
        q_data = list(range(20, 40))

        test_frame_i = axis_ep.AXIStreamFrame(i_data)
        test_frame_q = axis_ep.AXIStreamFrame(q_data)

        input_i_source_queue.put(test_frame_i)
        input_q_source_queue.put(test_frame_q)
        yield clk.posedge
        yield clk.posedge

        input_q_source_pause.next = True

        while input_i_tvalid or input_q_tvalid or output_tvalid:
            input_i_source_pause.next = True
            yield clk.posedge
            input_q_source_pause.next = False
            yield clk.posedge
            input_q_source_pause.next = True
            yield clk.posedge
            input_i_source_pause.next = False
            yield clk.posedge

        input_q_source_pause.next = False

        yield clk.posedge
        yield clk.posedge

        lst = []

        while not output_sink_queue.empty():
            lst += output_sink_queue.get(False).data

        assert lst == [list(f) for f in zip(i_data, q_data)]

        yield delay(100)

        yield clk.posedge
        print("test 4: pause sink")
        current_test.next = 4

        i_data = list(range(20))
        q_data = list(range(20, 40))

        test_frame_i = axis_ep.AXIStreamFrame(i_data)
        test_frame_q = axis_ep.AXIStreamFrame(q_data)

        input_i_source_queue.put(test_frame_i)
        input_q_source_queue.put(test_frame_q)
        yield clk.posedge
        yield clk.posedge

        while input_i_tvalid or input_q_tvalid or output_tvalid:
            output_sink_pause.next = True
            yield clk.posedge
            yield clk.posedge
            yield clk.posedge
            output_sink_pause.next = False
            yield clk.posedge

        yield clk.posedge
        yield clk.posedge

        lst = []

        while not output_sink_queue.empty():
            lst += output_sink_queue.get(False).data

        assert lst == [list(f) for f in zip(i_data, q_data)]

        yield delay(100)

        yield clk.posedge
        print("test 5: pause source and sink")
        current_test.next = 4

        i_data = list(range(20))
        q_data = list(range(20, 40))

        test_frame_i = axis_ep.AXIStreamFrame(i_data)
        test_frame_q = axis_ep.AXIStreamFrame(q_data)

        input_i_source_queue.put(test_frame_i)
        input_q_source_queue.put(test_frame_q)
        yield clk.posedge
        yield clk.posedge

        input_q_source_pause.next = True

        while input_i_tvalid or input_q_tvalid or output_tvalid:
            output_sink_pause.next = True
            yield clk.posedge
            input_q_source_pause.next = False
            yield clk.posedge
            input_q_source_pause.next = True
            yield clk.posedge
            output_sink_pause.next = False
            yield clk.posedge

        input_q_source_pause.next = False

        yield clk.posedge
        yield clk.posedge

        lst = []

        while not output_sink_queue.empty():
            lst += output_sink_queue.get(False).data

        assert lst == [list(f) for f in zip(i_data, q_data)]

        yield delay(100)

        raise StopSimulation
    def check():
        yield delay(100)
        yield clk.posedge
        rst.next = 1
        yield clk.posedge
        rst.next = 0
        yield clk.posedge
        yield delay(100)
        yield clk.posedge

        # testbench stimulus

        yield clk.posedge
        print("test 1: 0123 -> 0123")
        current_test.next = 1

        test_frame0 = axis_ep.AXIStreamFrame(b'\x01\x00\x00\xFF\x01\x02\x03\x04\x05\x06\x07\x08', dest=0)
        test_frame1 = axis_ep.AXIStreamFrame(b'\x01\x01\x01\xFF\x01\x02\x03\x04\x05\x06\x07\x08', dest=1)
        test_frame2 = axis_ep.AXIStreamFrame(b'\x01\x02\x02\xFF\x01\x02\x03\x04\x05\x06\x07\x08', dest=2)
        test_frame3 = axis_ep.AXIStreamFrame(b'\x01\x03\x03\xFF\x01\x02\x03\x04\x05\x06\x07\x08', dest=3)

        for wait in wait_normal, wait_pause_source, wait_pause_sink:
            source_0.send(test_frame0)
            source_1.send(test_frame1)
            source_2.send(test_frame2)
            source_3.send(test_frame3)
            yield clk.posedge
            yield clk.posedge

            yield wait()
            yield clk.posedge
            yield clk.posedge

            rx_frame0 = sink_0.recv()

            assert rx_frame0 == test_frame0

            rx_frame1 = sink_1.recv()

            assert rx_frame1 == test_frame1

            rx_frame2 = sink_2.recv()

            assert rx_frame2 == test_frame2

            rx_frame3 = sink_3.recv()

            assert rx_frame3 == test_frame3

            yield delay(100)

        yield clk.posedge
        print("test 2: 0123 -> 3210")
        current_test.next = 2

        test_frame0 = axis_ep.AXIStreamFrame(b'\x02\x00\x03\xFF\x01\x02\x03\x04\x05\x06\x07\x08', dest=3)
        test_frame1 = axis_ep.AXIStreamFrame(b'\x02\x01\x02\xFF\x01\x02\x03\x04\x05\x06\x07\x08', dest=2)
        test_frame2 = axis_ep.AXIStreamFrame(b'\x02\x02\x01\xFF\x01\x02\x03\x04\x05\x06\x07\x08', dest=1)
        test_frame3 = axis_ep.AXIStreamFrame(b'\x02\x03\x00\xFF\x01\x02\x03\x04\x05\x06\x07\x08', dest=0)

        for wait in wait_normal, wait_pause_source, wait_pause_sink:
            source_0.send(test_frame0)
            source_1.send(test_frame1)
            source_2.send(test_frame2)
            source_3.send(test_frame3)
            yield clk.posedge
            yield clk.posedge

            yield wait()
            yield clk.posedge
            yield clk.posedge

            rx_frame0 = sink_0.recv()

            assert rx_frame0 == test_frame3

            rx_frame1 = sink_1.recv()

            assert rx_frame1 == test_frame2

            rx_frame2 = sink_2.recv()

            assert rx_frame2 == test_frame1

            rx_frame3 = sink_3.recv()

            assert rx_frame3 == test_frame0

            yield delay(100)

        yield clk.posedge
        print("test 3: 0000 -> 0123")
        current_test.next = 3

        test_frame0 = axis_ep.AXIStreamFrame(b'\x02\x00\x00\xFF\x01\x02\x03\x04\x05\x06\x07\x08', dest=0)
        test_frame1 = axis_ep.AXIStreamFrame(b'\x02\x00\x01\xFF\x01\x02\x03\x04\x05\x06\x07\x08', dest=1)
        test_frame2 = axis_ep.AXIStreamFrame(b'\x02\x00\x02\xFF\x01\x02\x03\x04\x05\x06\x07\x08', dest=2)
        test_frame3 = axis_ep.AXIStreamFrame(b'\x02\x00\x03\xFF\x01\x02\x03\x04\x05\x06\x07\x08', dest=3)

        for wait in wait_normal, wait_pause_source, wait_pause_sink:
            source_0.send(test_frame0)
            source_0.send(test_frame1)
            source_0.send(test_frame2)
            source_0.send(test_frame3)
            yield clk.posedge
            yield clk.posedge

            yield wait()
            yield clk.posedge
            yield clk.posedge

            rx_frame0 = sink_0.recv()

            assert rx_frame0 == test_frame0

            rx_frame1 = sink_1.recv()

            assert rx_frame1 == test_frame1

            rx_frame2 = sink_2.recv()

            assert rx_frame2 == test_frame2

            rx_frame3 = sink_3.recv()

            assert rx_frame3 == test_frame3

            yield delay(100)

        yield clk.posedge
        print("test 4: 0123 -> 0000")
        current_test.next = 4

        test_frame0 = axis_ep.AXIStreamFrame(b'\x02\x00\x00\xFF\x01\x02\x03\x04\x05\x06\x07\x08', dest=0)
        test_frame1 = axis_ep.AXIStreamFrame(b'\x02\x01\x00\xFF\x01\x02\x03\x04\x05\x06\x07\x08', dest=0)
        test_frame2 = axis_ep.AXIStreamFrame(b'\x02\x02\x00\xFF\x01\x02\x03\x04\x05\x06\x07\x08', dest=0)
        test_frame3 = axis_ep.AXIStreamFrame(b'\x02\x03\x00\xFF\x01\x02\x03\x04\x05\x06\x07\x08', dest=0)

        for wait in wait_normal, wait_pause_source, wait_pause_sink:
            source_0.send(test_frame0)
            yield clk.posedge
            source_1.send(test_frame1)
            source_2.send(test_frame2)
            source_3.send(test_frame3)
            yield clk.posedge

            yield wait()
            yield clk.posedge
            yield clk.posedge

            rx_frame0 = sink_0.recv()

            assert rx_frame0 == test_frame0

            rx_frame1 = sink_0.recv()

            assert rx_frame1 == test_frame1

            rx_frame2 = sink_0.recv()

            assert rx_frame2 == test_frame2

            rx_frame3 = sink_0.recv()

            assert rx_frame3 == test_frame3

            yield delay(100)

        yield clk.posedge
        print("test 1: bad decoding")
        current_test.next = 1

        test_frame0 = axis_ep.AXIStreamFrame(b'\x01\x00\x00\xFF\x01\x02\x03\x04\x05\x06\x07\x08', dest=0)
        test_frame1 = axis_ep.AXIStreamFrame(b'\x01\x01\x01\xFF\x01\x02\x03\x04\x05\x06\x07\x08', dest=1)
        test_frame2 = axis_ep.AXIStreamFrame(b'\x01\x02\x04\xFF\x01\x02\x03\x04\x05\x06\x07\x08', dest=4)
        test_frame3 = axis_ep.AXIStreamFrame(b'\x01\x03\x05\xFF\x01\x02\x03\x04\x05\x06\x07\x08', dest=5)

        for wait in wait_normal, wait_pause_source, wait_pause_sink:
            source_0.send(test_frame0)
            source_1.send(test_frame1)
            source_2.send(test_frame2)
            source_3.send(test_frame3)
            yield clk.posedge
            yield clk.posedge

            yield wait()
            yield clk.posedge
            yield clk.posedge

            rx_frame0 = sink_0.recv()

            assert rx_frame0 == test_frame0

            rx_frame1 = sink_1.recv()

            assert rx_frame1 == test_frame1

            yield delay(100)

        raise StopSimulation
Example #22
0
    def check():
        yield delay(100)
        yield clk.posedge
        rst.next = 1
        yield clk.posedge
        rst.next = 0
        yield clk.posedge
        yield delay(100)
        yield clk.posedge

        # testbench stimulus

        yield clk.posedge
        print("test 1: high frequency")
        current_test.next = 1

        fcw = int(2**PHASE_WIDTH / 100)
        offset = 0

        test_frame1 = axis_ep.AXIStreamFrame()
        test_frame1.data = [offset]
        test_frame2 = axis_ep.AXIStreamFrame()
        test_frame2.data = [fcw]

        phase_source_queue.put(test_frame1)
        phase_step_source_queue.put(test_frame2)

        yield clk.posedge
        yield clk.posedge

        while not sample_sink_queue.empty():
            sample_sink_queue.get(False)

        yield delay(1000)

        for j in range(6):
            sample_sink_queue.get(False)

        for j in range(100):
            rx_frame = sample_sink_queue.get(False)
            INPUT_WIDTH = OUTPUT_WIDTH+2
            x = int((fcw*j + offset) / 2**(PHASE_WIDTH-INPUT_WIDTH))
            c, s = rx_frame.data[0]

            # sign bit
            if c >= 2**(OUTPUT_WIDTH-1):
                c -= 2**OUTPUT_WIDTH
            if s >= 2**(OUTPUT_WIDTH-1):
                s -= 2**OUTPUT_WIDTH

            # reference sine and cosine
            rc = int(np.cos(2*np.pi*(x-2**((INPUT_WIDTH-2)/2-1))/2**INPUT_WIDTH)*(2**(OUTPUT_WIDTH-1)-1))
            rs = int(np.sin(2*np.pi*(x-2**((INPUT_WIDTH-2)/2-1))/2**INPUT_WIDTH)*(2**(OUTPUT_WIDTH-1)-1))

            # assert error of two counts or less
            assert abs(c-rc) <= 2
            assert abs(s-rs) <= 2

        yield clk.posedge
        print("test 2: low frequency")
        current_test.next = 2

        fcw = int(2**PHASE_WIDTH / 10000)
        offset = 0

        test_frame1 = axis_ep.AXIStreamFrame()
        test_frame1.data = [offset]
        test_frame2 = axis_ep.AXIStreamFrame()
        test_frame2.data = [fcw]

        phase_source_queue.put(test_frame1)
        phase_step_source_queue.put(test_frame2)

        yield clk.posedge
        yield clk.posedge

        while not sample_sink_queue.empty():
            sample_sink_queue.get(False)

        yield delay(1000)

        for j in range(6):
            sample_sink_queue.get(False)

        for j in range(100):
            rx_frame = sample_sink_queue.get(False)
            INPUT_WIDTH = OUTPUT_WIDTH+2
            x = int((fcw*j + offset) / 2**(PHASE_WIDTH-INPUT_WIDTH))
            c, s = rx_frame.data[0]

            # sign bit
            if c >= 2**(OUTPUT_WIDTH-1):
                c -= 2**OUTPUT_WIDTH
            if s >= 2**(OUTPUT_WIDTH-1):
                s -= 2**OUTPUT_WIDTH

            # reference sine and cosine
            rc = int(np.cos(2*np.pi*(x-2**((INPUT_WIDTH-2)/2-1))/2**INPUT_WIDTH)*(2**(OUTPUT_WIDTH-1)-1))
            rs = int(np.sin(2*np.pi*(x-2**((INPUT_WIDTH-2)/2-1))/2**INPUT_WIDTH)*(2**(OUTPUT_WIDTH-1)-1))

            # assert error of two counts or less
            assert abs(c-rc) <= 2
            assert abs(s-rs) <= 2

        yield clk.posedge
        print("test 3: phase offset")
        current_test.next = 3

        fcw = int(2**PHASE_WIDTH / 10000)
        offset = 2**(PHASE_WIDTH-2)

        test_frame1 = axis_ep.AXIStreamFrame()
        test_frame1.data = [offset]
        test_frame2 = axis_ep.AXIStreamFrame()
        test_frame2.data = [fcw]

        phase_source_queue.put(test_frame1)
        phase_step_source_queue.put(test_frame2)

        yield clk.posedge
        yield clk.posedge

        while not sample_sink_queue.empty():
            sample_sink_queue.get(False)

        yield delay(1000)

        for j in range(6):
            sample_sink_queue.get(False)

        for j in range(100):
            rx_frame = sample_sink_queue.get(False)
            INPUT_WIDTH = OUTPUT_WIDTH+2
            x = int((fcw*j + offset) / 2**(PHASE_WIDTH-INPUT_WIDTH))
            c, s = rx_frame.data[0]

            # sign bit
            if c >= 2**(OUTPUT_WIDTH-1):
                c -= 2**OUTPUT_WIDTH
            if s >= 2**(OUTPUT_WIDTH-1):
                s -= 2**OUTPUT_WIDTH

            # reference sine and cosine
            rc = int(np.cos(2*np.pi*(x-2**((INPUT_WIDTH-2)/2-1))/2**INPUT_WIDTH)*(2**(OUTPUT_WIDTH-1)-1))
            rs = int(np.sin(2*np.pi*(x-2**((INPUT_WIDTH-2)/2-1))/2**INPUT_WIDTH)*(2**(OUTPUT_WIDTH-1)-1))

            # assert error of two counts or less
            assert abs(c-rc) <= 2
            assert abs(s-rs) <= 2

        raise StopSimulation
Example #23
0
    def check():
        yield delay(100)
        yield clk.posedge
        rst.next = 1
        yield clk.posedge
        rst.next = 0
        yield clk.posedge
        yield delay(100)
        yield clk.posedge

        yield clk.posedge

        yield clk.posedge
        print("test 1: port 0")
        current_test.next = 1

        test_frame = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x00\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=1,
            dest=1)

        source_0.send(test_frame)
        yield clk.posedge

        while input_0_axis_tvalid or input_1_axis_tvalid or input_2_axis_tvalid or input_3_axis_tvalid:
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame = sink.recv()

        assert rx_frame == test_frame

        yield delay(100)

        yield clk.posedge
        print("test 2: port 1")
        current_test.next = 2

        test_frame = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x00\x52\x53\x54\x55' +
            b'\x80\x01' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=2,
            dest=1)

        source_1.send(test_frame)
        yield clk.posedge

        while input_0_axis_tvalid or input_1_axis_tvalid or input_2_axis_tvalid or input_3_axis_tvalid:
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame = sink.recv()

        assert rx_frame == test_frame

        yield delay(100)

        yield clk.posedge
        print("test 3: back-to-back packets, same port")
        current_test.next = 3

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x00\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=3,
            dest=1)
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x00\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=3,
            dest=2)

        source_0.send(test_frame1)
        source_0.send(test_frame2)
        yield clk.posedge

        while input_0_axis_tvalid or input_1_axis_tvalid or input_2_axis_tvalid or input_3_axis_tvalid:
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame = sink.recv()

        assert rx_frame == test_frame1

        rx_frame = sink.recv()

        assert rx_frame == test_frame2

        yield delay(100)

        yield clk.posedge
        print("test 4: back-to-back packets, different ports")
        current_test.next = 4

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x01\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=4,
            dest=1)
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x02\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=4,
            dest=2)

        source_1.send(test_frame1)
        source_2.send(test_frame2)
        yield clk.posedge

        while input_0_axis_tvalid or input_1_axis_tvalid or input_2_axis_tvalid or input_3_axis_tvalid:
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame = sink.recv()

        assert rx_frame == test_frame1

        rx_frame = sink.recv()

        assert rx_frame == test_frame2

        yield delay(100)

        yield clk.posedge
        print("test 5: alterate pause source")
        current_test.next = 5

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x01\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=5,
            dest=1)
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x02\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=5,
            dest=1)

        source_1.send(test_frame1)
        source_2.send(test_frame2)
        yield clk.posedge

        while input_0_axis_tvalid or input_1_axis_tvalid or input_2_axis_tvalid or input_3_axis_tvalid:
            source_0_pause.next = True
            source_1_pause.next = True
            source_2_pause.next = True
            source_3_pause.next = True
            yield clk.posedge
            yield clk.posedge
            yield clk.posedge
            source_0_pause.next = False
            source_1_pause.next = False
            source_2_pause.next = False
            source_3_pause.next = False
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame = sink.recv()

        assert rx_frame == test_frame1

        rx_frame = sink.recv()

        assert rx_frame == test_frame2

        yield delay(100)

        yield clk.posedge
        print("test 6: alterate pause sink")
        current_test.next = 6

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x01\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=6,
            dest=1)
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x02\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=6,
            dest=2)

        source_1.send(test_frame1)
        source_2.send(test_frame2)
        yield clk.posedge

        while input_0_axis_tvalid or input_1_axis_tvalid or input_2_axis_tvalid or input_3_axis_tvalid:
            sink_pause.next = True
            yield clk.posedge
            yield clk.posedge
            yield clk.posedge
            sink_pause.next = False
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame = sink.recv()

        assert rx_frame == test_frame1

        rx_frame = sink.recv()

        assert rx_frame == test_frame2

        yield delay(100)

        yield clk.posedge
        print(
            "test 7: back-to-back packets, different ports, arbitration test")
        current_test.next = 7

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x01\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=7,
            dest=1)
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x02\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=7,
            dest=2)

        source_1.send(test_frame1)
        source_2.send(test_frame2)
        source_2.send(test_frame2)
        source_2.send(test_frame2)
        source_2.send(test_frame2)
        source_2.send(test_frame2)
        yield clk.posedge

        yield delay(800)
        yield clk.posedge
        source_1.send(test_frame1)

        while input_0_axis_tvalid or input_1_axis_tvalid or input_2_axis_tvalid or input_3_axis_tvalid:
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame = sink.recv()

        assert rx_frame == test_frame1

        rx_frame = sink.recv()

        assert rx_frame == test_frame2

        rx_frame = sink.recv()

        assert rx_frame == test_frame2

        rx_frame = sink.recv()

        assert rx_frame == test_frame2

        rx_frame = sink.recv()

        assert rx_frame == test_frame1

        rx_frame = sink.recv()

        assert rx_frame == test_frame2

        yield delay(100)

        raise StopSimulation
Example #24
0
    def check():
        yield delay(100)
        yield clk.posedge
        rst.next = 1
        yield clk.posedge
        rst.next = 0
        yield clk.posedge
        yield delay(100)
        yield clk.posedge

        yield clk.posedge
        enable.next = True
        drop.next = False

        yield clk.posedge
        print("test 1: select port 0")
        current_test.next = 1

        select.next = 0

        test_frame = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=1,
            dest=1
        )

        source.send(test_frame)

        yield sink_list[0].wait()
        rx_frame = sink_list[0].recv()

        assert rx_frame == test_frame

        yield delay(100)

        yield clk.posedge
        print("test 2: select port 1")
        current_test.next = 2

        select.next = 1

        test_frame = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=2,
            dest=1
        )

        source.send(test_frame)

        yield sink_list[1].wait()
        rx_frame = sink_list[1].recv()

        assert rx_frame == test_frame

        yield delay(100)

        yield clk.posedge
        print("test 3: back-to-back packets, same port")
        current_test.next = 3

        select.next = 0

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=3,
            dest=1
        )
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=3,
            dest=2
        )

        source.send(test_frame1)
        source.send(test_frame2)

        yield sink_list[0].wait()
        rx_frame = sink_list[0].recv()

        assert rx_frame == test_frame1

        yield sink_list[0].wait()
        rx_frame = sink_list[0].recv()

        assert rx_frame == test_frame2

        yield delay(100)

        yield clk.posedge
        print("test 4: back-to-back packets, different ports")
        current_test.next = 4

        select.next = 1

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=4,
            dest=1
        )
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=4,
            dest=2
        )

        source.send(test_frame1)
        source.send(test_frame2)
        yield clk.posedge

        while s_axis_tvalid:
            yield clk.posedge
            select.next = 2

        yield sink_list[1].wait()
        rx_frame = sink_list[1].recv()

        assert rx_frame == test_frame1

        yield sink_list[2].wait()
        rx_frame = sink_list[2].recv()

        assert rx_frame == test_frame2

        yield delay(100)

        yield clk.posedge
        print("test 5: alterate pause source")
        current_test.next = 5

        select.next = 1

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=5,
            dest=1
        )
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=5,
            dest=2
        )

        source.send(test_frame1)
        source.send(test_frame2)
        yield clk.posedge

        while s_axis_tvalid:
            source_pause.next = True
            yield clk.posedge
            yield clk.posedge
            yield clk.posedge
            source_pause.next = False
            yield clk.posedge
            select.next = 2

        yield sink_list[1].wait()
        rx_frame = sink_list[1].recv()

        assert rx_frame == test_frame1

        yield sink_list[2].wait()
        rx_frame = sink_list[2].recv()

        assert rx_frame == test_frame2

        yield delay(100)

        yield clk.posedge
        print("test 6: alterate pause sink")
        current_test.next = 6

        select.next = 1

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=6,
            dest=1
        )
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=6,
            dest=2
        )

        source.send(test_frame1)
        source.send(test_frame2)
        yield clk.posedge

        while s_axis_tvalid:
            sink_pause_list[0].next = True
            sink_pause_list[1].next = True
            sink_pause_list[2].next = True
            sink_pause_list[3].next = True
            yield clk.posedge
            yield clk.posedge
            yield clk.posedge
            sink_pause_list[0].next = False
            sink_pause_list[1].next = False
            sink_pause_list[2].next = False
            sink_pause_list[3].next = False
            yield clk.posedge
            select.next = 2

        yield sink_list[1].wait()
        rx_frame = sink_list[1].recv()

        assert rx_frame == test_frame1

        yield sink_list[2].wait()
        rx_frame = sink_list[2].recv()

        assert rx_frame == test_frame2

        yield delay(100)

        yield clk.posedge
        print("test 7: enable")
        current_test.next = 7

        enable.next = False
        select.next = 0

        test_frame = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=7,
            dest=1
        )

        source.send(test_frame)

        yield delay(500)

        assert sink_list[0].empty()

        enable.next = True

        yield sink_list[0].wait()
        rx_frame = sink_list[0].recv()

        assert rx_frame == test_frame

        yield delay(100)

        yield clk.posedge
        print("test 8: drop")
        current_test.next = 8

        drop.next = True
        select.next = 0

        test_frame = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=8,
            dest=1
        )

        source.send(test_frame)

        yield delay(500)

        assert sink_list[0].empty()

        drop.next = False

        yield delay(100)

        raise StopSimulation
Example #25
0
    def check():
        yield delay(100)
        yield clk.posedge
        rst.next = 1
        yield clk.posedge
        rst.next = 0
        yield clk.posedge
        yield delay(100)
        yield clk.posedge

        yield clk.posedge
        tag.next = 1

        yield clk.posedge
        print("test 1: test tick timer")
        current_test.next = 1

        yield clk.posedge
        start_time = now()
        trigger.next = 1
        yield clk.posedge
        trigger.next = 0

        for i in range(100 - 1):
            yield clk.posedge

        stop_time = now()
        trigger.next = 1
        yield clk.posedge
        trigger.next = 0
        yield clk.posedge

        while output_axis_tvalid:
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        # discard first trigger output
        rx_frame = sink.recv()

        # check second trigger output
        rx_frame = sink.recv()

        rx_frame_values = struct.unpack(">HLLL", bytes(rx_frame.data))
        cycles = (stop_time - start_time) / 8
        print(rx_frame_values)

        assert rx_frame_values[0] == 1
        assert rx_frame_values[1] == cycles * 8
        assert rx_frame_values[1] == 100 * 8

        yield delay(100)

        yield clk.posedge
        print("test 2: pause sink")
        current_test.next = 2

        yield clk.posedge
        start_time = now()
        trigger.next = 1
        yield clk.posedge
        trigger.next = 0

        for i in range(100 - 1):
            yield clk.posedge

        stop_time = now()
        trigger.next = 1
        yield clk.posedge
        trigger.next = 0

        while trigger or output_axis_tvalid:
            sink_pause.next = True
            yield clk.posedge
            yield clk.posedge
            yield clk.posedge
            sink_pause.next = False
            yield clk.posedge

        yield clk.posedge
        yield clk.posedge

        # discard first trigger output
        rx_frame = sink.recv()

        # check second trigger output
        rx_frame = sink.recv()

        rx_frame_values = struct.unpack(">HLLL", bytes(rx_frame.data))
        cycles = (stop_time - start_time) / 8
        print(rx_frame_values)

        assert rx_frame_values[0] == 1
        assert rx_frame_values[1] == cycles * 8
        assert rx_frame_values[1] == 100 * 8

        yield delay(100)

        yield clk.posedge
        print("test 3: test packet")
        current_test.next = 3

        yield clk.posedge
        start_time = now()
        trigger.next = 1
        yield clk.posedge
        trigger.next = 0

        test_frame = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10'
        )

        source.send(test_frame)
        yield clk.posedge

        while monitor_axis_tvalid:
            yield clk.posedge

        while output_axis_tvalid:
            yield clk.posedge

        yield clk.posedge
        stop_time = now()
        trigger.next = 1
        yield clk.posedge
        trigger.next = 0
        yield clk.posedge

        while output_axis_tvalid:
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        # discard first trigger output
        rx_frame = sink.recv()

        # check second trigger output
        rx_frame = sink.recv()

        rx_frame_values = struct.unpack(">HLLL", bytes(rx_frame.data))
        cycles = (stop_time - start_time) / 8
        print(rx_frame_values)

        assert rx_frame_values[0] == 1
        assert rx_frame_values[1] == cycles * 8
        assert rx_frame_values[2] == len(test_frame.data)
        assert rx_frame_values[3] == 1

        yield delay(100)

        yield clk.posedge
        print("test 4: longer packet")
        current_test.next = 4

        yield clk.posedge
        start_time = now()
        trigger.next = 1
        yield clk.posedge
        trigger.next = 0

        test_frame = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                            b'\x5A\x51\x52\x53\x54\x55' +
                                            b'\x80\x00' +
                                            bytearray(range(256)))

        source.send(test_frame)
        yield clk.posedge

        while monitor_axis_tvalid:
            yield clk.posedge

        while output_axis_tvalid:
            yield clk.posedge

        yield clk.posedge
        stop_time = now()
        trigger.next = 1
        yield clk.posedge
        trigger.next = 0
        yield clk.posedge

        while output_axis_tvalid:
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        # discard first trigger output
        rx_frame = sink.recv()

        # check second trigger output
        rx_frame = sink.recv()

        rx_frame_values = struct.unpack(">HLLL", bytes(rx_frame.data))
        cycles = (stop_time - start_time) / 8
        print(rx_frame_values)

        assert rx_frame_values[0] == 1
        assert rx_frame_values[1] == cycles * 8
        assert rx_frame_values[2] == len(test_frame.data)
        assert rx_frame_values[3] == 1

        yield delay(100)

        yield clk.posedge
        print("test 5: test packet with pauses")
        current_test.next = 5

        yield clk.posedge
        start_time = now()
        trigger.next = 1
        yield clk.posedge
        trigger.next = 0

        test_frame = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                            b'\x5A\x51\x52\x53\x54\x55' +
                                            b'\x80\x00' +
                                            bytearray(range(256)))

        source.send(test_frame)
        yield clk.posedge

        yield delay(64)
        yield clk.posedge
        source_pause.next = True
        yield delay(32)
        yield clk.posedge
        source_pause.next = False

        yield delay(64)
        yield clk.posedge
        monitor_sink_pause.next = True
        yield delay(32)
        yield clk.posedge
        monitor_sink_pause.next = False

        while monitor_axis_tvalid:
            yield clk.posedge

        while output_axis_tvalid:
            yield clk.posedge

        yield clk.posedge
        stop_time = now()
        trigger.next = 1
        yield clk.posedge
        trigger.next = 0
        yield clk.posedge

        while output_axis_tvalid:
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        # discard first trigger output
        rx_frame = sink.recv()

        # check second trigger output
        rx_frame = sink.recv()

        rx_frame_values = struct.unpack(">HLLL", bytes(rx_frame.data))
        cycles = (stop_time - start_time) / 8
        print(rx_frame_values)

        assert rx_frame_values[0] == 1
        assert rx_frame_values[1] == cycles * 8
        assert rx_frame_values[2] == len(test_frame.data)
        assert rx_frame_values[3] == 1

        yield delay(100)

        yield clk.posedge
        print("test 6: back-to-back packets")
        current_test.next = 6

        yield clk.posedge
        start_time = now()
        trigger.next = 1
        yield clk.posedge
        trigger.next = 0

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x01\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10'
        )
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x02\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10'
        )

        source.send(test_frame1)
        source.send(test_frame2)
        yield clk.posedge

        while monitor_axis_tvalid:
            yield clk.posedge

        while output_axis_tvalid:
            yield clk.posedge

        yield clk.posedge
        stop_time = now()
        trigger.next = 1
        yield clk.posedge
        trigger.next = 0
        yield clk.posedge

        while output_axis_tvalid:
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        # discard first trigger output
        rx_frame = sink.recv()

        # check second trigger output
        rx_frame = sink.recv()

        rx_frame_values = struct.unpack(">HLLL", bytes(rx_frame.data))
        cycles = (stop_time - start_time) / 8
        print(rx_frame_values)

        assert rx_frame_values[0] == 1
        assert rx_frame_values[1] == cycles * 8
        assert rx_frame_values[2] == len(test_frame1.data) + len(
            test_frame2.data)
        assert rx_frame_values[3] == 2

        yield delay(100)

        yield clk.posedge
        print("test 7: alternate pause source")
        current_test.next = 7

        yield clk.posedge
        start_time = now()
        trigger.next = 1
        yield clk.posedge
        trigger.next = 0

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x01\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10'
        )
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x02\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10'
        )

        source.send(test_frame1)
        source.send(test_frame2)
        yield clk.posedge

        while monitor_axis_tvalid:
            yield clk.posedge

        while output_axis_tvalid:
            yield clk.posedge

        yield clk.posedge
        stop_time = now()
        trigger.next = 1
        yield clk.posedge
        trigger.next = 0
        yield clk.posedge

        while output_axis_tvalid:
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        # discard first trigger output
        rx_frame = sink.recv()

        # check second trigger output
        rx_frame = sink.recv()

        rx_frame_values = struct.unpack(">HLLL", bytes(rx_frame.data))
        cycles = (stop_time - start_time) / 8
        print(rx_frame_values)

        assert rx_frame_values[0] == 1
        assert rx_frame_values[1] == cycles * 8
        assert rx_frame_values[2] == len(test_frame1.data) + len(
            test_frame2.data)
        assert rx_frame_values[3] == 2

        yield delay(100)

        yield clk.posedge
        print("test 8: alternate pause sink")
        current_test.next = 8

        yield clk.posedge
        start_time = now()
        trigger.next = 1
        yield clk.posedge
        trigger.next = 0

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x01\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10'
        )
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' + b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x02\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10'
        )

        source.send(test_frame1)
        source.send(test_frame2)
        yield clk.posedge

        while monitor_axis_tvalid:
            yield clk.posedge

        while output_axis_tvalid:
            yield clk.posedge

        yield clk.posedge
        stop_time = now()
        trigger.next = 1
        yield clk.posedge
        trigger.next = 0
        yield clk.posedge

        while output_axis_tvalid:
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        # discard first trigger output
        rx_frame = sink.recv()

        # check second trigger output
        rx_frame = sink.recv()

        rx_frame_values = struct.unpack(">HLLL", bytes(rx_frame.data))
        cycles = (stop_time - start_time) / 8
        print(rx_frame_values)

        assert rx_frame_values[0] == 1
        assert rx_frame_values[1] == cycles * 8
        assert rx_frame_values[2] == len(test_frame1.data) + len(
            test_frame2.data)
        assert rx_frame_values[3] == 2

        yield delay(100)

        yield clk.posedge
        print("test 9: various length packets")
        current_test.next = 9

        yield clk.posedge
        start_time = now()
        trigger.next = 1
        yield clk.posedge
        trigger.next = 0

        lens = [32, 48, 96, 128, 256]
        test_frame = []

        for i in range(len(lens)):
            test_frame.append(
                axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                       b'\x5A\x51\x52\x53\x54\x55' +
                                       b'\x80\x00' +
                                       bytearray(range(lens[i]))))

        for f in test_frame:
            source.send(f)
        yield clk.posedge

        while monitor_axis_tvalid:
            yield clk.posedge

        while output_axis_tvalid:
            yield clk.posedge

        yield clk.posedge
        stop_time = now()
        trigger.next = 1
        yield clk.posedge
        trigger.next = 0
        yield clk.posedge

        while output_axis_tvalid:
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        # discard first trigger output
        rx_frame = sink.recv()

        # check second trigger output
        rx_frame = sink.recv()

        rx_frame_values = struct.unpack(">HLLL", bytes(rx_frame.data))
        cycles = (stop_time - start_time) / 8
        print(rx_frame_values)

        assert rx_frame_values[0] == 1
        assert rx_frame_values[1] == cycles * 8
        assert rx_frame_values[2] == sum(len(f.data) for f in test_frame)
        assert rx_frame_values[3] == len(test_frame)

        yield delay(100)

        yield clk.posedge
        print("test 10: various length packets with intermediate trigger")
        current_test.next = 10

        yield clk.posedge
        start_time = now()
        trigger.next = 1
        yield clk.posedge
        trigger.next = 0

        lens = [32, 48, 96, 128, 256]
        test_frame = []

        for i in range(len(lens)):
            test_frame.append(
                axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                       b'\x5A\x51\x52\x53\x54\x55' +
                                       b'\x80\x00' +
                                       bytearray(range(lens[i]))))

        for f in test_frame:
            source.send(f)
        yield clk.posedge

        yield delay(200)

        yield clk.posedge
        trigger_time = now()
        trigger.next = 1
        yield clk.posedge
        trigger.next = 0
        yield clk.posedge

        while monitor_axis_tvalid:
            yield clk.posedge

        while output_axis_tvalid:
            yield clk.posedge

        yield clk.posedge
        stop_time = now()
        trigger.next = 1
        yield clk.posedge
        trigger.next = 0
        yield clk.posedge

        while output_axis_tvalid:
            yield clk.posedge
        yield clk.posedge
        yield clk.posedge

        # discard first trigger output
        rx_frame = sink.recv()

        # check second trigger output
        rx_frame = sink.recv()

        # check second trigger output
        rx_frame2 = sink.recv()

        rx_frame_values = struct.unpack(">HLLL", bytes(rx_frame.data))
        cycles = (stop_time - start_time) / 8
        cycles1 = (trigger_time - start_time) / 8
        print(rx_frame_values)

        rx_frame2_values = struct.unpack(">HLLL", bytes(rx_frame2.data))
        cycles2 = (stop_time - trigger_time) / 8
        print(rx_frame2_values)

        assert rx_frame_values[0] == 1
        assert rx_frame2_values[0] == 1
        assert rx_frame_values[1] == cycles1 * 8
        assert rx_frame2_values[1] == cycles2 * 8
        assert rx_frame_values[1] + rx_frame2_values[1] == cycles * 8
        assert rx_frame_values[2] + rx_frame2_values[2] == sum(
            len(f.data) for f in test_frame)
        assert rx_frame_values[3] + rx_frame2_values[3] == len(test_frame)

        yield delay(100)

        raise StopSimulation
Example #26
0
    def check():
        yield delay(100)
        yield clk.posedge
        rst.next = 1
        yield clk.posedge
        rst.next = 0
        yield clk.posedge
        yield delay(100)
        yield clk.posedge

        # testbench stimulus

        yield clk.posedge
        print("test 1: 0123 -> 0000")
        current_test.next = 1

        test_frame0 = axis_ep.AXIStreamFrame(b'\x01\x00\x00\xFF' +
                                             bytearray(range(256)),
                                             id=0,
                                             dest=0)
        test_frame1 = axis_ep.AXIStreamFrame(b'\x01\x01\x00\xFF' +
                                             bytearray(range(256)),
                                             id=1,
                                             dest=0)
        test_frame2 = axis_ep.AXIStreamFrame(b'\x01\x02\x00\xFF' +
                                             bytearray(range(256)),
                                             id=2,
                                             dest=0)
        test_frame3 = axis_ep.AXIStreamFrame(b'\x01\x03\x00\xFF' +
                                             bytearray(range(256)),
                                             id=3,
                                             dest=0)

        for wait in wait_normal, wait_pause_source, wait_pause_sink:
            status_overflow_latch.next = 0
            status_bad_frame_latch.next = 0
            status_good_frame_latch.next = 0

            source_list[0].send(test_frame0)
            source_list[1].send(test_frame1)
            source_list[2].send(test_frame2)
            source_list[3].send(test_frame3)
            yield clk.posedge
            yield clk.posedge

            yield wait()

            yield sink_list[0].wait()
            rx_frame0 = sink_list[0].recv()

            assert rx_frame0 == test_frame0

            yield sink_list[0].wait()
            rx_frame1 = sink_list[0].recv()

            assert rx_frame1 == test_frame1

            yield sink_list[0].wait()
            rx_frame2 = sink_list[0].recv()

            assert rx_frame2 == test_frame2

            yield sink_list[0].wait()
            rx_frame3 = sink_list[0].recv()

            assert rx_frame3 == test_frame3

            assert sink_list[0].empty()

            assert status_overflow_latch == 0x0
            assert status_bad_frame_latch == 0x0
            assert status_good_frame_latch == 0xf

            yield delay(100)

        yield clk.posedge
        print("test 2: 0000 -> 0000")
        current_test.next = 2

        test_frame0 = axis_ep.AXIStreamFrame(b'\x02\x00\x00\xFF' +
                                             bytearray(range(256)),
                                             id=0,
                                             dest=0)
        test_frame1 = axis_ep.AXIStreamFrame(b'\x02\x00\x00\xFF' +
                                             bytearray(range(256)),
                                             id=0,
                                             dest=0)
        test_frame2 = axis_ep.AXIStreamFrame(b'\x02\x00\x00\xFF' +
                                             bytearray(range(256)),
                                             id=0,
                                             dest=0)
        test_frame3 = axis_ep.AXIStreamFrame(b'\x02\x00\x00\xFF' +
                                             bytearray(range(256)),
                                             id=0,
                                             dest=0)

        for wait in wait_normal, wait_pause_source, wait_pause_sink:
            status_overflow_latch.next = 0
            status_bad_frame_latch.next = 0
            status_good_frame_latch.next = 0

            source_list[0].send(test_frame0)
            source_list[0].send(test_frame1)
            source_list[0].send(test_frame2)
            source_list[0].send(test_frame3)
            yield clk.posedge
            yield clk.posedge

            yield wait()

            yield sink_list[0].wait()
            rx_frame0 = sink_list[0].recv()

            assert rx_frame0 == test_frame0

            yield sink_list[0].wait()
            rx_frame1 = sink_list[0].recv()

            assert rx_frame1 == test_frame1

            yield sink_list[0].wait()
            rx_frame2 = sink_list[0].recv()

            assert rx_frame2 == test_frame2

            yield sink_list[0].wait()
            rx_frame3 = sink_list[0].recv()

            assert rx_frame3 == test_frame3

            assert sink_list[0].empty()

            assert status_overflow_latch == 0x0
            assert status_bad_frame_latch == 0x0
            assert status_good_frame_latch == 0x1

            yield delay(100)

        yield clk.posedge
        print("test 3: bad decoding")
        current_test.next = 3

        test_frame0 = axis_ep.AXIStreamFrame(b'\x03\x00\x00\xFF' +
                                             bytearray(range(256)),
                                             id=0,
                                             dest=0)
        test_frame1 = axis_ep.AXIStreamFrame(b'\x03\x01\x01\xFF' +
                                             bytearray(range(256)),
                                             id=1,
                                             dest=1)
        test_frame2 = axis_ep.AXIStreamFrame(b'\x03\x02\x00\xFF' +
                                             bytearray(range(256)),
                                             id=2,
                                             dest=0)
        test_frame3 = axis_ep.AXIStreamFrame(b'\x03\x03\x01\xFF' +
                                             bytearray(range(256)),
                                             id=3,
                                             dest=1)

        for wait in wait_normal, wait_pause_source, wait_pause_sink:
            status_overflow_latch.next = 0
            status_bad_frame_latch.next = 0
            status_good_frame_latch.next = 0

            source_list[0].send(test_frame0)
            yield clk.posedge
            source_list[1].send(test_frame1)
            source_list[2].send(test_frame2)
            source_list[3].send(test_frame3)
            yield clk.posedge
            yield clk.posedge

            yield wait()

            yield sink_list[0].wait()
            rx_frame0 = sink_list[0].recv()

            assert rx_frame0 == test_frame0

            yield sink_list[0].wait()
            rx_frame2 = sink_list[0].recv()

            assert rx_frame2 == test_frame2

            assert sink_list[0].empty()

            assert status_overflow_latch == 0x0
            assert status_bad_frame_latch == 0x0
            assert status_good_frame_latch == 0x5

            yield delay(100)

        yield clk.posedge
        print("test 4: tuser assert")
        current_test.next = 4

        test_frame0 = axis_ep.AXIStreamFrame(b'\x04\x00\x00\xFF' +
                                             bytearray(range(256)),
                                             id=0,
                                             dest=0)
        test_frame1 = axis_ep.AXIStreamFrame(b'\x04\x00\x01\xFF' +
                                             bytearray(range(256)),
                                             id=0,
                                             dest=0,
                                             last_cycle_user=1)
        test_frame2 = axis_ep.AXIStreamFrame(b'\x04\x00\x02\xFF' +
                                             bytearray(range(256)),
                                             id=0,
                                             dest=0)
        test_frame3 = axis_ep.AXIStreamFrame(b'\x04\x00\x03\xFF' +
                                             bytearray(range(256)),
                                             id=0,
                                             dest=0)

        for wait in wait_normal, wait_pause_source, wait_pause_sink:
            status_overflow_latch.next = 0
            status_bad_frame_latch.next = 0
            status_good_frame_latch.next = 0

            source_list[0].send(test_frame0)
            source_list[0].send(test_frame1)
            source_list[0].send(test_frame2)
            source_list[0].send(test_frame3)
            yield clk.posedge
            yield clk.posedge

            yield wait()

            yield sink_list[0].wait()
            rx_frame0 = sink_list[0].recv()

            assert rx_frame0 == test_frame0

            yield sink_list[0].wait()
            rx_frame2 = sink_list[0].recv()

            assert rx_frame2 == test_frame2

            yield sink_list[0].wait()
            rx_frame3 = sink_list[0].recv()

            assert rx_frame3 == test_frame3

            assert sink_list[0].empty()

            assert status_overflow_latch == 0x0
            assert status_bad_frame_latch == 0x1
            assert status_good_frame_latch == 0x1

            yield delay(100)

        yield clk.posedge
        print("test 5: single packet overflow")
        current_test.next = 5

        test_frame0 = axis_ep.AXIStreamFrame(b'\x05\x00\x00\xFF' +
                                             bytearray(range(256)) * 3,
                                             id=0,
                                             dest=0)
        test_frame1 = axis_ep.AXIStreamFrame(b'\x05\x01\x01\xFF' +
                                             bytearray(range(256)) * 3,
                                             id=1,
                                             dest=0)
        test_frame2 = axis_ep.AXIStreamFrame(b'\x05\x02\x02\xFF' +
                                             bytearray(range(256)) * 3,
                                             id=2,
                                             dest=0)
        test_frame3 = axis_ep.AXIStreamFrame(b'\x05\x03\x03\xFF' +
                                             bytearray(range(256)) * 3,
                                             id=3,
                                             dest=0)

        for wait in wait_normal, wait_pause_source, wait_pause_sink:
            status_overflow_latch.next = 0
            status_bad_frame_latch.next = 0
            status_good_frame_latch.next = 0

            source_list[0].send(test_frame0)
            source_list[1].send(test_frame1)
            source_list[2].send(test_frame2)
            source_list[3].send(test_frame3)
            yield clk.posedge
            yield clk.posedge

            yield wait()

            yield delay(100)

            assert sink_list[0].empty()

            assert status_overflow_latch == 0xf
            assert status_bad_frame_latch == 0x0
            assert status_good_frame_latch == 0x0

            yield delay(100)

        yield clk.posedge
        print("test 6: initial sink pause")
        current_test.next = 6

        test_frame0 = axis_ep.AXIStreamFrame(b'\x06\x00\x00\xFF' +
                                             bytearray(range(256)),
                                             id=0,
                                             dest=0)

        status_overflow_latch.next = 0
        status_bad_frame_latch.next = 0
        status_good_frame_latch.next = 0

        source_list[0].send(test_frame0)

        for k in range(M_COUNT):
            sink_pause_list[k].next = True

        yield clk.posedge
        yield clk.posedge
        while (s_axis_tvalid):
            yield clk.posedge
        for k in range(20):
            yield clk.posedge

        for k in range(M_COUNT):
            sink_pause_list[k].next = False

        yield wait_normal()

        yield sink_list[0].wait()
        rx_frame0 = sink_list[0].recv()

        assert rx_frame0 == test_frame0

        assert sink_list[0].empty()

        assert status_overflow_latch == 0x0
        assert status_bad_frame_latch == 0x0
        assert status_good_frame_latch == 0x1

        yield delay(100)

        yield clk.posedge
        print("test 7: initial sink pause, reset")
        current_test.next = 7

        test_frame0 = axis_ep.AXIStreamFrame(b'\x07\x00\x00\xFF' +
                                             bytearray(range(256)),
                                             id=0,
                                             dest=0)

        status_overflow_latch.next = 0
        status_bad_frame_latch.next = 0
        status_good_frame_latch.next = 0

        source_list[0].send(test_frame0)

        for k in range(M_COUNT):
            sink_pause_list[k].next = True

        yield clk.posedge
        yield clk.posedge
        while (s_axis_tvalid):
            yield clk.posedge
        for k in range(20):
            yield clk.posedge

        rst.next = 1
        yield clk.posedge
        rst.next = 0

        for k in range(M_COUNT):
            sink_pause_list[k].next = False

        yield delay(500)

        assert sink_list[0].empty()

        assert status_overflow_latch == 0x0
        assert status_bad_frame_latch == 0x0
        assert status_good_frame_latch == 0x1

        yield delay(100)

        yield clk.posedge
        print("test 8: backpressure test")
        current_test.next = 8

        test_frame0 = axis_ep.AXIStreamFrame(b'\x08\x00\x00\xFF' +
                                             bytearray(range(256)),
                                             id=0,
                                             dest=0)
        test_frame1 = axis_ep.AXIStreamFrame(b'\x08\x00\x00\xFF' +
                                             bytearray(range(256)),
                                             id=0,
                                             dest=0)
        test_frame2 = axis_ep.AXIStreamFrame(b'\x08\x00\x00\xFF' +
                                             bytearray(range(256)),
                                             id=0,
                                             dest=0)
        test_frame3 = axis_ep.AXIStreamFrame(b'\x08\x00\x00\xFF' +
                                             bytearray(range(256)),
                                             id=0,
                                             dest=0)

        for wait in wait_normal, wait_pause_source, wait_pause_sink:
            status_overflow_latch.next = 0
            status_bad_frame_latch.next = 0
            status_good_frame_latch.next = 0

            source_list[0].send(test_frame0)
            source_list[0].send(test_frame1)
            source_list[0].send(test_frame2)
            source_list[0].send(test_frame3)

            for k in range(M_COUNT):
                sink_pause_list[k].next = True

            for k in range(100):
                yield clk.posedge

            for k in range(M_COUNT):
                sink_pause_list[k].next = False

            yield wait()

            yield sink_list[0].wait()
            rx_frame0 = sink_list[0].recv()

            assert rx_frame0 == test_frame0

            yield sink_list[0].wait()
            rx_frame1 = sink_list[0].recv()

            assert rx_frame1 == test_frame1

            yield sink_list[0].wait()
            rx_frame2 = sink_list[0].recv()

            assert rx_frame2 == test_frame2

            yield sink_list[0].wait()
            rx_frame3 = sink_list[0].recv()

            assert rx_frame3 == test_frame3

            assert sink_list[0].empty()

            assert status_overflow_latch == 0x0
            assert status_bad_frame_latch == 0x0
            assert status_good_frame_latch == 0x1

            yield delay(100)

        yield clk.posedge
        print("test 9: many small packets, one to one")
        current_test.next = 9

        test_frame0 = axis_ep.AXIStreamFrame(b'\x09\x00\x00\xFF' +
                                             bytearray(range(4)),
                                             id=0,
                                             dest=0)

        for wait in wait_normal, wait_pause_source, wait_pause_sink:
            status_overflow_latch.next = 0
            status_bad_frame_latch.next = 0
            status_good_frame_latch.next = 0

            for k in range(64):
                source_list[0].send(test_frame0)
            yield clk.posedge
            yield clk.posedge

            yield wait()

            for k in range(64):
                yield sink_list[0].wait()
                rx_frame0 = sink_list[0].recv()

                assert rx_frame0 == test_frame0

            assert sink_list[0].empty()

            assert status_overflow_latch == 0x0
            assert status_bad_frame_latch == 0x0
            assert status_good_frame_latch == 0x1

            yield delay(100)

        yield clk.posedge
        print("test 10: many small packets, many to one")
        current_test.next = 10

        test_frame0 = axis_ep.AXIStreamFrame(b'\x0A\x00\x00\xFF' +
                                             bytearray(range(4)),
                                             id=0,
                                             dest=0)
        test_frame1 = axis_ep.AXIStreamFrame(b'\x0A\x01\x00\xFF' +
                                             bytearray(range(4)),
                                             id=1,
                                             dest=0)
        test_frame2 = axis_ep.AXIStreamFrame(b'\x0A\x02\x00\xFF' +
                                             bytearray(range(4)),
                                             id=2,
                                             dest=0)
        test_frame3 = axis_ep.AXIStreamFrame(b'\x0A\x03\x00\xFF' +
                                             bytearray(range(4)),
                                             id=3,
                                             dest=0)

        for wait in wait_normal, wait_pause_source, wait_pause_sink:
            status_overflow_latch.next = 0
            status_bad_frame_latch.next = 0
            status_good_frame_latch.next = 0

            for k in range(64):
                source_list[0].send(test_frame0)
                yield clk.posedge
                yield clk.posedge
                source_list[1].send(test_frame1)
                source_list[2].send(test_frame2)
                source_list[3].send(test_frame3)
            yield clk.posedge
            yield clk.posedge

            yield wait()

            for k in range(64):
                yield sink_list[0].wait()
                rx_frame0 = sink_list[0].recv()

                assert rx_frame0 == test_frame0

                yield sink_list[0].wait()
                rx_frame1 = sink_list[0].recv()

                assert rx_frame1 == test_frame1

                yield sink_list[0].wait()
                rx_frame2 = sink_list[0].recv()

                assert rx_frame2 == test_frame2

                yield sink_list[0].wait()
                rx_frame3 = sink_list[0].recv()

                assert rx_frame3 == test_frame3

            assert sink_list[0].empty()

            assert status_overflow_latch == 0x0
            assert status_bad_frame_latch == 0x0
            assert status_good_frame_latch == 0xf

            yield delay(100)

        raise StopSimulation
    def check():
        yield delay(100)
        yield clk.posedge
        rst.next = 1
        yield clk.posedge
        rst.next = 0
        yield clk.posedge
        yield delay(100)
        yield clk.posedge

        yield clk.posedge

        yield clk.posedge
        print("test 1: test packet")
        current_test.next = 1

        test_frame = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=1,
            dest=1
        )

        source.send(test_frame)
        yield clk.posedge

        yield output_axis_tlast.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame = sink.recv()

        assert rx_frame == test_frame

        yield delay(100)

        yield clk.posedge
        print("test 2: longer packet")
        current_test.next = 2

        test_frame = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            bytearray(range(256)),
            id=2,
            dest=1
        )

        source.send(test_frame)
        yield clk.posedge

        yield output_axis_tlast.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame = sink.recv()

        assert rx_frame == test_frame

        yield clk.posedge
        print("test 3: test packet with pauses")
        current_test.next = 3

        test_frame = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            bytearray(range(256)),
            id=3,
            dest=1
        )

        source.send(test_frame)
        yield clk.posedge

        yield delay(64)
        yield clk.posedge
        source_pause.next = True
        yield delay(32)
        yield clk.posedge
        source_pause.next = False

        yield delay(64)
        yield clk.posedge
        sink_pause.next = True
        yield delay(32)
        yield clk.posedge
        sink_pause.next = False

        yield output_axis_tlast.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame = sink.recv()

        assert rx_frame == test_frame

        yield delay(100)

        yield clk.posedge
        print("test 4: back-to-back packets")
        current_test.next = 4

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x01\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=4,
            dest=1
        )
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x02\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=4,
            dest=2
        )

        source.send(test_frame1)
        source.send(test_frame2)
        yield clk.posedge

        yield output_axis_tlast.posedge
        yield clk.posedge
        yield output_axis_tlast.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame = sink.recv()

        assert rx_frame == test_frame1

        rx_frame = sink.recv()

        assert rx_frame == test_frame2

        yield delay(100)

        yield clk.posedge
        print("test 5: alternate pause source")
        current_test.next = 5

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x01\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=5,
            dest=1
        )
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x02\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=5,
            dest=2
        )

        source.send(test_frame1)
        source.send(test_frame2)
        yield clk.posedge

        while input_axis_tvalid or output_axis_tvalid:
            source_pause.next = True
            yield clk.posedge
            yield clk.posedge
            yield clk.posedge
            source_pause.next = False
            yield clk.posedge

        yield clk.posedge
        yield clk.posedge

        rx_frame = sink.recv()

        assert rx_frame == test_frame1

        rx_frame = sink.recv()

        assert rx_frame == test_frame2

        yield delay(100)

        yield clk.posedge
        print("test 6: alternate pause sink")
        current_test.next = 6

        test_frame1 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x01\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=6,
            dest=1
        )
        test_frame2 = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x02\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=6,
            dest=2
        )

        source.send(test_frame1)
        source.send(test_frame2)
        yield clk.posedge

        while input_axis_tvalid or output_axis_tvalid:
            sink_pause.next = True
            yield clk.posedge
            yield clk.posedge
            yield clk.posedge
            sink_pause.next = False
            yield clk.posedge

        yield clk.posedge
        yield clk.posedge

        rx_frame = sink.recv()

        assert rx_frame == test_frame1

        rx_frame = sink.recv()

        assert rx_frame == test_frame2

        yield delay(100)

        yield clk.posedge
        print("test 7: tuser assert")
        current_test.next = 7

        test_frame = axis_ep.AXIStreamFrame(
            b'\xDA\xD1\xD2\xD3\xD4\xD5' +
            b'\x5A\x51\x52\x53\x54\x55' +
            b'\x80\x00' +
            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10',
            id=7,
            dest=1,
            last_cycle_user=1
        )

        source.send(test_frame)
        yield clk.posedge

        yield output_axis_tlast.posedge
        yield clk.posedge
        yield clk.posedge

        rx_frame = sink.recv()

        assert rx_frame == test_frame
        assert rx_frame.last_cycle_user

        yield delay(100)

        raise StopSimulation
    def check():
        yield delay(100)
        yield s_clk.posedge
        s_rst.next = 1
        m_rst.next = 1
        yield s_clk.posedge
        yield s_clk.posedge
        yield s_clk.posedge
        s_rst.next = 0
        m_rst.next = 0
        yield s_clk.posedge
        yield delay(100)
        yield s_clk.posedge

        for payload_len in range(1, 18):
            yield s_clk.posedge
            print("test 1: test packet, length %d" % payload_len)
            current_test.next = 1

            test_frame = axis_ep.AXIStreamFrame(
                bytearray(range(payload_len)),
                id=1,
                dest=1,
            )

            for wait in wait_normal, wait_pause_source, wait_pause_sink:
                source.send(test_frame)
                yield s_clk.posedge
                yield s_clk.posedge

                yield wait()

                yield sink.wait()
                rx_frame = sink.recv()

                assert rx_frame == test_frame

                assert sink.empty()

                yield delay(100)

            yield s_clk.posedge
            print("test 2: back-to-back packets, length %d" % payload_len)
            current_test.next = 2

            test_frame1 = axis_ep.AXIStreamFrame(
                bytearray(range(payload_len)),
                id=2,
                dest=1,
            )
            test_frame2 = axis_ep.AXIStreamFrame(
                bytearray(range(payload_len)),
                id=2,
                dest=2,
            )

            for wait in wait_normal, wait_pause_source, wait_pause_sink:
                source.send(test_frame1)
                source.send(test_frame2)
                yield s_clk.posedge
                yield s_clk.posedge

                yield wait()

                yield sink.wait()
                rx_frame = sink.recv()

                assert rx_frame == test_frame1

                yield sink.wait()
                rx_frame = sink.recv()

                assert rx_frame == test_frame2

                assert sink.empty()

                yield delay(100)

            yield s_clk.posedge
            print("test 3: tuser assert, length %d" % payload_len)
            current_test.next = 3

            test_frame1 = axis_ep.AXIStreamFrame(bytearray(range(payload_len)),
                                                 id=3,
                                                 dest=1,
                                                 last_cycle_user=1)
            test_frame2 = axis_ep.AXIStreamFrame(
                bytearray(range(payload_len)),
                id=3,
                dest=2,
            )

            for wait in wait_normal, wait_pause_source, wait_pause_sink:
                source.send(test_frame1)
                source.send(test_frame2)
                yield s_clk.posedge
                yield s_clk.posedge

                yield wait()

                yield sink.wait()
                rx_frame = sink.recv()

                assert rx_frame == test_frame1
                assert rx_frame.last_cycle_user

                yield sink.wait()
                rx_frame = sink.recv()

                assert rx_frame == test_frame2

                assert sink.empty()

                yield delay(100)

        raise StopSimulation
    def check():
        yield delay(100)
        yield clk.posedge
        rst.next = 1
        yield clk.posedge
        rst.next = 0
        yield clk.posedge
        yield delay(100)
        yield clk.posedge

        # testbench stimulus

        for payload_len in list(range(1, 33)) + list(range(253, 259)) + [512]:
            gen = prbs31()
            for block in [
                    bytearray([0] * payload_len),
                    bytearray([k % 255 + 1 for k in range(payload_len)]),
                    b'\x00' +
                    bytearray([k % 255 + 1
                               for k in range(payload_len)]) + b'\x00',
                    bytearray([next(gen) for i in range(payload_len)])
            ]:
                yield clk.posedge
                print("test 1: test packet, length %d" % payload_len)
                current_test.next = 1

                enc = cobs_encode(block)

                test_frame = axis_ep.AXIStreamFrame(block)

                for wait in wait_normal, wait_pause_source, wait_pause_sink:
                    source.send(test_frame)
                    yield clk.posedge
                    yield clk.posedge

                    yield wait()

                    yield clk.posedge
                    yield clk.posedge

                    rx_frame = sink.recv()

                    assert cobs_decode(enc) == block
                    assert rx_frame.data == enc
                    assert cobs_decode(rx_frame.data) == block
                    assert not rx_frame.last_cycle_user

                    assert sink.empty()

                    yield delay(100)

                yield clk.posedge
                print("test 2: back-to-back packets, length %d" % payload_len)
                current_test.next = 2

                test_frame1 = axis_ep.AXIStreamFrame(block)
                test_frame2 = axis_ep.AXIStreamFrame(block)

                for wait in wait_normal, wait_pause_source, wait_pause_sink:
                    source.send(test_frame1)
                    source.send(test_frame2)
                    yield clk.posedge
                    yield clk.posedge

                    yield wait()

                    yield clk.posedge
                    yield clk.posedge

                    rx_frame = sink.recv()

                    assert cobs_decode(enc) == block
                    assert rx_frame.data == enc
                    assert cobs_decode(rx_frame.data) == block
                    assert not rx_frame.last_cycle_user

                    rx_frame = sink.recv()

                    assert cobs_decode(enc) == block
                    assert rx_frame.data == enc
                    assert cobs_decode(rx_frame.data) == block
                    assert not rx_frame.last_cycle_user

                    assert sink.empty()

                    yield delay(100)

                yield clk.posedge
                print("test 3: tuser assert, length %d" % payload_len)
                current_test.next = 3

                test_frame1 = axis_ep.AXIStreamFrame(block)
                test_frame2 = axis_ep.AXIStreamFrame(block)

                test_frame1.last_cycle_user = 1

                for wait in wait_normal, wait_pause_source, wait_pause_sink:
                    source.send(test_frame1)
                    source.send(test_frame2)
                    yield clk.posedge
                    yield clk.posedge

                    yield wait()

                    yield clk.posedge
                    yield clk.posedge

                    rx_frame = sink.recv()

                    assert cobs_decode(rx_frame.data) == None
                    assert rx_frame.last_cycle_user

                    rx_frame = sink.recv()

                    assert cobs_decode(enc) == block
                    assert rx_frame.data == enc
                    assert cobs_decode(rx_frame.data) == block
                    assert not rx_frame.last_cycle_user

                    assert sink.empty()

                    yield delay(100)

        raise StopSimulation
    def check():
        yield delay(100)
        yield input_clk.posedge
        async_rst.next = 1
        yield input_clk.posedge
        yield input_clk.posedge
        yield input_clk.posedge
        async_rst.next = 0
        yield input_clk.posedge
        yield delay(100)
        yield input_clk.posedge

        yield input_clk.posedge

        yield input_clk.posedge
        print("test 1: test packet")
        current_test.next = 1

        test_frame = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                            b'\x5A\x51\x52\x53\x54\x55' +
                                            b'\x80\x00' +
                                            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10')

        input_status_overflow_asserted.next = 0
        input_status_bad_frame_asserted.next = 0
        input_status_good_frame_asserted.next = 0
        output_status_overflow_asserted.next = 0
        output_status_bad_frame_asserted.next = 0
        output_status_good_frame_asserted.next = 0

        source.send(test_frame)
        yield input_clk.posedge

        yield output_axis_tlast.posedge
        yield output_clk.posedge
        yield output_clk.posedge

        rx_frame = sink.recv()

        assert rx_frame == test_frame

        assert not input_status_overflow_asserted
        assert not input_status_bad_frame_asserted
        assert input_status_good_frame_asserted
        assert not output_status_overflow_asserted
        assert not output_status_bad_frame_asserted
        assert output_status_good_frame_asserted

        yield delay(100)

        yield input_clk.posedge
        print("test 2: longer packet")
        current_test.next = 2

        test_frame = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                            b'\x5A\x51\x52\x53\x54\x55' +
                                            b'\x80\x00' +
                                            bytearray(range(256)))

        input_status_overflow_asserted.next = 0
        input_status_bad_frame_asserted.next = 0
        input_status_good_frame_asserted.next = 0
        output_status_overflow_asserted.next = 0
        output_status_bad_frame_asserted.next = 0
        output_status_good_frame_asserted.next = 0

        source.send(test_frame)
        yield input_clk.posedge

        yield output_axis_tlast.posedge
        yield output_clk.posedge
        yield output_clk.posedge

        rx_frame = sink.recv()

        assert rx_frame == test_frame

        assert not input_status_overflow_asserted
        assert not input_status_bad_frame_asserted
        assert input_status_good_frame_asserted
        assert not output_status_overflow_asserted
        assert not output_status_bad_frame_asserted
        assert output_status_good_frame_asserted

        yield input_clk.posedge
        print("test 3: test packet with pauses")
        current_test.next = 3

        test_frame = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                            b'\x5A\x51\x52\x53\x54\x55' +
                                            b'\x80\x00' +
                                            bytearray(range(256)))

        input_status_overflow_asserted.next = 0
        input_status_bad_frame_asserted.next = 0
        input_status_good_frame_asserted.next = 0
        output_status_overflow_asserted.next = 0
        output_status_bad_frame_asserted.next = 0
        output_status_good_frame_asserted.next = 0

        source.send(test_frame)
        yield input_clk.posedge

        yield delay(64)
        yield input_clk.posedge
        source_pause.next = True
        yield delay(32)
        yield input_clk.posedge
        source_pause.next = False

        yield delay(64)
        yield output_clk.posedge
        sink_pause.next = True
        yield delay(32)
        yield output_clk.posedge
        sink_pause.next = False

        yield output_axis_tlast.posedge
        yield output_clk.posedge
        yield output_clk.posedge

        rx_frame = sink.recv()

        assert rx_frame == test_frame

        assert not input_status_overflow_asserted
        assert not input_status_bad_frame_asserted
        assert input_status_good_frame_asserted
        assert not output_status_overflow_asserted
        assert not output_status_bad_frame_asserted
        assert output_status_good_frame_asserted

        yield delay(100)

        yield input_clk.posedge
        print("test 4: back-to-back packets")
        current_test.next = 4

        test_frame1 = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                             b'\x5A\x51\x52\x53\x54\x55' +
                                             b'\x80\x00' +
                                             b'\x01\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10')
        test_frame2 = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                             b'\x5A\x51\x52\x53\x54\x55' +
                                             b'\x80\x00' +
                                             b'\x02\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10')

        input_status_overflow_asserted.next = 0
        input_status_bad_frame_asserted.next = 0
        input_status_good_frame_asserted.next = 0
        output_status_overflow_asserted.next = 0
        output_status_bad_frame_asserted.next = 0
        output_status_good_frame_asserted.next = 0

        source.send(test_frame1)
        source.send(test_frame2)
        yield input_clk.posedge

        yield output_axis_tlast.posedge
        yield output_clk.posedge
        yield output_axis_tlast.posedge
        yield output_clk.posedge
        yield output_clk.posedge

        rx_frame = sink.recv()

        assert rx_frame == test_frame1

        rx_frame = sink.recv()

        assert rx_frame == test_frame2

        assert not input_status_overflow_asserted
        assert not input_status_bad_frame_asserted
        assert input_status_good_frame_asserted
        assert not output_status_overflow_asserted
        assert not output_status_bad_frame_asserted
        assert output_status_good_frame_asserted

        yield delay(100)

        yield input_clk.posedge
        print("test 5: alternate pause source")
        current_test.next = 5

        test_frame1 = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                             b'\x5A\x51\x52\x53\x54\x55' +
                                             b'\x80\x00' +
                                             b'\x01\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10')
        test_frame2 = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                             b'\x5A\x51\x52\x53\x54\x55' +
                                             b'\x80\x00' +
                                             b'\x02\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10')

        input_status_overflow_asserted.next = 0
        input_status_bad_frame_asserted.next = 0
        input_status_good_frame_asserted.next = 0
        output_status_overflow_asserted.next = 0
        output_status_bad_frame_asserted.next = 0
        output_status_good_frame_asserted.next = 0

        source.send(test_frame1)
        source.send(test_frame2)
        yield input_clk.posedge

        while input_axis_tvalid or output_axis_tvalid:
            source_pause.next = True
            yield input_clk.posedge
            yield input_clk.posedge
            yield input_clk.posedge
            source_pause.next = False
            yield input_clk.posedge

        yield output_clk.posedge
        yield output_clk.posedge
        if output_axis_tvalid:
            yield output_axis_tlast.posedge
        yield output_clk.posedge
        yield output_clk.posedge

        rx_frame = sink.recv()

        assert rx_frame == test_frame1

        rx_frame = sink.recv()

        assert rx_frame == test_frame2

        assert not input_status_overflow_asserted
        assert not input_status_bad_frame_asserted
        assert input_status_good_frame_asserted
        assert not output_status_overflow_asserted
        assert not output_status_bad_frame_asserted
        assert output_status_good_frame_asserted

        yield delay(100)

        yield input_clk.posedge
        print("test 6: alternate pause sink")
        current_test.next = 6

        test_frame1 = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                             b'\x5A\x51\x52\x53\x54\x55' +
                                             b'\x80\x00' +
                                             b'\x01\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10')
        test_frame2 = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                             b'\x5A\x51\x52\x53\x54\x55' +
                                             b'\x80\x00' +
                                             b'\x02\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10')

        input_status_overflow_asserted.next = 0
        input_status_bad_frame_asserted.next = 0
        input_status_good_frame_asserted.next = 0
        output_status_overflow_asserted.next = 0
        output_status_bad_frame_asserted.next = 0
        output_status_good_frame_asserted.next = 0

        source.send(test_frame1)
        source.send(test_frame2)
        yield input_clk.posedge

        while input_axis_tvalid or output_axis_tvalid:
            sink_pause.next = True
            yield output_clk.posedge
            yield output_clk.posedge
            yield output_clk.posedge
            sink_pause.next = False
            yield output_clk.posedge

        yield output_clk.posedge
        yield output_clk.posedge

        rx_frame = sink.recv()

        assert rx_frame == test_frame1

        rx_frame = sink.recv()

        assert rx_frame == test_frame2

        assert not input_status_overflow_asserted
        assert not input_status_bad_frame_asserted
        assert input_status_good_frame_asserted
        assert not output_status_overflow_asserted
        assert not output_status_bad_frame_asserted
        assert output_status_good_frame_asserted

        yield delay(100)

        yield input_clk.posedge
        print("test 7: tuser assert")
        current_test.next = 7

        test_frame = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                            b'\x5A\x51\x52\x53\x54\x55' +
                                            b'\x80\x00' +
                                            b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10')
        test_frame.user = 1

        input_status_overflow_asserted.next = 0
        input_status_bad_frame_asserted.next = 0
        input_status_good_frame_asserted.next = 0
        output_status_overflow_asserted.next = 0
        output_status_bad_frame_asserted.next = 0
        output_status_good_frame_asserted.next = 0

        source.send(test_frame)
        yield input_clk.posedge

        yield delay(1000)

        assert sink.empty()

        assert not input_status_overflow_asserted
        assert input_status_bad_frame_asserted
        assert not input_status_good_frame_asserted
        assert not output_status_overflow_asserted
        assert output_status_bad_frame_asserted
        assert not output_status_good_frame_asserted

        yield delay(100)

        yield input_clk.posedge
        print("test 8: single packet overflow")
        current_test.next = 8

        test_frame = axis_ep.AXIStreamFrame(b'\xDA\xD1\xD2\xD3\xD4\xD5' +
                                            b'\x5A\x51\x52\x53\x54\x55' +
                                            b'\x80\x00' +
                                            bytearray(range(256))*2)

        input_status_overflow_asserted.next = 0
        input_status_bad_frame_asserted.next = 0
        input_status_good_frame_asserted.next = 0
        output_status_overflow_asserted.next = 0
        output_status_bad_frame_asserted.next = 0
        output_status_good_frame_asserted.next = 0

        source.send(test_frame)
        yield input_clk.posedge

        yield delay(10000)

        assert sink.empty()

        assert input_status_overflow_asserted
        assert not input_status_bad_frame_asserted
        assert not input_status_good_frame_asserted
        assert output_status_overflow_asserted
        assert not output_status_bad_frame_asserted
        assert not output_status_good_frame_asserted

        yield delay(100)

        yield input_clk.posedge
        print("test 9: initial sink pause")
        current_test.next = 9

        test_frame = axis_ep.AXIStreamFrame(bytearray(range(24)))

        sink_pause.next = 1
        source.send(test_frame)
        yield input_clk.posedge
        yield input_clk.posedge
        yield input_clk.posedge
        yield input_clk.posedge
        sink_pause.next = 0

        yield output_axis_tlast.posedge
        yield output_clk.posedge
        yield output_clk.posedge

        rx_frame = sink.recv()

        assert rx_frame == test_frame

        yield delay(100)

        yield input_clk.posedge
        print("test 10: initial sink pause, assert reset")
        current_test.next = 10

        test_frame = axis_ep.AXIStreamFrame(bytearray(range(24)))

        sink_pause.next = 1
        source.send(test_frame)
        yield input_clk.posedge
        yield input_clk.posedge
        yield input_clk.posedge
        yield input_clk.posedge

        async_rst.next = 1
        yield input_clk.posedge
        async_rst.next = 0

        sink_pause.next = 0

        yield delay(100)

        yield output_clk.posedge
        yield output_clk.posedge
        yield output_clk.posedge

        assert sink.empty()

        yield delay(100)

        raise StopSimulation