def bench(): # Inputs clk = Signal(bool(0)) rst = Signal(bool(0)) current_test = Signal(intbv(0)[8:]) input_ip_hdr_valid = Signal(bool(0)) input_eth_dest_mac = Signal(intbv(0)[48:]) input_eth_src_mac = Signal(intbv(0)[48:]) input_eth_type = Signal(intbv(0)[16:]) input_ip_version = Signal(intbv(0)[4:]) input_ip_ihl = Signal(intbv(0)[4:]) input_ip_dscp = Signal(intbv(0)[6:]) input_ip_ecn = Signal(intbv(0)[2:]) input_ip_length = Signal(intbv(0)[16:]) input_ip_identification = Signal(intbv(0)[16:]) input_ip_flags = Signal(intbv(0)[3:]) input_ip_fragment_offset = Signal(intbv(0)[13:]) input_ip_ttl = Signal(intbv(0)[8:]) input_ip_protocol = Signal(intbv(0)[8:]) input_ip_header_checksum = Signal(intbv(0)[16:]) input_ip_source_ip = Signal(intbv(0)[32:]) input_ip_dest_ip = Signal(intbv(0)[32:]) input_ip_payload_tdata = Signal(intbv(0)[64:]) input_ip_payload_tkeep = Signal(intbv(0)[8:]) input_ip_payload_tvalid = Signal(bool(0)) input_ip_payload_tlast = Signal(bool(0)) input_ip_payload_tuser = Signal(bool(0)) output_0_ip_hdr_ready = Signal(bool(0)) output_0_ip_payload_tready = Signal(bool(0)) output_1_ip_hdr_ready = Signal(bool(0)) output_1_ip_payload_tready = Signal(bool(0)) output_2_ip_hdr_ready = Signal(bool(0)) output_2_ip_payload_tready = Signal(bool(0)) output_3_ip_hdr_ready = Signal(bool(0)) output_3_ip_payload_tready = Signal(bool(0)) enable = Signal(bool(0)) select = Signal(intbv(0)[2:]) # Outputs input_ip_hdr_ready = Signal(bool(0)) input_ip_payload_tready = Signal(bool(0)) output_0_ip_hdr_valid = Signal(bool(0)) output_0_eth_dest_mac = Signal(intbv(0)[48:]) output_0_eth_src_mac = Signal(intbv(0)[48:]) output_0_eth_type = Signal(intbv(0)[16:]) output_0_ip_version = Signal(intbv(0)[4:]) output_0_ip_ihl = Signal(intbv(0)[4:]) output_0_ip_dscp = Signal(intbv(0)[6:]) output_0_ip_ecn = Signal(intbv(0)[2:]) output_0_ip_length = Signal(intbv(0)[16:]) output_0_ip_identification = Signal(intbv(0)[16:]) output_0_ip_flags = Signal(intbv(0)[3:]) output_0_ip_fragment_offset = Signal(intbv(0)[13:]) output_0_ip_ttl = Signal(intbv(0)[8:]) output_0_ip_protocol = Signal(intbv(0)[8:]) output_0_ip_header_checksum = Signal(intbv(0)[16:]) output_0_ip_source_ip = Signal(intbv(0)[32:]) output_0_ip_dest_ip = Signal(intbv(0)[32:]) output_0_ip_payload_tdata = Signal(intbv(0)[64:]) output_0_ip_payload_tkeep = Signal(intbv(0)[8:]) output_0_ip_payload_tvalid = Signal(bool(0)) output_0_ip_payload_tlast = Signal(bool(0)) output_0_ip_payload_tuser = Signal(bool(0)) output_1_ip_hdr_valid = Signal(bool(0)) output_1_eth_dest_mac = Signal(intbv(0)[48:]) output_1_eth_src_mac = Signal(intbv(0)[48:]) output_1_eth_type = Signal(intbv(0)[16:]) output_1_ip_version = Signal(intbv(0)[4:]) output_1_ip_ihl = Signal(intbv(0)[4:]) output_1_ip_dscp = Signal(intbv(0)[6:]) output_1_ip_ecn = Signal(intbv(0)[2:]) output_1_ip_length = Signal(intbv(0)[16:]) output_1_ip_identification = Signal(intbv(0)[16:]) output_1_ip_flags = Signal(intbv(0)[3:]) output_1_ip_fragment_offset = Signal(intbv(0)[13:]) output_1_ip_ttl = Signal(intbv(0)[8:]) output_1_ip_protocol = Signal(intbv(0)[8:]) output_1_ip_header_checksum = Signal(intbv(0)[16:]) output_1_ip_source_ip = Signal(intbv(0)[32:]) output_1_ip_dest_ip = Signal(intbv(0)[32:]) output_1_ip_payload_tdata = Signal(intbv(0)[64:]) output_1_ip_payload_tkeep = Signal(intbv(0)[8:]) output_1_ip_payload_tvalid = Signal(bool(0)) output_1_ip_payload_tlast = Signal(bool(0)) output_1_ip_payload_tuser = Signal(bool(0)) output_2_ip_hdr_valid = Signal(bool(0)) output_2_eth_dest_mac = Signal(intbv(0)[48:]) output_2_eth_src_mac = Signal(intbv(0)[48:]) output_2_eth_type = Signal(intbv(0)[16:]) output_2_ip_version = Signal(intbv(0)[4:]) output_2_ip_ihl = Signal(intbv(0)[4:]) output_2_ip_dscp = Signal(intbv(0)[6:]) output_2_ip_ecn = Signal(intbv(0)[2:]) output_2_ip_length = Signal(intbv(0)[16:]) output_2_ip_identification = Signal(intbv(0)[16:]) output_2_ip_flags = Signal(intbv(0)[3:]) output_2_ip_fragment_offset = Signal(intbv(0)[13:]) output_2_ip_ttl = Signal(intbv(0)[8:]) output_2_ip_protocol = Signal(intbv(0)[8:]) output_2_ip_header_checksum = Signal(intbv(0)[16:]) output_2_ip_source_ip = Signal(intbv(0)[32:]) output_2_ip_dest_ip = Signal(intbv(0)[32:]) output_2_ip_payload_tdata = Signal(intbv(0)[64:]) output_2_ip_payload_tkeep = Signal(intbv(0)[8:]) output_2_ip_payload_tvalid = Signal(bool(0)) output_2_ip_payload_tlast = Signal(bool(0)) output_2_ip_payload_tuser = Signal(bool(0)) output_3_ip_hdr_valid = Signal(bool(0)) output_3_eth_dest_mac = Signal(intbv(0)[48:]) output_3_eth_src_mac = Signal(intbv(0)[48:]) output_3_eth_type = Signal(intbv(0)[16:]) output_3_ip_version = Signal(intbv(0)[4:]) output_3_ip_ihl = Signal(intbv(0)[4:]) output_3_ip_dscp = Signal(intbv(0)[6:]) output_3_ip_ecn = Signal(intbv(0)[2:]) output_3_ip_length = Signal(intbv(0)[16:]) output_3_ip_identification = Signal(intbv(0)[16:]) output_3_ip_flags = Signal(intbv(0)[3:]) output_3_ip_fragment_offset = Signal(intbv(0)[13:]) output_3_ip_ttl = Signal(intbv(0)[8:]) output_3_ip_protocol = Signal(intbv(0)[8:]) output_3_ip_header_checksum = Signal(intbv(0)[16:]) output_3_ip_source_ip = Signal(intbv(0)[32:]) output_3_ip_dest_ip = Signal(intbv(0)[32:]) output_3_ip_payload_tdata = Signal(intbv(0)[64:]) output_3_ip_payload_tkeep = Signal(intbv(0)[8:]) output_3_ip_payload_tvalid = Signal(bool(0)) output_3_ip_payload_tlast = Signal(bool(0)) output_3_ip_payload_tuser = Signal(bool(0)) # sources and sinks source_pause = Signal(bool(0)) sink_0_pause = Signal(bool(0)) sink_1_pause = Signal(bool(0)) sink_2_pause = Signal(bool(0)) sink_3_pause = Signal(bool(0)) source = ip_ep.IPFrameSource() source_logic = source.create_logic( clk, rst, ip_hdr_ready=input_ip_hdr_ready, ip_hdr_valid=input_ip_hdr_valid, eth_dest_mac=input_eth_dest_mac, eth_src_mac=input_eth_src_mac, eth_type=input_eth_type, ip_version=input_ip_version, ip_ihl=input_ip_ihl, ip_dscp=input_ip_dscp, ip_ecn=input_ip_ecn, ip_length=input_ip_length, ip_identification=input_ip_identification, ip_flags=input_ip_flags, ip_fragment_offset=input_ip_fragment_offset, ip_ttl=input_ip_ttl, ip_protocol=input_ip_protocol, ip_header_checksum=input_ip_header_checksum, ip_source_ip=input_ip_source_ip, ip_dest_ip=input_ip_dest_ip, ip_payload_tdata=input_ip_payload_tdata, ip_payload_tkeep=input_ip_payload_tkeep, ip_payload_tvalid=input_ip_payload_tvalid, ip_payload_tready=input_ip_payload_tready, ip_payload_tlast=input_ip_payload_tlast, ip_payload_tuser=input_ip_payload_tuser, pause=source_pause, name='source') sink_0 = ip_ep.IPFrameSink() sink_0_logic = sink_0.create_logic( clk, rst, ip_hdr_ready=output_0_ip_hdr_ready, ip_hdr_valid=output_0_ip_hdr_valid, eth_dest_mac=output_0_eth_dest_mac, eth_src_mac=output_0_eth_src_mac, eth_type=output_0_eth_type, ip_version=output_0_ip_version, ip_ihl=output_0_ip_ihl, ip_dscp=output_0_ip_dscp, ip_ecn=output_0_ip_ecn, ip_length=output_0_ip_length, ip_identification=output_0_ip_identification, ip_flags=output_0_ip_flags, ip_fragment_offset=output_0_ip_fragment_offset, ip_ttl=output_0_ip_ttl, ip_protocol=output_0_ip_protocol, ip_header_checksum=output_0_ip_header_checksum, ip_source_ip=output_0_ip_source_ip, ip_dest_ip=output_0_ip_dest_ip, ip_payload_tdata=output_0_ip_payload_tdata, ip_payload_tkeep=output_0_ip_payload_tkeep, ip_payload_tvalid=output_0_ip_payload_tvalid, ip_payload_tready=output_0_ip_payload_tready, ip_payload_tlast=output_0_ip_payload_tlast, ip_payload_tuser=output_0_ip_payload_tuser, pause=sink_0_pause, name='sink_0') sink_1 = ip_ep.IPFrameSink() sink_1_logic = sink_1.create_logic( clk, rst, ip_hdr_ready=output_1_ip_hdr_ready, ip_hdr_valid=output_1_ip_hdr_valid, eth_dest_mac=output_1_eth_dest_mac, eth_src_mac=output_1_eth_src_mac, eth_type=output_1_eth_type, ip_version=output_1_ip_version, ip_ihl=output_1_ip_ihl, ip_dscp=output_1_ip_dscp, ip_ecn=output_1_ip_ecn, ip_length=output_1_ip_length, ip_identification=output_1_ip_identification, ip_flags=output_1_ip_flags, ip_fragment_offset=output_1_ip_fragment_offset, ip_ttl=output_1_ip_ttl, ip_protocol=output_1_ip_protocol, ip_header_checksum=output_1_ip_header_checksum, ip_source_ip=output_1_ip_source_ip, ip_dest_ip=output_1_ip_dest_ip, ip_payload_tdata=output_1_ip_payload_tdata, ip_payload_tkeep=output_1_ip_payload_tkeep, ip_payload_tvalid=output_1_ip_payload_tvalid, ip_payload_tready=output_1_ip_payload_tready, ip_payload_tlast=output_1_ip_payload_tlast, ip_payload_tuser=output_1_ip_payload_tuser, pause=sink_1_pause, name='sink_1') sink_2 = ip_ep.IPFrameSink() sink_2_logic = sink_2.create_logic( clk, rst, ip_hdr_ready=output_2_ip_hdr_ready, ip_hdr_valid=output_2_ip_hdr_valid, eth_dest_mac=output_2_eth_dest_mac, eth_src_mac=output_2_eth_src_mac, eth_type=output_2_eth_type, ip_version=output_2_ip_version, ip_ihl=output_2_ip_ihl, ip_dscp=output_2_ip_dscp, ip_ecn=output_2_ip_ecn, ip_length=output_2_ip_length, ip_identification=output_2_ip_identification, ip_flags=output_2_ip_flags, ip_fragment_offset=output_2_ip_fragment_offset, ip_ttl=output_2_ip_ttl, ip_protocol=output_2_ip_protocol, ip_header_checksum=output_2_ip_header_checksum, ip_source_ip=output_2_ip_source_ip, ip_dest_ip=output_2_ip_dest_ip, ip_payload_tdata=output_2_ip_payload_tdata, ip_payload_tkeep=output_2_ip_payload_tkeep, ip_payload_tvalid=output_2_ip_payload_tvalid, ip_payload_tready=output_2_ip_payload_tready, ip_payload_tlast=output_2_ip_payload_tlast, ip_payload_tuser=output_2_ip_payload_tuser, pause=sink_2_pause, name='sink_2') sink_3 = ip_ep.IPFrameSink() sink_3_logic = sink_3.create_logic( clk, rst, ip_hdr_ready=output_3_ip_hdr_ready, ip_hdr_valid=output_3_ip_hdr_valid, eth_dest_mac=output_3_eth_dest_mac, eth_src_mac=output_3_eth_src_mac, eth_type=output_3_eth_type, ip_version=output_3_ip_version, ip_ihl=output_3_ip_ihl, ip_dscp=output_3_ip_dscp, ip_ecn=output_3_ip_ecn, ip_length=output_3_ip_length, ip_identification=output_3_ip_identification, ip_flags=output_3_ip_flags, ip_fragment_offset=output_3_ip_fragment_offset, ip_ttl=output_3_ip_ttl, ip_protocol=output_3_ip_protocol, ip_header_checksum=output_3_ip_header_checksum, ip_source_ip=output_3_ip_source_ip, ip_dest_ip=output_3_ip_dest_ip, ip_payload_tdata=output_3_ip_payload_tdata, ip_payload_tkeep=output_3_ip_payload_tkeep, ip_payload_tvalid=output_3_ip_payload_tvalid, ip_payload_tready=output_3_ip_payload_tready, ip_payload_tlast=output_3_ip_payload_tlast, ip_payload_tuser=output_3_ip_payload_tuser, pause=sink_3_pause, name='sink_3') # DUT if os.system(build_cmd): raise Exception("Error running build command") dut = Cosimulation("vvp -m myhdl %s.vvp -lxt2" % testbench, clk=clk, rst=rst, current_test=current_test, input_ip_hdr_valid=input_ip_hdr_valid, input_ip_hdr_ready=input_ip_hdr_ready, input_eth_dest_mac=input_eth_dest_mac, input_eth_src_mac=input_eth_src_mac, input_eth_type=input_eth_type, input_ip_version=input_ip_version, input_ip_ihl=input_ip_ihl, input_ip_dscp=input_ip_dscp, input_ip_ecn=input_ip_ecn, input_ip_length=input_ip_length, input_ip_identification=input_ip_identification, input_ip_flags=input_ip_flags, input_ip_fragment_offset=input_ip_fragment_offset, input_ip_ttl=input_ip_ttl, input_ip_protocol=input_ip_protocol, input_ip_header_checksum=input_ip_header_checksum, input_ip_source_ip=input_ip_source_ip, input_ip_dest_ip=input_ip_dest_ip, input_ip_payload_tdata=input_ip_payload_tdata, input_ip_payload_tkeep=input_ip_payload_tkeep, input_ip_payload_tvalid=input_ip_payload_tvalid, input_ip_payload_tready=input_ip_payload_tready, input_ip_payload_tlast=input_ip_payload_tlast, input_ip_payload_tuser=input_ip_payload_tuser, output_0_ip_hdr_valid=output_0_ip_hdr_valid, output_0_ip_hdr_ready=output_0_ip_hdr_ready, output_0_eth_dest_mac=output_0_eth_dest_mac, output_0_eth_src_mac=output_0_eth_src_mac, output_0_eth_type=output_0_eth_type, output_0_ip_version=output_0_ip_version, output_0_ip_ihl=output_0_ip_ihl, output_0_ip_dscp=output_0_ip_dscp, output_0_ip_ecn=output_0_ip_ecn, output_0_ip_length=output_0_ip_length, output_0_ip_identification=output_0_ip_identification, output_0_ip_flags=output_0_ip_flags, output_0_ip_fragment_offset=output_0_ip_fragment_offset, output_0_ip_ttl=output_0_ip_ttl, output_0_ip_protocol=output_0_ip_protocol, output_0_ip_header_checksum=output_0_ip_header_checksum, output_0_ip_source_ip=output_0_ip_source_ip, output_0_ip_dest_ip=output_0_ip_dest_ip, output_0_ip_payload_tdata=output_0_ip_payload_tdata, output_0_ip_payload_tkeep=output_0_ip_payload_tkeep, output_0_ip_payload_tvalid=output_0_ip_payload_tvalid, output_0_ip_payload_tready=output_0_ip_payload_tready, output_0_ip_payload_tlast=output_0_ip_payload_tlast, output_0_ip_payload_tuser=output_0_ip_payload_tuser, output_1_ip_hdr_valid=output_1_ip_hdr_valid, output_1_ip_hdr_ready=output_1_ip_hdr_ready, output_1_eth_dest_mac=output_1_eth_dest_mac, output_1_eth_src_mac=output_1_eth_src_mac, output_1_eth_type=output_1_eth_type, output_1_ip_version=output_1_ip_version, output_1_ip_ihl=output_1_ip_ihl, output_1_ip_dscp=output_1_ip_dscp, output_1_ip_ecn=output_1_ip_ecn, output_1_ip_length=output_1_ip_length, output_1_ip_identification=output_1_ip_identification, output_1_ip_flags=output_1_ip_flags, output_1_ip_fragment_offset=output_1_ip_fragment_offset, output_1_ip_ttl=output_1_ip_ttl, output_1_ip_protocol=output_1_ip_protocol, output_1_ip_header_checksum=output_1_ip_header_checksum, output_1_ip_source_ip=output_1_ip_source_ip, output_1_ip_dest_ip=output_1_ip_dest_ip, output_1_ip_payload_tdata=output_1_ip_payload_tdata, output_1_ip_payload_tkeep=output_1_ip_payload_tkeep, output_1_ip_payload_tvalid=output_1_ip_payload_tvalid, output_1_ip_payload_tready=output_1_ip_payload_tready, output_1_ip_payload_tlast=output_1_ip_payload_tlast, output_1_ip_payload_tuser=output_1_ip_payload_tuser, output_2_ip_hdr_valid=output_2_ip_hdr_valid, output_2_ip_hdr_ready=output_2_ip_hdr_ready, output_2_eth_dest_mac=output_2_eth_dest_mac, output_2_eth_src_mac=output_2_eth_src_mac, output_2_eth_type=output_2_eth_type, output_2_ip_version=output_2_ip_version, output_2_ip_ihl=output_2_ip_ihl, output_2_ip_dscp=output_2_ip_dscp, output_2_ip_ecn=output_2_ip_ecn, output_2_ip_length=output_2_ip_length, output_2_ip_identification=output_2_ip_identification, output_2_ip_flags=output_2_ip_flags, output_2_ip_fragment_offset=output_2_ip_fragment_offset, output_2_ip_ttl=output_2_ip_ttl, output_2_ip_protocol=output_2_ip_protocol, output_2_ip_header_checksum=output_2_ip_header_checksum, output_2_ip_source_ip=output_2_ip_source_ip, output_2_ip_dest_ip=output_2_ip_dest_ip, output_2_ip_payload_tdata=output_2_ip_payload_tdata, output_2_ip_payload_tkeep=output_2_ip_payload_tkeep, output_2_ip_payload_tvalid=output_2_ip_payload_tvalid, output_2_ip_payload_tready=output_2_ip_payload_tready, output_2_ip_payload_tlast=output_2_ip_payload_tlast, output_2_ip_payload_tuser=output_2_ip_payload_tuser, output_3_ip_hdr_valid=output_3_ip_hdr_valid, output_3_ip_hdr_ready=output_3_ip_hdr_ready, output_3_eth_dest_mac=output_3_eth_dest_mac, output_3_eth_src_mac=output_3_eth_src_mac, output_3_eth_type=output_3_eth_type, output_3_ip_version=output_3_ip_version, output_3_ip_ihl=output_3_ip_ihl, output_3_ip_dscp=output_3_ip_dscp, output_3_ip_ecn=output_3_ip_ecn, output_3_ip_length=output_3_ip_length, output_3_ip_identification=output_3_ip_identification, output_3_ip_flags=output_3_ip_flags, output_3_ip_fragment_offset=output_3_ip_fragment_offset, output_3_ip_ttl=output_3_ip_ttl, output_3_ip_protocol=output_3_ip_protocol, output_3_ip_header_checksum=output_3_ip_header_checksum, output_3_ip_source_ip=output_3_ip_source_ip, output_3_ip_dest_ip=output_3_ip_dest_ip, output_3_ip_payload_tdata=output_3_ip_payload_tdata, output_3_ip_payload_tkeep=output_3_ip_payload_tkeep, output_3_ip_payload_tvalid=output_3_ip_payload_tvalid, output_3_ip_payload_tready=output_3_ip_payload_tready, output_3_ip_payload_tlast=output_3_ip_payload_tlast, output_3_ip_payload_tuser=output_3_ip_payload_tuser, enable=enable, select=select) @always(delay(4)) def clkgen(): clk.next = not clk @instance 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 = ip_ep.IPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x8000 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80165 test_frame.ip_dest_ip = 0xc0a80164 test_frame.payload = bytearray(range(32)) test_frame.build() source.send(test_frame) yield sink_0.wait() rx_frame = sink_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 = ip_ep.IPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x8000 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80165 test_frame.ip_dest_ip = 0xc0a80164 test_frame.payload = bytearray(range(32)) test_frame.build() source.send(test_frame) yield sink_1.wait() rx_frame = sink_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 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x8000 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_dscp = 0 test_frame1.ip_ecn = 0 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80165 test_frame1.ip_dest_ip = 0xc0a80164 test_frame1.payload = bytearray(range(32)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x8000 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_dscp = 0 test_frame2.ip_ecn = 0 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80165 test_frame2.ip_dest_ip = 0xc0a80164 test_frame2.payload = bytearray(range(32)) test_frame2.build() source.send(test_frame1) source.send(test_frame2) yield sink_0.wait() rx_frame = sink_0.recv() assert rx_frame == test_frame1 yield sink_0.wait() rx_frame = sink_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 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x8000 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_dscp = 0 test_frame1.ip_ecn = 0 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80165 test_frame1.ip_dest_ip = 0xc0a80164 test_frame1.payload = bytearray(range(32)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x8000 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_dscp = 0 test_frame2.ip_ecn = 0 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80165 test_frame2.ip_dest_ip = 0xc0a80164 test_frame2.payload = bytearray(range(32)) test_frame2.build() source.send(test_frame1) source.send(test_frame2) yield clk.posedge while input_ip_payload_tvalid or input_ip_hdr_valid: yield clk.posedge select.next = 2 yield sink_1.wait() rx_frame = sink_1.recv() assert rx_frame == test_frame1 yield sink_2.wait() rx_frame = sink_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 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x8000 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_dscp = 0 test_frame1.ip_ecn = 0 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80165 test_frame1.ip_dest_ip = 0xc0a80164 test_frame1.payload = bytearray(range(32)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x8000 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_dscp = 0 test_frame2.ip_ecn = 0 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80165 test_frame2.ip_dest_ip = 0xc0a80164 test_frame2.payload = bytearray(range(32)) test_frame2.build() source.send(test_frame1) source.send(test_frame2) yield clk.posedge while input_ip_payload_tvalid or input_ip_hdr_valid: 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_1.wait() rx_frame = sink_1.recv() assert rx_frame == test_frame1 yield sink_2.wait() rx_frame = sink_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 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x8000 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_dscp = 0 test_frame1.ip_ecn = 0 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80165 test_frame1.ip_dest_ip = 0xc0a80164 test_frame1.payload = bytearray(range(32)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x8000 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_dscp = 0 test_frame2.ip_ecn = 0 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80165 test_frame2.ip_dest_ip = 0xc0a80164 test_frame2.payload = bytearray(range(32)) test_frame2.build() source.send(test_frame1) source.send(test_frame2) yield clk.posedge while input_ip_payload_tvalid or input_ip_hdr_valid: 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 sink_1.wait() rx_frame = sink_1.recv() assert rx_frame == test_frame1 yield sink_2.wait() rx_frame = sink_2.recv() assert rx_frame == test_frame2 yield delay(100) raise StopSimulation return instances()
def bench(): # Parameters S_COUNT = 4 DATA_WIDTH = 64 KEEP_ENABLE = (DATA_WIDTH > 8) KEEP_WIDTH = (DATA_WIDTH / 8) ID_ENABLE = 1 ID_WIDTH = 8 DEST_ENABLE = 1 DEST_WIDTH = 8 USER_ENABLE = 1 USER_WIDTH = 1 ARB_TYPE = "PRIORITY" LSB_PRIORITY = "HIGH" # Inputs clk = Signal(bool(0)) rst = Signal(bool(0)) current_test = Signal(intbv(0)[8:]) s_ip_hdr_valid_list = [Signal(bool(0)) for i in range(S_COUNT)] s_eth_dest_mac_list = [Signal(intbv(0)[48:]) for i in range(S_COUNT)] s_eth_src_mac_list = [Signal(intbv(0)[48:]) for i in range(S_COUNT)] s_eth_type_list = [Signal(intbv(0)[16:]) for i in range(S_COUNT)] s_ip_version_list = [Signal(intbv(0)[4:]) for i in range(S_COUNT)] s_ip_ihl_list = [Signal(intbv(0)[4:]) for i in range(S_COUNT)] s_ip_dscp_list = [Signal(intbv(0)[6:]) for i in range(S_COUNT)] s_ip_ecn_list = [Signal(intbv(0)[2:]) for i in range(S_COUNT)] s_ip_length_list = [Signal(intbv(0)[16:]) for i in range(S_COUNT)] s_ip_identification_list = [Signal(intbv(0)[16:]) for i in range(S_COUNT)] s_ip_flags_list = [Signal(intbv(0)[3:]) for i in range(S_COUNT)] s_ip_fragment_offset_list = [Signal(intbv(0)[13:]) for i in range(S_COUNT)] s_ip_ttl_list = [Signal(intbv(0)[8:]) for i in range(S_COUNT)] s_ip_protocol_list = [Signal(intbv(0)[8:]) for i in range(S_COUNT)] s_ip_header_checksum_list = [Signal(intbv(0)[16:]) for i in range(S_COUNT)] s_ip_source_ip_list = [Signal(intbv(0)[32:]) for i in range(S_COUNT)] s_ip_dest_ip_list = [Signal(intbv(0)[32:]) for i in range(S_COUNT)] s_ip_payload_axis_tdata_list = [ Signal(intbv(0)[DATA_WIDTH:]) for i in range(S_COUNT) ] s_ip_payload_axis_tkeep_list = [ Signal(intbv(1)[KEEP_WIDTH:]) for i in range(S_COUNT) ] s_ip_payload_axis_tvalid_list = [Signal(bool(0)) for i in range(S_COUNT)] s_ip_payload_axis_tlast_list = [Signal(bool(0)) for i in range(S_COUNT)] s_ip_payload_axis_tid_list = [ Signal(intbv(0)[ID_WIDTH:]) for i in range(S_COUNT) ] s_ip_payload_axis_tdest_list = [ Signal(intbv(0)[DEST_WIDTH:]) for i in range(S_COUNT) ] s_ip_payload_axis_tuser_list = [ Signal(intbv(0)[USER_WIDTH:]) for i in range(S_COUNT) ] s_ip_hdr_valid = ConcatSignal(*reversed(s_ip_hdr_valid_list)) s_eth_dest_mac = ConcatSignal(*reversed(s_eth_dest_mac_list)) s_eth_src_mac = ConcatSignal(*reversed(s_eth_src_mac_list)) s_eth_type = ConcatSignal(*reversed(s_eth_type_list)) s_ip_version = ConcatSignal(*reversed(s_ip_version_list)) s_ip_ihl = ConcatSignal(*reversed(s_ip_ihl_list)) s_ip_dscp = ConcatSignal(*reversed(s_ip_dscp_list)) s_ip_ecn = ConcatSignal(*reversed(s_ip_ecn_list)) s_ip_length = ConcatSignal(*reversed(s_ip_length_list)) s_ip_identification = ConcatSignal(*reversed(s_ip_identification_list)) s_ip_flags = ConcatSignal(*reversed(s_ip_flags_list)) s_ip_fragment_offset = ConcatSignal(*reversed(s_ip_fragment_offset_list)) s_ip_ttl = ConcatSignal(*reversed(s_ip_ttl_list)) s_ip_protocol = ConcatSignal(*reversed(s_ip_protocol_list)) s_ip_header_checksum = ConcatSignal(*reversed(s_ip_header_checksum_list)) s_ip_source_ip = ConcatSignal(*reversed(s_ip_source_ip_list)) s_ip_dest_ip = ConcatSignal(*reversed(s_ip_dest_ip_list)) s_ip_payload_axis_tdata = ConcatSignal( *reversed(s_ip_payload_axis_tdata_list)) s_ip_payload_axis_tkeep = ConcatSignal( *reversed(s_ip_payload_axis_tkeep_list)) s_ip_payload_axis_tvalid = ConcatSignal( *reversed(s_ip_payload_axis_tvalid_list)) s_ip_payload_axis_tlast = ConcatSignal( *reversed(s_ip_payload_axis_tlast_list)) s_ip_payload_axis_tid = ConcatSignal(*reversed(s_ip_payload_axis_tid_list)) s_ip_payload_axis_tdest = ConcatSignal( *reversed(s_ip_payload_axis_tdest_list)) s_ip_payload_axis_tuser = ConcatSignal( *reversed(s_ip_payload_axis_tuser_list)) m_ip_hdr_ready = Signal(bool(0)) m_ip_payload_axis_tready = Signal(bool(0)) # Outputs s_ip_hdr_ready = Signal(intbv(0)[S_COUNT:]) s_ip_payload_axis_tready = Signal(intbv(0)[S_COUNT:]) s_ip_hdr_ready_list = [s_ip_hdr_ready(i) for i in range(S_COUNT)] s_ip_payload_axis_tready_list = [ s_ip_payload_axis_tready(i) for i in range(S_COUNT) ] m_ip_hdr_valid = Signal(bool(0)) m_eth_dest_mac = Signal(intbv(0)[48:]) m_eth_src_mac = Signal(intbv(0)[48:]) m_eth_type = Signal(intbv(0)[16:]) m_ip_version = Signal(intbv(0)[4:]) m_ip_ihl = Signal(intbv(0)[4:]) m_ip_dscp = Signal(intbv(0)[6:]) m_ip_ecn = Signal(intbv(0)[2:]) m_ip_length = Signal(intbv(0)[16:]) m_ip_identification = Signal(intbv(0)[16:]) m_ip_flags = Signal(intbv(0)[3:]) m_ip_fragment_offset = Signal(intbv(0)[13:]) m_ip_ttl = Signal(intbv(0)[8:]) m_ip_protocol = Signal(intbv(0)[8:]) m_ip_header_checksum = Signal(intbv(0)[16:]) m_ip_source_ip = Signal(intbv(0)[32:]) m_ip_dest_ip = Signal(intbv(0)[32:]) m_ip_payload_axis_tdata = Signal(intbv(0)[DATA_WIDTH:]) m_ip_payload_axis_tkeep = Signal(intbv(1)[KEEP_WIDTH:]) m_ip_payload_axis_tvalid = Signal(bool(0)) m_ip_payload_axis_tlast = Signal(bool(0)) m_ip_payload_axis_tid = Signal(intbv(0)[ID_WIDTH:]) m_ip_payload_axis_tdest = Signal(intbv(0)[DEST_WIDTH:]) m_ip_payload_axis_tuser = Signal(intbv(0)[USER_WIDTH:]) # sources and sinks source_pause_list = [] source_list = [] source_logic_list = [] sink_pause = Signal(bool(0)) for k in range(S_COUNT): s = ip_ep.IPFrameSource() p = Signal(bool(0)) source_list.append(s) source_pause_list.append(p) source_logic_list.append( s.create_logic(clk, rst, ip_hdr_ready=s_ip_hdr_ready_list[k], ip_hdr_valid=s_ip_hdr_valid_list[k], eth_dest_mac=s_eth_dest_mac_list[k], eth_src_mac=s_eth_src_mac_list[k], eth_type=s_eth_type_list[k], ip_version=s_ip_version_list[k], ip_ihl=s_ip_ihl_list[k], ip_dscp=s_ip_dscp_list[k], ip_ecn=s_ip_ecn_list[k], ip_length=s_ip_length_list[k], ip_identification=s_ip_identification_list[k], ip_flags=s_ip_flags_list[k], ip_fragment_offset=s_ip_fragment_offset_list[k], ip_ttl=s_ip_ttl_list[k], ip_protocol=s_ip_protocol_list[k], ip_header_checksum=s_ip_header_checksum_list[k], ip_source_ip=s_ip_source_ip_list[k], ip_dest_ip=s_ip_dest_ip_list[k], ip_payload_tdata=s_ip_payload_axis_tdata_list[k], ip_payload_tkeep=s_ip_payload_axis_tkeep_list[k], ip_payload_tvalid=s_ip_payload_axis_tvalid_list[k], ip_payload_tready=s_ip_payload_axis_tready_list[k], ip_payload_tlast=s_ip_payload_axis_tlast_list[k], ip_payload_tuser=s_ip_payload_axis_tuser_list[k], pause=p, name='source_%d' % k)) sink = ip_ep.IPFrameSink() sink_logic = sink.create_logic(clk, rst, ip_hdr_ready=m_ip_hdr_ready, ip_hdr_valid=m_ip_hdr_valid, eth_dest_mac=m_eth_dest_mac, eth_src_mac=m_eth_src_mac, eth_type=m_eth_type, ip_version=m_ip_version, ip_ihl=m_ip_ihl, ip_dscp=m_ip_dscp, ip_ecn=m_ip_ecn, ip_length=m_ip_length, ip_identification=m_ip_identification, ip_flags=m_ip_flags, ip_fragment_offset=m_ip_fragment_offset, ip_ttl=m_ip_ttl, ip_protocol=m_ip_protocol, ip_header_checksum=m_ip_header_checksum, ip_source_ip=m_ip_source_ip, ip_dest_ip=m_ip_dest_ip, ip_payload_tdata=m_ip_payload_axis_tdata, ip_payload_tkeep=m_ip_payload_axis_tkeep, ip_payload_tvalid=m_ip_payload_axis_tvalid, ip_payload_tready=m_ip_payload_axis_tready, ip_payload_tlast=m_ip_payload_axis_tlast, ip_payload_tuser=m_ip_payload_axis_tuser, pause=sink_pause, name='sink') # DUT if os.system(build_cmd): raise Exception("Error running build command") dut = Cosimulation("vvp -m myhdl %s.vvp -lxt2" % testbench, clk=clk, rst=rst, current_test=current_test, s_ip_hdr_valid=s_ip_hdr_valid, s_ip_hdr_ready=s_ip_hdr_ready, s_eth_dest_mac=s_eth_dest_mac, s_eth_src_mac=s_eth_src_mac, s_eth_type=s_eth_type, s_ip_version=s_ip_version, s_ip_ihl=s_ip_ihl, s_ip_dscp=s_ip_dscp, s_ip_ecn=s_ip_ecn, s_ip_length=s_ip_length, s_ip_identification=s_ip_identification, s_ip_flags=s_ip_flags, s_ip_fragment_offset=s_ip_fragment_offset, s_ip_ttl=s_ip_ttl, s_ip_protocol=s_ip_protocol, s_ip_header_checksum=s_ip_header_checksum, s_ip_source_ip=s_ip_source_ip, s_ip_dest_ip=s_ip_dest_ip, s_ip_payload_axis_tdata=s_ip_payload_axis_tdata, s_ip_payload_axis_tkeep=s_ip_payload_axis_tkeep, s_ip_payload_axis_tvalid=s_ip_payload_axis_tvalid, s_ip_payload_axis_tready=s_ip_payload_axis_tready, s_ip_payload_axis_tlast=s_ip_payload_axis_tlast, s_ip_payload_axis_tid=s_ip_payload_axis_tid, s_ip_payload_axis_tdest=s_ip_payload_axis_tdest, s_ip_payload_axis_tuser=s_ip_payload_axis_tuser, m_ip_hdr_valid=m_ip_hdr_valid, m_ip_hdr_ready=m_ip_hdr_ready, m_eth_dest_mac=m_eth_dest_mac, m_eth_src_mac=m_eth_src_mac, m_eth_type=m_eth_type, m_ip_version=m_ip_version, m_ip_ihl=m_ip_ihl, m_ip_dscp=m_ip_dscp, m_ip_ecn=m_ip_ecn, m_ip_length=m_ip_length, m_ip_identification=m_ip_identification, m_ip_flags=m_ip_flags, m_ip_fragment_offset=m_ip_fragment_offset, m_ip_ttl=m_ip_ttl, m_ip_protocol=m_ip_protocol, m_ip_header_checksum=m_ip_header_checksum, m_ip_source_ip=m_ip_source_ip, m_ip_dest_ip=m_ip_dest_ip, m_ip_payload_axis_tdata=m_ip_payload_axis_tdata, m_ip_payload_axis_tkeep=m_ip_payload_axis_tkeep, m_ip_payload_axis_tvalid=m_ip_payload_axis_tvalid, m_ip_payload_axis_tready=m_ip_payload_axis_tready, m_ip_payload_axis_tlast=m_ip_payload_axis_tlast, m_ip_payload_axis_tid=m_ip_payload_axis_tid, m_ip_payload_axis_tdest=m_ip_payload_axis_tdest, m_ip_payload_axis_tuser=m_ip_payload_axis_tuser) @always(delay(4)) def clkgen(): clk.next = not clk @instance 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 = ip_ep.IPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x8000 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80165 test_frame.ip_dest_ip = 0xc0a80164 test_frame.payload = bytearray(range(32)) test_frame.build() source_list[0].send(test_frame) yield sink.wait() 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 = ip_ep.IPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x8000 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80165 test_frame.ip_dest_ip = 0xc0a80164 test_frame.payload = bytearray(range(32)) test_frame.build() source_list[1].send(test_frame) yield sink.wait() 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 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x8000 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_dscp = 0 test_frame1.ip_ecn = 0 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80165 test_frame1.ip_dest_ip = 0xc0a80164 test_frame1.payload = bytearray(range(32)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x8000 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_dscp = 0 test_frame2.ip_ecn = 0 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80165 test_frame2.ip_dest_ip = 0xc0a80164 test_frame2.payload = bytearray(range(32)) test_frame2.build() source_list[0].send(test_frame1) source_list[0].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 4: back-to-back packets, different ports") current_test.next = 4 test_frame1 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A0152535455 test_frame1.eth_type = 0x8000 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_dscp = 0 test_frame1.ip_ecn = 0 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80165 test_frame1.ip_dest_ip = 0xc0a80164 test_frame1.payload = bytearray(range(32)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A0252535455 test_frame2.eth_type = 0x8000 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_dscp = 0 test_frame2.ip_ecn = 0 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80165 test_frame2.ip_dest_ip = 0xc0a80164 test_frame2.payload = bytearray(range(32)) test_frame2.build() source_list[1].send(test_frame1) source_list[2].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: alterate pause source") current_test.next = 5 test_frame1 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A0152535455 test_frame1.eth_type = 0x8000 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_dscp = 0 test_frame1.ip_ecn = 0 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80165 test_frame1.ip_dest_ip = 0xc0a80164 test_frame1.payload = bytearray(range(32)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A0252535455 test_frame2.eth_type = 0x8000 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_dscp = 0 test_frame2.ip_ecn = 0 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80165 test_frame2.ip_dest_ip = 0xc0a80164 test_frame2.payload = bytearray(range(32)) test_frame2.build() source_list[1].send(test_frame1) source_list[2].send(test_frame2) yield clk.posedge yield clk.posedge while s_ip_payload_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 == test_frame1 yield sink.wait() 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 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A0152535455 test_frame1.eth_type = 0x8000 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_dscp = 0 test_frame1.ip_ecn = 0 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80165 test_frame1.ip_dest_ip = 0xc0a80164 test_frame1.payload = bytearray(range(32)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A0252535455 test_frame2.eth_type = 0x8000 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_dscp = 0 test_frame2.ip_ecn = 0 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80165 test_frame2.ip_dest_ip = 0xc0a80164 test_frame2.payload = bytearray(range(32)) test_frame2.build() source_list[1].send(test_frame1) source_list[2].send(test_frame2) yield clk.posedge yield clk.posedge while s_ip_payload_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: back-to-back packets, different ports, arbitration test") current_test.next = 7 test_frame1 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A0152535455 test_frame1.eth_type = 0x8000 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_dscp = 0 test_frame1.ip_ecn = 0 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80165 test_frame1.ip_dest_ip = 0xc0a80164 test_frame1.payload = bytearray(range(32)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A0252535455 test_frame2.eth_type = 0x8000 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_dscp = 0 test_frame2.ip_ecn = 0 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80165 test_frame2.ip_dest_ip = 0xc0a80164 test_frame2.payload = bytearray(range(32)) test_frame2.build() source_list[1].send(test_frame1) source_list[2].send(test_frame2) source_list[2].send(test_frame2) source_list[2].send(test_frame2) source_list[2].send(test_frame2) source_list[2].send(test_frame2) yield clk.posedge yield delay(120) yield clk.posedge source_list[1].send(test_frame1) 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 sink.wait() rx_frame = sink.recv() assert rx_frame == test_frame2 yield sink.wait() rx_frame = sink.recv() assert rx_frame == 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) raise StopSimulation return instances()
def bench(): # Inputs clk = Signal(bool(0)) rst = Signal(bool(0)) current_test = Signal(intbv(0)[8:]) input_eth_hdr_valid = Signal(bool(0)) input_eth_dest_mac = Signal(intbv(0)[48:]) input_eth_src_mac = Signal(intbv(0)[48:]) input_eth_type = Signal(intbv(0)[16:]) input_eth_payload_tdata = Signal(intbv(0)[8:]) input_eth_payload_tvalid = Signal(bool(0)) input_eth_payload_tlast = Signal(bool(0)) input_eth_payload_tuser = Signal(bool(0)) output_ip_hdr_ready = Signal(bool(0)) output_ip_payload_tready = Signal(bool(0)) # Outputs input_eth_hdr_ready = Signal(bool(0)) input_eth_payload_tready = Signal(bool(0)) output_ip_hdr_valid = Signal(bool(0)) output_eth_dest_mac = Signal(intbv(0)[48:]) output_eth_src_mac = Signal(intbv(0)[48:]) output_eth_type = Signal(intbv(0)[16:]) output_ip_version = Signal(intbv(0)[4:]) output_ip_ihl = Signal(intbv(0)[4:]) output_ip_dscp = Signal(intbv(0)[6:]) output_ip_ecn = Signal(intbv(0)[2:]) output_ip_length = Signal(intbv(0)[16:]) output_ip_identification = Signal(intbv(0)[16:]) output_ip_flags = Signal(intbv(0)[3:]) output_ip_fragment_offset = Signal(intbv(0)[13:]) output_ip_ttl = Signal(intbv(0)[8:]) output_ip_protocol = Signal(intbv(0)[8:]) output_ip_header_checksum = Signal(intbv(0)[16:]) output_ip_source_ip = Signal(intbv(0)[32:]) output_ip_dest_ip = Signal(intbv(0)[32:]) output_ip_payload_tdata = Signal(intbv(0)[8:]) output_ip_payload_tvalid = Signal(bool(0)) output_ip_payload_tlast = Signal(bool(0)) output_ip_payload_tuser = Signal(bool(0)) busy = Signal(bool(0)) error_header_early_termination = Signal(bool(0)) error_payload_early_termination = Signal(bool(0)) error_invalid_header = Signal(bool(0)) error_invalid_checksum = Signal(bool(0)) # sources and sinks source_pause = Signal(bool(0)) sink_pause = Signal(bool(0)) source = eth_ep.EthFrameSource() source_logic = source.create_logic( clk, rst, eth_hdr_ready=input_eth_hdr_ready, eth_hdr_valid=input_eth_hdr_valid, eth_dest_mac=input_eth_dest_mac, eth_src_mac=input_eth_src_mac, eth_type=input_eth_type, eth_payload_tdata=input_eth_payload_tdata, eth_payload_tvalid=input_eth_payload_tvalid, eth_payload_tready=input_eth_payload_tready, eth_payload_tlast=input_eth_payload_tlast, eth_payload_tuser=input_eth_payload_tuser, pause=source_pause, name='source') sink = ip_ep.IPFrameSink() sink_logic = sink.create_logic( clk, rst, ip_hdr_ready=output_ip_hdr_ready, ip_hdr_valid=output_ip_hdr_valid, eth_dest_mac=output_eth_dest_mac, eth_src_mac=output_eth_src_mac, eth_type=output_eth_type, ip_version=output_ip_version, ip_ihl=output_ip_ihl, ip_dscp=output_ip_dscp, ip_ecn=output_ip_ecn, ip_length=output_ip_length, ip_identification=output_ip_identification, ip_flags=output_ip_flags, ip_fragment_offset=output_ip_fragment_offset, ip_ttl=output_ip_ttl, ip_protocol=output_ip_protocol, ip_header_checksum=output_ip_header_checksum, ip_source_ip=output_ip_source_ip, ip_dest_ip=output_ip_dest_ip, ip_payload_tdata=output_ip_payload_tdata, ip_payload_tvalid=output_ip_payload_tvalid, ip_payload_tready=output_ip_payload_tready, ip_payload_tlast=output_ip_payload_tlast, ip_payload_tuser=output_ip_payload_tuser, pause=sink_pause, name='sink') # DUT if os.system(build_cmd): raise Exception("Error running build command") dut = Cosimulation( "vvp -m myhdl %s.vvp -lxt2" % testbench, clk=clk, rst=rst, current_test=current_test, input_eth_hdr_valid=input_eth_hdr_valid, input_eth_hdr_ready=input_eth_hdr_ready, input_eth_dest_mac=input_eth_dest_mac, input_eth_src_mac=input_eth_src_mac, input_eth_type=input_eth_type, input_eth_payload_tdata=input_eth_payload_tdata, input_eth_payload_tvalid=input_eth_payload_tvalid, input_eth_payload_tready=input_eth_payload_tready, input_eth_payload_tlast=input_eth_payload_tlast, input_eth_payload_tuser=input_eth_payload_tuser, output_ip_hdr_valid=output_ip_hdr_valid, output_ip_hdr_ready=output_ip_hdr_ready, output_eth_dest_mac=output_eth_dest_mac, output_eth_src_mac=output_eth_src_mac, output_eth_type=output_eth_type, output_ip_version=output_ip_version, output_ip_ihl=output_ip_ihl, output_ip_dscp=output_ip_dscp, output_ip_ecn=output_ip_ecn, output_ip_length=output_ip_length, output_ip_identification=output_ip_identification, output_ip_flags=output_ip_flags, output_ip_fragment_offset=output_ip_fragment_offset, output_ip_ttl=output_ip_ttl, output_ip_protocol=output_ip_protocol, output_ip_header_checksum=output_ip_header_checksum, output_ip_source_ip=output_ip_source_ip, output_ip_dest_ip=output_ip_dest_ip, output_ip_payload_tdata=output_ip_payload_tdata, output_ip_payload_tvalid=output_ip_payload_tvalid, output_ip_payload_tready=output_ip_payload_tready, output_ip_payload_tlast=output_ip_payload_tlast, output_ip_payload_tuser=output_ip_payload_tuser, busy=busy, error_header_early_termination=error_header_early_termination, error_payload_early_termination=error_payload_early_termination, error_invalid_header=error_invalid_header, error_invalid_checksum=error_invalid_checksum) @always(delay(4)) def clkgen(): clk.next = not clk error_header_early_termination_asserted = Signal(bool(0)) error_payload_early_termination_asserted = Signal(bool(0)) error_invalid_header_asserted = Signal(bool(0)) error_invalid_checksum_asserted = Signal(bool(0)) @always(clk.posedge) def monitor(): if (error_header_early_termination): error_header_early_termination_asserted.next = 1 if (error_payload_early_termination): error_payload_early_termination_asserted.next = 1 if (error_invalid_header): error_invalid_header_asserted.next = 1 if (error_invalid_checksum): error_invalid_checksum_asserted.next = 1 def wait_normal(): while input_eth_payload_tvalid or output_ip_payload_tvalid or input_eth_hdr_valid: yield clk.posedge def wait_pause_source(): while input_eth_payload_tvalid or output_ip_payload_tvalid or input_eth_hdr_valid: source_pause.next = True yield clk.posedge yield clk.posedge yield clk.posedge source_pause.next = False yield clk.posedge def wait_pause_sink(): while input_eth_payload_tvalid or output_ip_payload_tvalid or input_eth_hdr_valid: sink_pause.next = True yield clk.posedge yield clk.posedge yield clk.posedge sink_pause.next = False yield clk.posedge @instance 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 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 = ip_ep.IPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80164 test_frame.ip_dest_ip = 0xc0a80165 test_frame.payload = bytearray(range(payload_len)) test_frame.build() eth_frame = test_frame.build_eth() for wait in wait_normal, wait_pause_source, wait_pause_sink: source.send(eth_frame) yield clk.posedge yield clk.posedge yield wait() yield clk.posedge yield clk.posedge yield clk.posedge rx_frame = sink.recv() assert rx_frame == test_frame 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 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.payload = bytearray(range(payload_len)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() eth_frame1 = test_frame1.build_eth() eth_frame2 = test_frame2.build_eth() for wait in wait_normal, wait_pause_source, wait_pause_sink: source.send(eth_frame1) source.send(eth_frame2) yield clk.posedge yield clk.posedge yield wait() 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 assert sink.empty() yield delay(100) yield clk.posedge print("test 3: tuser assert, length %d" % payload_len) current_test.next = 3 test_frame1 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.payload = bytearray(range(payload_len)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() eth_frame1 = test_frame1.build_eth() eth_frame2 = test_frame2.build_eth() eth_frame1.payload.user = 1 for wait in wait_normal, wait_pause_source, wait_pause_sink: source.send(eth_frame1) source.send(eth_frame2) yield clk.posedge yield clk.posedge yield wait() yield clk.posedge yield clk.posedge yield clk.posedge rx_frame = sink.recv() assert rx_frame == test_frame1 assert rx_frame.payload.user[-1] rx_frame = sink.recv() assert rx_frame == test_frame2 assert sink.empty() yield delay(100) yield clk.posedge print("test 4: trailing bytes (1), length %d" % payload_len) current_test.next = 4 test_frame1 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.payload = bytearray(range(payload_len)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() eth_frame1 = test_frame1.build_eth() eth_frame2 = test_frame2.build_eth() eth_frame1.payload.data += bytearray(b'\x00') for wait in wait_normal, wait_pause_source, wait_pause_sink: source.send(eth_frame1) source.send(eth_frame2) yield clk.posedge yield clk.posedge yield wait() 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 assert sink.empty() yield delay(100) yield clk.posedge print("test 5: trailing bytes (10), length %d" % payload_len) current_test.next = 5 test_frame1 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.payload = bytearray(range(payload_len)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() eth_frame1 = test_frame1.build_eth() eth_frame2 = test_frame2.build_eth() eth_frame1.payload.data += bytearray(b'\x00' * 10) for wait in wait_normal, wait_pause_source, wait_pause_sink: source.send(eth_frame1) source.send(eth_frame2) yield clk.posedge yield clk.posedge yield wait() 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 assert sink.empty() yield delay(100) yield clk.posedge print("test 6: trailing bytes with tuser assert (1), length %d" % payload_len) current_test.next = 6 test_frame1 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.payload = bytearray(range(payload_len)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() eth_frame1 = test_frame1.build_eth() eth_frame2 = test_frame2.build_eth() eth_frame1.payload.data += bytearray(b'\x00') eth_frame1.payload.user = 1 for wait in wait_normal, wait_pause_source, wait_pause_sink: source.send(eth_frame1) source.send(eth_frame2) yield clk.posedge yield clk.posedge yield wait() yield clk.posedge yield clk.posedge yield clk.posedge rx_frame = sink.recv() assert rx_frame == test_frame1 assert rx_frame.payload.user[-1] rx_frame = sink.recv() assert rx_frame == test_frame2 assert sink.empty() yield delay(100) yield clk.posedge print("test 7: trailing bytes with tuser assert (10), length %d" % payload_len) current_test.next = 7 test_frame1 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.payload = bytearray(range(payload_len)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() eth_frame1 = test_frame1.build_eth() eth_frame2 = test_frame2.build_eth() eth_frame1.payload.data += bytearray(b'\x00' * 10) eth_frame1.payload.user = 1 for wait in wait_normal, wait_pause_source, wait_pause_sink: source.send(eth_frame1) source.send(eth_frame2) yield clk.posedge yield clk.posedge yield wait() yield clk.posedge yield clk.posedge yield clk.posedge rx_frame = sink.recv() assert rx_frame == test_frame1 assert rx_frame.payload.user[-1] rx_frame = sink.recv() assert rx_frame == test_frame2 assert sink.empty() yield delay(100) yield clk.posedge print("test 8: truncated payload (1), length %d" % payload_len) current_test.next = 8 test_frame1 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.payload = bytearray(range(payload_len + 1)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() eth_frame1 = test_frame1.build_eth() eth_frame2 = test_frame2.build_eth() eth_frame1.payload.data = eth_frame1.payload.data[:-1] for wait in wait_normal, wait_pause_source, wait_pause_sink: error_payload_early_termination_asserted.next = 0 source.send(eth_frame1) source.send(eth_frame2) yield clk.posedge yield clk.posedge yield wait() yield clk.posedge yield clk.posedge yield clk.posedge rx_frame = sink.recv() assert rx_frame.payload.user[-1] assert error_payload_early_termination_asserted rx_frame = sink.recv() assert rx_frame == test_frame2 assert sink.empty() yield delay(100) yield clk.posedge print("test 9: truncated payload (10), length %d" % payload_len) current_test.next = 9 test_frame1 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.payload = bytearray(range(payload_len + 10)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() eth_frame1 = test_frame1.build_eth() eth_frame2 = test_frame2.build_eth() eth_frame1.payload.data = eth_frame1.payload.data[:-10] for wait in wait_normal, wait_pause_source, wait_pause_sink: error_payload_early_termination_asserted.next = 0 source.send(eth_frame1) source.send(eth_frame2) yield clk.posedge yield clk.posedge yield wait() yield clk.posedge yield clk.posedge yield clk.posedge rx_frame = sink.recv() assert rx_frame.payload.user[-1] assert error_payload_early_termination_asserted rx_frame = sink.recv() assert rx_frame == test_frame2 assert sink.empty() yield delay(100) yield clk.posedge print("test 10: bad IHL, length %d" % payload_len) current_test.next = 10 test_frame1 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 6 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.payload = bytearray(range(payload_len)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() eth_frame1 = test_frame1.build_eth() eth_frame2 = test_frame2.build_eth() for wait in wait_normal, wait_pause_source, wait_pause_sink: error_invalid_header_asserted.next = 0 source.send(eth_frame1) source.send(eth_frame2) yield clk.posedge yield clk.posedge yield wait() yield clk.posedge yield clk.posedge yield clk.posedge assert error_invalid_header_asserted rx_frame = sink.recv() assert rx_frame == test_frame2 assert sink.empty() yield delay(100) yield clk.posedge print("test 11: bad checksum, length %d" % payload_len) current_test.next = 11 test_frame1 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = 0x1234 test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.payload = bytearray(range(payload_len)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() eth_frame1 = test_frame1.build_eth() eth_frame2 = test_frame2.build_eth() for wait in wait_normal, wait_pause_source, wait_pause_sink: error_invalid_checksum_asserted.next = 0 source.send(eth_frame1) source.send(eth_frame2) yield clk.posedge yield clk.posedge yield wait() yield clk.posedge yield clk.posedge yield clk.posedge assert error_invalid_checksum_asserted rx_frame = sink.recv() assert rx_frame == test_frame2 assert sink.empty() yield delay(100) for length in range(1, 21): yield clk.posedge print("test 12: truncated header, length %d" % length) current_test.next = 12 test_frame1 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.payload = bytearray(range(16)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.payload = bytearray(range(16)) test_frame2.build() eth_frame1 = test_frame1.build_eth() eth_frame2 = test_frame2.build_eth() eth_frame1.payload.data = eth_frame1.payload.data[:length] for wait in wait_normal, wait_pause_source, wait_pause_sink: error_header_early_termination_asserted.next = 0 source.send(eth_frame1) source.send(eth_frame2) yield clk.posedge yield clk.posedge yield wait() yield clk.posedge yield clk.posedge yield clk.posedge assert error_header_early_termination_asserted rx_frame = sink.recv() assert rx_frame == test_frame2 assert sink.empty() yield delay(100) raise StopSimulation return dut, source_logic, sink_logic, clkgen, monitor, check
def bench(): # Inputs clk = Signal(bool(0)) rst = Signal(bool(0)) current_test = Signal(intbv(0)[8:]) input_eth_hdr_valid = Signal(bool(0)) input_eth_dest_mac = Signal(intbv(0)[48:]) input_eth_src_mac = Signal(intbv(0)[48:]) input_eth_type = Signal(intbv(0)[16:]) input_eth_payload_tdata = Signal(intbv(0)[64:]) input_eth_payload_tkeep = Signal(intbv(0)[8:]) input_eth_payload_tvalid = Signal(bool(0)) input_eth_payload_tlast = Signal(bool(0)) input_eth_payload_tuser = Signal(bool(0)) input_ip_hdr_valid = Signal(bool(0)) input_ip_dscp = Signal(intbv(0)[6:]) input_ip_ecn = Signal(intbv(0)[2:]) input_ip_length = Signal(intbv(0)[16:]) input_ip_ttl = Signal(intbv(0)[8:]) input_ip_protocol = Signal(intbv(0)[8:]) input_ip_source_ip = Signal(intbv(0)[32:]) input_ip_dest_ip = Signal(intbv(0)[32:]) input_ip_payload_tdata = Signal(intbv(0)[64:]) input_ip_payload_tkeep = Signal(intbv(0)[8:]) input_ip_payload_tvalid = Signal(bool(0)) input_ip_payload_tlast = Signal(bool(0)) input_ip_payload_tuser = Signal(bool(0)) output_eth_payload_tready = Signal(bool(0)) output_eth_hdr_ready = Signal(bool(0)) output_ip_hdr_ready = Signal(bool(0)) output_ip_payload_tready = Signal(bool(0)) # Outputs input_eth_hdr_ready = Signal(bool(0)) input_eth_payload_tready = Signal(bool(0)) input_ip_hdr_ready = Signal(bool(0)) input_ip_payload_tready = Signal(bool(0)) output_eth_hdr_valid = Signal(bool(0)) output_eth_dest_mac = Signal(intbv(0)[48:]) output_eth_src_mac = Signal(intbv(0)[48:]) output_eth_type = Signal(intbv(0)[16:]) output_eth_payload_tdata = Signal(intbv(0)[64:]) output_eth_payload_tkeep = Signal(intbv(0)[8:]) output_eth_payload_tvalid = Signal(bool(0)) output_eth_payload_tlast = Signal(bool(0)) output_eth_payload_tuser = Signal(bool(0)) output_ip_hdr_valid = Signal(bool(0)) output_ip_eth_dest_mac = Signal(intbv(0)[48:]) output_ip_eth_src_mac = Signal(intbv(0)[48:]) output_ip_eth_type = Signal(intbv(0)[16:]) output_ip_version = Signal(intbv(0)[4:]) output_ip_ihl = Signal(intbv(0)[4:]) output_ip_dscp = Signal(intbv(0)[6:]) output_ip_ecn = Signal(intbv(0)[2:]) output_ip_length = Signal(intbv(0)[16:]) output_ip_identification = Signal(intbv(0)[16:]) output_ip_flags = Signal(intbv(0)[3:]) output_ip_fragment_offset = Signal(intbv(0)[13:]) output_ip_ttl = Signal(intbv(0)[8:]) output_ip_protocol = Signal(intbv(0)[8:]) output_ip_header_checksum = Signal(intbv(0)[16:]) output_ip_source_ip = Signal(intbv(0)[32:]) output_ip_dest_ip = Signal(intbv(0)[32:]) output_ip_payload_tdata = Signal(intbv(0)[64:]) output_ip_payload_tkeep = Signal(intbv(0)[8:]) output_ip_payload_tvalid = Signal(bool(0)) output_ip_payload_tlast = Signal(bool(0)) output_ip_payload_tuser = Signal(bool(0)) rx_busy = Signal(bool(0)) tx_busy = Signal(bool(0)) rx_error_header_early_termination = Signal(bool(0)) rx_error_payload_early_termination = Signal(bool(0)) rx_error_invalid_header = Signal(bool(0)) rx_error_invalid_checksum = Signal(bool(0)) tx_error_payload_early_termination = Signal(bool(0)) tx_error_arp_failed = Signal(bool(0)) local_mac = Signal(intbv(0)[48:]) local_ip = Signal(intbv(0)[32:]) gateway_ip = Signal(intbv(0)[32:]) subnet_mask = Signal(intbv(0)[32:]) clear_arp_cache = Signal(bool(0)) # sources and sinks eth_source_pause = Signal(bool(0)) eth_sink_pause = Signal(bool(0)) ip_source_pause = Signal(bool(0)) ip_sink_pause = Signal(bool(0)) eth_source = eth_ep.EthFrameSource() eth_source_logic = eth_source.create_logic( clk, rst, eth_hdr_ready=input_eth_hdr_ready, eth_hdr_valid=input_eth_hdr_valid, eth_dest_mac=input_eth_dest_mac, eth_src_mac=input_eth_src_mac, eth_type=input_eth_type, eth_payload_tdata=input_eth_payload_tdata, eth_payload_tkeep=input_eth_payload_tkeep, eth_payload_tvalid=input_eth_payload_tvalid, eth_payload_tready=input_eth_payload_tready, eth_payload_tlast=input_eth_payload_tlast, eth_payload_tuser=input_eth_payload_tuser, pause=eth_source_pause, name='eth_source' ) eth_sink = eth_ep.EthFrameSink() eth_sink_logic = eth_sink.create_logic( clk, rst, eth_hdr_ready=output_eth_hdr_ready, eth_hdr_valid=output_eth_hdr_valid, eth_dest_mac=output_eth_dest_mac, eth_src_mac=output_eth_src_mac, eth_type=output_eth_type, eth_payload_tdata=output_eth_payload_tdata, eth_payload_tkeep=output_eth_payload_tkeep, eth_payload_tvalid=output_eth_payload_tvalid, eth_payload_tready=output_eth_payload_tready, eth_payload_tlast=output_eth_payload_tlast, eth_payload_tuser=output_eth_payload_tuser, pause=eth_sink_pause, name='eth_sink' ) ip_source = ip_ep.IPFrameSource() ip_source_logic = ip_source.create_logic( clk, rst, ip_hdr_valid=input_ip_hdr_valid, ip_hdr_ready=input_ip_hdr_ready, ip_dscp=input_ip_dscp, ip_ecn=input_ip_ecn, ip_length=input_ip_length, ip_ttl=input_ip_ttl, ip_protocol=input_ip_protocol, ip_source_ip=input_ip_source_ip, ip_dest_ip=input_ip_dest_ip, ip_payload_tdata=input_ip_payload_tdata, ip_payload_tkeep=input_ip_payload_tkeep, ip_payload_tvalid=input_ip_payload_tvalid, ip_payload_tready=input_ip_payload_tready, ip_payload_tlast=input_ip_payload_tlast, ip_payload_tuser=input_ip_payload_tuser, pause=ip_source_pause, name='ip_source' ) ip_sink = ip_ep.IPFrameSink() ip_sink_logic = ip_sink.create_logic( clk, rst, ip_hdr_ready=output_ip_hdr_ready, ip_hdr_valid=output_ip_hdr_valid, eth_dest_mac=output_ip_eth_dest_mac, eth_src_mac=output_ip_eth_src_mac, eth_type=output_ip_eth_type, ip_version=output_ip_version, ip_ihl=output_ip_ihl, ip_dscp=output_ip_dscp, ip_ecn=output_ip_ecn, ip_length=output_ip_length, ip_identification=output_ip_identification, ip_flags=output_ip_flags, ip_fragment_offset=output_ip_fragment_offset, ip_ttl=output_ip_ttl, ip_protocol=output_ip_protocol, ip_header_checksum=output_ip_header_checksum, ip_source_ip=output_ip_source_ip, ip_dest_ip=output_ip_dest_ip, ip_payload_tdata=output_ip_payload_tdata, ip_payload_tkeep=output_ip_payload_tkeep, ip_payload_tvalid=output_ip_payload_tvalid, ip_payload_tready=output_ip_payload_tready, ip_payload_tlast=output_ip_payload_tlast, ip_payload_tuser=output_ip_payload_tuser, pause=ip_sink_pause, name='ip_sink' ) # DUT if os.system(build_cmd): raise Exception("Error running build command") dut = Cosimulation( "vvp -m myhdl %s.vvp -lxt2" % testbench, clk=clk, rst=rst, current_test=current_test, input_eth_hdr_valid=input_eth_hdr_valid, input_eth_hdr_ready=input_eth_hdr_ready, input_eth_dest_mac=input_eth_dest_mac, input_eth_src_mac=input_eth_src_mac, input_eth_type=input_eth_type, input_eth_payload_tdata=input_eth_payload_tdata, input_eth_payload_tkeep=input_eth_payload_tkeep, input_eth_payload_tvalid=input_eth_payload_tvalid, input_eth_payload_tready=input_eth_payload_tready, input_eth_payload_tlast=input_eth_payload_tlast, input_eth_payload_tuser=input_eth_payload_tuser, output_eth_hdr_valid=output_eth_hdr_valid, output_eth_hdr_ready=output_eth_hdr_ready, output_eth_dest_mac=output_eth_dest_mac, output_eth_src_mac=output_eth_src_mac, output_eth_type=output_eth_type, output_eth_payload_tdata=output_eth_payload_tdata, output_eth_payload_tkeep=output_eth_payload_tkeep, output_eth_payload_tvalid=output_eth_payload_tvalid, output_eth_payload_tready=output_eth_payload_tready, output_eth_payload_tlast=output_eth_payload_tlast, output_eth_payload_tuser=output_eth_payload_tuser, input_ip_hdr_valid=input_ip_hdr_valid, input_ip_hdr_ready=input_ip_hdr_ready, input_ip_dscp=input_ip_dscp, input_ip_ecn=input_ip_ecn, input_ip_length=input_ip_length, input_ip_ttl=input_ip_ttl, input_ip_protocol=input_ip_protocol, input_ip_source_ip=input_ip_source_ip, input_ip_dest_ip=input_ip_dest_ip, input_ip_payload_tdata=input_ip_payload_tdata, input_ip_payload_tkeep=input_ip_payload_tkeep, input_ip_payload_tvalid=input_ip_payload_tvalid, input_ip_payload_tready=input_ip_payload_tready, input_ip_payload_tlast=input_ip_payload_tlast, input_ip_payload_tuser=input_ip_payload_tuser, output_ip_hdr_valid=output_ip_hdr_valid, output_ip_hdr_ready=output_ip_hdr_ready, output_ip_eth_dest_mac=output_ip_eth_dest_mac, output_ip_eth_src_mac=output_ip_eth_src_mac, output_ip_eth_type=output_ip_eth_type, output_ip_version=output_ip_version, output_ip_ihl=output_ip_ihl, output_ip_dscp=output_ip_dscp, output_ip_ecn=output_ip_ecn, output_ip_length=output_ip_length, output_ip_identification=output_ip_identification, output_ip_flags=output_ip_flags, output_ip_fragment_offset=output_ip_fragment_offset, output_ip_ttl=output_ip_ttl, output_ip_protocol=output_ip_protocol, output_ip_header_checksum=output_ip_header_checksum, output_ip_source_ip=output_ip_source_ip, output_ip_dest_ip=output_ip_dest_ip, output_ip_payload_tdata=output_ip_payload_tdata, output_ip_payload_tkeep=output_ip_payload_tkeep, output_ip_payload_tvalid=output_ip_payload_tvalid, output_ip_payload_tready=output_ip_payload_tready, output_ip_payload_tlast=output_ip_payload_tlast, output_ip_payload_tuser=output_ip_payload_tuser, rx_busy=rx_busy, tx_busy=tx_busy, rx_error_header_early_termination=rx_error_header_early_termination, rx_error_payload_early_termination=rx_error_payload_early_termination, rx_error_invalid_header=rx_error_invalid_header, rx_error_invalid_checksum=rx_error_invalid_checksum, tx_error_payload_early_termination=tx_error_payload_early_termination, tx_error_arp_failed=tx_error_arp_failed, local_mac=local_mac, local_ip=local_ip, gateway_ip=gateway_ip, subnet_mask=subnet_mask, clear_arp_cache=clear_arp_cache ) @always(delay(4)) def clkgen(): clk.next = not clk rx_error_header_early_termination_asserted = Signal(bool(0)) rx_error_payload_early_termination_asserted = Signal(bool(0)) rx_error_invalid_header_asserted = Signal(bool(0)) rx_error_invalid_checksum_asserted = Signal(bool(0)) tx_error_payload_early_termination_asserted = Signal(bool(0)) tx_error_arp_failed_asserted = Signal(bool(0)) @always(clk.posedge) def monitor(): if (rx_error_header_early_termination): rx_error_header_early_termination_asserted.next = 1 if (rx_error_payload_early_termination): rx_error_payload_early_termination_asserted.next = 1 if (rx_error_invalid_header): rx_error_invalid_header_asserted.next = 1 if (rx_error_invalid_checksum): rx_error_invalid_checksum_asserted.next = 1 if (tx_error_payload_early_termination): tx_error_payload_early_termination_asserted.next = 1 if (tx_error_arp_failed): tx_error_arp_failed_asserted.next = 1 def wait_normal(): while (input_eth_payload_tvalid or input_ip_payload_tvalid or output_eth_payload_tvalid or output_ip_payload_tvalid or input_eth_hdr_valid or input_ip_hdr_valid): yield clk.posedge @instance 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 # set MAC and IP address local_mac.next = 0x5A5152535455 local_ip.next = 0xc0a80164 gateway_ip.next = 0xc0a80101 subnet_mask.next = 0xffffff00 yield clk.posedge print("test 1: test IP RX packet") current_test.next = 1 test_frame = ip_ep.IPFrame() test_frame.eth_dest_mac = 0x5A5152535455 test_frame.eth_src_mac = 0xDAD1D2D3D4D5 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80165 test_frame.ip_dest_ip = 0xc0a80164 test_frame.payload = bytearray(range(32)) test_frame.build() eth_frame = test_frame.build_eth() eth_source.send(eth_frame) yield clk.posedge yield clk.posedge yield wait_normal() yield clk.posedge yield clk.posedge rx_frame = ip_sink.recv() assert rx_frame == test_frame assert eth_source.empty() assert eth_sink.empty() assert ip_source.empty() assert ip_sink.empty() yield delay(100) yield clk.posedge print("test 2: test IP TX packet") current_test.next = 2 # send IP packet test_frame = ip_ep.IPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80164 test_frame.ip_dest_ip = 0xc0a80166 test_frame.payload = bytearray(range(32)) test_frame.build() ip_source.send(test_frame) # wait for ARP request packet while eth_sink.empty(): yield clk.posedge rx_frame = eth_sink.recv() check_frame = arp_ep.ARPFrame() check_frame.parse_eth(rx_frame) assert check_frame.eth_dest_mac == 0xFFFFFFFFFFFF assert check_frame.eth_src_mac == 0x5A5152535455 assert check_frame.eth_type == 0x0806 assert check_frame.arp_htype == 0x0001 assert check_frame.arp_ptype == 0x0800 assert check_frame.arp_hlen == 6 assert check_frame.arp_plen == 4 assert check_frame.arp_oper == 1 assert check_frame.arp_sha == 0x5A5152535455 assert check_frame.arp_spa == 0xc0a80164 assert check_frame.arp_tha == 0x000000000000 assert check_frame.arp_tpa == 0xc0a80166 # generate response arp_frame = arp_ep.ARPFrame() arp_frame.eth_dest_mac = 0x5A5152535455 arp_frame.eth_src_mac = 0xDAD1D2D3D4D5 arp_frame.eth_type = 0x0806 arp_frame.arp_htype = 0x0001 arp_frame.arp_ptype = 0x0800 arp_frame.arp_hlen = 6 arp_frame.arp_plen = 4 arp_frame.arp_oper = 2 arp_frame.arp_sha = 0xDAD1D2D3D4D5 arp_frame.arp_spa = 0xc0a80166 arp_frame.arp_tha = 0x5A5152535455 arp_frame.arp_tpa = 0xc0a80164 eth_source.send(arp_frame.build_eth()) yield clk.posedge yield clk.posedge yield wait_normal() yield clk.posedge yield clk.posedge rx_frame = eth_sink.recv() check_frame = ip_ep.IPFrame() check_frame.parse_eth(rx_frame) print(test_frame) print(check_frame) assert check_frame == test_frame assert eth_source.empty() assert eth_sink.empty() assert ip_source.empty() assert ip_sink.empty() yield delay(100) yield clk.posedge print("test 3: test IP TX arp fail packet") current_test.next = 2 tx_error_arp_failed_asserted.next = 0 test_frame = ip_ep.IPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80164 test_frame.ip_dest_ip = 0xc0a80167 test_frame.payload = bytearray(range(32)) test_frame.build() ip_source.send(test_frame) yield clk.posedge yield clk.posedge yield wait_normal() yield clk.posedge yield clk.posedge assert tx_error_arp_failed_asserted # check for 4 ARP requests assert eth_sink.count() == 4 while not eth_sink.empty(): rx_frame = eth_sink.recv() check_frame = arp_ep.ARPFrame() check_frame.parse_eth(rx_frame) assert check_frame.eth_dest_mac == 0xFFFFFFFFFFFF assert check_frame.eth_src_mac == 0x5A5152535455 assert check_frame.eth_type == 0x0806 assert check_frame.arp_htype == 0x0001 assert check_frame.arp_ptype == 0x0800 assert check_frame.arp_hlen == 6 assert check_frame.arp_plen == 4 assert check_frame.arp_oper == 1 assert check_frame.arp_sha == 0x5A5152535455 assert check_frame.arp_spa == 0xc0a80164 assert check_frame.arp_tha == 0x000000000000 assert check_frame.arp_tpa == 0xc0a80167 assert eth_source.empty() assert eth_sink.empty() assert ip_source.empty() assert ip_sink.empty() yield delay(100) raise StopSimulation return dut, eth_source_logic, eth_sink_logic, ip_source_logic, ip_sink_logic, clkgen, monitor, check
def bench(): # Inputs clk = Signal(bool(0)) rst = Signal(bool(0)) current_test = Signal(intbv(0)[8:]) s_udp_hdr_valid = Signal(bool(0)) s_eth_dest_mac = Signal(intbv(0)[48:]) s_eth_src_mac = Signal(intbv(0)[48:]) s_eth_type = Signal(intbv(0)[16:]) s_ip_version = Signal(intbv(0)[4:]) s_ip_ihl = Signal(intbv(0)[4:]) s_ip_dscp = Signal(intbv(0)[6:]) s_ip_ecn = Signal(intbv(0)[2:]) s_ip_identification = Signal(intbv(0)[16:]) s_ip_flags = Signal(intbv(0)[3:]) s_ip_fragment_offset = Signal(intbv(0)[13:]) s_ip_ttl = Signal(intbv(0)[8:]) s_ip_protocol = Signal(intbv(0)[8:]) s_ip_header_checksum = Signal(intbv(0)[16:]) s_ip_source_ip = Signal(intbv(0)[32:]) s_ip_dest_ip = Signal(intbv(0)[32:]) s_udp_source_port = Signal(intbv(0)[16:]) s_udp_dest_port = Signal(intbv(0)[16:]) s_udp_length = Signal(intbv(0)[16:]) s_udp_checksum = Signal(intbv(0)[16:]) s_udp_payload_axis_tdata = Signal(intbv(0)[64:]) s_udp_payload_axis_tkeep = Signal(intbv(0)[8:]) s_udp_payload_axis_tvalid = Signal(bool(0)) s_udp_payload_axis_tlast = Signal(bool(0)) s_udp_payload_axis_tuser = Signal(bool(0)) m_ip_payload_axis_tready = Signal(bool(0)) m_ip_hdr_ready = Signal(bool(0)) # Outputs s_udp_hdr_ready = Signal(bool(0)) s_udp_payload_axis_tready = Signal(bool(0)) m_ip_hdr_valid = Signal(bool(0)) m_eth_dest_mac = Signal(intbv(0)[48:]) m_eth_src_mac = Signal(intbv(0)[48:]) m_eth_type = Signal(intbv(0)[16:]) m_ip_version = Signal(intbv(0)[4:]) m_ip_ihl = Signal(intbv(0)[4:]) m_ip_dscp = Signal(intbv(0)[6:]) m_ip_ecn = Signal(intbv(0)[2:]) m_ip_length = Signal(intbv(0)[16:]) m_ip_identification = Signal(intbv(0)[16:]) m_ip_flags = Signal(intbv(0)[3:]) m_ip_fragment_offset = Signal(intbv(0)[13:]) m_ip_ttl = Signal(intbv(0)[8:]) m_ip_protocol = Signal(intbv(0)[8:]) m_ip_header_checksum = Signal(intbv(0)[16:]) m_ip_source_ip = Signal(intbv(0)[32:]) m_ip_dest_ip = Signal(intbv(0)[32:]) m_ip_payload_axis_tdata = Signal(intbv(0)[64:]) m_ip_payload_axis_tkeep = Signal(intbv(0)[8:]) m_ip_payload_axis_tvalid = Signal(bool(0)) m_ip_payload_axis_tlast = Signal(bool(0)) m_ip_payload_axis_tuser = Signal(bool(0)) busy = Signal(bool(0)) error_payload_early_termination = Signal(bool(0)) # sources and sinks source_pause = Signal(bool(0)) sink_pause = Signal(bool(0)) source = udp_ep.UDPFrameSource() source_logic = source.create_logic( clk, rst, udp_hdr_ready=s_udp_hdr_ready, udp_hdr_valid=s_udp_hdr_valid, eth_dest_mac=s_eth_dest_mac, eth_src_mac=s_eth_src_mac, eth_type=s_eth_type, ip_version=s_ip_version, ip_ihl=s_ip_ihl, ip_dscp=s_ip_dscp, ip_ecn=s_ip_ecn, ip_identification=s_ip_identification, ip_flags=s_ip_flags, ip_fragment_offset=s_ip_fragment_offset, ip_ttl=s_ip_ttl, ip_protocol=s_ip_protocol, ip_header_checksum=s_ip_header_checksum, ip_source_ip=s_ip_source_ip, ip_dest_ip=s_ip_dest_ip, udp_source_port=s_udp_source_port, udp_dest_port=s_udp_dest_port, udp_length=s_udp_length, udp_checksum=s_udp_checksum, udp_payload_tdata=s_udp_payload_axis_tdata, udp_payload_tkeep=s_udp_payload_axis_tkeep, udp_payload_tvalid=s_udp_payload_axis_tvalid, udp_payload_tready=s_udp_payload_axis_tready, udp_payload_tlast=s_udp_payload_axis_tlast, udp_payload_tuser=s_udp_payload_axis_tuser, pause=source_pause, name='source') sink = ip_ep.IPFrameSink() sink_logic = sink.create_logic(clk, rst, ip_hdr_ready=m_ip_hdr_ready, ip_hdr_valid=m_ip_hdr_valid, eth_dest_mac=m_eth_dest_mac, eth_src_mac=m_eth_src_mac, eth_type=m_eth_type, ip_version=m_ip_version, ip_ihl=m_ip_ihl, ip_dscp=m_ip_dscp, ip_ecn=m_ip_ecn, ip_length=m_ip_length, ip_identification=m_ip_identification, ip_flags=m_ip_flags, ip_fragment_offset=m_ip_fragment_offset, ip_ttl=m_ip_ttl, ip_protocol=m_ip_protocol, ip_header_checksum=m_ip_header_checksum, ip_source_ip=m_ip_source_ip, ip_dest_ip=m_ip_dest_ip, ip_payload_tdata=m_ip_payload_axis_tdata, ip_payload_tkeep=m_ip_payload_axis_tkeep, ip_payload_tvalid=m_ip_payload_axis_tvalid, ip_payload_tready=m_ip_payload_axis_tready, ip_payload_tlast=m_ip_payload_axis_tlast, ip_payload_tuser=m_ip_payload_axis_tuser, pause=sink_pause, name='sink') # DUT if os.system(build_cmd): raise Exception("Error running build command") dut = Cosimulation( "vvp -m myhdl %s.vvp -lxt2" % testbench, clk=clk, rst=rst, current_test=current_test, s_udp_hdr_valid=s_udp_hdr_valid, s_udp_hdr_ready=s_udp_hdr_ready, s_eth_dest_mac=s_eth_dest_mac, s_eth_src_mac=s_eth_src_mac, s_eth_type=s_eth_type, s_ip_version=s_ip_version, s_ip_ihl=s_ip_ihl, s_ip_dscp=s_ip_dscp, s_ip_ecn=s_ip_ecn, s_ip_identification=s_ip_identification, s_ip_flags=s_ip_flags, s_ip_fragment_offset=s_ip_fragment_offset, s_ip_ttl=s_ip_ttl, s_ip_protocol=s_ip_protocol, s_ip_header_checksum=s_ip_header_checksum, s_ip_source_ip=s_ip_source_ip, s_ip_dest_ip=s_ip_dest_ip, s_udp_source_port=s_udp_source_port, s_udp_dest_port=s_udp_dest_port, s_udp_length=s_udp_length, s_udp_checksum=s_udp_checksum, s_udp_payload_axis_tdata=s_udp_payload_axis_tdata, s_udp_payload_axis_tkeep=s_udp_payload_axis_tkeep, s_udp_payload_axis_tvalid=s_udp_payload_axis_tvalid, s_udp_payload_axis_tready=s_udp_payload_axis_tready, s_udp_payload_axis_tlast=s_udp_payload_axis_tlast, s_udp_payload_axis_tuser=s_udp_payload_axis_tuser, m_ip_hdr_valid=m_ip_hdr_valid, m_ip_hdr_ready=m_ip_hdr_ready, m_eth_dest_mac=m_eth_dest_mac, m_eth_src_mac=m_eth_src_mac, m_eth_type=m_eth_type, m_ip_version=m_ip_version, m_ip_ihl=m_ip_ihl, m_ip_dscp=m_ip_dscp, m_ip_ecn=m_ip_ecn, m_ip_length=m_ip_length, m_ip_identification=m_ip_identification, m_ip_flags=m_ip_flags, m_ip_fragment_offset=m_ip_fragment_offset, m_ip_ttl=m_ip_ttl, m_ip_protocol=m_ip_protocol, m_ip_header_checksum=m_ip_header_checksum, m_ip_source_ip=m_ip_source_ip, m_ip_dest_ip=m_ip_dest_ip, m_ip_payload_axis_tdata=m_ip_payload_axis_tdata, m_ip_payload_axis_tkeep=m_ip_payload_axis_tkeep, m_ip_payload_axis_tvalid=m_ip_payload_axis_tvalid, m_ip_payload_axis_tready=m_ip_payload_axis_tready, m_ip_payload_axis_tlast=m_ip_payload_axis_tlast, m_ip_payload_axis_tuser=m_ip_payload_axis_tuser, busy=busy, error_payload_early_termination=error_payload_early_termination) @always(delay(4)) def clkgen(): clk.next = not clk error_payload_early_termination_asserted = Signal(bool(0)) @always(clk.posedge) def monitor(): if (error_payload_early_termination): error_payload_early_termination_asserted.next = 1 def wait_normal(): while s_udp_payload_axis_tvalid or m_ip_payload_axis_tvalid or s_udp_hdr_valid: yield clk.posedge def wait_pause_source(): while s_udp_payload_axis_tvalid or m_ip_payload_axis_tvalid or s_udp_hdr_valid: source_pause.next = True yield clk.posedge yield clk.posedge yield clk.posedge source_pause.next = False yield clk.posedge def wait_pause_sink(): while s_udp_payload_axis_tvalid or m_ip_payload_axis_tvalid or s_udp_hdr_valid: sink_pause.next = True yield clk.posedge yield clk.posedge yield clk.posedge sink_pause.next = False yield clk.posedge @instance 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 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 = udp_ep.UDPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80164 test_frame.ip_dest_ip = 0xc0a80165 test_frame.udp_source_port = 1 test_frame.udp_dest_port = 2 test_frame.udp_length = None test_frame.udp_checksum = None test_frame.payload = bytearray(range(payload_len)) test_frame.build() for wait in wait_normal, wait_pause_source, wait_pause_sink: source.send(test_frame) yield clk.posedge yield clk.posedge yield wait() yield sink.wait() rx_frame = sink.recv() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame 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 = udp_ep.UDPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.udp_source_port = 1 test_frame1.udp_dest_port = 2 test_frame1.udp_length = None test_frame1.udp_checksum = None test_frame1.payload = bytearray(range(payload_len)) test_frame1.build() test_frame2 = udp_ep.UDPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.udp_source_port = 1 test_frame2.udp_dest_port = 2 test_frame2.udp_length = None test_frame2.udp_checksum = None test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() 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 sink.wait() rx_frame = sink.recv() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame1 yield sink.wait() rx_frame = sink.recv() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame2 assert sink.empty() yield delay(100) yield clk.posedge print("test 3: tuser assert, length %d" % payload_len) current_test.next = 3 test_frame1 = udp_ep.UDPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.udp_source_port = 1 test_frame1.udp_dest_port = 2 test_frame1.udp_length = None test_frame1.udp_checksum = None test_frame1.payload = bytearray(range(payload_len)) test_frame1.build() test_frame2 = udp_ep.UDPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.udp_source_port = 1 test_frame2.udp_dest_port = 2 test_frame2.udp_length = None test_frame2.udp_checksum = None test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() test_frame1.payload.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 sink.wait() rx_frame = sink.recv() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame1 assert rx_frame.payload.user[-1] yield sink.wait() rx_frame = sink.recv() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame2 assert sink.empty() yield delay(100) yield clk.posedge print("test 4: trailing bytes (1), length %d" % payload_len) current_test.next = 4 test_frame1 = udp_ep.UDPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.udp_source_port = 1 test_frame1.udp_dest_port = 2 test_frame1.udp_length = None test_frame1.udp_checksum = None test_frame1.payload = bytearray(range(payload_len)) test_frame1.build() test_frame2 = udp_ep.UDPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.udp_source_port = 1 test_frame2.udp_dest_port = 2 test_frame2.udp_length = None test_frame2.udp_checksum = None test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() test_frame1a = udp_ep.UDPFrame(test_frame1) test_frame1a.payload.data += bytearray(b'\x00') for wait in wait_normal, wait_pause_source, wait_pause_sink: source.send(test_frame1a) source.send(test_frame2) yield clk.posedge yield clk.posedge yield wait() yield sink.wait() rx_frame = sink.recv() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame1 yield sink.wait() rx_frame = sink.recv() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame2 assert sink.empty() yield delay(100) yield clk.posedge print("test 5: trailing bytes (10), length %d" % payload_len) current_test.next = 5 test_frame1 = udp_ep.UDPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.udp_source_port = 1 test_frame1.udp_dest_port = 2 test_frame1.udp_length = None test_frame1.udp_checksum = None test_frame1.payload = bytearray(range(payload_len)) test_frame1.build() test_frame2 = udp_ep.UDPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.udp_source_port = 1 test_frame2.udp_dest_port = 2 test_frame2.udp_length = None test_frame2.udp_checksum = None test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() test_frame1a = udp_ep.UDPFrame(test_frame1) test_frame1a.payload.data += bytearray(b'\x00' * 10) for wait in wait_normal, wait_pause_source, wait_pause_sink: source.send(test_frame1a) source.send(test_frame2) yield clk.posedge yield clk.posedge yield wait() yield sink.wait() rx_frame = sink.recv() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame1 yield sink.wait() rx_frame = sink.recv() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame2 assert sink.empty() yield delay(100) yield clk.posedge print("test 6: trailing bytes with tuser assert (1), length %d" % payload_len) current_test.next = 6 test_frame1 = udp_ep.UDPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.udp_source_port = 1 test_frame1.udp_dest_port = 2 test_frame1.udp_length = None test_frame1.udp_checksum = None test_frame1.payload = bytearray(range(payload_len)) test_frame1.build() test_frame2 = udp_ep.UDPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.udp_source_port = 1 test_frame2.udp_dest_port = 2 test_frame2.udp_length = None test_frame2.udp_checksum = None test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() test_frame1a = udp_ep.UDPFrame(test_frame1) test_frame1a.payload.data += bytearray(b'\x00') test_frame1a.payload.user = 1 for wait in wait_normal, wait_pause_source, wait_pause_sink: source.send(test_frame1a) source.send(test_frame2) yield clk.posedge yield clk.posedge yield wait() yield sink.wait() rx_frame = sink.recv() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame1 assert rx_frame.payload.user[-1] yield sink.wait() rx_frame = sink.recv() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame2 assert sink.empty() yield delay(100) yield clk.posedge print("test 7: trailing bytes with tuser assert (10), length %d" % payload_len) current_test.next = 7 test_frame1 = udp_ep.UDPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.udp_source_port = 1 test_frame1.udp_dest_port = 2 test_frame1.udp_length = None test_frame1.udp_checksum = None test_frame1.payload = bytearray(range(payload_len)) test_frame1.build() test_frame2 = udp_ep.UDPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.udp_source_port = 1 test_frame2.udp_dest_port = 2 test_frame2.udp_length = None test_frame2.udp_checksum = None test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() test_frame1a = udp_ep.UDPFrame(test_frame1) test_frame1a.payload.data += bytearray(b'\x00' * 10) test_frame1a.payload.user = 1 for wait in wait_normal, wait_pause_source, wait_pause_sink: source.send(test_frame1a) source.send(test_frame2) yield clk.posedge yield clk.posedge yield wait() yield sink.wait() rx_frame = sink.recv() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame1 assert rx_frame.payload.user[-1] yield sink.wait() rx_frame = sink.recv() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame2 assert sink.empty() yield delay(100) yield clk.posedge print("test 8: truncated payload (1), length %d" % payload_len) current_test.next = 8 test_frame1 = udp_ep.UDPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.udp_source_port = 1 test_frame1.udp_dest_port = 2 test_frame1.udp_length = None test_frame1.udp_checksum = None test_frame1.payload = bytearray(range(payload_len + 1)) test_frame1.build() test_frame2 = udp_ep.UDPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.udp_source_port = 1 test_frame2.udp_dest_port = 2 test_frame2.udp_length = None test_frame2.udp_checksum = None test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() test_frame1a = udp_ep.UDPFrame(test_frame1) test_frame1a.payload.data = test_frame1a.payload.data[:-1] for wait in wait_normal, wait_pause_source, wait_pause_sink: error_payload_early_termination_asserted.next = 0 source.send(test_frame1a) source.send(test_frame2) yield clk.posedge yield clk.posedge yield wait() yield sink.wait() rx_frame = sink.recv() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert rx_frame.payload.user[-1] assert error_payload_early_termination_asserted yield sink.wait() rx_frame = sink.recv() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame2 assert sink.empty() yield delay(100) yield clk.posedge print("test 9: truncated payload (10), length %d" % payload_len) current_test.next = 9 test_frame1 = udp_ep.UDPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.udp_source_port = 1 test_frame1.udp_dest_port = 2 test_frame1.udp_length = None test_frame1.udp_checksum = None test_frame1.payload = bytearray(range(payload_len + 10)) test_frame1.build() test_frame2 = udp_ep.UDPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.udp_source_port = 1 test_frame2.udp_dest_port = 2 test_frame2.udp_length = None test_frame2.udp_checksum = None test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() test_frame1a = udp_ep.UDPFrame(test_frame1) test_frame1a.payload.data = test_frame1.payload.data[:-10] for wait in wait_normal, wait_pause_source, wait_pause_sink: error_payload_early_termination_asserted.next = 0 source.send(test_frame1a) source.send(test_frame2) yield clk.posedge yield clk.posedge yield wait() yield sink.wait() rx_frame = sink.recv() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert rx_frame.payload.user[-1] assert error_payload_early_termination_asserted yield sink.wait() rx_frame = sink.recv() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame2 assert sink.empty() yield delay(100) raise StopSimulation return instances()
def bench(): # Inputs clk = Signal(bool(0)) rst = Signal(bool(0)) current_test = Signal(intbv(0)[8:]) input_eth_hdr_valid = Signal(bool(0)) input_eth_dest_mac = Signal(intbv(0)[48:]) input_eth_src_mac = Signal(intbv(0)[48:]) input_eth_type = Signal(intbv(0)[16:]) input_eth_payload_tdata = Signal(intbv(0)[64:]) input_eth_payload_tkeep = Signal(intbv(0)[8:]) input_eth_payload_tvalid = Signal(bool(0)) input_eth_payload_tlast = Signal(bool(0)) input_eth_payload_tuser = Signal(bool(0)) arp_response_valid = Signal(bool(0)) arp_response_error = Signal(bool(0)) arp_response_mac = Signal(intbv(0)[48:]) input_ip_hdr_valid = Signal(bool(0)) input_ip_dscp = Signal(intbv(0)[6:]) input_ip_ecn = Signal(intbv(0)[2:]) input_ip_length = Signal(intbv(0)[16:]) input_ip_ttl = Signal(intbv(0)[8:]) input_ip_protocol = Signal(intbv(0)[8:]) input_ip_source_ip = Signal(intbv(0)[32:]) input_ip_dest_ip = Signal(intbv(0)[32:]) input_ip_payload_tdata = Signal(intbv(0)[64:]) input_ip_payload_tkeep = Signal(intbv(0)[8:]) input_ip_payload_tvalid = Signal(bool(0)) input_ip_payload_tlast = Signal(bool(0)) input_ip_payload_tuser = Signal(bool(0)) output_eth_payload_tready = Signal(bool(0)) output_eth_hdr_ready = Signal(bool(0)) output_ip_hdr_ready = Signal(bool(0)) output_ip_payload_tready = Signal(bool(0)) # Outputs input_eth_hdr_ready = Signal(bool(0)) input_eth_payload_tready = Signal(bool(0)) input_ip_hdr_ready = Signal(bool(0)) input_ip_payload_tready = Signal(bool(0)) output_eth_hdr_valid = Signal(bool(0)) output_eth_dest_mac = Signal(intbv(0)[48:]) output_eth_src_mac = Signal(intbv(0)[48:]) output_eth_type = Signal(intbv(0)[16:]) output_eth_payload_tdata = Signal(intbv(0)[64:]) output_eth_payload_tkeep = Signal(intbv(0)[8:]) output_eth_payload_tvalid = Signal(bool(0)) output_eth_payload_tlast = Signal(bool(0)) output_eth_payload_tuser = Signal(bool(0)) arp_request_valid = Signal(bool(0)) arp_request_ip = Signal(intbv(0)[32:]) output_ip_hdr_valid = Signal(bool(0)) output_ip_eth_dest_mac = Signal(intbv(0)[48:]) output_ip_eth_src_mac = Signal(intbv(0)[48:]) output_ip_eth_type = Signal(intbv(0)[16:]) output_ip_version = Signal(intbv(0)[4:]) output_ip_ihl = Signal(intbv(0)[4:]) output_ip_dscp = Signal(intbv(0)[6:]) output_ip_ecn = Signal(intbv(0)[2:]) output_ip_length = Signal(intbv(0)[16:]) output_ip_identification = Signal(intbv(0)[16:]) output_ip_flags = Signal(intbv(0)[3:]) output_ip_fragment_offset = Signal(intbv(0)[13:]) output_ip_ttl = Signal(intbv(0)[8:]) output_ip_protocol = Signal(intbv(0)[8:]) output_ip_header_checksum = Signal(intbv(0)[16:]) output_ip_source_ip = Signal(intbv(0)[32:]) output_ip_dest_ip = Signal(intbv(0)[32:]) output_ip_payload_tdata = Signal(intbv(0)[64:]) output_ip_payload_tkeep = Signal(intbv(0)[8:]) output_ip_payload_tvalid = Signal(bool(0)) output_ip_payload_tlast = Signal(bool(0)) output_ip_payload_tuser = Signal(bool(0)) rx_busy = Signal(bool(0)) tx_busy = Signal(bool(0)) rx_error_header_early_termination = Signal(bool(0)) rx_error_payload_early_termination = Signal(bool(0)) rx_error_invalid_header = Signal(bool(0)) rx_error_invalid_checksum = Signal(bool(0)) tx_error_payload_early_termination = Signal(bool(0)) tx_error_arp_failed = Signal(bool(0)) local_mac = Signal(intbv(0)[48:]) local_ip = Signal(intbv(0)[32:]) # sources and sinks eth_source_pause = Signal(bool(0)) eth_sink_pause = Signal(bool(0)) ip_source_pause = Signal(bool(0)) ip_sink_pause = Signal(bool(0)) eth_source = eth_ep.EthFrameSource() eth_source_logic = eth_source.create_logic( clk, rst, eth_hdr_ready=input_eth_hdr_ready, eth_hdr_valid=input_eth_hdr_valid, eth_dest_mac=input_eth_dest_mac, eth_src_mac=input_eth_src_mac, eth_type=input_eth_type, eth_payload_tdata=input_eth_payload_tdata, eth_payload_tkeep=input_eth_payload_tkeep, eth_payload_tvalid=input_eth_payload_tvalid, eth_payload_tready=input_eth_payload_tready, eth_payload_tlast=input_eth_payload_tlast, eth_payload_tuser=input_eth_payload_tuser, pause=eth_source_pause, name='eth_source') eth_sink = eth_ep.EthFrameSink() eth_sink_logic = eth_sink.create_logic( clk, rst, eth_hdr_ready=output_eth_hdr_ready, eth_hdr_valid=output_eth_hdr_valid, eth_dest_mac=output_eth_dest_mac, eth_src_mac=output_eth_src_mac, eth_type=output_eth_type, eth_payload_tdata=output_eth_payload_tdata, eth_payload_tkeep=output_eth_payload_tkeep, eth_payload_tvalid=output_eth_payload_tvalid, eth_payload_tready=output_eth_payload_tready, eth_payload_tlast=output_eth_payload_tlast, eth_payload_tuser=output_eth_payload_tuser, pause=eth_sink_pause, name='eth_sink') ip_source = ip_ep.IPFrameSource() ip_source_logic = ip_source.create_logic( clk, rst, ip_hdr_valid=input_ip_hdr_valid, ip_hdr_ready=input_ip_hdr_ready, ip_dscp=input_ip_dscp, ip_ecn=input_ip_ecn, ip_length=input_ip_length, ip_ttl=input_ip_ttl, ip_protocol=input_ip_protocol, ip_source_ip=input_ip_source_ip, ip_dest_ip=input_ip_dest_ip, ip_payload_tdata=input_ip_payload_tdata, ip_payload_tkeep=input_ip_payload_tkeep, ip_payload_tvalid=input_ip_payload_tvalid, ip_payload_tready=input_ip_payload_tready, ip_payload_tlast=input_ip_payload_tlast, ip_payload_tuser=input_ip_payload_tuser, pause=ip_source_pause, name='ip_source') ip_sink = ip_ep.IPFrameSink() ip_sink_logic = ip_sink.create_logic( clk, rst, ip_hdr_ready=output_ip_hdr_ready, ip_hdr_valid=output_ip_hdr_valid, eth_dest_mac=output_ip_eth_dest_mac, eth_src_mac=output_ip_eth_src_mac, eth_type=output_ip_eth_type, ip_version=output_ip_version, ip_ihl=output_ip_ihl, ip_dscp=output_ip_dscp, ip_ecn=output_ip_ecn, ip_length=output_ip_length, ip_identification=output_ip_identification, ip_flags=output_ip_flags, ip_fragment_offset=output_ip_fragment_offset, ip_ttl=output_ip_ttl, ip_protocol=output_ip_protocol, ip_header_checksum=output_ip_header_checksum, ip_source_ip=output_ip_source_ip, ip_dest_ip=output_ip_dest_ip, ip_payload_tdata=output_ip_payload_tdata, ip_payload_tkeep=output_ip_payload_tkeep, ip_payload_tvalid=output_ip_payload_tvalid, ip_payload_tready=output_ip_payload_tready, ip_payload_tlast=output_ip_payload_tlast, ip_payload_tuser=output_ip_payload_tuser, pause=ip_sink_pause, name='ip_sink') # DUT if os.system(build_cmd): raise Exception("Error running build command") dut = Cosimulation( "vvp -m myhdl %s.vvp -lxt2" % testbench, clk=clk, rst=rst, current_test=current_test, input_eth_hdr_valid=input_eth_hdr_valid, input_eth_hdr_ready=input_eth_hdr_ready, input_eth_dest_mac=input_eth_dest_mac, input_eth_src_mac=input_eth_src_mac, input_eth_type=input_eth_type, input_eth_payload_tdata=input_eth_payload_tdata, input_eth_payload_tkeep=input_eth_payload_tkeep, input_eth_payload_tvalid=input_eth_payload_tvalid, input_eth_payload_tready=input_eth_payload_tready, input_eth_payload_tlast=input_eth_payload_tlast, input_eth_payload_tuser=input_eth_payload_tuser, output_eth_hdr_valid=output_eth_hdr_valid, output_eth_hdr_ready=output_eth_hdr_ready, output_eth_dest_mac=output_eth_dest_mac, output_eth_src_mac=output_eth_src_mac, output_eth_type=output_eth_type, output_eth_payload_tdata=output_eth_payload_tdata, output_eth_payload_tkeep=output_eth_payload_tkeep, output_eth_payload_tvalid=output_eth_payload_tvalid, output_eth_payload_tready=output_eth_payload_tready, output_eth_payload_tlast=output_eth_payload_tlast, output_eth_payload_tuser=output_eth_payload_tuser, arp_request_valid=arp_request_valid, arp_request_ip=arp_request_ip, arp_response_valid=arp_response_valid, arp_response_error=arp_response_error, arp_response_mac=arp_response_mac, input_ip_hdr_valid=input_ip_hdr_valid, input_ip_hdr_ready=input_ip_hdr_ready, input_ip_dscp=input_ip_dscp, input_ip_ecn=input_ip_ecn, input_ip_length=input_ip_length, input_ip_ttl=input_ip_ttl, input_ip_protocol=input_ip_protocol, input_ip_source_ip=input_ip_source_ip, input_ip_dest_ip=input_ip_dest_ip, input_ip_payload_tdata=input_ip_payload_tdata, input_ip_payload_tkeep=input_ip_payload_tkeep, input_ip_payload_tvalid=input_ip_payload_tvalid, input_ip_payload_tready=input_ip_payload_tready, input_ip_payload_tlast=input_ip_payload_tlast, input_ip_payload_tuser=input_ip_payload_tuser, output_ip_hdr_valid=output_ip_hdr_valid, output_ip_hdr_ready=output_ip_hdr_ready, output_ip_eth_dest_mac=output_ip_eth_dest_mac, output_ip_eth_src_mac=output_ip_eth_src_mac, output_ip_eth_type=output_ip_eth_type, output_ip_version=output_ip_version, output_ip_ihl=output_ip_ihl, output_ip_dscp=output_ip_dscp, output_ip_ecn=output_ip_ecn, output_ip_length=output_ip_length, output_ip_identification=output_ip_identification, output_ip_flags=output_ip_flags, output_ip_fragment_offset=output_ip_fragment_offset, output_ip_ttl=output_ip_ttl, output_ip_protocol=output_ip_protocol, output_ip_header_checksum=output_ip_header_checksum, output_ip_source_ip=output_ip_source_ip, output_ip_dest_ip=output_ip_dest_ip, output_ip_payload_tdata=output_ip_payload_tdata, output_ip_payload_tkeep=output_ip_payload_tkeep, output_ip_payload_tvalid=output_ip_payload_tvalid, output_ip_payload_tready=output_ip_payload_tready, output_ip_payload_tlast=output_ip_payload_tlast, output_ip_payload_tuser=output_ip_payload_tuser, rx_busy=rx_busy, tx_busy=tx_busy, rx_error_header_early_termination=rx_error_header_early_termination, rx_error_payload_early_termination=rx_error_payload_early_termination, rx_error_invalid_header=rx_error_invalid_header, rx_error_invalid_checksum=rx_error_invalid_checksum, tx_error_payload_early_termination=tx_error_payload_early_termination, tx_error_arp_failed=tx_error_arp_failed, local_mac=local_mac, local_ip=local_ip) @always(delay(4)) def clkgen(): clk.next = not clk arp_table = {} @instance def arp_emu(): while True: yield clk.posedge arp_response_valid.next = 0 arp_response_error.next = 0 arp_response_mac.next = 0 if arp_request_valid: if int(arp_request_ip) in arp_table: arp_response_valid.next = 1 arp_response_mac.next = arp_table[int(arp_request_ip)] else: arp_response_valid.next = 1 arp_response_error.next = 1 rx_error_header_early_termination_asserted = Signal(bool(0)) rx_error_payload_early_termination_asserted = Signal(bool(0)) rx_error_invalid_header_asserted = Signal(bool(0)) rx_error_invalid_checksum_asserted = Signal(bool(0)) tx_error_payload_early_termination_asserted = Signal(bool(0)) tx_error_arp_failed_asserted = Signal(bool(0)) @always(clk.posedge) def monitor(): if (rx_error_header_early_termination): rx_error_header_early_termination_asserted.next = 1 if (rx_error_payload_early_termination): rx_error_payload_early_termination_asserted.next = 1 if (rx_error_invalid_header): rx_error_invalid_header_asserted.next = 1 if (rx_error_invalid_checksum): rx_error_invalid_checksum_asserted.next = 1 if (tx_error_payload_early_termination): tx_error_payload_early_termination_asserted.next = 1 if (tx_error_arp_failed): tx_error_arp_failed_asserted.next = 1 def wait_normal(): while (input_eth_payload_tvalid or input_ip_payload_tvalid or output_eth_payload_tvalid or output_ip_payload_tvalid or input_eth_hdr_valid or input_ip_hdr_valid): yield clk.posedge @instance 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 # set MAC and IP address local_mac.next = 0x5A5152535455 local_ip.next = 0xc0a80164 # put an entry in the ARP table arp_table[0xc0a80165] = 0xDAD1D2D3D4D5 yield clk.posedge print("test 1: test IP RX packet") current_test.next = 1 test_frame = ip_ep.IPFrame() test_frame.eth_dest_mac = 0x5A5152535455 test_frame.eth_src_mac = 0xDAD1D2D3D4D5 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80165 test_frame.ip_dest_ip = 0xc0a80164 test_frame.payload = bytearray(range(32)) test_frame.build() eth_frame = test_frame.build_eth() eth_source.send(eth_frame) yield clk.posedge yield clk.posedge yield wait_normal() yield clk.posedge yield clk.posedge rx_frame = ip_sink.recv() assert rx_frame == test_frame assert eth_source.empty() assert eth_sink.empty() assert ip_source.empty() assert ip_sink.empty() yield delay(100) yield clk.posedge print("test 2: test IP TX packet") current_test.next = 2 test_frame = ip_ep.IPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80164 test_frame.ip_dest_ip = 0xc0a80165 test_frame.payload = bytearray(range(32)) test_frame.build() ip_source.send(test_frame) yield clk.posedge yield clk.posedge yield wait_normal() yield clk.posedge yield clk.posedge rx_frame = eth_sink.recv() check_frame = ip_ep.IPFrame() check_frame.parse_eth(rx_frame) assert check_frame == test_frame assert eth_source.empty() assert eth_sink.empty() assert ip_source.empty() assert ip_sink.empty() yield delay(100) yield clk.posedge print("test 3: test IP TX arp fail packet") current_test.next = 2 tx_error_arp_failed_asserted.next = 0 test_frame = ip_ep.IPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80164 test_frame.ip_dest_ip = 0xc0a80166 test_frame.payload = bytearray(range(32)) test_frame.build() ip_source.send(test_frame) yield clk.posedge yield clk.posedge yield wait_normal() yield clk.posedge yield clk.posedge assert tx_error_arp_failed_asserted assert eth_source.empty() assert eth_sink.empty() assert ip_source.empty() assert ip_sink.empty() yield delay(100) raise StopSimulation return dut, eth_source_logic, eth_sink_logic, ip_source_logic, ip_sink_logic, clkgen, arp_emu, monitor, check
def bench(): # Parameters M_COUNT = 4 DATA_WIDTH = 64 KEEP_ENABLE = (DATA_WIDTH>8) KEEP_WIDTH = (DATA_WIDTH/8) ID_ENABLE = 1 ID_WIDTH = 8 DEST_ENABLE = 1 DEST_WIDTH = 8 USER_ENABLE = 1 USER_WIDTH = 1 # Inputs clk = Signal(bool(0)) rst = Signal(bool(0)) current_test = Signal(intbv(0)[8:]) s_ip_hdr_valid = Signal(bool(0)) s_eth_dest_mac = Signal(intbv(0)[48:]) s_eth_src_mac = Signal(intbv(0)[48:]) s_eth_type = Signal(intbv(0)[16:]) s_ip_version = Signal(intbv(0)[4:]) s_ip_ihl = Signal(intbv(0)[4:]) s_ip_dscp = Signal(intbv(0)[6:]) s_ip_ecn = Signal(intbv(0)[2:]) s_ip_length = Signal(intbv(0)[16:]) s_ip_identification = Signal(intbv(0)[16:]) s_ip_flags = Signal(intbv(0)[3:]) s_ip_fragment_offset = Signal(intbv(0)[13:]) s_ip_ttl = Signal(intbv(0)[8:]) s_ip_protocol = Signal(intbv(0)[8:]) s_ip_header_checksum = Signal(intbv(0)[16:]) s_ip_source_ip = Signal(intbv(0)[32:]) s_ip_dest_ip = Signal(intbv(0)[32:]) s_ip_payload_axis_tdata = Signal(intbv(0)[DATA_WIDTH:]) s_ip_payload_axis_tkeep = Signal(intbv(1)[KEEP_WIDTH:]) s_ip_payload_axis_tvalid = Signal(bool(0)) s_ip_payload_axis_tlast = Signal(bool(0)) s_ip_payload_axis_tid = Signal(intbv(0)[ID_WIDTH:]) s_ip_payload_axis_tdest = Signal(intbv(0)[DEST_WIDTH:]) s_ip_payload_axis_tuser = Signal(intbv(0)[USER_WIDTH:]) m_ip_hdr_ready_list = [Signal(bool(0)) for i in range(M_COUNT)] m_ip_payload_axis_tready_list = [Signal(bool(0)) for i in range(M_COUNT)] m_ip_hdr_ready = ConcatSignal(*reversed(m_ip_hdr_ready_list)) m_ip_payload_axis_tready = ConcatSignal(*reversed(m_ip_payload_axis_tready_list)) enable = Signal(bool(0)) drop = Signal(bool(0)) select = Signal(intbv(0)[2:]) # Outputs s_ip_hdr_ready = Signal(bool(0)) s_ip_payload_axis_tready = Signal(bool(0)) m_ip_hdr_valid = Signal(intbv(0)[M_COUNT:]) m_eth_dest_mac = Signal(intbv(0)[M_COUNT*48:]) m_eth_src_mac = Signal(intbv(0)[M_COUNT*48:]) m_eth_type = Signal(intbv(0)[M_COUNT*16:]) m_ip_version = Signal(intbv(0)[M_COUNT*4:]) m_ip_ihl = Signal(intbv(0)[M_COUNT*4:]) m_ip_dscp = Signal(intbv(0)[M_COUNT*6:]) m_ip_ecn = Signal(intbv(0)[M_COUNT*2:]) m_ip_length = Signal(intbv(0)[M_COUNT*16:]) m_ip_identification = Signal(intbv(0)[M_COUNT*16:]) m_ip_flags = Signal(intbv(0)[M_COUNT*3:]) m_ip_fragment_offset = Signal(intbv(0)[M_COUNT*13:]) m_ip_ttl = Signal(intbv(0)[M_COUNT*8:]) m_ip_protocol = Signal(intbv(0)[M_COUNT*8:]) m_ip_header_checksum = Signal(intbv(0)[M_COUNT*16:]) m_ip_source_ip = Signal(intbv(0)[M_COUNT*32:]) m_ip_dest_ip = Signal(intbv(0)[M_COUNT*32:]) m_ip_payload_axis_tdata = Signal(intbv(0)[M_COUNT*DATA_WIDTH:]) m_ip_payload_axis_tkeep = Signal(intbv(0xf)[M_COUNT*KEEP_WIDTH:]) m_ip_payload_axis_tvalid = Signal(intbv(0)[M_COUNT:]) m_ip_payload_axis_tlast = Signal(intbv(0)[M_COUNT:]) m_ip_payload_axis_tid = Signal(intbv(0)[M_COUNT*ID_WIDTH:]) m_ip_payload_axis_tdest = Signal(intbv(0)[M_COUNT*DEST_WIDTH:]) m_ip_payload_axis_tuser = Signal(intbv(0)[M_COUNT*USER_WIDTH:]) m_ip_hdr_valid_list = [m_ip_hdr_valid(i) for i in range(M_COUNT)] m_eth_dest_mac_list = [m_eth_dest_mac((i+1)*48, i*48) for i in range(M_COUNT)] m_eth_src_mac_list = [m_eth_src_mac((i+1)*48, i*48) for i in range(M_COUNT)] m_eth_type_list = [m_eth_type((i+1)*16, i*16) for i in range(M_COUNT)] m_ip_version_list = [m_ip_version((i+1)*4, i*4) for i in range(M_COUNT)] m_ip_ihl_list = [m_ip_ihl((i+1)*4, i*4) for i in range(M_COUNT)] m_ip_dscp_list = [m_ip_dscp((i+1)*6, i*6) for i in range(M_COUNT)] m_ip_ecn_list = [m_ip_ecn((i+1)*2, i*2) for i in range(M_COUNT)] m_ip_length_list = [m_ip_length((i+1)*16, i*16) for i in range(M_COUNT)] m_ip_identification_list = [m_ip_identification((i+1)*16, i*16) for i in range(M_COUNT)] m_ip_flags_list = [m_ip_flags((i+1)*3, i*3) for i in range(M_COUNT)] m_ip_fragment_offset_list = [m_ip_fragment_offset((i+1)*13, i*13) for i in range(M_COUNT)] m_ip_ttl_list = [m_ip_ttl((i+1)*8, i*8) for i in range(M_COUNT)] m_ip_protocol_list = [m_ip_protocol((i+1)*8, i*8) for i in range(M_COUNT)] m_ip_header_checksum_list = [m_ip_header_checksum((i+1)*16, i*16) for i in range(M_COUNT)] m_ip_source_ip_list = [m_ip_source_ip((i+1)*32, i*32) for i in range(M_COUNT)] m_ip_dest_ip_list = [m_ip_dest_ip((i+1)*32, i*32) for i in range(M_COUNT)] m_ip_payload_axis_tdata_list = [m_ip_payload_axis_tdata((i+1)*DATA_WIDTH, i*DATA_WIDTH) for i in range(M_COUNT)] m_ip_payload_axis_tkeep_list = [m_ip_payload_axis_tkeep((i+1)*KEEP_WIDTH, i*KEEP_WIDTH) for i in range(M_COUNT)] m_ip_payload_axis_tvalid_list = [m_ip_payload_axis_tvalid(i) for i in range(M_COUNT)] m_ip_payload_axis_tlast_list = [m_ip_payload_axis_tlast(i) for i in range(M_COUNT)] m_ip_payload_axis_tid_list = [m_ip_payload_axis_tid((i+1)*ID_WIDTH, i*ID_WIDTH) for i in range(M_COUNT)] m_ip_payload_axis_tdest_list = [m_ip_payload_axis_tdest((i+1)*DEST_WIDTH, i*DEST_WIDTH) for i in range(M_COUNT)] m_ip_payload_axis_tuser_list = [m_ip_payload_axis_tuser((i+1)*USER_WIDTH, i*USER_WIDTH) for i in range(M_COUNT)] # sources and sinks source_pause = Signal(bool(0)) sink_pause_list = [] sink_list = [] sink_logic_list = [] source = ip_ep.IPFrameSource() source_logic = source.create_logic( clk, rst, ip_hdr_ready=s_ip_hdr_ready, ip_hdr_valid=s_ip_hdr_valid, eth_dest_mac=s_eth_dest_mac, eth_src_mac=s_eth_src_mac, eth_type=s_eth_type, ip_version=s_ip_version, ip_ihl=s_ip_ihl, ip_dscp=s_ip_dscp, ip_ecn=s_ip_ecn, ip_length=s_ip_length, ip_identification=s_ip_identification, ip_flags=s_ip_flags, ip_fragment_offset=s_ip_fragment_offset, ip_ttl=s_ip_ttl, ip_protocol=s_ip_protocol, ip_header_checksum=s_ip_header_checksum, ip_source_ip=s_ip_source_ip, ip_dest_ip=s_ip_dest_ip, ip_payload_tdata=s_ip_payload_axis_tdata, ip_payload_tkeep=s_ip_payload_axis_tkeep, ip_payload_tvalid=s_ip_payload_axis_tvalid, ip_payload_tready=s_ip_payload_axis_tready, ip_payload_tlast=s_ip_payload_axis_tlast, ip_payload_tuser=s_ip_payload_axis_tuser, pause=source_pause, name='source' ) for k in range(M_COUNT): s = ip_ep.IPFrameSink() p = Signal(bool(0)) sink_list.append(s) sink_pause_list.append(p) sink_logic_list.append(s.create_logic( clk, rst, ip_hdr_ready=m_ip_hdr_ready_list[k], ip_hdr_valid=m_ip_hdr_valid_list[k], eth_dest_mac=m_eth_dest_mac_list[k], eth_src_mac=m_eth_src_mac_list[k], eth_type=m_eth_type_list[k], ip_version=m_ip_version_list[k], ip_ihl=m_ip_ihl_list[k], ip_dscp=m_ip_dscp_list[k], ip_ecn=m_ip_ecn_list[k], ip_length=m_ip_length_list[k], ip_identification=m_ip_identification_list[k], ip_flags=m_ip_flags_list[k], ip_fragment_offset=m_ip_fragment_offset_list[k], ip_ttl=m_ip_ttl_list[k], ip_protocol=m_ip_protocol_list[k], ip_header_checksum=m_ip_header_checksum_list[k], ip_source_ip=m_ip_source_ip_list[k], ip_dest_ip=m_ip_dest_ip_list[k], ip_payload_tdata=m_ip_payload_axis_tdata_list[k], ip_payload_tkeep=m_ip_payload_axis_tkeep_list[k], ip_payload_tvalid=m_ip_payload_axis_tvalid_list[k], ip_payload_tready=m_ip_payload_axis_tready_list[k], ip_payload_tlast=m_ip_payload_axis_tlast_list[k], ip_payload_tuser=m_ip_payload_axis_tuser_list[k], pause=p, name='sink_%d' % k )) # DUT if os.system(build_cmd): raise Exception("Error running build command") dut = Cosimulation( "vvp -m myhdl %s.vvp -lxt2" % testbench, clk=clk, rst=rst, current_test=current_test, s_ip_hdr_valid=s_ip_hdr_valid, s_ip_hdr_ready=s_ip_hdr_ready, s_eth_dest_mac=s_eth_dest_mac, s_eth_src_mac=s_eth_src_mac, s_eth_type=s_eth_type, s_ip_version=s_ip_version, s_ip_ihl=s_ip_ihl, s_ip_dscp=s_ip_dscp, s_ip_ecn=s_ip_ecn, s_ip_length=s_ip_length, s_ip_identification=s_ip_identification, s_ip_flags=s_ip_flags, s_ip_fragment_offset=s_ip_fragment_offset, s_ip_ttl=s_ip_ttl, s_ip_protocol=s_ip_protocol, s_ip_header_checksum=s_ip_header_checksum, s_ip_source_ip=s_ip_source_ip, s_ip_dest_ip=s_ip_dest_ip, s_ip_payload_axis_tdata=s_ip_payload_axis_tdata, s_ip_payload_axis_tkeep=s_ip_payload_axis_tkeep, s_ip_payload_axis_tvalid=s_ip_payload_axis_tvalid, s_ip_payload_axis_tready=s_ip_payload_axis_tready, s_ip_payload_axis_tlast=s_ip_payload_axis_tlast, s_ip_payload_axis_tid=s_ip_payload_axis_tid, s_ip_payload_axis_tdest=s_ip_payload_axis_tdest, s_ip_payload_axis_tuser=s_ip_payload_axis_tuser, m_ip_hdr_valid=m_ip_hdr_valid, m_ip_hdr_ready=m_ip_hdr_ready, m_eth_dest_mac=m_eth_dest_mac, m_eth_src_mac=m_eth_src_mac, m_eth_type=m_eth_type, m_ip_version=m_ip_version, m_ip_ihl=m_ip_ihl, m_ip_dscp=m_ip_dscp, m_ip_ecn=m_ip_ecn, m_ip_length=m_ip_length, m_ip_identification=m_ip_identification, m_ip_flags=m_ip_flags, m_ip_fragment_offset=m_ip_fragment_offset, m_ip_ttl=m_ip_ttl, m_ip_protocol=m_ip_protocol, m_ip_header_checksum=m_ip_header_checksum, m_ip_source_ip=m_ip_source_ip, m_ip_dest_ip=m_ip_dest_ip, m_ip_payload_axis_tdata=m_ip_payload_axis_tdata, m_ip_payload_axis_tkeep=m_ip_payload_axis_tkeep, m_ip_payload_axis_tvalid=m_ip_payload_axis_tvalid, m_ip_payload_axis_tready=m_ip_payload_axis_tready, m_ip_payload_axis_tlast=m_ip_payload_axis_tlast, m_ip_payload_axis_tid=m_ip_payload_axis_tid, m_ip_payload_axis_tdest=m_ip_payload_axis_tdest, m_ip_payload_axis_tuser=m_ip_payload_axis_tuser, enable=enable, drop=drop, select=select ) @always(delay(4)) def clkgen(): clk.next = not clk @instance 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 = ip_ep.IPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x8000 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80165 test_frame.ip_dest_ip = 0xc0a80164 test_frame.payload = bytearray(range(32)) test_frame.build() 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 = ip_ep.IPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x8000 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80165 test_frame.ip_dest_ip = 0xc0a80164 test_frame.payload = bytearray(range(32)) test_frame.build() 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 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x8000 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_dscp = 0 test_frame1.ip_ecn = 0 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80165 test_frame1.ip_dest_ip = 0xc0a80164 test_frame1.payload = bytearray(range(32)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x8000 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_dscp = 0 test_frame2.ip_ecn = 0 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80165 test_frame2.ip_dest_ip = 0xc0a80164 test_frame2.payload = bytearray(range(32)) test_frame2.build() 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 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x8000 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_dscp = 0 test_frame1.ip_ecn = 0 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80165 test_frame1.ip_dest_ip = 0xc0a80164 test_frame1.payload = bytearray(range(32)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x8000 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_dscp = 0 test_frame2.ip_ecn = 0 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80165 test_frame2.ip_dest_ip = 0xc0a80164 test_frame2.payload = bytearray(range(32)) test_frame2.build() source.send(test_frame1) source.send(test_frame2) yield clk.posedge while s_ip_payload_axis_tvalid or s_ip_hdr_valid: 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 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x8000 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_dscp = 0 test_frame1.ip_ecn = 0 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80165 test_frame1.ip_dest_ip = 0xc0a80164 test_frame1.payload = bytearray(range(32)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x8000 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_dscp = 0 test_frame2.ip_ecn = 0 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80165 test_frame2.ip_dest_ip = 0xc0a80164 test_frame2.payload = bytearray(range(32)) test_frame2.build() source.send(test_frame1) source.send(test_frame2) yield clk.posedge while s_ip_payload_axis_tvalid or s_ip_hdr_valid: 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 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x8000 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_dscp = 0 test_frame1.ip_ecn = 0 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80165 test_frame1.ip_dest_ip = 0xc0a80164 test_frame1.payload = bytearray(range(32)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x8000 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_dscp = 0 test_frame2.ip_ecn = 0 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80165 test_frame2.ip_dest_ip = 0xc0a80164 test_frame2.payload = bytearray(range(32)) test_frame2.build() source.send(test_frame1) source.send(test_frame2) yield clk.posedge while s_ip_payload_axis_tvalid or s_ip_hdr_valid: for k in range(M_COUNT): sink_pause_list[k].next = False yield clk.posedge yield clk.posedge yield clk.posedge for k in range(M_COUNT): sink_pause_list[k].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 = ip_ep.IPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x8000 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80165 test_frame.ip_dest_ip = 0xc0a80164 test_frame.payload = bytearray(range(32)) test_frame.build() 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 = ip_ep.IPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x8000 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80165 test_frame.ip_dest_ip = 0xc0a80164 test_frame.payload = bytearray(range(32)) test_frame.build() source.send(test_frame) yield delay(500) assert sink_list[0].empty() drop.next = False yield delay(100) raise StopSimulation return instances()
def bench(): # Inputs clk = Signal(bool(0)) rst = Signal(bool(0)) current_test = Signal(intbv(0)[8:]) input_ip_hdr_valid = Signal(bool(0)) input_ip_eth_dest_mac = Signal(intbv(0)[48:]) input_ip_eth_src_mac = Signal(intbv(0)[48:]) input_ip_eth_type = Signal(intbv(0)[16:]) input_ip_version = Signal(intbv(0)[4:]) input_ip_ihl = Signal(intbv(0)[4:]) input_ip_dscp = Signal(intbv(0)[6:]) input_ip_ecn = Signal(intbv(0)[2:]) input_ip_length = Signal(intbv(0)[16:]) input_ip_identification = Signal(intbv(0)[16:]) input_ip_flags = Signal(intbv(0)[3:]) input_ip_fragment_offset = Signal(intbv(0)[13:]) input_ip_ttl = Signal(intbv(0)[8:]) input_ip_protocol = Signal(intbv(0)[8:]) input_ip_header_checksum = Signal(intbv(0)[16:]) input_ip_source_ip = Signal(intbv(0)[32:]) input_ip_dest_ip = Signal(intbv(0)[32:]) input_ip_payload_tdata = Signal(intbv(0)[8:]) input_ip_payload_tvalid = Signal(bool(0)) input_ip_payload_tlast = Signal(bool(0)) input_ip_payload_tuser = Signal(bool(0)) input_udp_hdr_valid = Signal(bool(0)) input_udp_eth_dest_mac = Signal(intbv(0)[48:]) input_udp_eth_src_mac = Signal(intbv(0)[48:]) input_udp_eth_type = Signal(intbv(0)[16:]) input_udp_ip_version = Signal(intbv(0)[4:]) input_udp_ip_ihl = Signal(intbv(0)[4:]) input_udp_ip_dscp = Signal(intbv(0)[6:]) input_udp_ip_ecn = Signal(intbv(0)[2:]) input_udp_ip_identification = Signal(intbv(0)[16:]) input_udp_ip_flags = Signal(intbv(0)[3:]) input_udp_ip_fragment_offset = Signal(intbv(0)[13:]) input_udp_ip_ttl = Signal(intbv(0)[8:]) input_udp_ip_header_checksum = Signal(intbv(0)[16:]) input_udp_ip_source_ip = Signal(intbv(0)[32:]) input_udp_ip_dest_ip = Signal(intbv(0)[32:]) input_udp_source_port = Signal(intbv(0)[16:]) input_udp_dest_port = Signal(intbv(0)[16:]) input_udp_length = Signal(intbv(0)[16:]) input_udp_checksum = Signal(intbv(0)[16:]) input_udp_payload_tdata = Signal(intbv(0)[8:]) input_udp_payload_tvalid = Signal(bool(0)) input_udp_payload_tlast = Signal(bool(0)) input_udp_payload_tuser = Signal(bool(0)) output_ip_payload_tready = Signal(bool(0)) output_ip_hdr_ready = Signal(bool(0)) output_udp_hdr_ready = Signal(bool(0)) output_udp_payload_tready = Signal(bool(0)) # Outputs input_ip_hdr_ready = Signal(bool(0)) input_ip_payload_tready = Signal(bool(0)) input_udp_hdr_ready = Signal(bool(0)) input_udp_payload_tready = Signal(bool(0)) output_ip_hdr_valid = Signal(bool(0)) output_ip_eth_dest_mac = Signal(intbv(0)[48:]) output_ip_eth_src_mac = Signal(intbv(0)[48:]) output_ip_eth_type = Signal(intbv(0)[16:]) output_ip_version = Signal(intbv(0)[4:]) output_ip_ihl = Signal(intbv(0)[4:]) output_ip_dscp = Signal(intbv(0)[6:]) output_ip_ecn = Signal(intbv(0)[2:]) output_ip_length = Signal(intbv(0)[16:]) output_ip_identification = Signal(intbv(0)[16:]) output_ip_flags = Signal(intbv(0)[3:]) output_ip_fragment_offset = Signal(intbv(0)[13:]) output_ip_ttl = Signal(intbv(0)[8:]) output_ip_protocol = Signal(intbv(0)[8:]) output_ip_header_checksum = Signal(intbv(0)[16:]) output_ip_source_ip = Signal(intbv(0)[32:]) output_ip_dest_ip = Signal(intbv(0)[32:]) output_ip_payload_tdata = Signal(intbv(0)[8:]) output_ip_payload_tvalid = Signal(bool(0)) output_ip_payload_tlast = Signal(bool(0)) output_ip_payload_tuser = Signal(bool(0)) output_udp_hdr_valid = Signal(bool(0)) output_udp_eth_dest_mac = Signal(intbv(0)[48:]) output_udp_eth_src_mac = Signal(intbv(0)[48:]) output_udp_eth_type = Signal(intbv(0)[16:]) output_udp_ip_version = Signal(intbv(0)[4:]) output_udp_ip_ihl = Signal(intbv(0)[4:]) output_udp_ip_dscp = Signal(intbv(0)[6:]) output_udp_ip_ecn = Signal(intbv(0)[2:]) output_udp_ip_length = Signal(intbv(0)[16:]) output_udp_ip_identification = Signal(intbv(0)[16:]) output_udp_ip_flags = Signal(intbv(0)[3:]) output_udp_ip_fragment_offset = Signal(intbv(0)[13:]) output_udp_ip_ttl = Signal(intbv(0)[8:]) output_udp_ip_protocol = Signal(intbv(0)[8:]) output_udp_ip_header_checksum = Signal(intbv(0)[16:]) output_udp_ip_source_ip = Signal(intbv(0)[32:]) output_udp_ip_dest_ip = Signal(intbv(0)[32:]) output_udp_source_port = Signal(intbv(0)[16:]) output_udp_dest_port = Signal(intbv(0)[16:]) output_udp_length = Signal(intbv(0)[16:]) output_udp_checksum = Signal(intbv(0)[16:]) output_udp_payload_tdata = Signal(intbv(0)[8:]) output_udp_payload_tvalid = Signal(bool(0)) output_udp_payload_tlast = Signal(bool(0)) output_udp_payload_tuser = Signal(bool(0)) rx_busy = Signal(bool(0)) tx_busy = Signal(bool(0)) rx_error_header_early_termination = Signal(bool(0)) rx_error_payload_early_termination = Signal(bool(0)) tx_error_payload_early_termination = Signal(bool(0)) # sources and sinks ip_source_pause = Signal(bool(0)) ip_sink_pause = Signal(bool(0)) udp_source_pause = Signal(bool(0)) udp_sink_pause = Signal(bool(0)) ip_source = ip_ep.IPFrameSource() ip_source_logic = ip_source.create_logic( clk, rst, ip_hdr_ready=input_ip_hdr_ready, ip_hdr_valid=input_ip_hdr_valid, eth_dest_mac=input_ip_eth_dest_mac, eth_src_mac=input_ip_eth_src_mac, eth_type=input_ip_eth_type, ip_version=input_ip_version, ip_ihl=input_ip_ihl, ip_dscp=input_ip_dscp, ip_ecn=input_ip_ecn, ip_length=input_ip_length, ip_identification=input_ip_identification, ip_flags=input_ip_flags, ip_fragment_offset=input_ip_fragment_offset, ip_ttl=input_ip_ttl, ip_protocol=input_ip_protocol, ip_header_checksum=input_ip_header_checksum, ip_source_ip=input_ip_source_ip, ip_dest_ip=input_ip_dest_ip, ip_payload_tdata=input_ip_payload_tdata, ip_payload_tvalid=input_ip_payload_tvalid, ip_payload_tready=input_ip_payload_tready, ip_payload_tlast=input_ip_payload_tlast, ip_payload_tuser=input_ip_payload_tuser, pause=ip_source_pause, name='ip_source') ip_sink = ip_ep.IPFrameSink() ip_sink_logic = ip_sink.create_logic( clk, rst, ip_hdr_ready=output_ip_hdr_ready, ip_hdr_valid=output_ip_hdr_valid, eth_dest_mac=output_ip_eth_dest_mac, eth_src_mac=output_ip_eth_src_mac, eth_type=output_ip_eth_type, ip_version=output_ip_version, ip_ihl=output_ip_ihl, ip_dscp=output_ip_dscp, ip_ecn=output_ip_ecn, ip_length=output_ip_length, ip_identification=output_ip_identification, ip_flags=output_ip_flags, ip_fragment_offset=output_ip_fragment_offset, ip_ttl=output_ip_ttl, ip_protocol=output_ip_protocol, ip_header_checksum=output_ip_header_checksum, ip_source_ip=output_ip_source_ip, ip_dest_ip=output_ip_dest_ip, ip_payload_tdata=output_ip_payload_tdata, ip_payload_tvalid=output_ip_payload_tvalid, ip_payload_tready=output_ip_payload_tready, ip_payload_tlast=output_ip_payload_tlast, ip_payload_tuser=output_ip_payload_tuser, pause=ip_sink_pause, name='ip_sink') udp_source = udp_ep.UDPFrameSource() udp_source_logic = udp_source.create_logic( clk, rst, udp_hdr_ready=input_udp_hdr_ready, udp_hdr_valid=input_udp_hdr_valid, eth_dest_mac=input_udp_eth_dest_mac, eth_src_mac=input_udp_eth_src_mac, eth_type=input_udp_eth_type, ip_version=input_udp_ip_version, ip_ihl=input_udp_ip_ihl, ip_dscp=input_udp_ip_dscp, ip_ecn=input_udp_ip_ecn, ip_identification=input_udp_ip_identification, ip_flags=input_udp_ip_flags, ip_fragment_offset=input_udp_ip_fragment_offset, ip_ttl=input_udp_ip_ttl, ip_header_checksum=input_udp_ip_header_checksum, ip_source_ip=input_udp_ip_source_ip, ip_dest_ip=input_udp_ip_dest_ip, udp_source_port=input_udp_source_port, udp_dest_port=input_udp_dest_port, udp_length=input_udp_length, udp_checksum=input_udp_checksum, udp_payload_tdata=input_udp_payload_tdata, udp_payload_tvalid=input_udp_payload_tvalid, udp_payload_tready=input_udp_payload_tready, udp_payload_tlast=input_udp_payload_tlast, udp_payload_tuser=input_udp_payload_tuser, pause=udp_source_pause, name='udp_source') udp_sink = udp_ep.UDPFrameSink() udp_sink_logic = udp_sink.create_logic( clk, rst, udp_hdr_ready=output_udp_hdr_ready, udp_hdr_valid=output_udp_hdr_valid, eth_dest_mac=output_udp_eth_dest_mac, eth_src_mac=output_udp_eth_src_mac, eth_type=output_udp_eth_type, ip_version=output_udp_ip_version, ip_ihl=output_udp_ip_ihl, ip_dscp=output_udp_ip_dscp, ip_ecn=output_udp_ip_ecn, ip_length=output_udp_ip_length, ip_identification=output_udp_ip_identification, ip_flags=output_udp_ip_flags, ip_fragment_offset=output_udp_ip_fragment_offset, ip_ttl=output_udp_ip_ttl, ip_protocol=output_udp_ip_protocol, ip_header_checksum=output_udp_ip_header_checksum, ip_source_ip=output_udp_ip_source_ip, ip_dest_ip=output_udp_ip_dest_ip, udp_source_port=output_udp_source_port, udp_dest_port=output_udp_dest_port, udp_length=output_udp_length, udp_checksum=output_udp_checksum, udp_payload_tdata=output_udp_payload_tdata, udp_payload_tvalid=output_udp_payload_tvalid, udp_payload_tready=output_udp_payload_tready, udp_payload_tlast=output_udp_payload_tlast, udp_payload_tuser=output_udp_payload_tuser, pause=udp_sink_pause, name='udp_sink') # DUT if os.system(build_cmd): raise Exception("Error running build command") dut = Cosimulation( "vvp -m myhdl %s.vvp -lxt2" % testbench, clk=clk, rst=rst, current_test=current_test, input_ip_hdr_valid=input_ip_hdr_valid, input_ip_hdr_ready=input_ip_hdr_ready, input_ip_eth_dest_mac=input_ip_eth_dest_mac, input_ip_eth_src_mac=input_ip_eth_src_mac, input_ip_eth_type=input_ip_eth_type, input_ip_version=input_ip_version, input_ip_ihl=input_ip_ihl, input_ip_dscp=input_ip_dscp, input_ip_ecn=input_ip_ecn, input_ip_length=input_ip_length, input_ip_identification=input_ip_identification, input_ip_flags=input_ip_flags, input_ip_fragment_offset=input_ip_fragment_offset, input_ip_ttl=input_ip_ttl, input_ip_protocol=input_ip_protocol, input_ip_header_checksum=input_ip_header_checksum, input_ip_source_ip=input_ip_source_ip, input_ip_dest_ip=input_ip_dest_ip, input_ip_payload_tdata=input_ip_payload_tdata, input_ip_payload_tvalid=input_ip_payload_tvalid, input_ip_payload_tready=input_ip_payload_tready, input_ip_payload_tlast=input_ip_payload_tlast, input_ip_payload_tuser=input_ip_payload_tuser, output_ip_hdr_valid=output_ip_hdr_valid, output_ip_hdr_ready=output_ip_hdr_ready, output_ip_eth_dest_mac=output_ip_eth_dest_mac, output_ip_eth_src_mac=output_ip_eth_src_mac, output_ip_eth_type=output_ip_eth_type, output_ip_version=output_ip_version, output_ip_ihl=output_ip_ihl, output_ip_dscp=output_ip_dscp, output_ip_ecn=output_ip_ecn, output_ip_length=output_ip_length, output_ip_identification=output_ip_identification, output_ip_flags=output_ip_flags, output_ip_fragment_offset=output_ip_fragment_offset, output_ip_ttl=output_ip_ttl, output_ip_protocol=output_ip_protocol, output_ip_header_checksum=output_ip_header_checksum, output_ip_source_ip=output_ip_source_ip, output_ip_dest_ip=output_ip_dest_ip, output_ip_payload_tdata=output_ip_payload_tdata, output_ip_payload_tvalid=output_ip_payload_tvalid, output_ip_payload_tready=output_ip_payload_tready, output_ip_payload_tlast=output_ip_payload_tlast, output_ip_payload_tuser=output_ip_payload_tuser, input_udp_hdr_valid=input_udp_hdr_valid, input_udp_hdr_ready=input_udp_hdr_ready, input_udp_eth_dest_mac=input_udp_eth_dest_mac, input_udp_eth_src_mac=input_udp_eth_src_mac, input_udp_eth_type=input_udp_eth_type, input_udp_ip_version=input_udp_ip_version, input_udp_ip_ihl=input_udp_ip_ihl, input_udp_ip_dscp=input_udp_ip_dscp, input_udp_ip_ecn=input_udp_ip_ecn, input_udp_ip_identification=input_udp_ip_identification, input_udp_ip_flags=input_udp_ip_flags, input_udp_ip_fragment_offset=input_udp_ip_fragment_offset, input_udp_ip_ttl=input_udp_ip_ttl, input_udp_ip_header_checksum=input_udp_ip_header_checksum, input_udp_ip_source_ip=input_udp_ip_source_ip, input_udp_ip_dest_ip=input_udp_ip_dest_ip, input_udp_source_port=input_udp_source_port, input_udp_dest_port=input_udp_dest_port, input_udp_length=input_udp_length, input_udp_checksum=input_udp_checksum, input_udp_payload_tdata=input_udp_payload_tdata, input_udp_payload_tvalid=input_udp_payload_tvalid, input_udp_payload_tready=input_udp_payload_tready, input_udp_payload_tlast=input_udp_payload_tlast, input_udp_payload_tuser=input_udp_payload_tuser, output_udp_hdr_valid=output_udp_hdr_valid, output_udp_hdr_ready=output_udp_hdr_ready, output_udp_eth_dest_mac=output_udp_eth_dest_mac, output_udp_eth_src_mac=output_udp_eth_src_mac, output_udp_eth_type=output_udp_eth_type, output_udp_ip_version=output_udp_ip_version, output_udp_ip_ihl=output_udp_ip_ihl, output_udp_ip_dscp=output_udp_ip_dscp, output_udp_ip_ecn=output_udp_ip_ecn, output_udp_ip_length=output_udp_ip_length, output_udp_ip_identification=output_udp_ip_identification, output_udp_ip_flags=output_udp_ip_flags, output_udp_ip_fragment_offset=output_udp_ip_fragment_offset, output_udp_ip_ttl=output_udp_ip_ttl, output_udp_ip_protocol=output_udp_ip_protocol, output_udp_ip_header_checksum=output_udp_ip_header_checksum, output_udp_ip_source_ip=output_udp_ip_source_ip, output_udp_ip_dest_ip=output_udp_ip_dest_ip, output_udp_source_port=output_udp_source_port, output_udp_dest_port=output_udp_dest_port, output_udp_length=output_udp_length, output_udp_checksum=output_udp_checksum, output_udp_payload_tdata=output_udp_payload_tdata, output_udp_payload_tvalid=output_udp_payload_tvalid, output_udp_payload_tready=output_udp_payload_tready, output_udp_payload_tlast=output_udp_payload_tlast, output_udp_payload_tuser=output_udp_payload_tuser, rx_busy=rx_busy, tx_busy=tx_busy, rx_error_header_early_termination=rx_error_header_early_termination, rx_error_payload_early_termination=rx_error_payload_early_termination, tx_error_payload_early_termination=tx_error_payload_early_termination) @always(delay(4)) def clkgen(): clk.next = not clk rx_error_header_early_termination_asserted = Signal(bool(0)) rx_error_payload_early_termination_asserted = Signal(bool(0)) tx_error_payload_early_termination_asserted = Signal(bool(0)) @always(clk.posedge) def monitor(): if (rx_error_header_early_termination): rx_error_header_early_termination_asserted.next = 1 if (rx_error_payload_early_termination): rx_error_payload_early_termination_asserted.next = 1 if (tx_error_payload_early_termination): tx_error_payload_early_termination_asserted.next = 1 @instance 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 print("test 1: test UDP RX packet") current_test.next = 1 test_frame = udp_ep.UDPFrame() test_frame.eth_dest_mac = 0x5A5152535455 test_frame.eth_src_mac = 0xDAD1D2D3D4D5 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80165 test_frame.ip_dest_ip = 0xc0a80164 test_frame.udp_source_port = 1234 test_frame.udp_dest_port = 5678 test_frame.payload = bytearray(range(32)) test_frame.build() ip_frame = test_frame.build_ip() ip_source.send(ip_frame) yield udp_sink.wait() rx_frame = udp_sink.recv() assert rx_frame == test_frame assert ip_source.empty() assert ip_sink.empty() assert udp_source.empty() assert udp_sink.empty() yield delay(100) yield clk.posedge print("test 2: test UDP TX packet") current_test.next = 2 test_frame = udp_ep.UDPFrame() test_frame.eth_dest_mac = 0x5A5152535455 test_frame.eth_src_mac = 0xDAD1D2D3D4D5 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80165 test_frame.ip_dest_ip = 0xc0a80164 test_frame.udp_source_port = 1234 test_frame.udp_dest_port = 5678 test_frame.payload = bytearray(range(32)) test_frame.build() udp_source.send(test_frame) yield ip_sink.wait() rx_frame = ip_sink.recv() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame assert ip_source.empty() assert ip_sink.empty() assert udp_source.empty() assert udp_sink.empty() yield delay(100) raise StopSimulation return instances()
def bench(): # Inputs clk = Signal(bool(0)) rst = Signal(bool(0)) current_test = Signal(intbv(0)[8:]) input_eth_hdr_valid = Signal(bool(0)) input_eth_dest_mac = Signal(intbv(0)[48:]) input_eth_src_mac = Signal(intbv(0)[48:]) input_eth_type = Signal(intbv(0)[16:]) input_eth_payload_tdata = Signal(intbv(0)[64:]) input_eth_payload_tkeep = Signal(intbv(0)[8:]) input_eth_payload_tvalid = Signal(bool(0)) input_eth_payload_tlast = Signal(bool(0)) input_eth_payload_tuser = Signal(bool(0)) input_ip_hdr_valid = Signal(bool(0)) input_ip_dscp = Signal(intbv(0)[6:]) input_ip_ecn = Signal(intbv(0)[2:]) input_ip_length = Signal(intbv(0)[16:]) input_ip_ttl = Signal(intbv(0)[8:]) input_ip_protocol = Signal(intbv(0)[8:]) input_ip_source_ip = Signal(intbv(0)[32:]) input_ip_dest_ip = Signal(intbv(0)[32:]) input_ip_payload_tdata = Signal(intbv(0)[64:]) input_ip_payload_tkeep = Signal(intbv(0)[8:]) input_ip_payload_tvalid = Signal(bool(0)) input_ip_payload_tlast = Signal(bool(0)) input_ip_payload_tuser = Signal(bool(0)) input_udp_hdr_valid = Signal(bool(0)) input_udp_ip_dscp = Signal(intbv(0)[6:]) input_udp_ip_ecn = Signal(intbv(0)[2:]) input_udp_ip_ttl = Signal(intbv(0)[8:]) input_udp_ip_source_ip = Signal(intbv(0)[32:]) input_udp_ip_dest_ip = Signal(intbv(0)[32:]) input_udp_source_port = Signal(intbv(0)[16:]) input_udp_dest_port = Signal(intbv(0)[16:]) input_udp_length = Signal(intbv(0)[16:]) input_udp_checksum = Signal(intbv(0)[16:]) input_udp_payload_tdata = Signal(intbv(0)[64:]) input_udp_payload_tkeep = Signal(intbv(0)[8:]) input_udp_payload_tvalid = Signal(bool(0)) input_udp_payload_tlast = Signal(bool(0)) input_udp_payload_tuser = Signal(bool(0)) output_eth_payload_tready = Signal(bool(0)) output_eth_hdr_ready = Signal(bool(0)) output_ip_hdr_ready = Signal(bool(0)) output_ip_payload_tready = Signal(bool(0)) output_udp_hdr_ready = Signal(bool(0)) output_udp_payload_tready = Signal(bool(0)) # Outputs input_eth_hdr_ready = Signal(bool(0)) input_eth_payload_tready = Signal(bool(0)) input_ip_hdr_ready = Signal(bool(0)) input_ip_payload_tready = Signal(bool(0)) input_udp_hdr_ready = Signal(bool(0)) input_udp_payload_tready = Signal(bool(0)) output_eth_hdr_valid = Signal(bool(0)) output_eth_dest_mac = Signal(intbv(0)[48:]) output_eth_src_mac = Signal(intbv(0)[48:]) output_eth_type = Signal(intbv(0)[16:]) output_eth_payload_tdata = Signal(intbv(0)[64:]) output_eth_payload_tkeep = Signal(intbv(0)[8:]) output_eth_payload_tvalid = Signal(bool(0)) output_eth_payload_tlast = Signal(bool(0)) output_eth_payload_tuser = Signal(bool(0)) output_ip_hdr_valid = Signal(bool(0)) output_ip_eth_dest_mac = Signal(intbv(0)[48:]) output_ip_eth_src_mac = Signal(intbv(0)[48:]) output_ip_eth_type = Signal(intbv(0)[16:]) output_ip_version = Signal(intbv(0)[4:]) output_ip_ihl = Signal(intbv(0)[4:]) output_ip_dscp = Signal(intbv(0)[6:]) output_ip_ecn = Signal(intbv(0)[2:]) output_ip_length = Signal(intbv(0)[16:]) output_ip_identification = Signal(intbv(0)[16:]) output_ip_flags = Signal(intbv(0)[3:]) output_ip_fragment_offset = Signal(intbv(0)[13:]) output_ip_ttl = Signal(intbv(0)[8:]) output_ip_protocol = Signal(intbv(0)[8:]) output_ip_header_checksum = Signal(intbv(0)[16:]) output_ip_source_ip = Signal(intbv(0)[32:]) output_ip_dest_ip = Signal(intbv(0)[32:]) output_ip_payload_tdata = Signal(intbv(0)[64:]) output_ip_payload_tkeep = Signal(intbv(0)[8:]) output_ip_payload_tvalid = Signal(bool(0)) output_ip_payload_tlast = Signal(bool(0)) output_ip_payload_tuser = Signal(bool(0)) output_udp_hdr_valid = Signal(bool(0)) output_udp_eth_dest_mac = Signal(intbv(0)[48:]) output_udp_eth_src_mac = Signal(intbv(0)[48:]) output_udp_eth_type = Signal(intbv(0)[16:]) output_udp_ip_version = Signal(intbv(0)[4:]) output_udp_ip_ihl = Signal(intbv(0)[4:]) output_udp_ip_dscp = Signal(intbv(0)[6:]) output_udp_ip_ecn = Signal(intbv(0)[2:]) output_udp_ip_length = Signal(intbv(0)[16:]) output_udp_ip_identification = Signal(intbv(0)[16:]) output_udp_ip_flags = Signal(intbv(0)[3:]) output_udp_ip_fragment_offset = Signal(intbv(0)[13:]) output_udp_ip_ttl = Signal(intbv(0)[8:]) output_udp_ip_protocol = Signal(intbv(0)[8:]) output_udp_ip_header_checksum = Signal(intbv(0)[16:]) output_udp_ip_source_ip = Signal(intbv(0)[32:]) output_udp_ip_dest_ip = Signal(intbv(0)[32:]) output_udp_source_port = Signal(intbv(0)[16:]) output_udp_dest_port = Signal(intbv(0)[16:]) output_udp_length = Signal(intbv(0)[16:]) output_udp_checksum = Signal(intbv(0)[16:]) output_udp_payload_tdata = Signal(intbv(0)[64:]) output_udp_payload_tkeep = Signal(intbv(0)[8:]) output_udp_payload_tvalid = Signal(bool(0)) output_udp_payload_tlast = Signal(bool(0)) output_udp_payload_tuser = Signal(bool(0)) ip_rx_busy = Signal(bool(0)) ip_tx_busy = Signal(bool(0)) udp_rx_busy = Signal(bool(0)) udp_tx_busy = Signal(bool(0)) ip_rx_error_header_early_termination = Signal(bool(0)) ip_rx_error_payload_early_termination = Signal(bool(0)) ip_rx_error_invalid_header = Signal(bool(0)) ip_rx_error_invalid_checksum = Signal(bool(0)) ip_tx_error_payload_early_termination = Signal(bool(0)) ip_tx_error_arp_failed = Signal(bool(0)) udp_rx_error_header_early_termination = Signal(bool(0)) udp_rx_error_payload_early_termination = Signal(bool(0)) udp_tx_error_payload_early_termination = Signal(bool(0)) local_mac = Signal(intbv(0)[48:]) local_ip = Signal(intbv(0)[32:]) gateway_ip = Signal(intbv(0)[32:]) subnet_mask = Signal(intbv(0)[32:]) clear_arp_cache = Signal(bool(0)) # sources and sinks eth_source_queue = Queue() eth_source_pause = Signal(bool(0)) eth_sink_queue = Queue() eth_sink_pause = Signal(bool(0)) ip_source_queue = Queue() ip_source_pause = Signal(bool(0)) ip_sink_queue = Queue() ip_sink_pause = Signal(bool(0)) udp_source_queue = Queue() udp_source_pause = Signal(bool(0)) udp_sink_queue = Queue() udp_sink_pause = Signal(bool(0)) eth_source = eth_ep.EthFrameSource( clk, rst, eth_hdr_ready=input_eth_hdr_ready, eth_hdr_valid=input_eth_hdr_valid, eth_dest_mac=input_eth_dest_mac, eth_src_mac=input_eth_src_mac, eth_type=input_eth_type, eth_payload_tdata=input_eth_payload_tdata, eth_payload_tkeep=input_eth_payload_tkeep, eth_payload_tvalid=input_eth_payload_tvalid, eth_payload_tready=input_eth_payload_tready, eth_payload_tlast=input_eth_payload_tlast, eth_payload_tuser=input_eth_payload_tuser, fifo=eth_source_queue, pause=eth_source_pause, name='eth_source') eth_sink = eth_ep.EthFrameSink( clk, rst, eth_hdr_ready=output_eth_hdr_ready, eth_hdr_valid=output_eth_hdr_valid, eth_dest_mac=output_eth_dest_mac, eth_src_mac=output_eth_src_mac, eth_type=output_eth_type, eth_payload_tdata=output_eth_payload_tdata, eth_payload_tkeep=output_eth_payload_tkeep, eth_payload_tvalid=output_eth_payload_tvalid, eth_payload_tready=output_eth_payload_tready, eth_payload_tlast=output_eth_payload_tlast, eth_payload_tuser=output_eth_payload_tuser, fifo=eth_sink_queue, pause=eth_sink_pause, name='eth_sink') ip_source = ip_ep.IPFrameSource(clk, rst, ip_hdr_valid=input_ip_hdr_valid, ip_hdr_ready=input_ip_hdr_ready, ip_dscp=input_ip_dscp, ip_ecn=input_ip_ecn, ip_length=input_ip_length, ip_ttl=input_ip_ttl, ip_protocol=input_ip_protocol, ip_source_ip=input_ip_source_ip, ip_dest_ip=input_ip_dest_ip, ip_payload_tdata=input_ip_payload_tdata, ip_payload_tkeep=input_ip_payload_tkeep, ip_payload_tvalid=input_ip_payload_tvalid, ip_payload_tready=input_ip_payload_tready, ip_payload_tlast=input_ip_payload_tlast, ip_payload_tuser=input_ip_payload_tuser, fifo=ip_source_queue, pause=ip_source_pause, name='ip_source') ip_sink = ip_ep.IPFrameSink(clk, rst, ip_hdr_ready=output_ip_hdr_ready, ip_hdr_valid=output_ip_hdr_valid, eth_dest_mac=output_ip_eth_dest_mac, eth_src_mac=output_ip_eth_src_mac, eth_type=output_ip_eth_type, ip_version=output_ip_version, ip_ihl=output_ip_ihl, ip_dscp=output_ip_dscp, ip_ecn=output_ip_ecn, ip_length=output_ip_length, ip_identification=output_ip_identification, ip_flags=output_ip_flags, ip_fragment_offset=output_ip_fragment_offset, ip_ttl=output_ip_ttl, ip_protocol=output_ip_protocol, ip_header_checksum=output_ip_header_checksum, ip_source_ip=output_ip_source_ip, ip_dest_ip=output_ip_dest_ip, ip_payload_tdata=output_ip_payload_tdata, ip_payload_tkeep=output_ip_payload_tkeep, ip_payload_tvalid=output_ip_payload_tvalid, ip_payload_tready=output_ip_payload_tready, ip_payload_tlast=output_ip_payload_tlast, ip_payload_tuser=output_ip_payload_tuser, fifo=ip_sink_queue, pause=ip_sink_pause, name='ip_sink') udp_source = udp_ep.UDPFrameSource( clk, rst, udp_hdr_valid=input_udp_hdr_valid, udp_hdr_ready=input_udp_hdr_ready, ip_dscp=input_udp_ip_dscp, ip_ecn=input_udp_ip_ecn, ip_ttl=input_udp_ip_ttl, ip_source_ip=input_udp_ip_source_ip, ip_dest_ip=input_udp_ip_dest_ip, udp_source_port=input_udp_source_port, udp_dest_port=input_udp_dest_port, udp_length=input_udp_length, udp_checksum=input_udp_checksum, udp_payload_tdata=input_udp_payload_tdata, udp_payload_tkeep=input_udp_payload_tkeep, udp_payload_tvalid=input_udp_payload_tvalid, udp_payload_tready=input_udp_payload_tready, udp_payload_tlast=input_udp_payload_tlast, udp_payload_tuser=input_udp_payload_tuser, fifo=udp_source_queue, pause=udp_source_pause, name='udp_source') udp_sink = udp_ep.UDPFrameSink( clk, rst, udp_hdr_ready=output_udp_hdr_ready, udp_hdr_valid=output_udp_hdr_valid, eth_dest_mac=output_udp_eth_dest_mac, eth_src_mac=output_udp_eth_src_mac, eth_type=output_udp_eth_type, ip_version=output_udp_ip_version, ip_ihl=output_udp_ip_ihl, ip_dscp=output_udp_ip_dscp, ip_ecn=output_udp_ip_ecn, ip_length=output_udp_ip_length, ip_identification=output_udp_ip_identification, ip_flags=output_udp_ip_flags, ip_fragment_offset=output_udp_ip_fragment_offset, ip_ttl=output_udp_ip_ttl, ip_protocol=output_udp_ip_protocol, ip_header_checksum=output_udp_ip_header_checksum, ip_source_ip=output_udp_ip_source_ip, ip_dest_ip=output_udp_ip_dest_ip, udp_source_port=output_udp_source_port, udp_dest_port=output_udp_dest_port, udp_length=output_udp_length, udp_checksum=output_udp_checksum, udp_payload_tdata=output_udp_payload_tdata, udp_payload_tkeep=output_udp_payload_tkeep, udp_payload_tvalid=output_udp_payload_tvalid, udp_payload_tready=output_udp_payload_tready, udp_payload_tlast=output_udp_payload_tlast, udp_payload_tuser=output_udp_payload_tuser, fifo=udp_sink_queue, pause=udp_sink_pause, name='udp_sink') # DUT dut = dut_udp_complete( clk, rst, current_test, input_eth_hdr_valid, input_eth_hdr_ready, input_eth_dest_mac, input_eth_src_mac, input_eth_type, input_eth_payload_tdata, input_eth_payload_tkeep, input_eth_payload_tvalid, input_eth_payload_tready, input_eth_payload_tlast, input_eth_payload_tuser, output_eth_hdr_valid, output_eth_hdr_ready, output_eth_dest_mac, output_eth_src_mac, output_eth_type, output_eth_payload_tdata, output_eth_payload_tkeep, output_eth_payload_tvalid, output_eth_payload_tready, output_eth_payload_tlast, output_eth_payload_tuser, input_ip_hdr_valid, input_ip_hdr_ready, input_ip_dscp, input_ip_ecn, input_ip_length, input_ip_ttl, input_ip_protocol, input_ip_source_ip, input_ip_dest_ip, input_ip_payload_tdata, input_ip_payload_tkeep, input_ip_payload_tvalid, input_ip_payload_tready, input_ip_payload_tlast, input_ip_payload_tuser, output_ip_hdr_valid, output_ip_hdr_ready, output_ip_eth_dest_mac, output_ip_eth_src_mac, output_ip_eth_type, output_ip_version, output_ip_ihl, output_ip_dscp, output_ip_ecn, output_ip_length, output_ip_identification, output_ip_flags, output_ip_fragment_offset, output_ip_ttl, output_ip_protocol, output_ip_header_checksum, output_ip_source_ip, output_ip_dest_ip, output_ip_payload_tdata, output_ip_payload_tkeep, output_ip_payload_tvalid, output_ip_payload_tready, output_ip_payload_tlast, output_ip_payload_tuser, input_udp_hdr_valid, input_udp_hdr_ready, input_udp_ip_dscp, input_udp_ip_ecn, input_udp_ip_ttl, input_udp_ip_source_ip, input_udp_ip_dest_ip, input_udp_source_port, input_udp_dest_port, input_udp_length, input_udp_checksum, input_udp_payload_tdata, input_udp_payload_tkeep, input_udp_payload_tvalid, input_udp_payload_tready, input_udp_payload_tlast, input_udp_payload_tuser, output_udp_hdr_valid, output_udp_hdr_ready, output_udp_eth_dest_mac, output_udp_eth_src_mac, output_udp_eth_type, output_udp_ip_version, output_udp_ip_ihl, output_udp_ip_dscp, output_udp_ip_ecn, output_udp_ip_length, output_udp_ip_identification, output_udp_ip_flags, output_udp_ip_fragment_offset, output_udp_ip_ttl, output_udp_ip_protocol, output_udp_ip_header_checksum, output_udp_ip_source_ip, output_udp_ip_dest_ip, output_udp_source_port, output_udp_dest_port, output_udp_length, output_udp_checksum, output_udp_payload_tdata, output_udp_payload_tkeep, output_udp_payload_tvalid, output_udp_payload_tready, output_udp_payload_tlast, output_udp_payload_tuser, ip_rx_busy, ip_tx_busy, udp_rx_busy, udp_tx_busy, ip_rx_error_header_early_termination, ip_rx_error_payload_early_termination, ip_rx_error_invalid_header, ip_rx_error_invalid_checksum, ip_tx_error_payload_early_termination, ip_tx_error_arp_failed, udp_rx_error_header_early_termination, udp_rx_error_payload_early_termination, udp_tx_error_payload_early_termination, local_mac, local_ip, gateway_ip, subnet_mask, clear_arp_cache) @always(delay(4)) def clkgen(): clk.next = not clk ip_rx_error_header_early_termination_asserted = Signal(bool(0)) ip_rx_error_payload_early_termination_asserted = Signal(bool(0)) ip_rx_error_invalid_header_asserted = Signal(bool(0)) ip_rx_error_invalid_checksum_asserted = Signal(bool(0)) ip_tx_error_payload_early_termination_asserted = Signal(bool(0)) ip_tx_error_arp_failed_asserted = Signal(bool(0)) udp_rx_error_header_early_termination_asserted = Signal(bool(0)) udp_rx_error_payload_early_termination_asserted = Signal(bool(0)) udp_tx_error_payload_early_termination_asserted = Signal(bool(0)) @always(clk.posedge) def monitor(): if (ip_rx_error_header_early_termination): ip_rx_error_header_early_termination_asserted.next = 1 if (ip_rx_error_payload_early_termination): ip_rx_error_payload_early_termination_asserted.next = 1 if (ip_rx_error_invalid_header): ip_rx_error_invalid_header_asserted.next = 1 if (ip_rx_error_invalid_checksum): ip_rx_error_invalid_checksum_asserted.next = 1 if (ip_tx_error_payload_early_termination): ip_tx_error_payload_early_termination_asserted.next = 1 if (ip_tx_error_arp_failed): ip_tx_error_arp_failed_asserted.next = 1 if (udp_rx_error_header_early_termination): udp_rx_error_header_early_termination_asserted.next = 1 if (udp_rx_error_payload_early_termination): udp_rx_error_payload_early_termination_asserted.next = 1 if (udp_tx_error_payload_early_termination): udp_tx_error_payload_early_termination_asserted.next = 1 def wait_normal(): while (input_eth_payload_tvalid or input_ip_payload_tvalid or input_udp_payload_tvalid or output_eth_payload_tvalid or output_ip_payload_tvalid or output_udp_payload_tvalid or input_eth_hdr_valid or input_ip_hdr_valid or input_udp_hdr_valid): yield clk.posedge @instance 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 # set MAC and IP address local_mac.next = 0x5A5152535455 local_ip.next = 0xc0a80164 gateway_ip.next = 0xc0a80101 subnet_mask.next = 0xffffff00 yield clk.posedge print("test 1: test IP RX packet") current_test.next = 1 test_frame = ip_ep.IPFrame() test_frame.eth_dest_mac = 0x5A5152535455 test_frame.eth_src_mac = 0xDAD1D2D3D4D5 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x10 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80165 test_frame.ip_dest_ip = 0xc0a80164 test_frame.payload = bytearray(range(32)) test_frame.build() eth_frame = test_frame.build_eth() eth_source_queue.put(eth_frame) yield clk.posedge yield clk.posedge yield wait_normal() yield clk.posedge yield clk.posedge rx_frame = ip_sink_queue.get(False) assert rx_frame == test_frame assert eth_source_queue.empty() assert eth_sink_queue.empty() assert ip_source_queue.empty() assert ip_sink_queue.empty() yield delay(100) yield clk.posedge print("test 2: test IP TX packet") current_test.next = 2 # send IP packet test_frame = ip_ep.IPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x10 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80164 test_frame.ip_dest_ip = 0xc0a80166 test_frame.payload = bytearray(range(32)) test_frame.build() ip_source_queue.put(test_frame) # wait for ARP request packet while eth_sink_queue.empty(): yield clk.posedge rx_frame = eth_sink_queue.get(False) check_frame = arp_ep.ARPFrame() check_frame.parse_eth(rx_frame) assert check_frame.eth_dest_mac == 0xFFFFFFFFFFFF assert check_frame.eth_src_mac == 0x5A5152535455 assert check_frame.eth_type == 0x0806 assert check_frame.arp_htype == 0x0001 assert check_frame.arp_ptype == 0x0800 assert check_frame.arp_hlen == 6 assert check_frame.arp_plen == 4 assert check_frame.arp_oper == 1 assert check_frame.arp_sha == 0x5A5152535455 assert check_frame.arp_spa == 0xc0a80164 assert check_frame.arp_tha == 0x000000000000 assert check_frame.arp_tpa == 0xc0a80166 # generate response arp_frame = arp_ep.ARPFrame() arp_frame.eth_dest_mac = 0x5A5152535455 arp_frame.eth_src_mac = 0xDAD1D2D3D4D5 arp_frame.eth_type = 0x0806 arp_frame.arp_htype = 0x0001 arp_frame.arp_ptype = 0x0800 arp_frame.arp_hlen = 6 arp_frame.arp_plen = 4 arp_frame.arp_oper = 2 arp_frame.arp_sha = 0xDAD1D2D3D4D5 arp_frame.arp_spa = 0xc0a80166 arp_frame.arp_tha = 0x5A5152535455 arp_frame.arp_tpa = 0xc0a80164 eth_source_queue.put(arp_frame.build_eth()) yield clk.posedge yield clk.posedge yield wait_normal() yield clk.posedge yield clk.posedge rx_frame = eth_sink_queue.get(False) check_frame = ip_ep.IPFrame() check_frame.parse_eth(rx_frame) print(test_frame) print(check_frame) assert check_frame == test_frame assert eth_source_queue.empty() assert eth_sink_queue.empty() assert ip_source_queue.empty() assert ip_sink_queue.empty() yield delay(100) yield clk.posedge print("test 3: test IP TX arp fail packet") current_test.next = 2 ip_tx_error_arp_failed_asserted.next = 0 test_frame = ip_ep.IPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x10 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80164 test_frame.ip_dest_ip = 0xc0a80167 test_frame.payload = bytearray(range(32)) test_frame.build() ip_source_queue.put(test_frame) yield clk.posedge yield clk.posedge yield wait_normal() yield clk.posedge yield clk.posedge assert ip_tx_error_arp_failed_asserted # check for 4 ARP requests assert eth_sink_queue.qsize() == 4 while not eth_sink_queue.empty(): rx_frame = eth_sink_queue.get(False) check_frame = arp_ep.ARPFrame() check_frame.parse_eth(rx_frame) assert check_frame.eth_dest_mac == 0xFFFFFFFFFFFF assert check_frame.eth_src_mac == 0x5A5152535455 assert check_frame.eth_type == 0x0806 assert check_frame.arp_htype == 0x0001 assert check_frame.arp_ptype == 0x0800 assert check_frame.arp_hlen == 6 assert check_frame.arp_plen == 4 assert check_frame.arp_oper == 1 assert check_frame.arp_sha == 0x5A5152535455 assert check_frame.arp_spa == 0xc0a80164 assert check_frame.arp_tha == 0x000000000000 assert check_frame.arp_tpa == 0xc0a80167 assert eth_source_queue.empty() assert eth_sink_queue.empty() assert ip_source_queue.empty() assert ip_sink_queue.empty() yield delay(100) yield clk.posedge print("test 4: test UDP RX packet") current_test.next = 4 test_frame = udp_ep.UDPFrame() test_frame.eth_dest_mac = 0x5A5152535455 test_frame.eth_src_mac = 0xDAD1D2D3D4D5 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80165 test_frame.ip_dest_ip = 0xc0a80164 test_frame.udp_source_port = 1234 test_frame.udp_dest_port = 5678 test_frame.payload = bytearray(range(32)) test_frame.build() eth_frame = test_frame.build_eth() eth_source_queue.put(eth_frame) yield clk.posedge yield clk.posedge yield wait_normal() yield clk.posedge yield clk.posedge rx_frame = None if not udp_sink_queue.empty(): rx_frame = udp_sink_queue.get() assert rx_frame == test_frame assert eth_source_queue.empty() assert eth_sink_queue.empty() assert udp_source_queue.empty() assert udp_sink_queue.empty() yield delay(100) yield clk.posedge print("test 5: test UDP TX packet") current_test.next = 5 test_frame = udp_ep.UDPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80164 test_frame.ip_dest_ip = 0xc0a80166 test_frame.udp_source_port = 1234 test_frame.udp_dest_port = 5678 test_frame.payload = bytearray(range(32)) test_frame.build() udp_source_queue.put(test_frame) yield clk.posedge yield clk.posedge yield wait_normal() yield clk.posedge yield clk.posedge rx_frame = None if not eth_sink_queue.empty(): rx_frame = eth_sink_queue.get() check_frame = udp_ep.UDPFrame() check_frame.parse_eth(rx_frame) assert check_frame == test_frame assert eth_source_queue.empty() assert eth_sink_queue.empty() assert udp_source_queue.empty() assert udp_sink_queue.empty() yield delay(100) raise StopSimulation return dut, eth_source, eth_sink, ip_source, ip_sink, udp_source, udp_sink, clkgen, monitor, check
def bench(): # Inputs clk = Signal(bool(0)) rst = Signal(bool(0)) current_test = Signal(intbv(0)[8:]) input_0_ip_hdr_valid = Signal(bool(0)) input_0_eth_dest_mac = Signal(intbv(0)[48:]) input_0_eth_src_mac = Signal(intbv(0)[48:]) input_0_eth_type = Signal(intbv(0)[16:]) input_0_ip_version = Signal(intbv(0)[4:]) input_0_ip_ihl = Signal(intbv(0)[4:]) input_0_ip_dscp = Signal(intbv(0)[6:]) input_0_ip_ecn = Signal(intbv(0)[2:]) input_0_ip_length = Signal(intbv(0)[16:]) input_0_ip_identification = Signal(intbv(0)[16:]) input_0_ip_flags = Signal(intbv(0)[3:]) input_0_ip_fragment_offset = Signal(intbv(0)[13:]) input_0_ip_ttl = Signal(intbv(0)[8:]) input_0_ip_protocol = Signal(intbv(0)[8:]) input_0_ip_header_checksum = Signal(intbv(0)[16:]) input_0_ip_source_ip = Signal(intbv(0)[32:]) input_0_ip_dest_ip = Signal(intbv(0)[32:]) input_0_ip_payload_tdata = Signal(intbv(0)[64:]) input_0_ip_payload_tkeep = Signal(intbv(0)[8:]) input_0_ip_payload_tvalid = Signal(bool(0)) input_0_ip_payload_tlast = Signal(bool(0)) input_0_ip_payload_tuser = Signal(bool(0)) input_1_ip_hdr_valid = Signal(bool(0)) input_1_eth_dest_mac = Signal(intbv(0)[48:]) input_1_eth_src_mac = Signal(intbv(0)[48:]) input_1_eth_type = Signal(intbv(0)[16:]) input_1_ip_version = Signal(intbv(0)[4:]) input_1_ip_ihl = Signal(intbv(0)[4:]) input_1_ip_dscp = Signal(intbv(0)[6:]) input_1_ip_ecn = Signal(intbv(0)[2:]) input_1_ip_length = Signal(intbv(0)[16:]) input_1_ip_identification = Signal(intbv(0)[16:]) input_1_ip_flags = Signal(intbv(0)[3:]) input_1_ip_fragment_offset = Signal(intbv(0)[13:]) input_1_ip_ttl = Signal(intbv(0)[8:]) input_1_ip_protocol = Signal(intbv(0)[8:]) input_1_ip_header_checksum = Signal(intbv(0)[16:]) input_1_ip_source_ip = Signal(intbv(0)[32:]) input_1_ip_dest_ip = Signal(intbv(0)[32:]) input_1_ip_payload_tdata = Signal(intbv(0)[64:]) input_1_ip_payload_tkeep = Signal(intbv(0)[8:]) input_1_ip_payload_tvalid = Signal(bool(0)) input_1_ip_payload_tlast = Signal(bool(0)) input_1_ip_payload_tuser = Signal(bool(0)) input_2_ip_hdr_valid = Signal(bool(0)) input_2_eth_dest_mac = Signal(intbv(0)[48:]) input_2_eth_src_mac = Signal(intbv(0)[48:]) input_2_eth_type = Signal(intbv(0)[16:]) input_2_ip_version = Signal(intbv(0)[4:]) input_2_ip_ihl = Signal(intbv(0)[4:]) input_2_ip_dscp = Signal(intbv(0)[6:]) input_2_ip_ecn = Signal(intbv(0)[2:]) input_2_ip_length = Signal(intbv(0)[16:]) input_2_ip_identification = Signal(intbv(0)[16:]) input_2_ip_flags = Signal(intbv(0)[3:]) input_2_ip_fragment_offset = Signal(intbv(0)[13:]) input_2_ip_ttl = Signal(intbv(0)[8:]) input_2_ip_protocol = Signal(intbv(0)[8:]) input_2_ip_header_checksum = Signal(intbv(0)[16:]) input_2_ip_source_ip = Signal(intbv(0)[32:]) input_2_ip_dest_ip = Signal(intbv(0)[32:]) input_2_ip_payload_tdata = Signal(intbv(0)[64:]) input_2_ip_payload_tkeep = Signal(intbv(0)[8:]) input_2_ip_payload_tvalid = Signal(bool(0)) input_2_ip_payload_tlast = Signal(bool(0)) input_2_ip_payload_tuser = Signal(bool(0)) input_3_ip_hdr_valid = Signal(bool(0)) input_3_eth_dest_mac = Signal(intbv(0)[48:]) input_3_eth_src_mac = Signal(intbv(0)[48:]) input_3_eth_type = Signal(intbv(0)[16:]) input_3_ip_version = Signal(intbv(0)[4:]) input_3_ip_ihl = Signal(intbv(0)[4:]) input_3_ip_dscp = Signal(intbv(0)[6:]) input_3_ip_ecn = Signal(intbv(0)[2:]) input_3_ip_length = Signal(intbv(0)[16:]) input_3_ip_identification = Signal(intbv(0)[16:]) input_3_ip_flags = Signal(intbv(0)[3:]) input_3_ip_fragment_offset = Signal(intbv(0)[13:]) input_3_ip_ttl = Signal(intbv(0)[8:]) input_3_ip_protocol = Signal(intbv(0)[8:]) input_3_ip_header_checksum = Signal(intbv(0)[16:]) input_3_ip_source_ip = Signal(intbv(0)[32:]) input_3_ip_dest_ip = Signal(intbv(0)[32:]) input_3_ip_payload_tdata = Signal(intbv(0)[64:]) input_3_ip_payload_tkeep = Signal(intbv(0)[8:]) input_3_ip_payload_tvalid = Signal(bool(0)) input_3_ip_payload_tlast = Signal(bool(0)) input_3_ip_payload_tuser = Signal(bool(0)) output_ip_payload_tready = Signal(bool(0)) output_ip_hdr_ready = Signal(bool(0)) # Outputs input_0_ip_hdr_ready = Signal(bool(0)) input_0_ip_payload_tready = Signal(bool(0)) input_1_ip_hdr_ready = Signal(bool(0)) input_1_ip_payload_tready = Signal(bool(0)) input_2_ip_hdr_ready = Signal(bool(0)) input_2_ip_payload_tready = Signal(bool(0)) input_3_ip_hdr_ready = Signal(bool(0)) input_3_ip_payload_tready = Signal(bool(0)) output_ip_hdr_valid = Signal(bool(0)) output_eth_dest_mac = Signal(intbv(0)[48:]) output_eth_src_mac = Signal(intbv(0)[48:]) output_eth_type = Signal(intbv(0)[16:]) output_ip_version = Signal(intbv(0)[4:]) output_ip_ihl = Signal(intbv(0)[4:]) output_ip_dscp = Signal(intbv(0)[6:]) output_ip_ecn = Signal(intbv(0)[2:]) output_ip_length = Signal(intbv(0)[16:]) output_ip_identification = Signal(intbv(0)[16:]) output_ip_flags = Signal(intbv(0)[3:]) output_ip_fragment_offset = Signal(intbv(0)[13:]) output_ip_ttl = Signal(intbv(0)[8:]) output_ip_protocol = Signal(intbv(0)[8:]) output_ip_header_checksum = Signal(intbv(0)[16:]) output_ip_source_ip = Signal(intbv(0)[32:]) output_ip_dest_ip = Signal(intbv(0)[32:]) output_ip_payload_tdata = Signal(intbv(0)[64:]) output_ip_payload_tkeep = Signal(intbv(0)[8:]) output_ip_payload_tvalid = Signal(bool(0)) output_ip_payload_tlast = Signal(bool(0)) output_ip_payload_tuser = Signal(bool(0)) # sources and sinks source_0_queue = Queue() source_0_pause = Signal(bool(0)) source_1_queue = Queue() source_1_pause = Signal(bool(0)) source_2_queue = Queue() source_2_pause = Signal(bool(0)) source_3_queue = Queue() source_3_pause = Signal(bool(0)) sink_queue = Queue() sink_pause = Signal(bool(0)) source_0 = ip_ep.IPFrameSource( clk, rst, ip_hdr_ready=input_0_ip_hdr_ready, ip_hdr_valid=input_0_ip_hdr_valid, eth_dest_mac=input_0_eth_dest_mac, eth_src_mac=input_0_eth_src_mac, eth_type=input_0_eth_type, ip_version=input_0_ip_version, ip_ihl=input_0_ip_ihl, ip_dscp=input_0_ip_dscp, ip_ecn=input_0_ip_ecn, ip_length=input_0_ip_length, ip_identification=input_0_ip_identification, ip_flags=input_0_ip_flags, ip_fragment_offset=input_0_ip_fragment_offset, ip_ttl=input_0_ip_ttl, ip_protocol=input_0_ip_protocol, ip_header_checksum=input_0_ip_header_checksum, ip_source_ip=input_0_ip_source_ip, ip_dest_ip=input_0_ip_dest_ip, ip_payload_tdata=input_0_ip_payload_tdata, ip_payload_tkeep=input_0_ip_payload_tkeep, ip_payload_tvalid=input_0_ip_payload_tvalid, ip_payload_tready=input_0_ip_payload_tready, ip_payload_tlast=input_0_ip_payload_tlast, ip_payload_tuser=input_0_ip_payload_tuser, fifo=source_0_queue, pause=source_0_pause, name='source0') source_1 = ip_ep.IPFrameSource( clk, rst, ip_hdr_ready=input_1_ip_hdr_ready, ip_hdr_valid=input_1_ip_hdr_valid, eth_dest_mac=input_1_eth_dest_mac, eth_src_mac=input_1_eth_src_mac, eth_type=input_1_eth_type, ip_version=input_1_ip_version, ip_ihl=input_1_ip_ihl, ip_dscp=input_1_ip_dscp, ip_ecn=input_1_ip_ecn, ip_length=input_1_ip_length, ip_identification=input_1_ip_identification, ip_flags=input_1_ip_flags, ip_fragment_offset=input_1_ip_fragment_offset, ip_ttl=input_1_ip_ttl, ip_protocol=input_1_ip_protocol, ip_header_checksum=input_1_ip_header_checksum, ip_source_ip=input_1_ip_source_ip, ip_dest_ip=input_1_ip_dest_ip, ip_payload_tdata=input_1_ip_payload_tdata, ip_payload_tkeep=input_1_ip_payload_tkeep, ip_payload_tvalid=input_1_ip_payload_tvalid, ip_payload_tready=input_1_ip_payload_tready, ip_payload_tlast=input_1_ip_payload_tlast, ip_payload_tuser=input_1_ip_payload_tuser, fifo=source_1_queue, pause=source_1_pause, name='source1') source_2 = ip_ep.IPFrameSource( clk, rst, ip_hdr_ready=input_2_ip_hdr_ready, ip_hdr_valid=input_2_ip_hdr_valid, eth_dest_mac=input_2_eth_dest_mac, eth_src_mac=input_2_eth_src_mac, eth_type=input_2_eth_type, ip_version=input_2_ip_version, ip_ihl=input_2_ip_ihl, ip_dscp=input_2_ip_dscp, ip_ecn=input_2_ip_ecn, ip_length=input_2_ip_length, ip_identification=input_2_ip_identification, ip_flags=input_2_ip_flags, ip_fragment_offset=input_2_ip_fragment_offset, ip_ttl=input_2_ip_ttl, ip_protocol=input_2_ip_protocol, ip_header_checksum=input_2_ip_header_checksum, ip_source_ip=input_2_ip_source_ip, ip_dest_ip=input_2_ip_dest_ip, ip_payload_tdata=input_2_ip_payload_tdata, ip_payload_tkeep=input_2_ip_payload_tkeep, ip_payload_tvalid=input_2_ip_payload_tvalid, ip_payload_tready=input_2_ip_payload_tready, ip_payload_tlast=input_2_ip_payload_tlast, ip_payload_tuser=input_2_ip_payload_tuser, fifo=source_2_queue, pause=source_2_pause, name='source2') source_3 = ip_ep.IPFrameSource( clk, rst, ip_hdr_ready=input_3_ip_hdr_ready, ip_hdr_valid=input_3_ip_hdr_valid, eth_dest_mac=input_3_eth_dest_mac, eth_src_mac=input_3_eth_src_mac, eth_type=input_3_eth_type, ip_version=input_3_ip_version, ip_ihl=input_3_ip_ihl, ip_dscp=input_3_ip_dscp, ip_ecn=input_3_ip_ecn, ip_length=input_3_ip_length, ip_identification=input_3_ip_identification, ip_flags=input_3_ip_flags, ip_fragment_offset=input_3_ip_fragment_offset, ip_ttl=input_3_ip_ttl, ip_protocol=input_3_ip_protocol, ip_header_checksum=input_3_ip_header_checksum, ip_source_ip=input_3_ip_source_ip, ip_dest_ip=input_3_ip_dest_ip, ip_payload_tdata=input_3_ip_payload_tdata, ip_payload_tkeep=input_3_ip_payload_tkeep, ip_payload_tvalid=input_3_ip_payload_tvalid, ip_payload_tready=input_3_ip_payload_tready, ip_payload_tlast=input_3_ip_payload_tlast, ip_payload_tuser=input_3_ip_payload_tuser, fifo=source_3_queue, pause=source_3_pause, name='source3') sink = ip_ep.IPFrameSink(clk, rst, ip_hdr_ready=output_ip_hdr_ready, ip_hdr_valid=output_ip_hdr_valid, eth_dest_mac=output_eth_dest_mac, eth_src_mac=output_eth_src_mac, eth_type=output_eth_type, ip_version=output_ip_version, ip_ihl=output_ip_ihl, ip_dscp=output_ip_dscp, ip_ecn=output_ip_ecn, ip_length=output_ip_length, ip_identification=output_ip_identification, ip_flags=output_ip_flags, ip_fragment_offset=output_ip_fragment_offset, ip_ttl=output_ip_ttl, ip_protocol=output_ip_protocol, ip_header_checksum=output_ip_header_checksum, ip_source_ip=output_ip_source_ip, ip_dest_ip=output_ip_dest_ip, ip_payload_tdata=output_ip_payload_tdata, ip_payload_tkeep=output_ip_payload_tkeep, ip_payload_tvalid=output_ip_payload_tvalid, ip_payload_tready=output_ip_payload_tready, ip_payload_tlast=output_ip_payload_tlast, ip_payload_tuser=output_ip_payload_tuser, fifo=sink_queue, pause=sink_pause, name='sink') # DUT dut = dut_ip_arb_mux_64_4( clk, rst, current_test, input_0_ip_hdr_valid, input_0_ip_hdr_ready, input_0_eth_dest_mac, input_0_eth_src_mac, input_0_eth_type, input_0_ip_version, input_0_ip_ihl, input_0_ip_dscp, input_0_ip_ecn, input_0_ip_length, input_0_ip_identification, input_0_ip_flags, input_0_ip_fragment_offset, input_0_ip_ttl, input_0_ip_protocol, input_0_ip_header_checksum, input_0_ip_source_ip, input_0_ip_dest_ip, input_0_ip_payload_tdata, input_0_ip_payload_tkeep, input_0_ip_payload_tvalid, input_0_ip_payload_tready, input_0_ip_payload_tlast, input_0_ip_payload_tuser, input_1_ip_hdr_valid, input_1_ip_hdr_ready, input_1_eth_dest_mac, input_1_eth_src_mac, input_1_eth_type, input_1_ip_version, input_1_ip_ihl, input_1_ip_dscp, input_1_ip_ecn, input_1_ip_length, input_1_ip_identification, input_1_ip_flags, input_1_ip_fragment_offset, input_1_ip_ttl, input_1_ip_protocol, input_1_ip_header_checksum, input_1_ip_source_ip, input_1_ip_dest_ip, input_1_ip_payload_tdata, input_1_ip_payload_tkeep, input_1_ip_payload_tvalid, input_1_ip_payload_tready, input_1_ip_payload_tlast, input_1_ip_payload_tuser, input_2_ip_hdr_valid, input_2_ip_hdr_ready, input_2_eth_dest_mac, input_2_eth_src_mac, input_2_eth_type, input_2_ip_version, input_2_ip_ihl, input_2_ip_dscp, input_2_ip_ecn, input_2_ip_length, input_2_ip_identification, input_2_ip_flags, input_2_ip_fragment_offset, input_2_ip_ttl, input_2_ip_protocol, input_2_ip_header_checksum, input_2_ip_source_ip, input_2_ip_dest_ip, input_2_ip_payload_tdata, input_2_ip_payload_tkeep, input_2_ip_payload_tvalid, input_2_ip_payload_tready, input_2_ip_payload_tlast, input_2_ip_payload_tuser, input_3_ip_hdr_valid, input_3_ip_hdr_ready, input_3_eth_dest_mac, input_3_eth_src_mac, input_3_eth_type, input_3_ip_version, input_3_ip_ihl, input_3_ip_dscp, input_3_ip_ecn, input_3_ip_length, input_3_ip_identification, input_3_ip_flags, input_3_ip_fragment_offset, input_3_ip_ttl, input_3_ip_protocol, input_3_ip_header_checksum, input_3_ip_source_ip, input_3_ip_dest_ip, input_3_ip_payload_tdata, input_3_ip_payload_tkeep, input_3_ip_payload_tvalid, input_3_ip_payload_tready, input_3_ip_payload_tlast, input_3_ip_payload_tuser, output_ip_hdr_valid, output_ip_hdr_ready, output_eth_dest_mac, output_eth_src_mac, output_eth_type, output_ip_version, output_ip_ihl, output_ip_dscp, output_ip_ecn, output_ip_length, output_ip_identification, output_ip_flags, output_ip_fragment_offset, output_ip_ttl, output_ip_protocol, output_ip_header_checksum, output_ip_source_ip, output_ip_dest_ip, output_ip_payload_tdata, output_ip_payload_tkeep, output_ip_payload_tvalid, output_ip_payload_tready, output_ip_payload_tlast, output_ip_payload_tuser) @always(delay(4)) def clkgen(): clk.next = not clk @instance 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 = ip_ep.IPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x8000 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80165 test_frame.ip_dest_ip = 0xc0a80164 test_frame.payload = bytearray(range(32)) test_frame.build() source_0_queue.put(test_frame) yield clk.posedge yield clk.posedge while input_0_ip_payload_tvalid or input_1_ip_payload_tvalid or input_2_ip_payload_tvalid or input_3_ip_payload_tvalid: 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_frame yield delay(100) yield clk.posedge print("test 2: port 1") current_test.next = 2 test_frame = ip_ep.IPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x8000 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80165 test_frame.ip_dest_ip = 0xc0a80164 test_frame.payload = bytearray(range(32)) test_frame.build() source_1_queue.put(test_frame) yield clk.posedge yield clk.posedge while input_0_ip_payload_tvalid or input_1_ip_payload_tvalid or input_2_ip_payload_tvalid or input_3_ip_payload_tvalid: 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_frame yield delay(100) yield clk.posedge print("test 3: back-to-back packets, same port") current_test.next = 3 test_frame1 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x8000 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_dscp = 0 test_frame1.ip_ecn = 0 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80165 test_frame1.ip_dest_ip = 0xc0a80164 test_frame1.payload = bytearray(range(32)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x8000 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_dscp = 0 test_frame2.ip_ecn = 0 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80165 test_frame2.ip_dest_ip = 0xc0a80164 test_frame2.payload = bytearray(range(32)) test_frame2.build() source_0_queue.put(test_frame1) source_0_queue.put(test_frame2) yield clk.posedge yield clk.posedge while input_0_ip_payload_tvalid or input_1_ip_payload_tvalid or input_2_ip_payload_tvalid or input_3_ip_payload_tvalid: 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 4: back-to-back packets, different ports") current_test.next = 4 test_frame1 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A0152535455 test_frame1.eth_type = 0x8000 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_dscp = 0 test_frame1.ip_ecn = 0 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80165 test_frame1.ip_dest_ip = 0xc0a80164 test_frame1.payload = bytearray(range(32)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A0252535455 test_frame2.eth_type = 0x8000 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_dscp = 0 test_frame2.ip_ecn = 0 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80165 test_frame2.ip_dest_ip = 0xc0a80164 test_frame2.payload = bytearray(range(32)) test_frame2.build() source_1_queue.put(test_frame1) source_2_queue.put(test_frame2) yield clk.posedge yield clk.posedge while input_0_ip_payload_tvalid or input_1_ip_payload_tvalid or input_2_ip_payload_tvalid or input_3_ip_payload_tvalid: 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 5: alterate pause source") current_test.next = 5 test_frame1 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A0152535455 test_frame1.eth_type = 0x8000 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_dscp = 0 test_frame1.ip_ecn = 0 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80165 test_frame1.ip_dest_ip = 0xc0a80164 test_frame1.payload = bytearray(range(32)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A0252535455 test_frame2.eth_type = 0x8000 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_dscp = 0 test_frame2.ip_ecn = 0 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80165 test_frame2.ip_dest_ip = 0xc0a80164 test_frame2.payload = bytearray(range(32)) test_frame2.build() source_1_queue.put(test_frame1) source_2_queue.put(test_frame2) yield clk.posedge yield clk.posedge while input_0_ip_payload_tvalid or input_1_ip_payload_tvalid or input_2_ip_payload_tvalid or input_3_ip_payload_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 = 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: alterate pause sink") current_test.next = 6 test_frame1 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A0152535455 test_frame1.eth_type = 0x8000 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_dscp = 0 test_frame1.ip_ecn = 0 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80165 test_frame1.ip_dest_ip = 0xc0a80164 test_frame1.payload = bytearray(range(32)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A0252535455 test_frame2.eth_type = 0x8000 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_dscp = 0 test_frame2.ip_ecn = 0 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80165 test_frame2.ip_dest_ip = 0xc0a80164 test_frame2.payload = bytearray(range(32)) test_frame2.build() source_1_queue.put(test_frame1) source_2_queue.put(test_frame2) yield clk.posedge yield clk.posedge while input_0_ip_payload_tvalid or input_1_ip_payload_tvalid or input_2_ip_payload_tvalid or input_3_ip_payload_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 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: back-to-back packets, different ports, arbitration test") current_test.next = 7 test_frame1 = ip_ep.IPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A0152535455 test_frame1.eth_type = 0x8000 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_dscp = 0 test_frame1.ip_ecn = 0 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80165 test_frame1.ip_dest_ip = 0xc0a80164 test_frame1.payload = bytearray(range(32)) test_frame1.build() test_frame2 = ip_ep.IPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A0252535455 test_frame2.eth_type = 0x8000 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_dscp = 0 test_frame2.ip_ecn = 0 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80165 test_frame2.ip_dest_ip = 0xc0a80164 test_frame2.payload = bytearray(range(32)) test_frame2.build() source_1_queue.put(test_frame1) source_2_queue.put(test_frame2) source_2_queue.put(test_frame2) source_2_queue.put(test_frame2) source_2_queue.put(test_frame2) source_2_queue.put(test_frame2) yield clk.posedge yield delay(150) yield clk.posedge source_1_queue.put(test_frame1) while input_0_ip_payload_tvalid or input_1_ip_payload_tvalid or input_2_ip_payload_tvalid or input_3_ip_payload_tvalid: 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 rx_frame = None if not sink_queue.empty(): rx_frame = sink_queue.get() assert rx_frame == test_frame2 rx_frame = None if not sink_queue.empty(): rx_frame = sink_queue.get() assert rx_frame == test_frame2 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) raise StopSimulation return dut, source_0, source_1, source_2, source_3, sink, clkgen, check
def bench(): # Parameters DEST_WIDTH = 8 DATA_WIDTH = 64 KEEP_WIDTH = (DATA_WIDTH / 8) MAC_PREFIX = 0xDA0000000000 IP_PREFIX = 0xc0a80100 # Inputs clk = Signal(bool(0)) rst = Signal(bool(0)) current_test = Signal(intbv(0)[8:]) input_bd_valid = Signal(bool(0)) input_bd_dest = Signal(intbv(0)[DEST_WIDTH:]) input_bd_burst_len = Signal(intbv(0)[32:]) output_ip_hdr_ready = Signal(bool(0)) output_ip_payload_tready = Signal(bool(0)) local_mac = Signal(intbv(0)[48:]) local_ip = Signal(intbv(0)[32:]) frame_mtu = Signal(intbv(0)[16:]) dest_wr_en = Signal(bool(0)) dest_index = Signal(intbv(0)[DEST_WIDTH:]) dest_mac = Signal(intbv(0)[48:]) dest_ip = Signal(intbv(0)[32:]) # Outputs input_bd_ready = Signal(bool(0)) output_ip_hdr_valid = Signal(bool(0)) output_ip_eth_dest_mac = Signal(intbv(0)[48:]) output_ip_eth_src_mac = Signal(intbv(0)[48:]) output_ip_eth_type = Signal(intbv(0)[16:]) output_ip_dscp = Signal(intbv(0)[6:]) output_ip_ecn = Signal(intbv(0)[2:]) output_ip_length = Signal(intbv(0)[16:]) output_ip_identification = Signal(intbv(0)[16:]) output_ip_flags = Signal(intbv(0)[3:]) output_ip_fragment_offset = Signal(intbv(0)[13:]) output_ip_ttl = Signal(intbv(0)[8:]) output_ip_protocol = Signal(intbv(0)[8:]) output_ip_source_ip = Signal(intbv(0)[32:]) output_ip_dest_ip = Signal(intbv(0)[32:]) output_ip_payload_tdata = Signal(intbv(0)[DATA_WIDTH:]) output_ip_payload_tkeep = Signal(intbv(0)[KEEP_WIDTH:]) output_ip_payload_tvalid = Signal(bool(0)) output_ip_payload_tlast = Signal(bool(0)) output_ip_payload_tuser = Signal(bool(0)) busy = Signal(bool(0)) # sources and sinks source_queue = Queue() source_pause = Signal(bool(0)) sink_queue = Queue() sink_pause = Signal(bool(0)) source = fg_bd_ep.BurstDescriptorSource(clk, rst, valid=input_bd_valid, ready=input_bd_ready, dest=input_bd_dest, burst_len=input_bd_burst_len, fifo=source_queue, pause=source_pause, name='source') sink = ip_ep.IPFrameSink(clk, rst, ip_hdr_ready=output_ip_hdr_ready, ip_hdr_valid=output_ip_hdr_valid, eth_dest_mac=output_ip_eth_dest_mac, eth_src_mac=output_ip_eth_src_mac, eth_type=output_ip_eth_type, ip_dscp=output_ip_dscp, ip_ecn=output_ip_ecn, ip_length=output_ip_length, ip_identification=output_ip_identification, ip_flags=output_ip_flags, ip_fragment_offset=output_ip_fragment_offset, ip_ttl=output_ip_ttl, ip_protocol=output_ip_protocol, ip_source_ip=output_ip_source_ip, ip_dest_ip=output_ip_dest_ip, ip_payload_tdata=output_ip_payload_tdata, ip_payload_tkeep=output_ip_payload_tkeep, ip_payload_tvalid=output_ip_payload_tvalid, ip_payload_tready=output_ip_payload_tready, ip_payload_tlast=output_ip_payload_tlast, ip_payload_tuser=output_ip_payload_tuser, fifo=sink_queue, pause=sink_pause, name='sink') # DUT dut = dut_fg_ip_packet_gen( clk, rst, current_test, input_bd_valid, input_bd_ready, input_bd_dest, input_bd_burst_len, output_ip_hdr_valid, output_ip_hdr_ready, output_ip_eth_dest_mac, output_ip_eth_src_mac, output_ip_eth_type, output_ip_dscp, output_ip_ecn, output_ip_length, output_ip_identification, output_ip_flags, output_ip_fragment_offset, output_ip_ttl, output_ip_protocol, output_ip_source_ip, output_ip_dest_ip, output_ip_payload_tdata, output_ip_payload_tkeep, output_ip_payload_tvalid, output_ip_payload_tready, output_ip_payload_tlast, output_ip_payload_tuser, busy, local_mac, local_ip, frame_mtu, dest_wr_en, dest_index, dest_mac, dest_ip) @always(delay(4)) def clkgen(): clk.next = not clk def wait_normal(): while busy or output_ip_payload_tvalid: yield clk.posedge def wait_pause_sink(): while busy or output_ip_payload_tvalid: sink_pause.next = True yield clk.posedge yield clk.posedge yield clk.posedge sink_pause.next = False yield clk.posedge @instance 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 # set MAC and IP address local_mac.next = 0x5A5152535455 local_ip.next = 0xc0a80164 frame_mtu.next = 128 yield clk.posedge print("test 1: test packet") current_test.next = 1 test_bd = fg_bd_ep.BurstDescriptor() test_bd.dest = 1 test_bd.burst_len = 32 for wait in wait_normal, wait_pause_sink: source_queue.put(test_bd) yield clk.posedge yield clk.posedge yield clk.posedge yield wait() yield clk.posedge yield clk.posedge yield clk.posedge total = 0 while not sink_queue.empty(): rx_frame = sink_queue.get(False) total += len(rx_frame.payload.data) assert total == test_bd.burst_len yield delay(100) yield clk.posedge print("test 2: test packet") current_test.next = 1 test_bd = fg_bd_ep.BurstDescriptor() test_bd.dest = 2 test_bd.burst_len = 512 for wait in wait_normal, wait_pause_sink: source_queue.put(test_bd) yield clk.posedge yield clk.posedge yield clk.posedge yield wait() yield clk.posedge yield clk.posedge yield clk.posedge total = 0 while not sink_queue.empty(): rx_frame = sink_queue.get(False) total += len(rx_frame.payload.data) assert total == test_bd.burst_len yield delay(100) raise StopSimulation return dut, source, sink, clkgen, check
def bench(): # Inputs clk = Signal(bool(0)) rst = Signal(bool(0)) current_test = Signal(intbv(0)[8:]) s_eth_hdr_valid = Signal(bool(0)) s_eth_dest_mac = Signal(intbv(0)[48:]) s_eth_src_mac = Signal(intbv(0)[48:]) s_eth_type = Signal(intbv(0)[16:]) s_eth_payload_axis_tdata = Signal(intbv(0)[8:]) s_eth_payload_axis_tvalid = Signal(bool(0)) s_eth_payload_axis_tlast = Signal(bool(0)) s_eth_payload_axis_tuser = Signal(bool(0)) s_ip_hdr_valid = Signal(bool(0)) s_ip_dscp = Signal(intbv(0)[6:]) s_ip_ecn = Signal(intbv(0)[2:]) s_ip_length = Signal(intbv(0)[16:]) s_ip_ttl = Signal(intbv(0)[8:]) s_ip_protocol = Signal(intbv(0)[8:]) s_ip_source_ip = Signal(intbv(0)[32:]) s_ip_dest_ip = Signal(intbv(0)[32:]) s_ip_payload_axis_tdata = Signal(intbv(0)[8:]) s_ip_payload_axis_tvalid = Signal(bool(0)) s_ip_payload_axis_tlast = Signal(bool(0)) s_ip_payload_axis_tuser = Signal(bool(0)) s_udp_hdr_valid = Signal(bool(0)) s_udp_ip_dscp = Signal(intbv(0)[6:]) s_udp_ip_ecn = Signal(intbv(0)[2:]) s_udp_ip_ttl = Signal(intbv(0)[8:]) s_udp_ip_source_ip = Signal(intbv(0)[32:]) s_udp_ip_dest_ip = Signal(intbv(0)[32:]) s_udp_source_port = Signal(intbv(0)[16:]) s_udp_dest_port = Signal(intbv(0)[16:]) s_udp_length = Signal(intbv(0)[16:]) s_udp_checksum = Signal(intbv(0)[16:]) s_udp_payload_axis_tdata = Signal(intbv(0)[8:]) s_udp_payload_axis_tvalid = Signal(bool(0)) s_udp_payload_axis_tlast = Signal(bool(0)) s_udp_payload_axis_tuser = Signal(bool(0)) m_eth_payload_axis_tready = Signal(bool(0)) m_eth_hdr_ready = Signal(bool(0)) m_ip_hdr_ready = Signal(bool(0)) m_ip_payload_axis_tready = Signal(bool(0)) m_udp_hdr_ready = Signal(bool(0)) m_udp_payload_axis_tready = Signal(bool(0)) # Outputs s_eth_hdr_ready = Signal(bool(0)) s_eth_payload_axis_tready = Signal(bool(0)) s_ip_hdr_ready = Signal(bool(0)) s_ip_payload_axis_tready = Signal(bool(0)) s_udp_hdr_ready = Signal(bool(0)) s_udp_payload_axis_tready = Signal(bool(0)) m_eth_hdr_valid = Signal(bool(0)) m_eth_dest_mac = Signal(intbv(0)[48:]) m_eth_src_mac = Signal(intbv(0)[48:]) m_eth_type = Signal(intbv(0)[16:]) m_eth_payload_axis_tdata = Signal(intbv(0)[8:]) m_eth_payload_axis_tvalid = Signal(bool(0)) m_eth_payload_axis_tlast = Signal(bool(0)) m_eth_payload_axis_tuser = Signal(bool(0)) m_ip_hdr_valid = Signal(bool(0)) m_ip_eth_dest_mac = Signal(intbv(0)[48:]) m_ip_eth_src_mac = Signal(intbv(0)[48:]) m_ip_eth_type = Signal(intbv(0)[16:]) m_ip_version = Signal(intbv(0)[4:]) m_ip_ihl = Signal(intbv(0)[4:]) m_ip_dscp = Signal(intbv(0)[6:]) m_ip_ecn = Signal(intbv(0)[2:]) m_ip_length = Signal(intbv(0)[16:]) m_ip_identification = Signal(intbv(0)[16:]) m_ip_flags = Signal(intbv(0)[3:]) m_ip_fragment_offset = Signal(intbv(0)[13:]) m_ip_ttl = Signal(intbv(0)[8:]) m_ip_protocol = Signal(intbv(0)[8:]) m_ip_header_checksum = Signal(intbv(0)[16:]) m_ip_source_ip = Signal(intbv(0)[32:]) m_ip_dest_ip = Signal(intbv(0)[32:]) m_ip_payload_axis_tdata = Signal(intbv(0)[8:]) m_ip_payload_axis_tvalid = Signal(bool(0)) m_ip_payload_axis_tlast = Signal(bool(0)) m_ip_payload_axis_tuser = Signal(bool(0)) m_udp_hdr_valid = Signal(bool(0)) m_udp_eth_dest_mac = Signal(intbv(0)[48:]) m_udp_eth_src_mac = Signal(intbv(0)[48:]) m_udp_eth_type = Signal(intbv(0)[16:]) m_udp_ip_version = Signal(intbv(0)[4:]) m_udp_ip_ihl = Signal(intbv(0)[4:]) m_udp_ip_dscp = Signal(intbv(0)[6:]) m_udp_ip_ecn = Signal(intbv(0)[2:]) m_udp_ip_length = Signal(intbv(0)[16:]) m_udp_ip_identification = Signal(intbv(0)[16:]) m_udp_ip_flags = Signal(intbv(0)[3:]) m_udp_ip_fragment_offset = Signal(intbv(0)[13:]) m_udp_ip_ttl = Signal(intbv(0)[8:]) m_udp_ip_protocol = Signal(intbv(0)[8:]) m_udp_ip_header_checksum = Signal(intbv(0)[16:]) m_udp_ip_source_ip = Signal(intbv(0)[32:]) m_udp_ip_dest_ip = Signal(intbv(0)[32:]) m_udp_source_port = Signal(intbv(0)[16:]) m_udp_dest_port = Signal(intbv(0)[16:]) m_udp_length = Signal(intbv(0)[16:]) m_udp_checksum = Signal(intbv(0)[16:]) m_udp_payload_axis_tdata = Signal(intbv(0)[8:]) m_udp_payload_axis_tvalid = Signal(bool(0)) m_udp_payload_axis_tlast = Signal(bool(0)) m_udp_payload_axis_tuser = Signal(bool(0)) ip_rx_busy = Signal(bool(0)) ip_tx_busy = Signal(bool(0)) udp_rx_busy = Signal(bool(0)) udp_tx_busy = Signal(bool(0)) ip_rx_error_header_early_termination = Signal(bool(0)) ip_rx_error_payload_early_termination = Signal(bool(0)) ip_rx_error_invalid_header = Signal(bool(0)) ip_rx_error_invalid_checksum = Signal(bool(0)) ip_tx_error_payload_early_termination = Signal(bool(0)) ip_tx_error_arp_failed = Signal(bool(0)) udp_rx_error_header_early_termination = Signal(bool(0)) udp_rx_error_payload_early_termination = Signal(bool(0)) udp_tx_error_payload_early_termination = Signal(bool(0)) local_mac = Signal(intbv(0)[48:]) local_ip = Signal(intbv(0)[32:]) gateway_ip = Signal(intbv(0)[32:]) subnet_mask = Signal(intbv(0)[32:]) clear_arp_cache = Signal(bool(0)) # sources and sinks eth_source_pause = Signal(bool(0)) eth_sink_pause = Signal(bool(0)) ip_source_pause = Signal(bool(0)) ip_sink_pause = Signal(bool(0)) udp_source_pause = Signal(bool(0)) udp_sink_pause = Signal(bool(0)) eth_source = eth_ep.EthFrameSource() eth_source_logic = eth_source.create_logic( clk, rst, eth_hdr_ready=s_eth_hdr_ready, eth_hdr_valid=s_eth_hdr_valid, eth_dest_mac=s_eth_dest_mac, eth_src_mac=s_eth_src_mac, eth_type=s_eth_type, eth_payload_tdata=s_eth_payload_axis_tdata, eth_payload_tvalid=s_eth_payload_axis_tvalid, eth_payload_tready=s_eth_payload_axis_tready, eth_payload_tlast=s_eth_payload_axis_tlast, eth_payload_tuser=s_eth_payload_axis_tuser, pause=eth_source_pause, name='eth_source') eth_sink = eth_ep.EthFrameSink() eth_sink_logic = eth_sink.create_logic( clk, rst, eth_hdr_ready=m_eth_hdr_ready, eth_hdr_valid=m_eth_hdr_valid, eth_dest_mac=m_eth_dest_mac, eth_src_mac=m_eth_src_mac, eth_type=m_eth_type, eth_payload_tdata=m_eth_payload_axis_tdata, eth_payload_tvalid=m_eth_payload_axis_tvalid, eth_payload_tready=m_eth_payload_axis_tready, eth_payload_tlast=m_eth_payload_axis_tlast, eth_payload_tuser=m_eth_payload_axis_tuser, pause=eth_sink_pause, name='eth_sink') ip_source = ip_ep.IPFrameSource() ip_source_logic = ip_source.create_logic( clk, rst, ip_hdr_valid=s_ip_hdr_valid, ip_hdr_ready=s_ip_hdr_ready, ip_dscp=s_ip_dscp, ip_ecn=s_ip_ecn, ip_length=s_ip_length, ip_ttl=s_ip_ttl, ip_protocol=s_ip_protocol, ip_source_ip=s_ip_source_ip, ip_dest_ip=s_ip_dest_ip, ip_payload_tdata=s_ip_payload_axis_tdata, ip_payload_tvalid=s_ip_payload_axis_tvalid, ip_payload_tready=s_ip_payload_axis_tready, ip_payload_tlast=s_ip_payload_axis_tlast, ip_payload_tuser=s_ip_payload_axis_tuser, pause=ip_source_pause, name='ip_source') ip_sink = ip_ep.IPFrameSink() ip_sink_logic = ip_sink.create_logic( clk, rst, ip_hdr_ready=m_ip_hdr_ready, ip_hdr_valid=m_ip_hdr_valid, eth_dest_mac=m_ip_eth_dest_mac, eth_src_mac=m_ip_eth_src_mac, eth_type=m_ip_eth_type, ip_version=m_ip_version, ip_ihl=m_ip_ihl, ip_dscp=m_ip_dscp, ip_ecn=m_ip_ecn, ip_length=m_ip_length, ip_identification=m_ip_identification, ip_flags=m_ip_flags, ip_fragment_offset=m_ip_fragment_offset, ip_ttl=m_ip_ttl, ip_protocol=m_ip_protocol, ip_header_checksum=m_ip_header_checksum, ip_source_ip=m_ip_source_ip, ip_dest_ip=m_ip_dest_ip, ip_payload_tdata=m_ip_payload_axis_tdata, ip_payload_tvalid=m_ip_payload_axis_tvalid, ip_payload_tready=m_ip_payload_axis_tready, ip_payload_tlast=m_ip_payload_axis_tlast, ip_payload_tuser=m_ip_payload_axis_tuser, pause=ip_sink_pause, name='ip_sink') udp_source = udp_ep.UDPFrameSource() udp_source_logic = udp_source.create_logic( clk, rst, udp_hdr_ready=s_udp_hdr_ready, udp_hdr_valid=s_udp_hdr_valid, ip_dscp=s_udp_ip_dscp, ip_ecn=s_udp_ip_ecn, ip_ttl=s_udp_ip_ttl, ip_source_ip=s_udp_ip_source_ip, ip_dest_ip=s_udp_ip_dest_ip, udp_source_port=s_udp_source_port, udp_dest_port=s_udp_dest_port, udp_length=s_udp_length, udp_checksum=s_udp_checksum, udp_payload_tdata=s_udp_payload_axis_tdata, udp_payload_tvalid=s_udp_payload_axis_tvalid, udp_payload_tready=s_udp_payload_axis_tready, udp_payload_tlast=s_udp_payload_axis_tlast, udp_payload_tuser=s_udp_payload_axis_tuser, pause=udp_source_pause, name='udp_source') udp_sink = udp_ep.UDPFrameSink() udp_sink_logic = udp_sink.create_logic( clk, rst, udp_hdr_ready=m_udp_hdr_ready, udp_hdr_valid=m_udp_hdr_valid, eth_dest_mac=m_udp_eth_dest_mac, eth_src_mac=m_udp_eth_src_mac, eth_type=m_udp_eth_type, ip_version=m_udp_ip_version, ip_ihl=m_udp_ip_ihl, ip_dscp=m_udp_ip_dscp, ip_ecn=m_udp_ip_ecn, ip_length=m_udp_ip_length, ip_identification=m_udp_ip_identification, ip_flags=m_udp_ip_flags, ip_fragment_offset=m_udp_ip_fragment_offset, ip_ttl=m_udp_ip_ttl, ip_protocol=m_udp_ip_protocol, ip_header_checksum=m_udp_ip_header_checksum, ip_source_ip=m_udp_ip_source_ip, ip_dest_ip=m_udp_ip_dest_ip, udp_source_port=m_udp_source_port, udp_dest_port=m_udp_dest_port, udp_length=m_udp_length, udp_checksum=m_udp_checksum, udp_payload_tdata=m_udp_payload_axis_tdata, udp_payload_tvalid=m_udp_payload_axis_tvalid, udp_payload_tready=m_udp_payload_axis_tready, udp_payload_tlast=m_udp_payload_axis_tlast, udp_payload_tuser=m_udp_payload_axis_tuser, pause=udp_sink_pause, name='udp_sink') # DUT if os.system(build_cmd): raise Exception("Error running build command") dut = Cosimulation( "vvp -m myhdl %s.vvp -lxt2" % testbench, clk=clk, rst=rst, current_test=current_test, s_eth_hdr_valid=s_eth_hdr_valid, s_eth_hdr_ready=s_eth_hdr_ready, s_eth_dest_mac=s_eth_dest_mac, s_eth_src_mac=s_eth_src_mac, s_eth_type=s_eth_type, s_eth_payload_axis_tdata=s_eth_payload_axis_tdata, s_eth_payload_axis_tvalid=s_eth_payload_axis_tvalid, s_eth_payload_axis_tready=s_eth_payload_axis_tready, s_eth_payload_axis_tlast=s_eth_payload_axis_tlast, s_eth_payload_axis_tuser=s_eth_payload_axis_tuser, m_eth_hdr_valid=m_eth_hdr_valid, m_eth_hdr_ready=m_eth_hdr_ready, m_eth_dest_mac=m_eth_dest_mac, m_eth_src_mac=m_eth_src_mac, m_eth_type=m_eth_type, m_eth_payload_axis_tdata=m_eth_payload_axis_tdata, m_eth_payload_axis_tvalid=m_eth_payload_axis_tvalid, m_eth_payload_axis_tready=m_eth_payload_axis_tready, m_eth_payload_axis_tlast=m_eth_payload_axis_tlast, m_eth_payload_axis_tuser=m_eth_payload_axis_tuser, s_ip_hdr_valid=s_ip_hdr_valid, s_ip_hdr_ready=s_ip_hdr_ready, s_ip_dscp=s_ip_dscp, s_ip_ecn=s_ip_ecn, s_ip_length=s_ip_length, s_ip_ttl=s_ip_ttl, s_ip_protocol=s_ip_protocol, s_ip_source_ip=s_ip_source_ip, s_ip_dest_ip=s_ip_dest_ip, s_ip_payload_axis_tdata=s_ip_payload_axis_tdata, s_ip_payload_axis_tvalid=s_ip_payload_axis_tvalid, s_ip_payload_axis_tready=s_ip_payload_axis_tready, s_ip_payload_axis_tlast=s_ip_payload_axis_tlast, s_ip_payload_axis_tuser=s_ip_payload_axis_tuser, m_ip_hdr_valid=m_ip_hdr_valid, m_ip_hdr_ready=m_ip_hdr_ready, m_ip_eth_dest_mac=m_ip_eth_dest_mac, m_ip_eth_src_mac=m_ip_eth_src_mac, m_ip_eth_type=m_ip_eth_type, m_ip_version=m_ip_version, m_ip_ihl=m_ip_ihl, m_ip_dscp=m_ip_dscp, m_ip_ecn=m_ip_ecn, m_ip_length=m_ip_length, m_ip_identification=m_ip_identification, m_ip_flags=m_ip_flags, m_ip_fragment_offset=m_ip_fragment_offset, m_ip_ttl=m_ip_ttl, m_ip_protocol=m_ip_protocol, m_ip_header_checksum=m_ip_header_checksum, m_ip_source_ip=m_ip_source_ip, m_ip_dest_ip=m_ip_dest_ip, m_ip_payload_axis_tdata=m_ip_payload_axis_tdata, m_ip_payload_axis_tvalid=m_ip_payload_axis_tvalid, m_ip_payload_axis_tready=m_ip_payload_axis_tready, m_ip_payload_axis_tlast=m_ip_payload_axis_tlast, m_ip_payload_axis_tuser=m_ip_payload_axis_tuser, s_udp_hdr_valid=s_udp_hdr_valid, s_udp_hdr_ready=s_udp_hdr_ready, s_udp_ip_dscp=s_udp_ip_dscp, s_udp_ip_ecn=s_udp_ip_ecn, s_udp_ip_ttl=s_udp_ip_ttl, s_udp_ip_source_ip=s_udp_ip_source_ip, s_udp_ip_dest_ip=s_udp_ip_dest_ip, s_udp_source_port=s_udp_source_port, s_udp_dest_port=s_udp_dest_port, s_udp_length=s_udp_length, s_udp_checksum=s_udp_checksum, s_udp_payload_axis_tdata=s_udp_payload_axis_tdata, s_udp_payload_axis_tvalid=s_udp_payload_axis_tvalid, s_udp_payload_axis_tready=s_udp_payload_axis_tready, s_udp_payload_axis_tlast=s_udp_payload_axis_tlast, s_udp_payload_axis_tuser=s_udp_payload_axis_tuser, m_udp_hdr_valid=m_udp_hdr_valid, m_udp_hdr_ready=m_udp_hdr_ready, m_udp_eth_dest_mac=m_udp_eth_dest_mac, m_udp_eth_src_mac=m_udp_eth_src_mac, m_udp_eth_type=m_udp_eth_type, m_udp_ip_version=m_udp_ip_version, m_udp_ip_ihl=m_udp_ip_ihl, m_udp_ip_dscp=m_udp_ip_dscp, m_udp_ip_ecn=m_udp_ip_ecn, m_udp_ip_length=m_udp_ip_length, m_udp_ip_identification=m_udp_ip_identification, m_udp_ip_flags=m_udp_ip_flags, m_udp_ip_fragment_offset=m_udp_ip_fragment_offset, m_udp_ip_ttl=m_udp_ip_ttl, m_udp_ip_protocol=m_udp_ip_protocol, m_udp_ip_header_checksum=m_udp_ip_header_checksum, m_udp_ip_source_ip=m_udp_ip_source_ip, m_udp_ip_dest_ip=m_udp_ip_dest_ip, m_udp_source_port=m_udp_source_port, m_udp_dest_port=m_udp_dest_port, m_udp_length=m_udp_length, m_udp_checksum=m_udp_checksum, m_udp_payload_axis_tdata=m_udp_payload_axis_tdata, m_udp_payload_axis_tvalid=m_udp_payload_axis_tvalid, m_udp_payload_axis_tready=m_udp_payload_axis_tready, m_udp_payload_axis_tlast=m_udp_payload_axis_tlast, m_udp_payload_axis_tuser=m_udp_payload_axis_tuser, ip_rx_busy=ip_rx_busy, ip_tx_busy=ip_tx_busy, udp_rx_busy=udp_rx_busy, udp_tx_busy=udp_tx_busy, ip_rx_error_header_early_termination= ip_rx_error_header_early_termination, ip_rx_error_payload_early_termination= ip_rx_error_payload_early_termination, ip_rx_error_invalid_header=ip_rx_error_invalid_header, ip_rx_error_invalid_checksum=ip_rx_error_invalid_checksum, ip_tx_error_payload_early_termination= ip_tx_error_payload_early_termination, ip_tx_error_arp_failed=ip_tx_error_arp_failed, udp_rx_error_header_early_termination= udp_rx_error_header_early_termination, udp_rx_error_payload_early_termination= udp_rx_error_payload_early_termination, udp_tx_error_payload_early_termination= udp_tx_error_payload_early_termination, local_mac=local_mac, local_ip=local_ip, gateway_ip=gateway_ip, subnet_mask=subnet_mask, clear_arp_cache=clear_arp_cache) @always(delay(4)) def clkgen(): clk.next = not clk ip_rx_error_header_early_termination_asserted = Signal(bool(0)) ip_rx_error_payload_early_termination_asserted = Signal(bool(0)) ip_rx_error_invalid_header_asserted = Signal(bool(0)) ip_rx_error_invalid_checksum_asserted = Signal(bool(0)) ip_tx_error_payload_early_termination_asserted = Signal(bool(0)) ip_tx_error_arp_failed_asserted = Signal(bool(0)) udp_rx_error_header_early_termination_asserted = Signal(bool(0)) udp_rx_error_payload_early_termination_asserted = Signal(bool(0)) udp_tx_error_payload_early_termination_asserted = Signal(bool(0)) @always(clk.posedge) def monitor(): if (ip_rx_error_header_early_termination): ip_rx_error_header_early_termination_asserted.next = 1 if (ip_rx_error_payload_early_termination): ip_rx_error_payload_early_termination_asserted.next = 1 if (ip_rx_error_invalid_header): ip_rx_error_invalid_header_asserted.next = 1 if (ip_rx_error_invalid_checksum): ip_rx_error_invalid_checksum_asserted.next = 1 if (ip_tx_error_payload_early_termination): ip_tx_error_payload_early_termination_asserted.next = 1 if (ip_tx_error_arp_failed): ip_tx_error_arp_failed_asserted.next = 1 if (udp_rx_error_header_early_termination): udp_rx_error_header_early_termination_asserted.next = 1 if (udp_rx_error_payload_early_termination): udp_rx_error_payload_early_termination_asserted.next = 1 if (udp_tx_error_payload_early_termination): udp_tx_error_payload_early_termination_asserted.next = 1 def wait_normal(): i = 20 while i > 0: i = max(0, i - 1) if (s_eth_payload_axis_tvalid or s_ip_payload_axis_tvalid or s_udp_payload_axis_tvalid or m_eth_payload_axis_tvalid or m_ip_payload_axis_tvalid or m_udp_payload_axis_tvalid or s_eth_hdr_valid or s_ip_hdr_valid or s_udp_hdr_valid): i = 20 yield clk.posedge @instance 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 # set MAC and IP address local_mac.next = 0x5A5152535455 local_ip.next = 0xc0a80164 gateway_ip.next = 0xc0a80101 subnet_mask.next = 0xffffff00 yield clk.posedge print("test 1: test IP RX packet") current_test.next = 1 test_frame = ip_ep.IPFrame() test_frame.eth_dest_mac = 0x5A5152535455 test_frame.eth_src_mac = 0xDAD1D2D3D4D5 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x10 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80165 test_frame.ip_dest_ip = 0xc0a80164 test_frame.payload = bytearray(range(32)) test_frame.build() eth_frame = test_frame.build_eth() eth_source.send(eth_frame) yield ip_sink.wait() rx_frame = ip_sink.recv() assert rx_frame == test_frame assert eth_source.empty() assert eth_sink.empty() assert ip_source.empty() assert ip_sink.empty() yield delay(100) yield clk.posedge print("test 2: test IP TX packet") current_test.next = 2 # send IP packet test_frame = ip_ep.IPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x10 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80164 test_frame.ip_dest_ip = 0xc0a80166 test_frame.payload = bytearray(range(32)) test_frame.build() ip_source.send(test_frame) # wait for ARP request packet yield eth_sink.wait() rx_frame = eth_sink.recv() check_frame = arp_ep.ARPFrame() check_frame.parse_eth(rx_frame) assert check_frame.eth_dest_mac == 0xFFFFFFFFFFFF assert check_frame.eth_src_mac == 0x5A5152535455 assert check_frame.eth_type == 0x0806 assert check_frame.arp_htype == 0x0001 assert check_frame.arp_ptype == 0x0800 assert check_frame.arp_hlen == 6 assert check_frame.arp_plen == 4 assert check_frame.arp_oper == 1 assert check_frame.arp_sha == 0x5A5152535455 assert check_frame.arp_spa == 0xc0a80164 assert check_frame.arp_tha == 0x000000000000 assert check_frame.arp_tpa == 0xc0a80166 # generate response arp_frame = arp_ep.ARPFrame() arp_frame.eth_dest_mac = 0x5A5152535455 arp_frame.eth_src_mac = 0xDAD1D2D3D4D5 arp_frame.eth_type = 0x0806 arp_frame.arp_htype = 0x0001 arp_frame.arp_ptype = 0x0800 arp_frame.arp_hlen = 6 arp_frame.arp_plen = 4 arp_frame.arp_oper = 2 arp_frame.arp_sha = 0xDAD1D2D3D4D5 arp_frame.arp_spa = 0xc0a80166 arp_frame.arp_tha = 0x5A5152535455 arp_frame.arp_tpa = 0xc0a80164 eth_source.send(arp_frame.build_eth()) yield eth_sink.wait() rx_frame = eth_sink.recv() check_frame = ip_ep.IPFrame() check_frame.parse_eth(rx_frame) print(test_frame) print(check_frame) assert check_frame == test_frame assert eth_source.empty() assert eth_sink.empty() assert ip_source.empty() assert ip_sink.empty() yield delay(100) yield clk.posedge print("test 3: test IP TX arp fail packet") current_test.next = 2 ip_tx_error_arp_failed_asserted.next = 0 test_frame = ip_ep.IPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x10 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80164 test_frame.ip_dest_ip = 0xc0a80167 test_frame.payload = bytearray(range(32)) test_frame.build() ip_source.send(test_frame) yield clk.posedge yield clk.posedge yield wait_normal() yield clk.posedge yield clk.posedge assert ip_tx_error_arp_failed_asserted # check for 4 ARP requests assert eth_sink.count() == 4 while not eth_sink.empty(): rx_frame = eth_sink.recv() check_frame = arp_ep.ARPFrame() check_frame.parse_eth(rx_frame) assert check_frame.eth_dest_mac == 0xFFFFFFFFFFFF assert check_frame.eth_src_mac == 0x5A5152535455 assert check_frame.eth_type == 0x0806 assert check_frame.arp_htype == 0x0001 assert check_frame.arp_ptype == 0x0800 assert check_frame.arp_hlen == 6 assert check_frame.arp_plen == 4 assert check_frame.arp_oper == 1 assert check_frame.arp_sha == 0x5A5152535455 assert check_frame.arp_spa == 0xc0a80164 assert check_frame.arp_tha == 0x000000000000 assert check_frame.arp_tpa == 0xc0a80167 assert eth_source.empty() assert eth_sink.empty() assert ip_source.empty() assert ip_sink.empty() yield delay(100) yield clk.posedge print("test 4: test UDP RX packet") current_test.next = 4 test_frame = udp_ep.UDPFrame() test_frame.eth_dest_mac = 0x5A5152535455 test_frame.eth_src_mac = 0xDAD1D2D3D4D5 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80165 test_frame.ip_dest_ip = 0xc0a80164 test_frame.udp_source_port = 1234 test_frame.udp_dest_port = 5678 test_frame.payload = bytearray(range(32)) test_frame.build() eth_frame = test_frame.build_eth() eth_source.send(eth_frame) yield udp_sink.wait() rx_frame = udp_sink.recv() assert rx_frame == test_frame assert eth_source.empty() assert eth_sink.empty() assert udp_source.empty() assert udp_sink.empty() yield delay(100) yield clk.posedge print("test 5: test UDP TX packet") current_test.next = 5 test_frame = udp_ep.UDPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80164 test_frame.ip_dest_ip = 0xc0a80166 test_frame.udp_source_port = 1234 test_frame.udp_dest_port = 5678 test_frame.payload = bytearray(range(32)) test_frame.build() udp_source.send(test_frame) yield eth_sink.wait() rx_frame = eth_sink.recv() check_frame = udp_ep.UDPFrame() check_frame.parse_eth(rx_frame) assert check_frame == test_frame assert eth_source.empty() assert eth_sink.empty() assert udp_source.empty() assert udp_sink.empty() yield delay(100) raise StopSimulation return instances()
def bench(): # Inputs clk = Signal(bool(0)) rst = Signal(bool(0)) current_test = Signal(intbv(0)[8:]) input_ip_hdr_valid = Signal(bool(0)) input_ip_eth_dest_mac = Signal(intbv(0)[48:]) input_ip_eth_src_mac = Signal(intbv(0)[48:]) input_ip_eth_type = Signal(intbv(0)[16:]) input_ip_version = Signal(intbv(0)[4:]) input_ip_ihl = Signal(intbv(0)[4:]) input_ip_dscp = Signal(intbv(0)[6:]) input_ip_ecn = Signal(intbv(0)[2:]) input_ip_length = Signal(intbv(0)[16:]) input_ip_identification = Signal(intbv(0)[16:]) input_ip_flags = Signal(intbv(0)[3:]) input_ip_fragment_offset = Signal(intbv(0)[13:]) input_ip_ttl = Signal(intbv(0)[8:]) input_ip_protocol = Signal(intbv(0)[8:]) input_ip_header_checksum = Signal(intbv(0)[16:]) input_ip_source_ip = Signal(intbv(0)[32:]) input_ip_dest_ip = Signal(intbv(0)[32:]) input_ip_payload_tdata = Signal(intbv(0)[64:]) input_ip_payload_tkeep = Signal(intbv(0)[8:]) input_ip_payload_tvalid = Signal(bool(0)) input_ip_payload_tlast = Signal(bool(0)) input_ip_payload_tuser = Signal(bool(0)) input_udp_hdr_valid = Signal(bool(0)) input_udp_eth_dest_mac = Signal(intbv(0)[48:]) input_udp_eth_src_mac = Signal(intbv(0)[48:]) input_udp_eth_type = Signal(intbv(0)[16:]) input_udp_ip_version = Signal(intbv(0)[4:]) input_udp_ip_ihl = Signal(intbv(0)[4:]) input_udp_ip_dscp = Signal(intbv(0)[6:]) input_udp_ip_ecn = Signal(intbv(0)[2:]) input_udp_ip_identification = Signal(intbv(0)[16:]) input_udp_ip_flags = Signal(intbv(0)[3:]) input_udp_ip_fragment_offset = Signal(intbv(0)[13:]) input_udp_ip_ttl = Signal(intbv(0)[8:]) input_udp_ip_header_checksum = Signal(intbv(0)[16:]) input_udp_ip_source_ip = Signal(intbv(0)[32:]) input_udp_ip_dest_ip = Signal(intbv(0)[32:]) input_udp_source_port = Signal(intbv(0)[16:]) input_udp_dest_port = Signal(intbv(0)[16:]) input_udp_length = Signal(intbv(0)[16:]) input_udp_checksum = Signal(intbv(0)[16:]) input_udp_payload_tdata = Signal(intbv(0)[64:]) input_udp_payload_tkeep = Signal(intbv(0)[8:]) input_udp_payload_tvalid = Signal(bool(0)) input_udp_payload_tlast = Signal(bool(0)) input_udp_payload_tuser = Signal(bool(0)) output_ip_payload_tready = Signal(bool(0)) output_ip_hdr_ready = Signal(bool(0)) output_udp_hdr_ready = Signal(bool(0)) output_udp_payload_tready = Signal(bool(0)) # Outputs input_ip_hdr_ready = Signal(bool(0)) input_ip_payload_tready = Signal(bool(0)) input_udp_hdr_ready = Signal(bool(0)) input_udp_payload_tready = Signal(bool(0)) output_ip_hdr_valid = Signal(bool(0)) output_ip_eth_dest_mac = Signal(intbv(0)[48:]) output_ip_eth_src_mac = Signal(intbv(0)[48:]) output_ip_eth_type = Signal(intbv(0)[16:]) output_ip_version = Signal(intbv(0)[4:]) output_ip_ihl = Signal(intbv(0)[4:]) output_ip_dscp = Signal(intbv(0)[6:]) output_ip_ecn = Signal(intbv(0)[2:]) output_ip_length = Signal(intbv(0)[16:]) output_ip_identification = Signal(intbv(0)[16:]) output_ip_flags = Signal(intbv(0)[3:]) output_ip_fragment_offset = Signal(intbv(0)[13:]) output_ip_ttl = Signal(intbv(0)[8:]) output_ip_protocol = Signal(intbv(0)[8:]) output_ip_header_checksum = Signal(intbv(0)[16:]) output_ip_source_ip = Signal(intbv(0)[32:]) output_ip_dest_ip = Signal(intbv(0)[32:]) output_ip_payload_tdata = Signal(intbv(0)[64:]) output_ip_payload_tkeep = Signal(intbv(0)[8:]) output_ip_payload_tvalid = Signal(bool(0)) output_ip_payload_tlast = Signal(bool(0)) output_ip_payload_tuser = Signal(bool(0)) output_udp_hdr_valid = Signal(bool(0)) output_udp_eth_dest_mac = Signal(intbv(0)[48:]) output_udp_eth_src_mac = Signal(intbv(0)[48:]) output_udp_eth_type = Signal(intbv(0)[16:]) output_udp_ip_version = Signal(intbv(0)[4:]) output_udp_ip_ihl = Signal(intbv(0)[4:]) output_udp_ip_dscp = Signal(intbv(0)[6:]) output_udp_ip_ecn = Signal(intbv(0)[2:]) output_udp_ip_length = Signal(intbv(0)[16:]) output_udp_ip_identification = Signal(intbv(0)[16:]) output_udp_ip_flags = Signal(intbv(0)[3:]) output_udp_ip_fragment_offset = Signal(intbv(0)[13:]) output_udp_ip_ttl = Signal(intbv(0)[8:]) output_udp_ip_protocol = Signal(intbv(0)[8:]) output_udp_ip_header_checksum = Signal(intbv(0)[16:]) output_udp_ip_source_ip = Signal(intbv(0)[32:]) output_udp_ip_dest_ip = Signal(intbv(0)[32:]) output_udp_source_port = Signal(intbv(0)[16:]) output_udp_dest_port = Signal(intbv(0)[16:]) output_udp_length = Signal(intbv(0)[16:]) output_udp_checksum = Signal(intbv(0)[16:]) output_udp_payload_tdata = Signal(intbv(0)[64:]) output_udp_payload_tkeep = Signal(intbv(0)[8:]) output_udp_payload_tvalid = Signal(bool(0)) output_udp_payload_tlast = Signal(bool(0)) output_udp_payload_tuser = Signal(bool(0)) rx_busy = Signal(bool(0)) tx_busy = Signal(bool(0)) rx_error_header_early_termination = Signal(bool(0)) rx_error_payload_early_termination = Signal(bool(0)) tx_error_payload_early_termination = Signal(bool(0)) # sources and sinks ip_source_queue = Queue() ip_source_pause = Signal(bool(0)) ip_sink_queue = Queue() ip_sink_pause = Signal(bool(0)) udp_source_queue = Queue() udp_source_pause = Signal(bool(0)) udp_sink_queue = Queue() udp_sink_pause = Signal(bool(0)) ip_source = ip_ep.IPFrameSource( clk, rst, ip_hdr_valid=input_ip_hdr_valid, ip_hdr_ready=input_ip_hdr_ready, eth_dest_mac=input_ip_eth_dest_mac, eth_src_mac=input_ip_eth_src_mac, eth_type=input_ip_eth_type, ip_version=input_ip_version, ip_ihl=input_ip_ihl, ip_dscp=input_ip_dscp, ip_ecn=input_ip_ecn, ip_length=input_ip_length, ip_identification=input_ip_identification, ip_flags=input_ip_flags, ip_fragment_offset=input_ip_fragment_offset, ip_ttl=input_ip_ttl, ip_protocol=input_ip_protocol, ip_header_checksum=input_ip_header_checksum, ip_source_ip=input_ip_source_ip, ip_dest_ip=input_ip_dest_ip, ip_payload_tdata=input_ip_payload_tdata, ip_payload_tkeep=input_ip_payload_tkeep, ip_payload_tvalid=input_ip_payload_tvalid, ip_payload_tready=input_ip_payload_tready, ip_payload_tlast=input_ip_payload_tlast, ip_payload_tuser=input_ip_payload_tuser, fifo=ip_source_queue, pause=ip_source_pause, name='ip_source') ip_sink = ip_ep.IPFrameSink(clk, rst, ip_hdr_ready=output_ip_hdr_ready, ip_hdr_valid=output_ip_hdr_valid, eth_dest_mac=output_ip_eth_dest_mac, eth_src_mac=output_ip_eth_src_mac, eth_type=output_ip_eth_type, ip_version=output_ip_version, ip_ihl=output_ip_ihl, ip_dscp=output_ip_dscp, ip_ecn=output_ip_ecn, ip_length=output_ip_length, ip_identification=output_ip_identification, ip_flags=output_ip_flags, ip_fragment_offset=output_ip_fragment_offset, ip_ttl=output_ip_ttl, ip_protocol=output_ip_protocol, ip_header_checksum=output_ip_header_checksum, ip_source_ip=output_ip_source_ip, ip_dest_ip=output_ip_dest_ip, ip_payload_tdata=output_ip_payload_tdata, ip_payload_tkeep=output_ip_payload_tkeep, ip_payload_tvalid=output_ip_payload_tvalid, ip_payload_tready=output_ip_payload_tready, ip_payload_tlast=output_ip_payload_tlast, ip_payload_tuser=output_ip_payload_tuser, fifo=ip_sink_queue, pause=ip_sink_pause, name='ip_sink') udp_source = udp_ep.UDPFrameSource( clk, rst, udp_hdr_valid=input_udp_hdr_valid, udp_hdr_ready=input_udp_hdr_ready, eth_dest_mac=input_udp_eth_dest_mac, eth_src_mac=input_udp_eth_src_mac, eth_type=input_udp_eth_type, ip_version=input_udp_ip_version, ip_ihl=input_udp_ip_ihl, ip_dscp=input_udp_ip_dscp, ip_ecn=input_udp_ip_ecn, ip_identification=input_udp_ip_identification, ip_flags=input_udp_ip_flags, ip_fragment_offset=input_udp_ip_fragment_offset, ip_ttl=input_udp_ip_ttl, ip_header_checksum=input_udp_ip_header_checksum, ip_source_ip=input_udp_ip_source_ip, ip_dest_ip=input_udp_ip_dest_ip, udp_source_port=input_udp_source_port, udp_dest_port=input_udp_dest_port, udp_length=input_udp_length, udp_checksum=input_udp_checksum, udp_payload_tdata=input_udp_payload_tdata, udp_payload_tkeep=input_udp_payload_tkeep, udp_payload_tvalid=input_udp_payload_tvalid, udp_payload_tready=input_udp_payload_tready, udp_payload_tlast=input_udp_payload_tlast, udp_payload_tuser=input_udp_payload_tuser, fifo=udp_source_queue, pause=udp_source_pause, name='udp_source') udp_sink = udp_ep.UDPFrameSink( clk, rst, udp_hdr_ready=output_udp_hdr_ready, udp_hdr_valid=output_udp_hdr_valid, eth_dest_mac=output_udp_eth_dest_mac, eth_src_mac=output_udp_eth_src_mac, eth_type=output_udp_eth_type, ip_version=output_udp_ip_version, ip_ihl=output_udp_ip_ihl, ip_dscp=output_udp_ip_dscp, ip_ecn=output_udp_ip_ecn, ip_length=output_udp_ip_length, ip_identification=output_udp_ip_identification, ip_flags=output_udp_ip_flags, ip_fragment_offset=output_udp_ip_fragment_offset, ip_ttl=output_udp_ip_ttl, ip_protocol=output_udp_ip_protocol, ip_header_checksum=output_udp_ip_header_checksum, ip_source_ip=output_udp_ip_source_ip, ip_dest_ip=output_udp_ip_dest_ip, udp_source_port=output_udp_source_port, udp_dest_port=output_udp_dest_port, udp_length=output_udp_length, udp_checksum=output_udp_checksum, udp_payload_tdata=output_udp_payload_tdata, udp_payload_tkeep=output_udp_payload_tkeep, udp_payload_tvalid=output_udp_payload_tvalid, udp_payload_tready=output_udp_payload_tready, udp_payload_tlast=output_udp_payload_tlast, udp_payload_tuser=output_udp_payload_tuser, fifo=udp_sink_queue, pause=udp_sink_pause, name='udp_sink') # DUT dut = dut_udp( clk, rst, current_test, input_ip_hdr_valid, input_ip_hdr_ready, input_ip_eth_dest_mac, input_ip_eth_src_mac, input_ip_eth_type, input_ip_version, input_ip_ihl, input_ip_dscp, input_ip_ecn, input_ip_length, input_ip_identification, input_ip_flags, input_ip_fragment_offset, input_ip_ttl, input_ip_protocol, input_ip_header_checksum, input_ip_source_ip, input_ip_dest_ip, input_ip_payload_tdata, input_ip_payload_tkeep, input_ip_payload_tvalid, input_ip_payload_tready, input_ip_payload_tlast, input_ip_payload_tuser, output_ip_hdr_valid, output_ip_hdr_ready, output_ip_eth_dest_mac, output_ip_eth_src_mac, output_ip_eth_type, output_ip_version, output_ip_ihl, output_ip_dscp, output_ip_ecn, output_ip_length, output_ip_identification, output_ip_flags, output_ip_fragment_offset, output_ip_ttl, output_ip_protocol, output_ip_header_checksum, output_ip_source_ip, output_ip_dest_ip, output_ip_payload_tdata, output_ip_payload_tkeep, output_ip_payload_tvalid, output_ip_payload_tready, output_ip_payload_tlast, output_ip_payload_tuser, input_udp_hdr_valid, input_udp_hdr_ready, input_udp_eth_dest_mac, input_udp_eth_src_mac, input_udp_eth_type, input_udp_ip_version, input_udp_ip_ihl, input_udp_ip_dscp, input_udp_ip_ecn, input_udp_ip_identification, input_udp_ip_flags, input_udp_ip_fragment_offset, input_udp_ip_ttl, input_udp_ip_header_checksum, input_udp_ip_source_ip, input_udp_ip_dest_ip, input_udp_source_port, input_udp_dest_port, input_udp_length, input_udp_checksum, input_udp_payload_tdata, input_udp_payload_tkeep, input_udp_payload_tvalid, input_udp_payload_tready, input_udp_payload_tlast, input_udp_payload_tuser, output_udp_hdr_valid, output_udp_hdr_ready, output_udp_eth_dest_mac, output_udp_eth_src_mac, output_udp_eth_type, output_udp_ip_version, output_udp_ip_ihl, output_udp_ip_dscp, output_udp_ip_ecn, output_udp_ip_length, output_udp_ip_identification, output_udp_ip_flags, output_udp_ip_fragment_offset, output_udp_ip_ttl, output_udp_ip_protocol, output_udp_ip_header_checksum, output_udp_ip_source_ip, output_udp_ip_dest_ip, output_udp_source_port, output_udp_dest_port, output_udp_length, output_udp_checksum, output_udp_payload_tdata, output_udp_payload_tkeep, output_udp_payload_tvalid, output_udp_payload_tready, output_udp_payload_tlast, output_udp_payload_tuser, rx_busy, tx_busy, rx_error_header_early_termination, rx_error_payload_early_termination, tx_error_payload_early_termination) @always(delay(4)) def clkgen(): clk.next = not clk rx_error_header_early_termination_asserted = Signal(bool(0)) rx_error_payload_early_termination_asserted = Signal(bool(0)) tx_error_payload_early_termination_asserted = Signal(bool(0)) @always(clk.posedge) def monitor(): if (rx_error_header_early_termination): rx_error_header_early_termination_asserted.next = 1 if (rx_error_payload_early_termination): rx_error_payload_early_termination_asserted.next = 1 if (tx_error_payload_early_termination): tx_error_payload_early_termination_asserted.next = 1 def wait_normal(): while (input_ip_payload_tvalid or input_udp_payload_tvalid or output_ip_payload_tvalid or output_udp_payload_tvalid or input_ip_hdr_valid or input_udp_hdr_valid): yield clk.posedge @instance 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 print("test 1: test UDP RX packet") current_test.next = 1 test_frame = udp_ep.UDPFrame() test_frame.eth_dest_mac = 0x5A5152535455 test_frame.eth_src_mac = 0xDAD1D2D3D4D5 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80165 test_frame.ip_dest_ip = 0xc0a80164 test_frame.udp_source_port = 1234 test_frame.udp_dest_port = 5678 test_frame.payload = bytearray(range(32)) test_frame.build() ip_frame = test_frame.build_ip() ip_source_queue.put(ip_frame) yield clk.posedge yield clk.posedge yield wait_normal() yield clk.posedge yield clk.posedge rx_frame = None if not udp_sink_queue.empty(): rx_frame = udp_sink_queue.get() assert rx_frame == test_frame assert ip_source_queue.empty() assert ip_sink_queue.empty() assert udp_source_queue.empty() assert udp_sink_queue.empty() yield delay(100) yield clk.posedge print("test 2: test UDP TX packet") current_test.next = 2 test_frame = udp_ep.UDPFrame() test_frame.eth_dest_mac = 0x5A5152535455 test_frame.eth_src_mac = 0xDAD1D2D3D4D5 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_dscp = 0 test_frame.ip_ecn = 0 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80165 test_frame.ip_dest_ip = 0xc0a80164 test_frame.udp_source_port = 1234 test_frame.udp_dest_port = 5678 test_frame.payload = bytearray(range(32)) test_frame.build() udp_source_queue.put(test_frame) yield clk.posedge yield clk.posedge yield wait_normal() yield clk.posedge yield clk.posedge rx_frame = None if not ip_sink_queue.empty(): rx_frame = ip_sink_queue.get() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame assert ip_source_queue.empty() assert ip_sink_queue.empty() assert udp_source_queue.empty() assert udp_sink_queue.empty() yield delay(100) raise StopSimulation return dut, ip_source, ip_sink, udp_source, udp_sink, clkgen, monitor, check
def bench(): # Inputs clk = Signal(bool(0)) rst = Signal(bool(0)) current_test = Signal(intbv(0)[8:]) input_udp_hdr_valid = Signal(bool(0)) input_eth_dest_mac = Signal(intbv(0)[48:]) input_eth_src_mac = Signal(intbv(0)[48:]) input_eth_type = Signal(intbv(0)[16:]) input_ip_version = Signal(intbv(0)[4:]) input_ip_ihl = Signal(intbv(0)[4:]) input_ip_dscp = Signal(intbv(0)[6:]) input_ip_ecn = Signal(intbv(0)[2:]) input_ip_identification = Signal(intbv(0)[16:]) input_ip_flags = Signal(intbv(0)[3:]) input_ip_fragment_offset = Signal(intbv(0)[13:]) input_ip_ttl = Signal(intbv(0)[8:]) input_ip_protocol = Signal(intbv(0)[8:]) input_ip_header_checksum = Signal(intbv(0)[16:]) input_ip_source_ip = Signal(intbv(0)[32:]) input_ip_dest_ip = Signal(intbv(0)[32:]) input_udp_source_port = Signal(intbv(0)[16:]) input_udp_dest_port = Signal(intbv(0)[16:]) input_udp_length = Signal(intbv(0)[16:]) input_udp_checksum = Signal(intbv(0)[16:]) input_udp_payload_tdata = Signal(intbv(0)[8:]) input_udp_payload_tvalid = Signal(bool(0)) input_udp_payload_tlast = Signal(bool(0)) input_udp_payload_tuser = Signal(bool(0)) output_ip_payload_tready = Signal(bool(0)) output_ip_hdr_ready = Signal(bool(0)) # Outputs input_udp_hdr_ready = Signal(bool(0)) input_udp_payload_tready = Signal(bool(0)) output_ip_hdr_valid = Signal(bool(0)) output_eth_dest_mac = Signal(intbv(0)[48:]) output_eth_src_mac = Signal(intbv(0)[48:]) output_eth_type = Signal(intbv(0)[16:]) output_ip_version = Signal(intbv(0)[4:]) output_ip_ihl = Signal(intbv(0)[4:]) output_ip_dscp = Signal(intbv(0)[6:]) output_ip_ecn = Signal(intbv(0)[2:]) output_ip_length = Signal(intbv(0)[16:]) output_ip_identification = Signal(intbv(0)[16:]) output_ip_flags = Signal(intbv(0)[3:]) output_ip_fragment_offset = Signal(intbv(0)[13:]) output_ip_ttl = Signal(intbv(0)[8:]) output_ip_protocol = Signal(intbv(0)[8:]) output_ip_header_checksum = Signal(intbv(0)[16:]) output_ip_source_ip = Signal(intbv(0)[32:]) output_ip_dest_ip = Signal(intbv(0)[32:]) output_ip_payload_tdata = Signal(intbv(0)[8:]) output_ip_payload_tvalid = Signal(bool(0)) output_ip_payload_tlast = Signal(bool(0)) output_ip_payload_tuser = Signal(bool(0)) busy = Signal(bool(0)) error_payload_early_termination = Signal(bool(0)) # sources and sinks source_queue = Queue() source_pause = Signal(bool(0)) sink_queue = Queue() sink_pause = Signal(bool(0)) source = udp_ep.UDPFrameSource(clk, rst, udp_hdr_valid=input_udp_hdr_valid, udp_hdr_ready=input_udp_hdr_ready, eth_dest_mac=input_eth_dest_mac, eth_src_mac=input_eth_src_mac, eth_type=input_eth_type, ip_version=input_ip_version, ip_ihl=input_ip_ihl, ip_dscp=input_ip_dscp, ip_ecn=input_ip_ecn, ip_identification=input_ip_identification, ip_flags=input_ip_flags, ip_fragment_offset=input_ip_fragment_offset, ip_ttl=input_ip_ttl, ip_protocol=input_ip_protocol, ip_header_checksum=input_ip_header_checksum, ip_source_ip=input_ip_source_ip, ip_dest_ip=input_ip_dest_ip, udp_source_port=input_udp_source_port, udp_dest_port=input_udp_dest_port, udp_length=input_udp_length, udp_checksum=input_udp_checksum, udp_payload_tdata=input_udp_payload_tdata, udp_payload_tvalid=input_udp_payload_tvalid, udp_payload_tready=input_udp_payload_tready, udp_payload_tlast=input_udp_payload_tlast, udp_payload_tuser=input_udp_payload_tuser, fifo=source_queue, pause=source_pause, name='source') sink = ip_ep.IPFrameSink(clk, rst, ip_hdr_ready=output_ip_hdr_ready, ip_hdr_valid=output_ip_hdr_valid, eth_dest_mac=output_eth_dest_mac, eth_src_mac=output_eth_src_mac, eth_type=output_eth_type, ip_version=output_ip_version, ip_ihl=output_ip_ihl, ip_dscp=output_ip_dscp, ip_ecn=output_ip_ecn, ip_length=output_ip_length, ip_identification=output_ip_identification, ip_flags=output_ip_flags, ip_fragment_offset=output_ip_fragment_offset, ip_ttl=output_ip_ttl, ip_protocol=output_ip_protocol, ip_header_checksum=output_ip_header_checksum, ip_source_ip=output_ip_source_ip, ip_dest_ip=output_ip_dest_ip, ip_payload_tdata=output_ip_payload_tdata, ip_payload_tvalid=output_ip_payload_tvalid, ip_payload_tready=output_ip_payload_tready, ip_payload_tlast=output_ip_payload_tlast, ip_payload_tuser=output_ip_payload_tuser, fifo=sink_queue, pause=sink_pause, name='sink') # DUT dut = dut_udp_ip_tx(clk, rst, current_test, input_udp_hdr_valid, input_udp_hdr_ready, input_eth_dest_mac, input_eth_src_mac, input_eth_type, input_ip_version, input_ip_ihl, input_ip_dscp, input_ip_ecn, input_ip_identification, input_ip_flags, input_ip_fragment_offset, input_ip_ttl, input_ip_protocol, input_ip_header_checksum, input_ip_source_ip, input_ip_dest_ip, input_udp_source_port, input_udp_dest_port, input_udp_length, input_udp_checksum, input_udp_payload_tdata, input_udp_payload_tvalid, input_udp_payload_tready, input_udp_payload_tlast, input_udp_payload_tuser, output_ip_hdr_valid, output_ip_hdr_ready, output_eth_dest_mac, output_eth_src_mac, output_eth_type, output_ip_version, output_ip_ihl, output_ip_dscp, output_ip_ecn, output_ip_length, output_ip_identification, output_ip_flags, output_ip_fragment_offset, output_ip_ttl, output_ip_protocol, output_ip_header_checksum, output_ip_source_ip, output_ip_dest_ip, output_ip_payload_tdata, output_ip_payload_tvalid, output_ip_payload_tready, output_ip_payload_tlast, output_ip_payload_tuser, busy, error_payload_early_termination) @always(delay(4)) def clkgen(): clk.next = not clk error_payload_early_termination_asserted = Signal(bool(0)) @always(clk.posedge) def monitor(): if (error_payload_early_termination): error_payload_early_termination_asserted.next = 1 def wait_normal(): while input_udp_payload_tvalid or output_ip_payload_tvalid or input_udp_hdr_valid: yield clk.posedge def wait_pause_source(): while input_udp_payload_tvalid or output_ip_payload_tvalid or input_udp_hdr_valid: source_pause.next = True yield clk.posedge yield clk.posedge yield clk.posedge source_pause.next = False yield clk.posedge def wait_pause_sink(): while input_udp_payload_tvalid or output_ip_payload_tvalid or input_udp_hdr_valid: sink_pause.next = True yield clk.posedge yield clk.posedge yield clk.posedge sink_pause.next = False yield clk.posedge @instance 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 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 = udp_ep.UDPFrame() test_frame.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame.eth_src_mac = 0x5A5152535455 test_frame.eth_type = 0x0800 test_frame.ip_version = 4 test_frame.ip_ihl = 5 test_frame.ip_length = None test_frame.ip_identification = 0 test_frame.ip_flags = 2 test_frame.ip_fragment_offset = 0 test_frame.ip_ttl = 64 test_frame.ip_protocol = 0x11 test_frame.ip_header_checksum = None test_frame.ip_source_ip = 0xc0a80164 test_frame.ip_dest_ip = 0xc0a80165 test_frame.udp_source_port = 1 test_frame.udp_dest_port = 2 test_frame.udp_length = None test_frame.udp_checksum = None test_frame.payload = bytearray(range(payload_len)) test_frame.build() for wait in wait_normal, wait_pause_source, wait_pause_sink: source_queue.put(test_frame) yield clk.posedge yield clk.posedge yield wait() yield clk.posedge yield clk.posedge yield clk.posedge rx_frame = None if not sink_queue.empty(): rx_frame = sink_queue.get() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame assert sink_queue.empty() yield delay(100) yield clk.posedge print("test 2: back-to-back packets, length %d" % payload_len) current_test.next = 2 test_frame1 = udp_ep.UDPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.udp_source_port = 1 test_frame1.udp_dest_port = 2 test_frame1.udp_length = None test_frame1.udp_checksum = None test_frame1.payload = bytearray(range(payload_len)) test_frame1.build() test_frame2 = udp_ep.UDPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.udp_source_port = 1 test_frame2.udp_dest_port = 2 test_frame2.udp_length = None test_frame2.udp_checksum = None test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() for wait in wait_normal, wait_pause_source, wait_pause_sink: source_queue.put(test_frame1) source_queue.put(test_frame2) yield clk.posedge yield clk.posedge yield wait() yield clk.posedge yield clk.posedge yield clk.posedge rx_frame = None if not sink_queue.empty(): rx_frame = sink_queue.get() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame1 rx_frame = None if not sink_queue.empty(): rx_frame = sink_queue.get() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame2 assert sink_queue.empty() yield delay(100) yield clk.posedge print("test 3: tuser assert, length %d" % payload_len) current_test.next = 3 test_frame1 = udp_ep.UDPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.udp_source_port = 1 test_frame1.udp_dest_port = 2 test_frame1.udp_length = None test_frame1.udp_checksum = None test_frame1.payload = bytearray(range(payload_len)) test_frame1.build() test_frame2 = udp_ep.UDPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.udp_source_port = 1 test_frame2.udp_dest_port = 2 test_frame2.udp_length = None test_frame2.udp_checksum = None test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() test_frame1.payload.user = 1 for wait in wait_normal, wait_pause_source, wait_pause_sink: source_queue.put(test_frame1) source_queue.put(test_frame2) yield clk.posedge yield clk.posedge yield wait() yield clk.posedge yield clk.posedge yield clk.posedge rx_frame = None if not sink_queue.empty(): rx_frame = sink_queue.get() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame1 assert rx_frame.payload.user[-1] rx_frame = None if not sink_queue.empty(): rx_frame = sink_queue.get() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame2 assert sink_queue.empty() yield delay(100) yield clk.posedge print("test 4: trailing bytes (1), length %d" % payload_len) current_test.next = 4 test_frame1 = udp_ep.UDPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.udp_source_port = 1 test_frame1.udp_dest_port = 2 test_frame1.udp_length = None test_frame1.udp_checksum = None test_frame1.payload = bytearray(range(payload_len)) test_frame1.build() test_frame2 = udp_ep.UDPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.udp_source_port = 1 test_frame2.udp_dest_port = 2 test_frame2.udp_length = None test_frame2.udp_checksum = None test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() test_frame1a = udp_ep.UDPFrame(test_frame1) test_frame1a.payload.data += bytearray(b'\x00') for wait in wait_normal, wait_pause_source, wait_pause_sink: source_queue.put(test_frame1a) source_queue.put(test_frame2) yield clk.posedge yield clk.posedge yield wait() yield clk.posedge yield clk.posedge yield clk.posedge rx_frame = None if not sink_queue.empty(): rx_frame = sink_queue.get() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame1 rx_frame = None if not sink_queue.empty(): rx_frame = sink_queue.get() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame2 assert sink_queue.empty() yield delay(100) yield clk.posedge print("test 5: trailing bytes (10), length %d" % payload_len) current_test.next = 5 test_frame1 = udp_ep.UDPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.udp_source_port = 1 test_frame1.udp_dest_port = 2 test_frame1.udp_length = None test_frame1.udp_checksum = None test_frame1.payload = bytearray(range(payload_len)) test_frame1.build() test_frame2 = udp_ep.UDPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.udp_source_port = 1 test_frame2.udp_dest_port = 2 test_frame2.udp_length = None test_frame2.udp_checksum = None test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() test_frame1a = udp_ep.UDPFrame(test_frame1) test_frame1a.payload.data += bytearray(b'\x00'*10) for wait in wait_normal, wait_pause_source, wait_pause_sink: source_queue.put(test_frame1a) source_queue.put(test_frame2) yield clk.posedge yield clk.posedge yield wait() yield clk.posedge yield clk.posedge yield clk.posedge rx_frame = None if not sink_queue.empty(): rx_frame = sink_queue.get() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame1 rx_frame = None if not sink_queue.empty(): rx_frame = sink_queue.get() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame2 assert sink_queue.empty() yield delay(100) yield clk.posedge print("test 6: trailing bytes with tuser assert (1), length %d" % payload_len) current_test.next = 6 test_frame1 = udp_ep.UDPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.udp_source_port = 1 test_frame1.udp_dest_port = 2 test_frame1.udp_length = None test_frame1.udp_checksum = None test_frame1.payload = bytearray(range(payload_len)) test_frame1.build() test_frame2 = udp_ep.UDPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.udp_source_port = 1 test_frame2.udp_dest_port = 2 test_frame2.udp_length = None test_frame2.udp_checksum = None test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() test_frame1a = udp_ep.UDPFrame(test_frame1) test_frame1a.payload.data += bytearray(b'\x00') test_frame1a.payload.user = 1 for wait in wait_normal, wait_pause_source, wait_pause_sink: source_queue.put(test_frame1a) source_queue.put(test_frame2) yield clk.posedge yield clk.posedge yield wait() yield clk.posedge yield clk.posedge yield clk.posedge rx_frame = None if not sink_queue.empty(): rx_frame = sink_queue.get() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame1 assert rx_frame.payload.user[-1] rx_frame = None if not sink_queue.empty(): rx_frame = sink_queue.get() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame2 assert sink_queue.empty() yield delay(100) yield clk.posedge print("test 7: trailing bytes with tuser assert (10), length %d" % payload_len) current_test.next = 7 test_frame1 = udp_ep.UDPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.udp_source_port = 1 test_frame1.udp_dest_port = 2 test_frame1.udp_length = None test_frame1.udp_checksum = None test_frame1.payload = bytearray(range(payload_len)) test_frame1.build() test_frame2 = udp_ep.UDPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.udp_source_port = 1 test_frame2.udp_dest_port = 2 test_frame2.udp_length = None test_frame2.udp_checksum = None test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() test_frame1a = udp_ep.UDPFrame(test_frame1) test_frame1a.payload.data += bytearray(b'\x00'*10) test_frame1a.payload.user = 1 for wait in wait_normal, wait_pause_source, wait_pause_sink: source_queue.put(test_frame1a) source_queue.put(test_frame2) yield clk.posedge yield clk.posedge yield wait() yield clk.posedge yield clk.posedge yield clk.posedge rx_frame = None if not sink_queue.empty(): rx_frame = sink_queue.get() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame1 assert rx_frame.payload.user[-1] rx_frame = None if not sink_queue.empty(): rx_frame = sink_queue.get() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame2 assert sink_queue.empty() yield delay(100) yield clk.posedge print("test 8: truncated payload (1), length %d" % payload_len) current_test.next = 8 test_frame1 = udp_ep.UDPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.udp_source_port = 1 test_frame1.udp_dest_port = 2 test_frame1.udp_length = None test_frame1.udp_checksum = None test_frame1.payload = bytearray(range(payload_len+1)) test_frame1.build() test_frame2 = udp_ep.UDPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.udp_source_port = 1 test_frame2.udp_dest_port = 2 test_frame2.udp_length = None test_frame2.udp_checksum = None test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() test_frame1a = udp_ep.UDPFrame(test_frame1) test_frame1a.payload.data = test_frame1a.payload.data[:-1] for wait in wait_normal, wait_pause_source, wait_pause_sink: error_payload_early_termination_asserted.next = 0 source_queue.put(test_frame1a) source_queue.put(test_frame2) yield clk.posedge yield clk.posedge yield wait() yield clk.posedge yield clk.posedge yield clk.posedge rx_frame = None if not sink_queue.empty(): rx_frame = sink_queue.get() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert rx_frame.payload.user[-1] assert error_payload_early_termination_asserted rx_frame = None if not sink_queue.empty(): rx_frame = sink_queue.get() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame2 assert sink_queue.empty() yield delay(100) yield clk.posedge print("test 9: truncated payload (10), length %d" % payload_len) current_test.next = 9 test_frame1 = udp_ep.UDPFrame() test_frame1.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame1.eth_src_mac = 0x5A5152535455 test_frame1.eth_type = 0x0800 test_frame1.ip_version = 4 test_frame1.ip_ihl = 5 test_frame1.ip_length = None test_frame1.ip_identification = 0 test_frame1.ip_flags = 2 test_frame1.ip_fragment_offset = 0 test_frame1.ip_ttl = 64 test_frame1.ip_protocol = 0x11 test_frame1.ip_header_checksum = None test_frame1.ip_source_ip = 0xc0a80164 test_frame1.ip_dest_ip = 0xc0a80165 test_frame1.udp_source_port = 1 test_frame1.udp_dest_port = 2 test_frame1.udp_length = None test_frame1.udp_checksum = None test_frame1.payload = bytearray(range(payload_len+10)) test_frame1.build() test_frame2 = udp_ep.UDPFrame() test_frame2.eth_dest_mac = 0xDAD1D2D3D4D5 test_frame2.eth_src_mac = 0x5A5152535455 test_frame2.eth_type = 0x0800 test_frame2.ip_version = 4 test_frame2.ip_ihl = 5 test_frame2.ip_length = None test_frame2.ip_identification = 0 test_frame2.ip_flags = 2 test_frame2.ip_fragment_offset = 0 test_frame2.ip_ttl = 64 test_frame2.ip_protocol = 0x11 test_frame2.ip_header_checksum = None test_frame2.ip_source_ip = 0xc0a80164 test_frame2.ip_dest_ip = 0xc0a80166 test_frame2.udp_source_port = 1 test_frame2.udp_dest_port = 2 test_frame2.udp_length = None test_frame2.udp_checksum = None test_frame2.payload = bytearray(range(payload_len)) test_frame2.build() test_frame1a = udp_ep.UDPFrame(test_frame1) test_frame1a.payload.data = test_frame1.payload.data[:-10] for wait in wait_normal, wait_pause_source, wait_pause_sink: error_payload_early_termination_asserted.next = 0 source_queue.put(test_frame1a) source_queue.put(test_frame2) yield clk.posedge yield clk.posedge yield wait() yield clk.posedge yield clk.posedge yield clk.posedge rx_frame = None if not sink_queue.empty(): rx_frame = sink_queue.get() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert rx_frame.payload.user[-1] assert error_payload_early_termination_asserted rx_frame = None if not sink_queue.empty(): rx_frame = sink_queue.get() check_frame = udp_ep.UDPFrame() check_frame.parse_ip(rx_frame) assert check_frame == test_frame2 assert sink_queue.empty() yield delay(100) raise StopSimulation return dut, source, sink, clkgen, monitor, check