async def run_test(dut, payload_lengths=None, payload_data=None, ifg=12, enable_gen=None): tb = TB(dut) tb.source.ifg = ifg if enable_gen is not None: tb.set_enable_generator(enable_gen()) await tb.reset() test_frames = [payload_data(x) for x in payload_lengths()] for test_data in test_frames: test_frame = GmiiFrame.from_payload(test_data) await tb.source.send(test_frame) for test_data in test_frames: rx_frame = await tb.sink.recv() assert rx_frame.get_payload() == test_data assert rx_frame.check_fcs() assert rx_frame.error is None assert tb.sink.empty() await RisingEdge(dut.clk) await RisingEdge(dut.clk)
async def run_test_rx(dut, payload_lengths=None, payload_data=None, ifg=12, speed=100e6): tb = TB(dut, speed) tb.mii_phy.rx.ifg = ifg tb.dut.ifg_delay.value = ifg await tb.reset() test_frames = [payload_data(x) for x in payload_lengths()] for test_data in test_frames: test_frame = GmiiFrame.from_payload(test_data) await tb.mii_phy.rx.send(test_frame) for test_data in test_frames: rx_frame = await tb.axis_sink.recv() assert rx_frame.tdata == test_data assert rx_frame.tuser == 0 assert tb.axis_sink.empty() await RisingEdge(dut.rx_clk) await RisingEdge(dut.rx_clk)
async def run_test(dut, payload_lengths=None, payload_data=None, ifg=12, enable_gen=None, mii_sel=False): tb = TB(dut) tb.source.ifg = ifg tb.dut.mii_select <= mii_sel if enable_gen is not None: tb.set_enable_generator(enable_gen()) await tb.reset() test_frames = [payload_data(x) for x in payload_lengths()] for test_data in test_frames: test_frame = GmiiFrame.from_payload(test_data) await tb.source.send(test_frame) for test_data in test_frames: rx_frame = await tb.sink.recv() assert rx_frame.tdata == test_data assert rx_frame.tuser == 0 assert tb.sink.empty() await RisingEdge(dut.clk) await RisingEdge(dut.clk)
async def run_test_tx(dut, payload_lengths=None, payload_data=None, ifg=12, speed=1000e6): tb = TB(dut, speed) tb.gmii_phy.rx.ifg = ifg tb.source.ifg = ifg await tb.reset() test_frames = [payload_data(x) for x in payload_lengths()] for test_data in test_frames: test_frame = GmiiFrame.from_payload(test_data) await tb.source.send(test_frame) for test_data in test_frames: rx_frame = await tb.gmii_phy.tx.recv() assert rx_frame.get_payload() == test_data assert rx_frame.check_fcs() assert rx_frame.error is None assert tb.gmii_phy.tx.empty() await RisingEdge(dut.phy_tx_clk) await RisingEdge(dut.phy_tx_clk)
async def run_test_rx(dut, payload_lengths=None, payload_data=None, ifg=12, speed=1000e6): tb = TB(dut, speed) tb.gmii_phy.rx.ifg = ifg tb.dut.ifg_delay <= ifg tb.set_speed(speed) await tb.reset() for k in range(100): await RisingEdge(dut.rx_clk) if speed == 10e6: assert dut.speed == 0 elif speed == 100e6: assert dut.speed == 1 else: assert dut.speed == 2 test_frames = [payload_data(x) for x in payload_lengths()] for test_data in test_frames: test_frame = GmiiFrame.from_payload(test_data) await tb.gmii_phy.rx.send(test_frame) for test_data in test_frames: rx_frame = await tb.axis_sink.recv() assert rx_frame.tdata == test_data assert rx_frame.tuser == 0 assert tb.axis_sink.empty() await RisingEdge(dut.rx_clk) await RisingEdge(dut.rx_clk)
async def run_test_rx(dut, payload_lengths=None, payload_data=None, ifg=12, enable_gen=None, mii_sel=False): tb = TB(dut) tb.gmii_source.ifg = ifg tb.dut.ifg_delay.value = ifg tb.dut.rx_mii_select.value = mii_sel tb.dut.tx_mii_select.value = mii_sel if enable_gen is not None: tb.set_enable_generator_rx(enable_gen()) tb.set_enable_generator_tx(enable_gen()) await tb.reset() test_frames = [payload_data(x) for x in payload_lengths()] for test_data in test_frames: test_frame = GmiiFrame.from_payload(test_data) await tb.gmii_source.send(test_frame) for test_data in test_frames: rx_frame = await tb.axis_sink.recv() assert rx_frame.tdata == test_data assert rx_frame.tuser == 0 assert tb.axis_sink.empty() await RisingEdge(dut.logic_clk) await RisingEdge(dut.logic_clk)
async def run_test(dut): tb = TB(dut) await tb.init() tb.log.info("test UDP RX packet") payload = bytes([x % 256 for x in range(256)]) eth = Ether(src='5a:51:52:53:54:55', dst='02:00:00:00:00:00') ip = IP(src='192.168.1.100', dst='192.168.1.128') udp = UDP(sport=5678, dport=1234) test_pkt = eth / ip / udp / payload test_frame = GmiiFrame.from_payload(test_pkt.build()) await tb.mii_phy.rx.send(test_frame) tb.log.info("receive ARP request") rx_frame = await tb.mii_phy.tx.recv() rx_pkt = Ether(bytes(rx_frame.get_payload())) tb.log.info("RX packet: %s", repr(rx_pkt)) assert rx_pkt.dst == 'ff:ff:ff:ff:ff:ff' assert rx_pkt.src == test_pkt.dst assert rx_pkt[ARP].hwtype == 1 assert rx_pkt[ARP].ptype == 0x0800 assert rx_pkt[ARP].hwlen == 6 assert rx_pkt[ARP].plen == 4 assert rx_pkt[ARP].op == 1 assert rx_pkt[ARP].hwsrc == test_pkt.dst assert rx_pkt[ARP].psrc == test_pkt[IP].dst assert rx_pkt[ARP].hwdst == '00:00:00:00:00:00' assert rx_pkt[ARP].pdst == test_pkt[IP].src tb.log.info("send ARP response") eth = Ether(src=test_pkt.src, dst=test_pkt.dst) arp = ARP(hwtype=1, ptype=0x0800, hwlen=6, plen=4, op=2, hwsrc=test_pkt.src, psrc=test_pkt[IP].src, hwdst=test_pkt.dst, pdst=test_pkt[IP].dst) resp_pkt = eth / arp resp_frame = GmiiFrame.from_payload(resp_pkt.build()) await tb.mii_phy.rx.send(resp_frame) tb.log.info("receive UDP packet") rx_frame = await tb.mii_phy.tx.recv() rx_pkt = Ether(bytes(rx_frame.get_payload())) tb.log.info("RX packet: %s", repr(rx_pkt)) assert rx_pkt.dst == test_pkt.src assert rx_pkt.src == test_pkt.dst assert rx_pkt[IP].dst == test_pkt[IP].src assert rx_pkt[IP].src == test_pkt[IP].dst assert rx_pkt[UDP].dport == test_pkt[UDP].sport assert rx_pkt[UDP].sport == test_pkt[UDP].dport assert rx_pkt[UDP].payload == test_pkt[UDP].payload await RisingEdge(dut.clk) await RisingEdge(dut.clk)