From 1b69fc5eed7140da47d58a4035bae75b58caa61b Mon Sep 17 00:00:00 2001 From: Alex Forencich Date: Tue, 18 Nov 2014 14:53:31 -0800 Subject: [PATCH] Add UDP arbitrated mux and testbench --- rtl/udp_arb_mux.py | 284 ++++++++ rtl/udp_arb_mux_4.v | 366 ++++++++++ rtl/udp_arb_mux_64.py | 288 ++++++++ rtl/udp_arb_mux_64_4.v | 376 ++++++++++ tb/test_udp_arb_mux_4.py | 1339 ++++++++++++++++++++++++++++++++++ tb/test_udp_arb_mux_4.v | 465 ++++++++++++ tb/test_udp_arb_mux_64_4.py | 1364 +++++++++++++++++++++++++++++++++++ tb/test_udp_arb_mux_64_4.v | 480 ++++++++++++ 8 files changed, 4962 insertions(+) create mode 100755 rtl/udp_arb_mux.py create mode 100644 rtl/udp_arb_mux_4.v create mode 100755 rtl/udp_arb_mux_64.py create mode 100644 rtl/udp_arb_mux_64_4.v create mode 100755 tb/test_udp_arb_mux_4.py create mode 100644 tb/test_udp_arb_mux_4.v create mode 100755 tb/test_udp_arb_mux_64_4.py create mode 100644 tb/test_udp_arb_mux_64_4.v diff --git a/rtl/udp_arb_mux.py b/rtl/udp_arb_mux.py new file mode 100755 index 00000000..0a8f53c7 --- /dev/null +++ b/rtl/udp_arb_mux.py @@ -0,0 +1,284 @@ +#!/usr/bin/env python +"""udp_arb_mux + +Generates an arbitrated UDP mux with the specified number of ports + +Usage: udp_arb_mux [OPTION]... + -?, --help display this help and exit + -p, --ports specify number of ports + -n, --name specify module name + -o, --output specify output file name +""" + +import io +import sys +import getopt +from math import * +from jinja2 import Template + +class Usage(Exception): + def __init__(self, msg): + self.msg = msg + +def main(argv=None): + if argv is None: + argv = sys.argv + try: + try: + opts, args = getopt.getopt(argv[1:], "?n:p:o:", ["help", "name=", "ports=", "output="]) + except getopt.error as msg: + raise Usage(msg) + # more code, unchanged + except Usage as err: + print(err.msg, file=sys.stderr) + print("for help use --help", file=sys.stderr) + return 2 + + ports = 4 + name = None + out_name = None + + # process options + for o, a in opts: + if o in ('-?', '--help'): + print(__doc__) + sys.exit(0) + if o in ('-p', '--ports'): + ports = int(a) + if o in ('-n', '--name'): + name = a + if o in ('-o', '--output'): + out_name = a + + if name is None: + name = "udp_arb_mux_{0}".format(ports) + + if out_name is None: + out_name = name + ".v" + + print("Opening file '%s'..." % out_name) + + try: + out_file = open(out_name, 'w') + except Exception as ex: + print("Error opening \"%s\": %s" %(out_name, ex.strerror), file=sys.stderr) + exit(1) + + print("Generating {0} port AXI Stream arbitrated mux {1}...".format(ports, name)) + + select_width = ceil(log2(ports)) + + t = Template(u"""/* + +Copyright (c) 2014 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`timescale 1ns / 1ps + +/* + * UDP {{n}} port arbitrated multiplexer + */ +module {{name}} # +( + // arbitration type: "PRIORITY" or "ROUND_ROBIN" + parameter ARB_TYPE = "PRIORITY", + // LSB priority: "LOW", "HIGH" + parameter LSB_PRIORITY = "HIGH" +) +( + input wire clk, + input wire rst, + + /* + * UDP frame inputs + */ +{%- for p in ports %} + input wire input_{{p}}_udp_hdr_valid, + output wire input_{{p}}_udp_hdr_ready, + input wire [47:0] input_{{p}}_eth_dest_mac, + input wire [47:0] input_{{p}}_eth_src_mac, + input wire [15:0] input_{{p}}_eth_type, + input wire [3:0] input_{{p}}_ip_version, + input wire [3:0] input_{{p}}_ip_ihl, + input wire [5:0] input_{{p}}_ip_dscp, + input wire [1:0] input_{{p}}_ip_ecn, + input wire [15:0] input_{{p}}_ip_length, + input wire [15:0] input_{{p}}_ip_identification, + input wire [2:0] input_{{p}}_ip_flags, + input wire [12:0] input_{{p}}_ip_fragment_offset, + input wire [7:0] input_{{p}}_ip_ttl, + input wire [7:0] input_{{p}}_ip_protocol, + input wire [15:0] input_{{p}}_ip_header_checksum, + input wire [31:0] input_{{p}}_ip_source_ip, + input wire [31:0] input_{{p}}_ip_dest_ip, + input wire [15:0] input_{{p}}_udp_source_port, + input wire [15:0] input_{{p}}_udp_dest_port, + input wire [15:0] input_{{p}}_udp_length, + input wire [15:0] input_{{p}}_udp_checksum, + input wire [7:0] input_{{p}}_udp_payload_tdata, + input wire input_{{p}}_udp_payload_tvalid, + output wire input_{{p}}_udp_payload_tready, + input wire input_{{p}}_udp_payload_tlast, + input wire input_{{p}}_udp_payload_tuser, +{% endfor %} + /* + * UDP frame output + */ + output wire output_udp_hdr_valid, + input wire output_udp_hdr_ready, + output wire [47:0] output_eth_dest_mac, + output wire [47:0] output_eth_src_mac, + output wire [15:0] output_eth_type, + output wire [3:0] output_ip_version, + output wire [3:0] output_ip_ihl, + output wire [5:0] output_ip_dscp, + output wire [1:0] output_ip_ecn, + output wire [15:0] output_ip_length, + output wire [15:0] output_ip_identification, + output wire [2:0] output_ip_flags, + output wire [12:0] output_ip_fragment_offset, + output wire [7:0] output_ip_ttl, + output wire [7:0] output_ip_protocol, + output wire [15:0] output_ip_header_checksum, + output wire [31:0] output_ip_source_ip, + output wire [31:0] output_ip_dest_ip, + output wire [15:0] output_udp_source_port, + output wire [15:0] output_udp_dest_port, + output wire [15:0] output_udp_length, + output wire [15:0] output_udp_checksum, + output wire [7:0] output_udp_payload_tdata, + output wire output_udp_payload_tvalid, + input wire output_udp_payload_tready, + output wire output_udp_payload_tlast, + output wire output_udp_payload_tuser +); + +wire [{{n-1}}:0] request; +wire [{{n-1}}:0] acknowledge; +wire [{{n-1}}:0] grant; +wire grant_valid; +wire [{{w-1}}:0] grant_encoded; +{% for p in ports %} +assign acknowledge[{{p}}] = input_{{p}}_udp_payload_tvalid & input_{{p}}_udp_payload_tready & input_{{p}}_udp_payload_tlast; +assign request[{{p}}] = input_{{p}}_udp_hdr_valid; +{%- endfor %} + +// mux instance +udp_mux_{{n}} +mux_inst ( + .clk(clk), + .rst(rst), +{%- for p in ports %} + .input_{{p}}_udp_hdr_valid(input_{{p}}_udp_hdr_valid & grant[{{p}}]), + .input_{{p}}_udp_hdr_ready(input_{{p}}_udp_hdr_ready), + .input_{{p}}_eth_dest_mac(input_{{p}}_eth_dest_mac), + .input_{{p}}_eth_src_mac(input_{{p}}_eth_src_mac), + .input_{{p}}_eth_type(input_{{p}}_eth_type), + .input_{{p}}_ip_version(input_{{p}}_ip_version), + .input_{{p}}_ip_ihl(input_{{p}}_ip_ihl), + .input_{{p}}_ip_dscp(input_{{p}}_ip_dscp), + .input_{{p}}_ip_ecn(input_{{p}}_ip_ecn), + .input_{{p}}_ip_length(input_{{p}}_ip_length), + .input_{{p}}_ip_identification(input_{{p}}_ip_identification), + .input_{{p}}_ip_flags(input_{{p}}_ip_flags), + .input_{{p}}_ip_fragment_offset(input_{{p}}_ip_fragment_offset), + .input_{{p}}_ip_ttl(input_{{p}}_ip_ttl), + .input_{{p}}_ip_protocol(input_{{p}}_ip_protocol), + .input_{{p}}_ip_header_checksum(input_{{p}}_ip_header_checksum), + .input_{{p}}_ip_source_ip(input_{{p}}_ip_source_ip), + .input_{{p}}_ip_dest_ip(input_{{p}}_ip_dest_ip), + .input_{{p}}_udp_source_port(input_{{p}}_udp_source_port), + .input_{{p}}_udp_dest_port(input_{{p}}_udp_dest_port), + .input_{{p}}_udp_length(input_{{p}}_udp_length), + .input_{{p}}_udp_checksum(input_{{p}}_udp_checksum), + .input_{{p}}_udp_payload_tdata(input_{{p}}_udp_payload_tdata), + .input_{{p}}_udp_payload_tvalid(input_{{p}}_udp_payload_tvalid & grant[{{p}}]), + .input_{{p}}_udp_payload_tready(input_{{p}}_udp_payload_tready), + .input_{{p}}_udp_payload_tlast(input_{{p}}_udp_payload_tlast), + .input_{{p}}_udp_payload_tuser(input_{{p}}_udp_payload_tuser), +{%- endfor %} + .output_udp_hdr_valid(output_udp_hdr_valid), + .output_udp_hdr_ready(output_udp_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_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), + .enable(grant_valid), + .select(grant_encoded) +); + +// arbiter instance +arbiter #( + .PORTS({{n}}), + .TYPE(ARB_TYPE), + .BLOCK("ACKNOWLEDGE"), + .LSB_PRIORITY(LSB_PRIORITY) +) +arb_inst ( + .clk(clk), + .rst(rst), + .request(request), + .acknowledge(acknowledge), + .grant(grant), + .grant_valid(grant_valid), + .grant_encoded(grant_encoded) +); + +endmodule + +""") + + out_file.write(t.render( + n=ports, + w=select_width, + name=name, + ports=range(ports) + )) + + print("Done") + +if __name__ == "__main__": + sys.exit(main()) + diff --git a/rtl/udp_arb_mux_4.v b/rtl/udp_arb_mux_4.v new file mode 100644 index 00000000..9d926e99 --- /dev/null +++ b/rtl/udp_arb_mux_4.v @@ -0,0 +1,366 @@ +/* + +Copyright (c) 2014 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`timescale 1ns / 1ps + +/* + * UDP 4 port arbitrated multiplexer + */ +module udp_arb_mux_4 # +( + // arbitration type: "PRIORITY" or "ROUND_ROBIN" + parameter ARB_TYPE = "PRIORITY", + // LSB priority: "LOW", "HIGH" + parameter LSB_PRIORITY = "HIGH" +) +( + input wire clk, + input wire rst, + + /* + * UDP frame inputs + */ + input wire input_0_udp_hdr_valid, + output wire input_0_udp_hdr_ready, + input wire [47:0] input_0_eth_dest_mac, + input wire [47:0] input_0_eth_src_mac, + input wire [15:0] input_0_eth_type, + input wire [3:0] input_0_ip_version, + input wire [3:0] input_0_ip_ihl, + input wire [5:0] input_0_ip_dscp, + input wire [1:0] input_0_ip_ecn, + input wire [15:0] input_0_ip_length, + input wire [15:0] input_0_ip_identification, + input wire [2:0] input_0_ip_flags, + input wire [12:0] input_0_ip_fragment_offset, + input wire [7:0] input_0_ip_ttl, + input wire [7:0] input_0_ip_protocol, + input wire [15:0] input_0_ip_header_checksum, + input wire [31:0] input_0_ip_source_ip, + input wire [31:0] input_0_ip_dest_ip, + input wire [15:0] input_0_udp_source_port, + input wire [15:0] input_0_udp_dest_port, + input wire [15:0] input_0_udp_length, + input wire [15:0] input_0_udp_checksum, + input wire [7:0] input_0_udp_payload_tdata, + input wire input_0_udp_payload_tvalid, + output wire input_0_udp_payload_tready, + input wire input_0_udp_payload_tlast, + input wire input_0_udp_payload_tuser, + + input wire input_1_udp_hdr_valid, + output wire input_1_udp_hdr_ready, + input wire [47:0] input_1_eth_dest_mac, + input wire [47:0] input_1_eth_src_mac, + input wire [15:0] input_1_eth_type, + input wire [3:0] input_1_ip_version, + input wire [3:0] input_1_ip_ihl, + input wire [5:0] input_1_ip_dscp, + input wire [1:0] input_1_ip_ecn, + input wire [15:0] input_1_ip_length, + input wire [15:0] input_1_ip_identification, + input wire [2:0] input_1_ip_flags, + input wire [12:0] input_1_ip_fragment_offset, + input wire [7:0] input_1_ip_ttl, + input wire [7:0] input_1_ip_protocol, + input wire [15:0] input_1_ip_header_checksum, + input wire [31:0] input_1_ip_source_ip, + input wire [31:0] input_1_ip_dest_ip, + input wire [15:0] input_1_udp_source_port, + input wire [15:0] input_1_udp_dest_port, + input wire [15:0] input_1_udp_length, + input wire [15:0] input_1_udp_checksum, + input wire [7:0] input_1_udp_payload_tdata, + input wire input_1_udp_payload_tvalid, + output wire input_1_udp_payload_tready, + input wire input_1_udp_payload_tlast, + input wire input_1_udp_payload_tuser, + + input wire input_2_udp_hdr_valid, + output wire input_2_udp_hdr_ready, + input wire [47:0] input_2_eth_dest_mac, + input wire [47:0] input_2_eth_src_mac, + input wire [15:0] input_2_eth_type, + input wire [3:0] input_2_ip_version, + input wire [3:0] input_2_ip_ihl, + input wire [5:0] input_2_ip_dscp, + input wire [1:0] input_2_ip_ecn, + input wire [15:0] input_2_ip_length, + input wire [15:0] input_2_ip_identification, + input wire [2:0] input_2_ip_flags, + input wire [12:0] input_2_ip_fragment_offset, + input wire [7:0] input_2_ip_ttl, + input wire [7:0] input_2_ip_protocol, + input wire [15:0] input_2_ip_header_checksum, + input wire [31:0] input_2_ip_source_ip, + input wire [31:0] input_2_ip_dest_ip, + input wire [15:0] input_2_udp_source_port, + input wire [15:0] input_2_udp_dest_port, + input wire [15:0] input_2_udp_length, + input wire [15:0] input_2_udp_checksum, + input wire [7:0] input_2_udp_payload_tdata, + input wire input_2_udp_payload_tvalid, + output wire input_2_udp_payload_tready, + input wire input_2_udp_payload_tlast, + input wire input_2_udp_payload_tuser, + + input wire input_3_udp_hdr_valid, + output wire input_3_udp_hdr_ready, + input wire [47:0] input_3_eth_dest_mac, + input wire [47:0] input_3_eth_src_mac, + input wire [15:0] input_3_eth_type, + input wire [3:0] input_3_ip_version, + input wire [3:0] input_3_ip_ihl, + input wire [5:0] input_3_ip_dscp, + input wire [1:0] input_3_ip_ecn, + input wire [15:0] input_3_ip_length, + input wire [15:0] input_3_ip_identification, + input wire [2:0] input_3_ip_flags, + input wire [12:0] input_3_ip_fragment_offset, + input wire [7:0] input_3_ip_ttl, + input wire [7:0] input_3_ip_protocol, + input wire [15:0] input_3_ip_header_checksum, + input wire [31:0] input_3_ip_source_ip, + input wire [31:0] input_3_ip_dest_ip, + input wire [15:0] input_3_udp_source_port, + input wire [15:0] input_3_udp_dest_port, + input wire [15:0] input_3_udp_length, + input wire [15:0] input_3_udp_checksum, + input wire [7:0] input_3_udp_payload_tdata, + input wire input_3_udp_payload_tvalid, + output wire input_3_udp_payload_tready, + input wire input_3_udp_payload_tlast, + input wire input_3_udp_payload_tuser, + + /* + * UDP frame output + */ + output wire output_udp_hdr_valid, + input wire output_udp_hdr_ready, + output wire [47:0] output_eth_dest_mac, + output wire [47:0] output_eth_src_mac, + output wire [15:0] output_eth_type, + output wire [3:0] output_ip_version, + output wire [3:0] output_ip_ihl, + output wire [5:0] output_ip_dscp, + output wire [1:0] output_ip_ecn, + output wire [15:0] output_ip_length, + output wire [15:0] output_ip_identification, + output wire [2:0] output_ip_flags, + output wire [12:0] output_ip_fragment_offset, + output wire [7:0] output_ip_ttl, + output wire [7:0] output_ip_protocol, + output wire [15:0] output_ip_header_checksum, + output wire [31:0] output_ip_source_ip, + output wire [31:0] output_ip_dest_ip, + output wire [15:0] output_udp_source_port, + output wire [15:0] output_udp_dest_port, + output wire [15:0] output_udp_length, + output wire [15:0] output_udp_checksum, + output wire [7:0] output_udp_payload_tdata, + output wire output_udp_payload_tvalid, + input wire output_udp_payload_tready, + output wire output_udp_payload_tlast, + output wire output_udp_payload_tuser +); + +wire [3:0] request; +wire [3:0] acknowledge; +wire [3:0] grant; +wire grant_valid; +wire [1:0] grant_encoded; + +assign acknowledge[0] = input_0_udp_payload_tvalid & input_0_udp_payload_tready & input_0_udp_payload_tlast; +assign request[0] = input_0_udp_hdr_valid; +assign acknowledge[1] = input_1_udp_payload_tvalid & input_1_udp_payload_tready & input_1_udp_payload_tlast; +assign request[1] = input_1_udp_hdr_valid; +assign acknowledge[2] = input_2_udp_payload_tvalid & input_2_udp_payload_tready & input_2_udp_payload_tlast; +assign request[2] = input_2_udp_hdr_valid; +assign acknowledge[3] = input_3_udp_payload_tvalid & input_3_udp_payload_tready & input_3_udp_payload_tlast; +assign request[3] = input_3_udp_hdr_valid; + +// mux instance +udp_mux_4 +mux_inst ( + .clk(clk), + .rst(rst), + .input_0_udp_hdr_valid(input_0_udp_hdr_valid & grant[0]), + .input_0_udp_hdr_ready(input_0_udp_hdr_ready), + .input_0_eth_dest_mac(input_0_eth_dest_mac), + .input_0_eth_src_mac(input_0_eth_src_mac), + .input_0_eth_type(input_0_eth_type), + .input_0_ip_version(input_0_ip_version), + .input_0_ip_ihl(input_0_ip_ihl), + .input_0_ip_dscp(input_0_ip_dscp), + .input_0_ip_ecn(input_0_ip_ecn), + .input_0_ip_length(input_0_ip_length), + .input_0_ip_identification(input_0_ip_identification), + .input_0_ip_flags(input_0_ip_flags), + .input_0_ip_fragment_offset(input_0_ip_fragment_offset), + .input_0_ip_ttl(input_0_ip_ttl), + .input_0_ip_protocol(input_0_ip_protocol), + .input_0_ip_header_checksum(input_0_ip_header_checksum), + .input_0_ip_source_ip(input_0_ip_source_ip), + .input_0_ip_dest_ip(input_0_ip_dest_ip), + .input_0_udp_source_port(input_0_udp_source_port), + .input_0_udp_dest_port(input_0_udp_dest_port), + .input_0_udp_length(input_0_udp_length), + .input_0_udp_checksum(input_0_udp_checksum), + .input_0_udp_payload_tdata(input_0_udp_payload_tdata), + .input_0_udp_payload_tvalid(input_0_udp_payload_tvalid & grant[0]), + .input_0_udp_payload_tready(input_0_udp_payload_tready), + .input_0_udp_payload_tlast(input_0_udp_payload_tlast), + .input_0_udp_payload_tuser(input_0_udp_payload_tuser), + .input_1_udp_hdr_valid(input_1_udp_hdr_valid & grant[1]), + .input_1_udp_hdr_ready(input_1_udp_hdr_ready), + .input_1_eth_dest_mac(input_1_eth_dest_mac), + .input_1_eth_src_mac(input_1_eth_src_mac), + .input_1_eth_type(input_1_eth_type), + .input_1_ip_version(input_1_ip_version), + .input_1_ip_ihl(input_1_ip_ihl), + .input_1_ip_dscp(input_1_ip_dscp), + .input_1_ip_ecn(input_1_ip_ecn), + .input_1_ip_length(input_1_ip_length), + .input_1_ip_identification(input_1_ip_identification), + .input_1_ip_flags(input_1_ip_flags), + .input_1_ip_fragment_offset(input_1_ip_fragment_offset), + .input_1_ip_ttl(input_1_ip_ttl), + .input_1_ip_protocol(input_1_ip_protocol), + .input_1_ip_header_checksum(input_1_ip_header_checksum), + .input_1_ip_source_ip(input_1_ip_source_ip), + .input_1_ip_dest_ip(input_1_ip_dest_ip), + .input_1_udp_source_port(input_1_udp_source_port), + .input_1_udp_dest_port(input_1_udp_dest_port), + .input_1_udp_length(input_1_udp_length), + .input_1_udp_checksum(input_1_udp_checksum), + .input_1_udp_payload_tdata(input_1_udp_payload_tdata), + .input_1_udp_payload_tvalid(input_1_udp_payload_tvalid & grant[1]), + .input_1_udp_payload_tready(input_1_udp_payload_tready), + .input_1_udp_payload_tlast(input_1_udp_payload_tlast), + .input_1_udp_payload_tuser(input_1_udp_payload_tuser), + .input_2_udp_hdr_valid(input_2_udp_hdr_valid & grant[2]), + .input_2_udp_hdr_ready(input_2_udp_hdr_ready), + .input_2_eth_dest_mac(input_2_eth_dest_mac), + .input_2_eth_src_mac(input_2_eth_src_mac), + .input_2_eth_type(input_2_eth_type), + .input_2_ip_version(input_2_ip_version), + .input_2_ip_ihl(input_2_ip_ihl), + .input_2_ip_dscp(input_2_ip_dscp), + .input_2_ip_ecn(input_2_ip_ecn), + .input_2_ip_length(input_2_ip_length), + .input_2_ip_identification(input_2_ip_identification), + .input_2_ip_flags(input_2_ip_flags), + .input_2_ip_fragment_offset(input_2_ip_fragment_offset), + .input_2_ip_ttl(input_2_ip_ttl), + .input_2_ip_protocol(input_2_ip_protocol), + .input_2_ip_header_checksum(input_2_ip_header_checksum), + .input_2_ip_source_ip(input_2_ip_source_ip), + .input_2_ip_dest_ip(input_2_ip_dest_ip), + .input_2_udp_source_port(input_2_udp_source_port), + .input_2_udp_dest_port(input_2_udp_dest_port), + .input_2_udp_length(input_2_udp_length), + .input_2_udp_checksum(input_2_udp_checksum), + .input_2_udp_payload_tdata(input_2_udp_payload_tdata), + .input_2_udp_payload_tvalid(input_2_udp_payload_tvalid & grant[2]), + .input_2_udp_payload_tready(input_2_udp_payload_tready), + .input_2_udp_payload_tlast(input_2_udp_payload_tlast), + .input_2_udp_payload_tuser(input_2_udp_payload_tuser), + .input_3_udp_hdr_valid(input_3_udp_hdr_valid & grant[3]), + .input_3_udp_hdr_ready(input_3_udp_hdr_ready), + .input_3_eth_dest_mac(input_3_eth_dest_mac), + .input_3_eth_src_mac(input_3_eth_src_mac), + .input_3_eth_type(input_3_eth_type), + .input_3_ip_version(input_3_ip_version), + .input_3_ip_ihl(input_3_ip_ihl), + .input_3_ip_dscp(input_3_ip_dscp), + .input_3_ip_ecn(input_3_ip_ecn), + .input_3_ip_length(input_3_ip_length), + .input_3_ip_identification(input_3_ip_identification), + .input_3_ip_flags(input_3_ip_flags), + .input_3_ip_fragment_offset(input_3_ip_fragment_offset), + .input_3_ip_ttl(input_3_ip_ttl), + .input_3_ip_protocol(input_3_ip_protocol), + .input_3_ip_header_checksum(input_3_ip_header_checksum), + .input_3_ip_source_ip(input_3_ip_source_ip), + .input_3_ip_dest_ip(input_3_ip_dest_ip), + .input_3_udp_source_port(input_3_udp_source_port), + .input_3_udp_dest_port(input_3_udp_dest_port), + .input_3_udp_length(input_3_udp_length), + .input_3_udp_checksum(input_3_udp_checksum), + .input_3_udp_payload_tdata(input_3_udp_payload_tdata), + .input_3_udp_payload_tvalid(input_3_udp_payload_tvalid & grant[3]), + .input_3_udp_payload_tready(input_3_udp_payload_tready), + .input_3_udp_payload_tlast(input_3_udp_payload_tlast), + .input_3_udp_payload_tuser(input_3_udp_payload_tuser), + .output_udp_hdr_valid(output_udp_hdr_valid), + .output_udp_hdr_ready(output_udp_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_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), + .enable(grant_valid), + .select(grant_encoded) +); + +// arbiter instance +arbiter #( + .PORTS(4), + .TYPE(ARB_TYPE), + .BLOCK("ACKNOWLEDGE"), + .LSB_PRIORITY(LSB_PRIORITY) +) +arb_inst ( + .clk(clk), + .rst(rst), + .request(request), + .acknowledge(acknowledge), + .grant(grant), + .grant_valid(grant_valid), + .grant_encoded(grant_encoded) +); + +endmodule diff --git a/rtl/udp_arb_mux_64.py b/rtl/udp_arb_mux_64.py new file mode 100755 index 00000000..8151998a --- /dev/null +++ b/rtl/udp_arb_mux_64.py @@ -0,0 +1,288 @@ +#!/usr/bin/env python +"""udp_arb_mux_64 + +Generates an arbitrated UDP mux with the specified number of ports + +Usage: udp_arb_mux_64 [OPTION]... + -?, --help display this help and exit + -p, --ports specify number of ports + -n, --name specify module name + -o, --output specify output file name +""" + +import io +import sys +import getopt +from math import * +from jinja2 import Template + +class Usage(Exception): + def __init__(self, msg): + self.msg = msg + +def main(argv=None): + if argv is None: + argv = sys.argv + try: + try: + opts, args = getopt.getopt(argv[1:], "?n:p:o:", ["help", "name=", "ports=", "output="]) + except getopt.error as msg: + raise Usage(msg) + # more code, unchanged + except Usage as err: + print(err.msg, file=sys.stderr) + print("for help use --help", file=sys.stderr) + return 2 + + ports = 4 + name = None + out_name = None + + # process options + for o, a in opts: + if o in ('-?', '--help'): + print(__doc__) + sys.exit(0) + if o in ('-p', '--ports'): + ports = int(a) + if o in ('-n', '--name'): + name = a + if o in ('-o', '--output'): + out_name = a + + if name is None: + name = "udp_arb_mux_64_{0}".format(ports) + + if out_name is None: + out_name = name + ".v" + + print("Opening file '%s'..." % out_name) + + try: + out_file = open(out_name, 'w') + except Exception as ex: + print("Error opening \"%s\": %s" %(out_name, ex.strerror), file=sys.stderr) + exit(1) + + print("Generating {0} port AXI Stream arbitrated mux {1}...".format(ports, name)) + + select_width = ceil(log2(ports)) + + t = Template(u"""/* + +Copyright (c) 2014 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`timescale 1ns / 1ps + +/* + * UDP {{n}} port arbitrated multiplexer (64 bit datapath) + */ +module {{name}} # +( + // arbitration type: "PRIORITY" or "ROUND_ROBIN" + parameter ARB_TYPE = "PRIORITY", + // LSB priority: "LOW", "HIGH" + parameter LSB_PRIORITY = "HIGH" +) +( + input wire clk, + input wire rst, + + /* + * UDP frame inputs + */ +{%- for p in ports %} + input wire input_{{p}}_udp_hdr_valid, + output wire input_{{p}}_udp_hdr_ready, + input wire [47:0] input_{{p}}_eth_dest_mac, + input wire [47:0] input_{{p}}_eth_src_mac, + input wire [15:0] input_{{p}}_eth_type, + input wire [3:0] input_{{p}}_ip_version, + input wire [3:0] input_{{p}}_ip_ihl, + input wire [5:0] input_{{p}}_ip_dscp, + input wire [1:0] input_{{p}}_ip_ecn, + input wire [15:0] input_{{p}}_ip_length, + input wire [15:0] input_{{p}}_ip_identification, + input wire [2:0] input_{{p}}_ip_flags, + input wire [12:0] input_{{p}}_ip_fragment_offset, + input wire [7:0] input_{{p}}_ip_ttl, + input wire [7:0] input_{{p}}_ip_protocol, + input wire [15:0] input_{{p}}_ip_header_checksum, + input wire [31:0] input_{{p}}_ip_source_ip, + input wire [31:0] input_{{p}}_ip_dest_ip, + input wire [15:0] input_{{p}}_udp_source_port, + input wire [15:0] input_{{p}}_udp_dest_port, + input wire [15:0] input_{{p}}_udp_length, + input wire [15:0] input_{{p}}_udp_checksum, + input wire [63:0] input_{{p}}_udp_payload_tdata, + input wire [7:0] input_{{p}}_udp_payload_tkeep, + input wire input_{{p}}_udp_payload_tvalid, + output wire input_{{p}}_udp_payload_tready, + input wire input_{{p}}_udp_payload_tlast, + input wire input_{{p}}_udp_payload_tuser, +{% endfor %} + /* + * UDP frame output + */ + output wire output_udp_hdr_valid, + input wire output_udp_hdr_ready, + output wire [47:0] output_eth_dest_mac, + output wire [47:0] output_eth_src_mac, + output wire [15:0] output_eth_type, + output wire [3:0] output_ip_version, + output wire [3:0] output_ip_ihl, + output wire [5:0] output_ip_dscp, + output wire [1:0] output_ip_ecn, + output wire [15:0] output_ip_length, + output wire [15:0] output_ip_identification, + output wire [2:0] output_ip_flags, + output wire [12:0] output_ip_fragment_offset, + output wire [7:0] output_ip_ttl, + output wire [7:0] output_ip_protocol, + output wire [15:0] output_ip_header_checksum, + output wire [31:0] output_ip_source_ip, + output wire [31:0] output_ip_dest_ip, + output wire [15:0] output_udp_source_port, + output wire [15:0] output_udp_dest_port, + output wire [15:0] output_udp_length, + output wire [15:0] output_udp_checksum, + output wire [63:0] output_udp_payload_tdata, + output wire [7:0] output_udp_payload_tkeep, + output wire output_udp_payload_tvalid, + input wire output_udp_payload_tready, + output wire output_udp_payload_tlast, + output wire output_udp_payload_tuser +); + +wire [{{n-1}}:0] request; +wire [{{n-1}}:0] acknowledge; +wire [{{n-1}}:0] grant; +wire grant_valid; +wire [{{w-1}}:0] grant_encoded; +{% for p in ports %} +assign acknowledge[{{p}}] = input_{{p}}_udp_payload_tvalid & input_{{p}}_udp_payload_tready & input_{{p}}_udp_payload_tlast; +assign request[{{p}}] = input_{{p}}_udp_hdr_valid; +{%- endfor %} + +// mux instance +udp_mux_64_{{n}} +mux_inst ( + .clk(clk), + .rst(rst), +{%- for p in ports %} + .input_{{p}}_udp_hdr_valid(input_{{p}}_udp_hdr_valid & grant[{{p}}]), + .input_{{p}}_udp_hdr_ready(input_{{p}}_udp_hdr_ready), + .input_{{p}}_eth_dest_mac(input_{{p}}_eth_dest_mac), + .input_{{p}}_eth_src_mac(input_{{p}}_eth_src_mac), + .input_{{p}}_eth_type(input_{{p}}_eth_type), + .input_{{p}}_ip_version(input_{{p}}_ip_version), + .input_{{p}}_ip_ihl(input_{{p}}_ip_ihl), + .input_{{p}}_ip_dscp(input_{{p}}_ip_dscp), + .input_{{p}}_ip_ecn(input_{{p}}_ip_ecn), + .input_{{p}}_ip_length(input_{{p}}_ip_length), + .input_{{p}}_ip_identification(input_{{p}}_ip_identification), + .input_{{p}}_ip_flags(input_{{p}}_ip_flags), + .input_{{p}}_ip_fragment_offset(input_{{p}}_ip_fragment_offset), + .input_{{p}}_ip_ttl(input_{{p}}_ip_ttl), + .input_{{p}}_ip_protocol(input_{{p}}_ip_protocol), + .input_{{p}}_ip_header_checksum(input_{{p}}_ip_header_checksum), + .input_{{p}}_ip_source_ip(input_{{p}}_ip_source_ip), + .input_{{p}}_ip_dest_ip(input_{{p}}_ip_dest_ip), + .input_{{p}}_udp_source_port(input_{{p}}_udp_source_port), + .input_{{p}}_udp_dest_port(input_{{p}}_udp_dest_port), + .input_{{p}}_udp_length(input_{{p}}_udp_length), + .input_{{p}}_udp_checksum(input_{{p}}_udp_checksum), + .input_{{p}}_udp_payload_tdata(input_{{p}}_udp_payload_tdata), + .input_{{p}}_udp_payload_tkeep(input_{{p}}_udp_payload_tkeep), + .input_{{p}}_udp_payload_tvalid(input_{{p}}_udp_payload_tvalid & grant[{{p}}]), + .input_{{p}}_udp_payload_tready(input_{{p}}_udp_payload_tready), + .input_{{p}}_udp_payload_tlast(input_{{p}}_udp_payload_tlast), + .input_{{p}}_udp_payload_tuser(input_{{p}}_udp_payload_tuser), +{%- endfor %} + .output_udp_hdr_valid(output_udp_hdr_valid), + .output_udp_hdr_ready(output_udp_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_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_tkeep(output_udp_payload_tkeep), + .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), + .enable(grant_valid), + .select(grant_encoded) +); + +// arbiter instance +arbiter #( + .PORTS({{n}}), + .TYPE(ARB_TYPE), + .BLOCK("ACKNOWLEDGE"), + .LSB_PRIORITY(LSB_PRIORITY) +) +arb_inst ( + .clk(clk), + .rst(rst), + .request(request), + .acknowledge(acknowledge), + .grant(grant), + .grant_valid(grant_valid), + .grant_encoded(grant_encoded) +); + +endmodule + +""") + + out_file.write(t.render( + n=ports, + w=select_width, + name=name, + ports=range(ports) + )) + + print("Done") + +if __name__ == "__main__": + sys.exit(main()) + diff --git a/rtl/udp_arb_mux_64_4.v b/rtl/udp_arb_mux_64_4.v new file mode 100644 index 00000000..60bb9c5b --- /dev/null +++ b/rtl/udp_arb_mux_64_4.v @@ -0,0 +1,376 @@ +/* + +Copyright (c) 2014 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`timescale 1ns / 1ps + +/* + * UDP 4 port arbitrated multiplexer (64 bit datapath) + */ +module udp_arb_mux_64_4 # +( + // arbitration type: "PRIORITY" or "ROUND_ROBIN" + parameter ARB_TYPE = "PRIORITY", + // LSB priority: "LOW", "HIGH" + parameter LSB_PRIORITY = "HIGH" +) +( + input wire clk, + input wire rst, + + /* + * UDP frame inputs + */ + input wire input_0_udp_hdr_valid, + output wire input_0_udp_hdr_ready, + input wire [47:0] input_0_eth_dest_mac, + input wire [47:0] input_0_eth_src_mac, + input wire [15:0] input_0_eth_type, + input wire [3:0] input_0_ip_version, + input wire [3:0] input_0_ip_ihl, + input wire [5:0] input_0_ip_dscp, + input wire [1:0] input_0_ip_ecn, + input wire [15:0] input_0_ip_length, + input wire [15:0] input_0_ip_identification, + input wire [2:0] input_0_ip_flags, + input wire [12:0] input_0_ip_fragment_offset, + input wire [7:0] input_0_ip_ttl, + input wire [7:0] input_0_ip_protocol, + input wire [15:0] input_0_ip_header_checksum, + input wire [31:0] input_0_ip_source_ip, + input wire [31:0] input_0_ip_dest_ip, + input wire [15:0] input_0_udp_source_port, + input wire [15:0] input_0_udp_dest_port, + input wire [15:0] input_0_udp_length, + input wire [15:0] input_0_udp_checksum, + input wire [63:0] input_0_udp_payload_tdata, + input wire [7:0] input_0_udp_payload_tkeep, + input wire input_0_udp_payload_tvalid, + output wire input_0_udp_payload_tready, + input wire input_0_udp_payload_tlast, + input wire input_0_udp_payload_tuser, + + input wire input_1_udp_hdr_valid, + output wire input_1_udp_hdr_ready, + input wire [47:0] input_1_eth_dest_mac, + input wire [47:0] input_1_eth_src_mac, + input wire [15:0] input_1_eth_type, + input wire [3:0] input_1_ip_version, + input wire [3:0] input_1_ip_ihl, + input wire [5:0] input_1_ip_dscp, + input wire [1:0] input_1_ip_ecn, + input wire [15:0] input_1_ip_length, + input wire [15:0] input_1_ip_identification, + input wire [2:0] input_1_ip_flags, + input wire [12:0] input_1_ip_fragment_offset, + input wire [7:0] input_1_ip_ttl, + input wire [7:0] input_1_ip_protocol, + input wire [15:0] input_1_ip_header_checksum, + input wire [31:0] input_1_ip_source_ip, + input wire [31:0] input_1_ip_dest_ip, + input wire [15:0] input_1_udp_source_port, + input wire [15:0] input_1_udp_dest_port, + input wire [15:0] input_1_udp_length, + input wire [15:0] input_1_udp_checksum, + input wire [63:0] input_1_udp_payload_tdata, + input wire [7:0] input_1_udp_payload_tkeep, + input wire input_1_udp_payload_tvalid, + output wire input_1_udp_payload_tready, + input wire input_1_udp_payload_tlast, + input wire input_1_udp_payload_tuser, + + input wire input_2_udp_hdr_valid, + output wire input_2_udp_hdr_ready, + input wire [47:0] input_2_eth_dest_mac, + input wire [47:0] input_2_eth_src_mac, + input wire [15:0] input_2_eth_type, + input wire [3:0] input_2_ip_version, + input wire [3:0] input_2_ip_ihl, + input wire [5:0] input_2_ip_dscp, + input wire [1:0] input_2_ip_ecn, + input wire [15:0] input_2_ip_length, + input wire [15:0] input_2_ip_identification, + input wire [2:0] input_2_ip_flags, + input wire [12:0] input_2_ip_fragment_offset, + input wire [7:0] input_2_ip_ttl, + input wire [7:0] input_2_ip_protocol, + input wire [15:0] input_2_ip_header_checksum, + input wire [31:0] input_2_ip_source_ip, + input wire [31:0] input_2_ip_dest_ip, + input wire [15:0] input_2_udp_source_port, + input wire [15:0] input_2_udp_dest_port, + input wire [15:0] input_2_udp_length, + input wire [15:0] input_2_udp_checksum, + input wire [63:0] input_2_udp_payload_tdata, + input wire [7:0] input_2_udp_payload_tkeep, + input wire input_2_udp_payload_tvalid, + output wire input_2_udp_payload_tready, + input wire input_2_udp_payload_tlast, + input wire input_2_udp_payload_tuser, + + input wire input_3_udp_hdr_valid, + output wire input_3_udp_hdr_ready, + input wire [47:0] input_3_eth_dest_mac, + input wire [47:0] input_3_eth_src_mac, + input wire [15:0] input_3_eth_type, + input wire [3:0] input_3_ip_version, + input wire [3:0] input_3_ip_ihl, + input wire [5:0] input_3_ip_dscp, + input wire [1:0] input_3_ip_ecn, + input wire [15:0] input_3_ip_length, + input wire [15:0] input_3_ip_identification, + input wire [2:0] input_3_ip_flags, + input wire [12:0] input_3_ip_fragment_offset, + input wire [7:0] input_3_ip_ttl, + input wire [7:0] input_3_ip_protocol, + input wire [15:0] input_3_ip_header_checksum, + input wire [31:0] input_3_ip_source_ip, + input wire [31:0] input_3_ip_dest_ip, + input wire [15:0] input_3_udp_source_port, + input wire [15:0] input_3_udp_dest_port, + input wire [15:0] input_3_udp_length, + input wire [15:0] input_3_udp_checksum, + input wire [63:0] input_3_udp_payload_tdata, + input wire [7:0] input_3_udp_payload_tkeep, + input wire input_3_udp_payload_tvalid, + output wire input_3_udp_payload_tready, + input wire input_3_udp_payload_tlast, + input wire input_3_udp_payload_tuser, + + /* + * UDP frame output + */ + output wire output_udp_hdr_valid, + input wire output_udp_hdr_ready, + output wire [47:0] output_eth_dest_mac, + output wire [47:0] output_eth_src_mac, + output wire [15:0] output_eth_type, + output wire [3:0] output_ip_version, + output wire [3:0] output_ip_ihl, + output wire [5:0] output_ip_dscp, + output wire [1:0] output_ip_ecn, + output wire [15:0] output_ip_length, + output wire [15:0] output_ip_identification, + output wire [2:0] output_ip_flags, + output wire [12:0] output_ip_fragment_offset, + output wire [7:0] output_ip_ttl, + output wire [7:0] output_ip_protocol, + output wire [15:0] output_ip_header_checksum, + output wire [31:0] output_ip_source_ip, + output wire [31:0] output_ip_dest_ip, + output wire [15:0] output_udp_source_port, + output wire [15:0] output_udp_dest_port, + output wire [15:0] output_udp_length, + output wire [15:0] output_udp_checksum, + output wire [63:0] output_udp_payload_tdata, + output wire [7:0] output_udp_payload_tkeep, + output wire output_udp_payload_tvalid, + input wire output_udp_payload_tready, + output wire output_udp_payload_tlast, + output wire output_udp_payload_tuser +); + +wire [3:0] request; +wire [3:0] acknowledge; +wire [3:0] grant; +wire grant_valid; +wire [1:0] grant_encoded; + +assign acknowledge[0] = input_0_udp_payload_tvalid & input_0_udp_payload_tready & input_0_udp_payload_tlast; +assign request[0] = input_0_udp_hdr_valid; +assign acknowledge[1] = input_1_udp_payload_tvalid & input_1_udp_payload_tready & input_1_udp_payload_tlast; +assign request[1] = input_1_udp_hdr_valid; +assign acknowledge[2] = input_2_udp_payload_tvalid & input_2_udp_payload_tready & input_2_udp_payload_tlast; +assign request[2] = input_2_udp_hdr_valid; +assign acknowledge[3] = input_3_udp_payload_tvalid & input_3_udp_payload_tready & input_3_udp_payload_tlast; +assign request[3] = input_3_udp_hdr_valid; + +// mux instance +udp_mux_64_4 +mux_inst ( + .clk(clk), + .rst(rst), + .input_0_udp_hdr_valid(input_0_udp_hdr_valid & grant[0]), + .input_0_udp_hdr_ready(input_0_udp_hdr_ready), + .input_0_eth_dest_mac(input_0_eth_dest_mac), + .input_0_eth_src_mac(input_0_eth_src_mac), + .input_0_eth_type(input_0_eth_type), + .input_0_ip_version(input_0_ip_version), + .input_0_ip_ihl(input_0_ip_ihl), + .input_0_ip_dscp(input_0_ip_dscp), + .input_0_ip_ecn(input_0_ip_ecn), + .input_0_ip_length(input_0_ip_length), + .input_0_ip_identification(input_0_ip_identification), + .input_0_ip_flags(input_0_ip_flags), + .input_0_ip_fragment_offset(input_0_ip_fragment_offset), + .input_0_ip_ttl(input_0_ip_ttl), + .input_0_ip_protocol(input_0_ip_protocol), + .input_0_ip_header_checksum(input_0_ip_header_checksum), + .input_0_ip_source_ip(input_0_ip_source_ip), + .input_0_ip_dest_ip(input_0_ip_dest_ip), + .input_0_udp_source_port(input_0_udp_source_port), + .input_0_udp_dest_port(input_0_udp_dest_port), + .input_0_udp_length(input_0_udp_length), + .input_0_udp_checksum(input_0_udp_checksum), + .input_0_udp_payload_tdata(input_0_udp_payload_tdata), + .input_0_udp_payload_tkeep(input_0_udp_payload_tkeep), + .input_0_udp_payload_tvalid(input_0_udp_payload_tvalid & grant[0]), + .input_0_udp_payload_tready(input_0_udp_payload_tready), + .input_0_udp_payload_tlast(input_0_udp_payload_tlast), + .input_0_udp_payload_tuser(input_0_udp_payload_tuser), + .input_1_udp_hdr_valid(input_1_udp_hdr_valid & grant[1]), + .input_1_udp_hdr_ready(input_1_udp_hdr_ready), + .input_1_eth_dest_mac(input_1_eth_dest_mac), + .input_1_eth_src_mac(input_1_eth_src_mac), + .input_1_eth_type(input_1_eth_type), + .input_1_ip_version(input_1_ip_version), + .input_1_ip_ihl(input_1_ip_ihl), + .input_1_ip_dscp(input_1_ip_dscp), + .input_1_ip_ecn(input_1_ip_ecn), + .input_1_ip_length(input_1_ip_length), + .input_1_ip_identification(input_1_ip_identification), + .input_1_ip_flags(input_1_ip_flags), + .input_1_ip_fragment_offset(input_1_ip_fragment_offset), + .input_1_ip_ttl(input_1_ip_ttl), + .input_1_ip_protocol(input_1_ip_protocol), + .input_1_ip_header_checksum(input_1_ip_header_checksum), + .input_1_ip_source_ip(input_1_ip_source_ip), + .input_1_ip_dest_ip(input_1_ip_dest_ip), + .input_1_udp_source_port(input_1_udp_source_port), + .input_1_udp_dest_port(input_1_udp_dest_port), + .input_1_udp_length(input_1_udp_length), + .input_1_udp_checksum(input_1_udp_checksum), + .input_1_udp_payload_tdata(input_1_udp_payload_tdata), + .input_1_udp_payload_tkeep(input_1_udp_payload_tkeep), + .input_1_udp_payload_tvalid(input_1_udp_payload_tvalid & grant[1]), + .input_1_udp_payload_tready(input_1_udp_payload_tready), + .input_1_udp_payload_tlast(input_1_udp_payload_tlast), + .input_1_udp_payload_tuser(input_1_udp_payload_tuser), + .input_2_udp_hdr_valid(input_2_udp_hdr_valid & grant[2]), + .input_2_udp_hdr_ready(input_2_udp_hdr_ready), + .input_2_eth_dest_mac(input_2_eth_dest_mac), + .input_2_eth_src_mac(input_2_eth_src_mac), + .input_2_eth_type(input_2_eth_type), + .input_2_ip_version(input_2_ip_version), + .input_2_ip_ihl(input_2_ip_ihl), + .input_2_ip_dscp(input_2_ip_dscp), + .input_2_ip_ecn(input_2_ip_ecn), + .input_2_ip_length(input_2_ip_length), + .input_2_ip_identification(input_2_ip_identification), + .input_2_ip_flags(input_2_ip_flags), + .input_2_ip_fragment_offset(input_2_ip_fragment_offset), + .input_2_ip_ttl(input_2_ip_ttl), + .input_2_ip_protocol(input_2_ip_protocol), + .input_2_ip_header_checksum(input_2_ip_header_checksum), + .input_2_ip_source_ip(input_2_ip_source_ip), + .input_2_ip_dest_ip(input_2_ip_dest_ip), + .input_2_udp_source_port(input_2_udp_source_port), + .input_2_udp_dest_port(input_2_udp_dest_port), + .input_2_udp_length(input_2_udp_length), + .input_2_udp_checksum(input_2_udp_checksum), + .input_2_udp_payload_tdata(input_2_udp_payload_tdata), + .input_2_udp_payload_tkeep(input_2_udp_payload_tkeep), + .input_2_udp_payload_tvalid(input_2_udp_payload_tvalid & grant[2]), + .input_2_udp_payload_tready(input_2_udp_payload_tready), + .input_2_udp_payload_tlast(input_2_udp_payload_tlast), + .input_2_udp_payload_tuser(input_2_udp_payload_tuser), + .input_3_udp_hdr_valid(input_3_udp_hdr_valid & grant[3]), + .input_3_udp_hdr_ready(input_3_udp_hdr_ready), + .input_3_eth_dest_mac(input_3_eth_dest_mac), + .input_3_eth_src_mac(input_3_eth_src_mac), + .input_3_eth_type(input_3_eth_type), + .input_3_ip_version(input_3_ip_version), + .input_3_ip_ihl(input_3_ip_ihl), + .input_3_ip_dscp(input_3_ip_dscp), + .input_3_ip_ecn(input_3_ip_ecn), + .input_3_ip_length(input_3_ip_length), + .input_3_ip_identification(input_3_ip_identification), + .input_3_ip_flags(input_3_ip_flags), + .input_3_ip_fragment_offset(input_3_ip_fragment_offset), + .input_3_ip_ttl(input_3_ip_ttl), + .input_3_ip_protocol(input_3_ip_protocol), + .input_3_ip_header_checksum(input_3_ip_header_checksum), + .input_3_ip_source_ip(input_3_ip_source_ip), + .input_3_ip_dest_ip(input_3_ip_dest_ip), + .input_3_udp_source_port(input_3_udp_source_port), + .input_3_udp_dest_port(input_3_udp_dest_port), + .input_3_udp_length(input_3_udp_length), + .input_3_udp_checksum(input_3_udp_checksum), + .input_3_udp_payload_tdata(input_3_udp_payload_tdata), + .input_3_udp_payload_tkeep(input_3_udp_payload_tkeep), + .input_3_udp_payload_tvalid(input_3_udp_payload_tvalid & grant[3]), + .input_3_udp_payload_tready(input_3_udp_payload_tready), + .input_3_udp_payload_tlast(input_3_udp_payload_tlast), + .input_3_udp_payload_tuser(input_3_udp_payload_tuser), + .output_udp_hdr_valid(output_udp_hdr_valid), + .output_udp_hdr_ready(output_udp_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_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_tkeep(output_udp_payload_tkeep), + .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), + .enable(grant_valid), + .select(grant_encoded) +); + +// arbiter instance +arbiter #( + .PORTS(4), + .TYPE(ARB_TYPE), + .BLOCK("ACKNOWLEDGE"), + .LSB_PRIORITY(LSB_PRIORITY) +) +arb_inst ( + .clk(clk), + .rst(rst), + .request(request), + .acknowledge(acknowledge), + .grant(grant), + .grant_valid(grant_valid), + .grant_encoded(grant_encoded) +); + +endmodule diff --git a/tb/test_udp_arb_mux_4.py b/tb/test_udp_arb_mux_4.py new file mode 100755 index 00000000..e1697882 --- /dev/null +++ b/tb/test_udp_arb_mux_4.py @@ -0,0 +1,1339 @@ +#!/usr/bin/env python2 +""" + +Copyright (c) 2014 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +""" + +from myhdl import * +import os +from Queue import Queue + +import udp_ep + +module = 'udp_arb_mux_4' + +srcs = [] + +srcs.append("../rtl/%s.v" % module) +srcs.append("../rtl/udp_mux_4.v") +srcs.append("../lib/axis/rtl/arbiter.v") +srcs.append("../lib/axis/rtl/priority_encoder.v") +srcs.append("test_%s.v" % module) + +src = ' '.join(srcs) + +build_cmd = "iverilog -o test_%s.vvp %s" % (module, src) + +def dut_udp_arb_mux_4(clk, + rst, + current_test, + + input_0_udp_hdr_valid, + input_0_udp_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_udp_source_port, + input_0_udp_dest_port, + input_0_udp_length, + input_0_udp_checksum, + input_0_udp_payload_tdata, + input_0_udp_payload_tvalid, + input_0_udp_payload_tready, + input_0_udp_payload_tlast, + input_0_udp_payload_tuser, + input_1_udp_hdr_valid, + input_1_udp_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_udp_source_port, + input_1_udp_dest_port, + input_1_udp_length, + input_1_udp_checksum, + input_1_udp_payload_tdata, + input_1_udp_payload_tvalid, + input_1_udp_payload_tready, + input_1_udp_payload_tlast, + input_1_udp_payload_tuser, + input_2_udp_hdr_valid, + input_2_udp_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_udp_source_port, + input_2_udp_dest_port, + input_2_udp_length, + input_2_udp_checksum, + input_2_udp_payload_tdata, + input_2_udp_payload_tvalid, + input_2_udp_payload_tready, + input_2_udp_payload_tlast, + input_2_udp_payload_tuser, + input_3_udp_hdr_valid, + input_3_udp_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_udp_source_port, + input_3_udp_dest_port, + input_3_udp_length, + input_3_udp_checksum, + input_3_udp_payload_tdata, + input_3_udp_payload_tvalid, + input_3_udp_payload_tready, + input_3_udp_payload_tlast, + input_3_udp_payload_tuser, + + output_udp_hdr_valid, + output_udp_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_udp_source_port, + output_udp_dest_port, + output_udp_length, + output_udp_checksum, + output_udp_payload_tdata, + output_udp_payload_tvalid, + output_udp_payload_tready, + output_udp_payload_tlast, + output_udp_payload_tuser): + + if os.system(build_cmd): + raise Exception("Error running build command") + return Cosimulation("vvp -m myhdl test_%s.vvp -lxt2" % module, + clk=clk, + rst=rst, + current_test=current_test, + + input_0_udp_hdr_valid=input_0_udp_hdr_valid, + input_0_udp_hdr_ready=input_0_udp_hdr_ready, + input_0_eth_dest_mac=input_0_eth_dest_mac, + input_0_eth_src_mac=input_0_eth_src_mac, + input_0_eth_type=input_0_eth_type, + input_0_ip_version=input_0_ip_version, + input_0_ip_ihl=input_0_ip_ihl, + input_0_ip_dscp=input_0_ip_dscp, + input_0_ip_ecn=input_0_ip_ecn, + input_0_ip_length=input_0_ip_length, + input_0_ip_identification=input_0_ip_identification, + input_0_ip_flags=input_0_ip_flags, + input_0_ip_fragment_offset=input_0_ip_fragment_offset, + input_0_ip_ttl=input_0_ip_ttl, + input_0_ip_protocol=input_0_ip_protocol, + input_0_ip_header_checksum=input_0_ip_header_checksum, + input_0_ip_source_ip=input_0_ip_source_ip, + input_0_ip_dest_ip=input_0_ip_dest_ip, + input_0_udp_source_port=input_0_udp_source_port, + input_0_udp_dest_port=input_0_udp_dest_port, + input_0_udp_length=input_0_udp_length, + input_0_udp_checksum=input_0_udp_checksum, + input_0_udp_payload_tdata=input_0_udp_payload_tdata, + input_0_udp_payload_tvalid=input_0_udp_payload_tvalid, + input_0_udp_payload_tready=input_0_udp_payload_tready, + input_0_udp_payload_tlast=input_0_udp_payload_tlast, + input_0_udp_payload_tuser=input_0_udp_payload_tuser, + input_1_udp_hdr_valid=input_1_udp_hdr_valid, + input_1_udp_hdr_ready=input_1_udp_hdr_ready, + input_1_eth_dest_mac=input_1_eth_dest_mac, + input_1_eth_src_mac=input_1_eth_src_mac, + input_1_eth_type=input_1_eth_type, + input_1_ip_version=input_1_ip_version, + input_1_ip_ihl=input_1_ip_ihl, + input_1_ip_dscp=input_1_ip_dscp, + input_1_ip_ecn=input_1_ip_ecn, + input_1_ip_length=input_1_ip_length, + input_1_ip_identification=input_1_ip_identification, + input_1_ip_flags=input_1_ip_flags, + input_1_ip_fragment_offset=input_1_ip_fragment_offset, + input_1_ip_ttl=input_1_ip_ttl, + input_1_ip_protocol=input_1_ip_protocol, + input_1_ip_header_checksum=input_1_ip_header_checksum, + input_1_ip_source_ip=input_1_ip_source_ip, + input_1_ip_dest_ip=input_1_ip_dest_ip, + input_1_udp_source_port=input_1_udp_source_port, + input_1_udp_dest_port=input_1_udp_dest_port, + input_1_udp_length=input_1_udp_length, + input_1_udp_checksum=input_1_udp_checksum, + input_1_udp_payload_tdata=input_1_udp_payload_tdata, + input_1_udp_payload_tvalid=input_1_udp_payload_tvalid, + input_1_udp_payload_tready=input_1_udp_payload_tready, + input_1_udp_payload_tlast=input_1_udp_payload_tlast, + input_1_udp_payload_tuser=input_1_udp_payload_tuser, + input_2_udp_hdr_valid=input_2_udp_hdr_valid, + input_2_udp_hdr_ready=input_2_udp_hdr_ready, + input_2_eth_dest_mac=input_2_eth_dest_mac, + input_2_eth_src_mac=input_2_eth_src_mac, + input_2_eth_type=input_2_eth_type, + input_2_ip_version=input_2_ip_version, + input_2_ip_ihl=input_2_ip_ihl, + input_2_ip_dscp=input_2_ip_dscp, + input_2_ip_ecn=input_2_ip_ecn, + input_2_ip_length=input_2_ip_length, + input_2_ip_identification=input_2_ip_identification, + input_2_ip_flags=input_2_ip_flags, + input_2_ip_fragment_offset=input_2_ip_fragment_offset, + input_2_ip_ttl=input_2_ip_ttl, + input_2_ip_protocol=input_2_ip_protocol, + input_2_ip_header_checksum=input_2_ip_header_checksum, + input_2_ip_source_ip=input_2_ip_source_ip, + input_2_ip_dest_ip=input_2_ip_dest_ip, + input_2_udp_source_port=input_2_udp_source_port, + input_2_udp_dest_port=input_2_udp_dest_port, + input_2_udp_length=input_2_udp_length, + input_2_udp_checksum=input_2_udp_checksum, + input_2_udp_payload_tdata=input_2_udp_payload_tdata, + input_2_udp_payload_tvalid=input_2_udp_payload_tvalid, + input_2_udp_payload_tready=input_2_udp_payload_tready, + input_2_udp_payload_tlast=input_2_udp_payload_tlast, + input_2_udp_payload_tuser=input_2_udp_payload_tuser, + input_3_udp_hdr_valid=input_3_udp_hdr_valid, + input_3_udp_hdr_ready=input_3_udp_hdr_ready, + input_3_eth_dest_mac=input_3_eth_dest_mac, + input_3_eth_src_mac=input_3_eth_src_mac, + input_3_eth_type=input_3_eth_type, + input_3_ip_version=input_3_ip_version, + input_3_ip_ihl=input_3_ip_ihl, + input_3_ip_dscp=input_3_ip_dscp, + input_3_ip_ecn=input_3_ip_ecn, + input_3_ip_length=input_3_ip_length, + input_3_ip_identification=input_3_ip_identification, + input_3_ip_flags=input_3_ip_flags, + input_3_ip_fragment_offset=input_3_ip_fragment_offset, + input_3_ip_ttl=input_3_ip_ttl, + input_3_ip_protocol=input_3_ip_protocol, + input_3_ip_header_checksum=input_3_ip_header_checksum, + input_3_ip_source_ip=input_3_ip_source_ip, + input_3_ip_dest_ip=input_3_ip_dest_ip, + input_3_udp_source_port=input_3_udp_source_port, + input_3_udp_dest_port=input_3_udp_dest_port, + input_3_udp_length=input_3_udp_length, + input_3_udp_checksum=input_3_udp_checksum, + input_3_udp_payload_tdata=input_3_udp_payload_tdata, + input_3_udp_payload_tvalid=input_3_udp_payload_tvalid, + input_3_udp_payload_tready=input_3_udp_payload_tready, + input_3_udp_payload_tlast=input_3_udp_payload_tlast, + input_3_udp_payload_tuser=input_3_udp_payload_tuser, + + output_udp_hdr_valid=output_udp_hdr_valid, + output_udp_hdr_ready=output_udp_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_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) + +def bench(): + + # Inputs + clk = Signal(bool(0)) + rst = Signal(bool(0)) + current_test = Signal(intbv(0)[8:]) + + input_0_udp_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_udp_source_port = Signal(intbv(0)[16:]) + input_0_udp_dest_port = Signal(intbv(0)[16:]) + input_0_udp_length = Signal(intbv(0)[16:]) + input_0_udp_checksum = Signal(intbv(0)[16:]) + input_0_udp_payload_tdata = Signal(intbv(0)[8:]) + input_0_udp_payload_tvalid = Signal(bool(0)) + input_0_udp_payload_tlast = Signal(bool(0)) + input_0_udp_payload_tuser = Signal(bool(0)) + input_1_udp_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_udp_source_port = Signal(intbv(0)[16:]) + input_1_udp_dest_port = Signal(intbv(0)[16:]) + input_1_udp_length = Signal(intbv(0)[16:]) + input_1_udp_checksum = Signal(intbv(0)[16:]) + input_1_udp_payload_tdata = Signal(intbv(0)[8:]) + input_1_udp_payload_tvalid = Signal(bool(0)) + input_1_udp_payload_tlast = Signal(bool(0)) + input_1_udp_payload_tuser = Signal(bool(0)) + input_2_udp_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_udp_source_port = Signal(intbv(0)[16:]) + input_2_udp_dest_port = Signal(intbv(0)[16:]) + input_2_udp_length = Signal(intbv(0)[16:]) + input_2_udp_checksum = Signal(intbv(0)[16:]) + input_2_udp_payload_tdata = Signal(intbv(0)[8:]) + input_2_udp_payload_tvalid = Signal(bool(0)) + input_2_udp_payload_tlast = Signal(bool(0)) + input_2_udp_payload_tuser = Signal(bool(0)) + input_3_udp_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_udp_source_port = Signal(intbv(0)[16:]) + input_3_udp_dest_port = Signal(intbv(0)[16:]) + input_3_udp_length = Signal(intbv(0)[16:]) + input_3_udp_checksum = Signal(intbv(0)[16:]) + input_3_udp_payload_tdata = Signal(intbv(0)[8:]) + input_3_udp_payload_tvalid = Signal(bool(0)) + input_3_udp_payload_tlast = Signal(bool(0)) + input_3_udp_payload_tuser = Signal(bool(0)) + + output_udp_payload_tready = Signal(bool(0)) + output_udp_hdr_ready = Signal(bool(0)) + + # Outputs + input_0_udp_hdr_ready = Signal(bool(0)) + input_0_udp_payload_tready = Signal(bool(0)) + input_1_udp_hdr_ready = Signal(bool(0)) + input_1_udp_payload_tready = Signal(bool(0)) + input_2_udp_hdr_ready = Signal(bool(0)) + input_2_udp_payload_tready = Signal(bool(0)) + input_3_udp_hdr_ready = Signal(bool(0)) + input_3_udp_payload_tready = Signal(bool(0)) + + output_udp_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_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)) + + # 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 = udp_ep.UDPFrameSource(clk, + rst, + udp_hdr_ready=input_0_udp_hdr_ready, + udp_hdr_valid=input_0_udp_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, + udp_source_port=input_0_udp_source_port, + udp_dest_port=input_0_udp_dest_port, + udp_length=input_0_udp_length, + udp_checksum=input_0_udp_checksum, + udp_payload_tdata=input_0_udp_payload_tdata, + udp_payload_tvalid=input_0_udp_payload_tvalid, + udp_payload_tready=input_0_udp_payload_tready, + udp_payload_tlast=input_0_udp_payload_tlast, + udp_payload_tuser=input_0_udp_payload_tuser, + fifo=source_0_queue, + pause=source_0_pause, + name='source0') + + source_1 = udp_ep.UDPFrameSource(clk, + rst, + udp_hdr_ready=input_1_udp_hdr_ready, + udp_hdr_valid=input_1_udp_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, + udp_source_port=input_1_udp_source_port, + udp_dest_port=input_1_udp_dest_port, + udp_length=input_1_udp_length, + udp_checksum=input_1_udp_checksum, + udp_payload_tdata=input_1_udp_payload_tdata, + udp_payload_tvalid=input_1_udp_payload_tvalid, + udp_payload_tready=input_1_udp_payload_tready, + udp_payload_tlast=input_1_udp_payload_tlast, + udp_payload_tuser=input_1_udp_payload_tuser, + fifo=source_1_queue, + pause=source_1_pause, + name='source1') + + source_2 = udp_ep.UDPFrameSource(clk, + rst, + udp_hdr_ready=input_2_udp_hdr_ready, + udp_hdr_valid=input_2_udp_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, + udp_source_port=input_2_udp_source_port, + udp_dest_port=input_2_udp_dest_port, + udp_length=input_2_udp_length, + udp_checksum=input_2_udp_checksum, + udp_payload_tdata=input_2_udp_payload_tdata, + udp_payload_tvalid=input_2_udp_payload_tvalid, + udp_payload_tready=input_2_udp_payload_tready, + udp_payload_tlast=input_2_udp_payload_tlast, + udp_payload_tuser=input_2_udp_payload_tuser, + fifo=source_2_queue, + pause=source_2_pause, + name='source2') + + source_3 = udp_ep.UDPFrameSource(clk, + rst, + udp_hdr_ready=input_3_udp_hdr_ready, + udp_hdr_valid=input_3_udp_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, + udp_source_port=input_3_udp_source_port, + udp_dest_port=input_3_udp_dest_port, + udp_length=input_3_udp_length, + udp_checksum=input_3_udp_checksum, + udp_payload_tdata=input_3_udp_payload_tdata, + udp_payload_tvalid=input_3_udp_payload_tvalid, + udp_payload_tready=input_3_udp_payload_tready, + udp_payload_tlast=input_3_udp_payload_tlast, + udp_payload_tuser=input_3_udp_payload_tuser, + fifo=source_3_queue, + pause=source_3_pause, + name='source3') + + sink = udp_ep.UDPFrameSink(clk, + rst, + udp_hdr_ready=output_udp_hdr_ready, + udp_hdr_valid=output_udp_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, + 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, + fifo=sink_queue, + pause=sink_pause, + name='sink') + + # DUT + dut = dut_udp_arb_mux_4(clk, + rst, + current_test, + + input_0_udp_hdr_valid, + input_0_udp_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_udp_source_port, + input_0_udp_dest_port, + input_0_udp_length, + input_0_udp_checksum, + input_0_udp_payload_tdata, + input_0_udp_payload_tvalid, + input_0_udp_payload_tready, + input_0_udp_payload_tlast, + input_0_udp_payload_tuser, + input_1_udp_hdr_valid, + input_1_udp_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_udp_source_port, + input_1_udp_dest_port, + input_1_udp_length, + input_1_udp_checksum, + input_1_udp_payload_tdata, + input_1_udp_payload_tvalid, + input_1_udp_payload_tready, + input_1_udp_payload_tlast, + input_1_udp_payload_tuser, + input_2_udp_hdr_valid, + input_2_udp_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_udp_source_port, + input_2_udp_dest_port, + input_2_udp_length, + input_2_udp_checksum, + input_2_udp_payload_tdata, + input_2_udp_payload_tvalid, + input_2_udp_payload_tready, + input_2_udp_payload_tlast, + input_2_udp_payload_tuser, + input_3_udp_hdr_valid, + input_3_udp_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_udp_source_port, + input_3_udp_dest_port, + input_3_udp_length, + input_3_udp_checksum, + input_3_udp_payload_tdata, + input_3_udp_payload_tvalid, + input_3_udp_payload_tready, + input_3_udp_payload_tlast, + input_3_udp_payload_tuser, + + output_udp_hdr_valid, + output_udp_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_udp_source_port, + output_udp_dest_port, + output_udp_length, + output_udp_checksum, + output_udp_payload_tdata, + output_udp_payload_tvalid, + output_udp_payload_tready, + output_udp_payload_tlast, + output_udp_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 = udp_ep.UDPFrame() + 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.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(32)) + test_frame.build() + + source_0_queue.put(test_frame) + yield clk.posedge + yield clk.posedge + + while input_0_udp_payload_tvalid or input_1_udp_payload_tvalid or input_2_udp_payload_tvalid or input_3_udp_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 = udp_ep.UDPFrame() + 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.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(32)) + test_frame.build() + + source_1_queue.put(test_frame) + yield clk.posedge + yield clk.posedge + + while input_0_udp_payload_tvalid or input_1_udp_payload_tvalid or input_2_udp_payload_tvalid or input_3_udp_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 = udp_ep.UDPFrame() + 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.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(32)) + test_frame1.build() + test_frame2 = udp_ep.UDPFrame() + 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.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(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_udp_payload_tvalid or input_1_udp_payload_tvalid or input_2_udp_payload_tvalid or input_3_udp_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 = udp_ep.UDPFrame() + 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.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(32)) + test_frame1.build() + test_frame2 = udp_ep.UDPFrame() + 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.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(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_udp_payload_tvalid or input_1_udp_payload_tvalid or input_2_udp_payload_tvalid or input_3_udp_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 = udp_ep.UDPFrame() + 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.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(32)) + test_frame1.build() + test_frame2 = udp_ep.UDPFrame() + 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.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(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_udp_payload_tvalid or input_1_udp_payload_tvalid or input_2_udp_payload_tvalid or input_3_udp_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 = udp_ep.UDPFrame() + 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.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(32)) + test_frame1.build() + test_frame2 = udp_ep.UDPFrame() + 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.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(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_udp_payload_tvalid or input_1_udp_payload_tvalid or input_2_udp_payload_tvalid or input_3_udp_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 = udp_ep.UDPFrame() + 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.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(32)) + test_frame1.build() + test_frame2 = udp_ep.UDPFrame() + 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.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(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(800) + yield clk.posedge + source_1_queue.put(test_frame1) + + while input_0_udp_payload_tvalid or input_1_udp_payload_tvalid or input_2_udp_payload_tvalid or input_3_udp_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 test_bench(): + os.chdir(os.path.dirname(os.path.abspath(__file__))) + sim = Simulation(bench()) + sim.run() + +if __name__ == '__main__': + print("Running test...") + test_bench() + diff --git a/tb/test_udp_arb_mux_4.v b/tb/test_udp_arb_mux_4.v new file mode 100644 index 00000000..f38d96a2 --- /dev/null +++ b/tb/test_udp_arb_mux_4.v @@ -0,0 +1,465 @@ +/* + +Copyright (c) 2014 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`timescale 1 ns / 1 ps + +module test_udp_arb_mux_4; + +// Inputs +reg clk = 0; +reg rst = 0; +reg [7:0] current_test = 0; + +reg input_0_udp_hdr_valid = 0; +reg [47:0] input_0_eth_dest_mac = 0; +reg [47:0] input_0_eth_src_mac = 0; +reg [15:0] input_0_eth_type = 0; +reg [3:0] input_0_ip_version = 0; +reg [3:0] input_0_ip_ihl = 0; +reg [5:0] input_0_ip_dscp = 0; +reg [1:0] input_0_ip_ecn = 0; +reg [15:0] input_0_ip_length = 0; +reg [15:0] input_0_ip_identification = 0; +reg [2:0] input_0_ip_flags = 0; +reg [12:0] input_0_ip_fragment_offset = 0; +reg [7:0] input_0_ip_ttl = 0; +reg [7:0] input_0_ip_protocol = 0; +reg [15:0] input_0_ip_header_checksum = 0; +reg [31:0] input_0_ip_source_ip = 0; +reg [31:0] input_0_ip_dest_ip = 0; +reg [15:0] input_0_udp_source_port = 0; +reg [15:0] input_0_udp_dest_port = 0; +reg [15:0] input_0_udp_length = 0; +reg [15:0] input_0_udp_checksum = 0; +reg [7:0] input_0_udp_payload_tdata = 0; +reg input_0_udp_payload_tvalid = 0; +reg input_0_udp_payload_tlast = 0; +reg input_0_udp_payload_tuser = 0; +reg input_1_udp_hdr_valid = 0; +reg [47:0] input_1_eth_dest_mac = 0; +reg [47:0] input_1_eth_src_mac = 0; +reg [15:0] input_1_eth_type = 0; +reg [3:0] input_1_ip_version = 0; +reg [3:0] input_1_ip_ihl = 0; +reg [5:0] input_1_ip_dscp = 0; +reg [1:0] input_1_ip_ecn = 0; +reg [15:0] input_1_ip_length = 0; +reg [15:0] input_1_ip_identification = 0; +reg [2:0] input_1_ip_flags = 0; +reg [12:0] input_1_ip_fragment_offset = 0; +reg [7:0] input_1_ip_ttl = 0; +reg [7:0] input_1_ip_protocol = 0; +reg [15:0] input_1_ip_header_checksum = 0; +reg [31:0] input_1_ip_source_ip = 0; +reg [31:0] input_1_ip_dest_ip = 0; +reg [15:0] input_1_udp_source_port = 0; +reg [15:0] input_1_udp_dest_port = 0; +reg [15:0] input_1_udp_length = 0; +reg [15:0] input_1_udp_checksum = 0; +reg [7:0] input_1_udp_payload_tdata = 0; +reg input_1_udp_payload_tvalid = 0; +reg input_1_udp_payload_tlast = 0; +reg input_1_udp_payload_tuser = 0; +reg input_2_udp_hdr_valid = 0; +reg [47:0] input_2_eth_dest_mac = 0; +reg [47:0] input_2_eth_src_mac = 0; +reg [15:0] input_2_eth_type = 0; +reg [3:0] input_2_ip_version = 0; +reg [3:0] input_2_ip_ihl = 0; +reg [5:0] input_2_ip_dscp = 0; +reg [1:0] input_2_ip_ecn = 0; +reg [15:0] input_2_ip_length = 0; +reg [15:0] input_2_ip_identification = 0; +reg [2:0] input_2_ip_flags = 0; +reg [12:0] input_2_ip_fragment_offset = 0; +reg [7:0] input_2_ip_ttl = 0; +reg [7:0] input_2_ip_protocol = 0; +reg [15:0] input_2_ip_header_checksum = 0; +reg [31:0] input_2_ip_source_ip = 0; +reg [31:0] input_2_ip_dest_ip = 0; +reg [15:0] input_2_udp_source_port = 0; +reg [15:0] input_2_udp_dest_port = 0; +reg [15:0] input_2_udp_length = 0; +reg [15:0] input_2_udp_checksum = 0; +reg [7:0] input_2_udp_payload_tdata = 0; +reg input_2_udp_payload_tvalid = 0; +reg input_2_udp_payload_tlast = 0; +reg input_2_udp_payload_tuser = 0; +reg input_3_udp_hdr_valid = 0; +reg [47:0] input_3_eth_dest_mac = 0; +reg [47:0] input_3_eth_src_mac = 0; +reg [15:0] input_3_eth_type = 0; +reg [3:0] input_3_ip_version = 0; +reg [3:0] input_3_ip_ihl = 0; +reg [5:0] input_3_ip_dscp = 0; +reg [1:0] input_3_ip_ecn = 0; +reg [15:0] input_3_ip_length = 0; +reg [15:0] input_3_ip_identification = 0; +reg [2:0] input_3_ip_flags = 0; +reg [12:0] input_3_ip_fragment_offset = 0; +reg [7:0] input_3_ip_ttl = 0; +reg [7:0] input_3_ip_protocol = 0; +reg [15:0] input_3_ip_header_checksum = 0; +reg [31:0] input_3_ip_source_ip = 0; +reg [31:0] input_3_ip_dest_ip = 0; +reg [15:0] input_3_udp_source_port = 0; +reg [15:0] input_3_udp_dest_port = 0; +reg [15:0] input_3_udp_length = 0; +reg [15:0] input_3_udp_checksum = 0; +reg [7:0] input_3_udp_payload_tdata = 0; +reg input_3_udp_payload_tvalid = 0; +reg input_3_udp_payload_tlast = 0; +reg input_3_udp_payload_tuser = 0; + +reg output_udp_hdr_ready = 0; +reg output_udp_payload_tready = 0; + +// Outputs +wire input_0_udp_payload_tready; +wire input_0_udp_hdr_ready; +wire input_1_udp_payload_tready; +wire input_1_udp_hdr_ready; +wire input_2_udp_payload_tready; +wire input_2_udp_hdr_ready; +wire input_3_udp_payload_tready; +wire input_3_udp_hdr_ready; + +wire output_udp_hdr_valid; +wire [47:0] output_eth_dest_mac; +wire [47:0] output_eth_src_mac; +wire [15:0] output_eth_type; +wire [3:0] output_ip_version; +wire [3:0] output_ip_ihl; +wire [5:0] output_ip_dscp; +wire [1:0] output_ip_ecn; +wire [15:0] output_ip_length; +wire [15:0] output_ip_identification; +wire [2:0] output_ip_flags; +wire [12:0] output_ip_fragment_offset; +wire [7:0] output_ip_ttl; +wire [7:0] output_ip_protocol; +wire [15:0] output_ip_header_checksum; +wire [31:0] output_ip_source_ip; +wire [31:0] output_ip_dest_ip; +wire [15:0] output_udp_source_port; +wire [15:0] output_udp_dest_port; +wire [15:0] output_udp_length; +wire [15:0] output_udp_checksum; +wire [7:0] output_udp_payload_tdata; +wire output_udp_payload_tvalid; +wire output_udp_payload_tlast; +wire output_udp_payload_tuser; + +initial begin + // myhdl integration + $from_myhdl(clk, + rst, + current_test, + input_0_udp_hdr_valid, + 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_udp_source_port, + input_0_udp_dest_port, + input_0_udp_length, + input_0_udp_checksum, + input_0_udp_payload_tdata, + input_0_udp_payload_tvalid, + input_0_udp_payload_tlast, + input_0_udp_payload_tuser, + input_1_udp_hdr_valid, + 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_udp_source_port, + input_1_udp_dest_port, + input_1_udp_length, + input_1_udp_checksum, + input_1_udp_payload_tdata, + input_1_udp_payload_tvalid, + input_1_udp_payload_tlast, + input_1_udp_payload_tuser, + input_2_udp_hdr_valid, + 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_udp_source_port, + input_2_udp_dest_port, + input_2_udp_length, + input_2_udp_checksum, + input_2_udp_payload_tdata, + input_2_udp_payload_tvalid, + input_2_udp_payload_tlast, + input_2_udp_payload_tuser, + input_3_udp_hdr_valid, + 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_udp_source_port, + input_3_udp_dest_port, + input_3_udp_length, + input_3_udp_checksum, + input_3_udp_payload_tdata, + input_3_udp_payload_tvalid, + input_3_udp_payload_tlast, + input_3_udp_payload_tuser, + output_udp_hdr_ready, + output_udp_payload_tready); + $to_myhdl(input_0_udp_hdr_ready, + input_0_udp_payload_tready, + input_1_udp_hdr_ready, + input_1_udp_payload_tready, + input_2_udp_hdr_ready, + input_2_udp_payload_tready, + input_3_udp_hdr_ready, + input_3_udp_payload_tready, + output_udp_hdr_valid, + 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_udp_source_port, + output_udp_dest_port, + output_udp_length, + output_udp_checksum, + output_udp_payload_tdata, + output_udp_payload_tvalid, + output_udp_payload_tlast, + output_udp_payload_tuser); + + // dump file + $dumpfile("test_udp_arb_mux_4.lxt"); + $dumpvars(0, test_udp_arb_mux_4); +end + +udp_arb_mux_4 +UUT ( + .clk(clk), + .rst(rst), + // UDP frame inputs + .input_0_udp_hdr_valid(input_0_udp_hdr_valid), + .input_0_udp_hdr_ready(input_0_udp_hdr_ready), + .input_0_eth_dest_mac(input_0_eth_dest_mac), + .input_0_eth_src_mac(input_0_eth_src_mac), + .input_0_eth_type(input_0_eth_type), + .input_0_ip_version(input_0_ip_version), + .input_0_ip_ihl(input_0_ip_ihl), + .input_0_ip_dscp(input_0_ip_dscp), + .input_0_ip_ecn(input_0_ip_ecn), + .input_0_ip_length(input_0_ip_length), + .input_0_ip_identification(input_0_ip_identification), + .input_0_ip_flags(input_0_ip_flags), + .input_0_ip_fragment_offset(input_0_ip_fragment_offset), + .input_0_ip_ttl(input_0_ip_ttl), + .input_0_ip_protocol(input_0_ip_protocol), + .input_0_ip_header_checksum(input_0_ip_header_checksum), + .input_0_ip_source_ip(input_0_ip_source_ip), + .input_0_ip_dest_ip(input_0_ip_dest_ip), + .input_0_udp_source_port(input_0_udp_source_port), + .input_0_udp_dest_port(input_0_udp_dest_port), + .input_0_udp_length(input_0_udp_length), + .input_0_udp_checksum(input_0_udp_checksum), + .input_0_udp_payload_tdata(input_0_udp_payload_tdata), + .input_0_udp_payload_tvalid(input_0_udp_payload_tvalid), + .input_0_udp_payload_tready(input_0_udp_payload_tready), + .input_0_udp_payload_tlast(input_0_udp_payload_tlast), + .input_0_udp_payload_tuser(input_0_udp_payload_tuser), + .input_1_udp_hdr_valid(input_1_udp_hdr_valid), + .input_1_udp_hdr_ready(input_1_udp_hdr_ready), + .input_1_eth_dest_mac(input_1_eth_dest_mac), + .input_1_eth_src_mac(input_1_eth_src_mac), + .input_1_eth_type(input_1_eth_type), + .input_1_ip_version(input_1_ip_version), + .input_1_ip_ihl(input_1_ip_ihl), + .input_1_ip_dscp(input_1_ip_dscp), + .input_1_ip_ecn(input_1_ip_ecn), + .input_1_ip_length(input_1_ip_length), + .input_1_ip_identification(input_1_ip_identification), + .input_1_ip_flags(input_1_ip_flags), + .input_1_ip_fragment_offset(input_1_ip_fragment_offset), + .input_1_ip_ttl(input_1_ip_ttl), + .input_1_ip_protocol(input_1_ip_protocol), + .input_1_ip_header_checksum(input_1_ip_header_checksum), + .input_1_ip_source_ip(input_1_ip_source_ip), + .input_1_ip_dest_ip(input_1_ip_dest_ip), + .input_1_udp_source_port(input_1_udp_source_port), + .input_1_udp_dest_port(input_1_udp_dest_port), + .input_1_udp_length(input_1_udp_length), + .input_1_udp_checksum(input_1_udp_checksum), + .input_1_udp_payload_tdata(input_1_udp_payload_tdata), + .input_1_udp_payload_tvalid(input_1_udp_payload_tvalid), + .input_1_udp_payload_tready(input_1_udp_payload_tready), + .input_1_udp_payload_tlast(input_1_udp_payload_tlast), + .input_1_udp_payload_tuser(input_1_udp_payload_tuser), + .input_2_udp_hdr_valid(input_2_udp_hdr_valid), + .input_2_udp_hdr_ready(input_2_udp_hdr_ready), + .input_2_eth_dest_mac(input_2_eth_dest_mac), + .input_2_eth_src_mac(input_2_eth_src_mac), + .input_2_eth_type(input_2_eth_type), + .input_2_ip_version(input_2_ip_version), + .input_2_ip_ihl(input_2_ip_ihl), + .input_2_ip_dscp(input_2_ip_dscp), + .input_2_ip_ecn(input_2_ip_ecn), + .input_2_ip_length(input_2_ip_length), + .input_2_ip_identification(input_2_ip_identification), + .input_2_ip_flags(input_2_ip_flags), + .input_2_ip_fragment_offset(input_2_ip_fragment_offset), + .input_2_ip_ttl(input_2_ip_ttl), + .input_2_ip_protocol(input_2_ip_protocol), + .input_2_ip_header_checksum(input_2_ip_header_checksum), + .input_2_ip_source_ip(input_2_ip_source_ip), + .input_2_ip_dest_ip(input_2_ip_dest_ip), + .input_2_udp_source_port(input_2_udp_source_port), + .input_2_udp_dest_port(input_2_udp_dest_port), + .input_2_udp_length(input_2_udp_length), + .input_2_udp_checksum(input_2_udp_checksum), + .input_2_udp_payload_tdata(input_2_udp_payload_tdata), + .input_2_udp_payload_tvalid(input_2_udp_payload_tvalid), + .input_2_udp_payload_tready(input_2_udp_payload_tready), + .input_2_udp_payload_tlast(input_2_udp_payload_tlast), + .input_2_udp_payload_tuser(input_2_udp_payload_tuser), + .input_3_udp_hdr_valid(input_3_udp_hdr_valid), + .input_3_udp_hdr_ready(input_3_udp_hdr_ready), + .input_3_eth_dest_mac(input_3_eth_dest_mac), + .input_3_eth_src_mac(input_3_eth_src_mac), + .input_3_eth_type(input_3_eth_type), + .input_3_ip_version(input_3_ip_version), + .input_3_ip_ihl(input_3_ip_ihl), + .input_3_ip_dscp(input_3_ip_dscp), + .input_3_ip_ecn(input_3_ip_ecn), + .input_3_ip_length(input_3_ip_length), + .input_3_ip_identification(input_3_ip_identification), + .input_3_ip_flags(input_3_ip_flags), + .input_3_ip_fragment_offset(input_3_ip_fragment_offset), + .input_3_ip_ttl(input_3_ip_ttl), + .input_3_ip_protocol(input_3_ip_protocol), + .input_3_ip_header_checksum(input_3_ip_header_checksum), + .input_3_ip_source_ip(input_3_ip_source_ip), + .input_3_ip_dest_ip(input_3_ip_dest_ip), + .input_3_udp_source_port(input_3_udp_source_port), + .input_3_udp_dest_port(input_3_udp_dest_port), + .input_3_udp_length(input_3_udp_length), + .input_3_udp_checksum(input_3_udp_checksum), + .input_3_udp_payload_tdata(input_3_udp_payload_tdata), + .input_3_udp_payload_tvalid(input_3_udp_payload_tvalid), + .input_3_udp_payload_tready(input_3_udp_payload_tready), + .input_3_udp_payload_tlast(input_3_udp_payload_tlast), + .input_3_udp_payload_tuser(input_3_udp_payload_tuser), + // UDP frame output + .output_udp_hdr_valid(output_udp_hdr_valid), + .output_udp_hdr_ready(output_udp_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_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) +); + +endmodule diff --git a/tb/test_udp_arb_mux_64_4.py b/tb/test_udp_arb_mux_64_4.py new file mode 100755 index 00000000..08c67095 --- /dev/null +++ b/tb/test_udp_arb_mux_64_4.py @@ -0,0 +1,1364 @@ +#!/usr/bin/env python2 +""" + +Copyright (c) 2014 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +""" + +from myhdl import * +import os +from Queue import Queue + +import udp_ep + +module = 'udp_arb_mux_64_4' + +srcs = [] + +srcs.append("../rtl/%s.v" % module) +srcs.append("../rtl/udp_mux_64_4.v") +srcs.append("../lib/axis/rtl/arbiter.v") +srcs.append("../lib/axis/rtl/priority_encoder.v") +srcs.append("test_%s.v" % module) + +src = ' '.join(srcs) + +build_cmd = "iverilog -o test_%s.vvp %s" % (module, src) + +def dut_udp_arb_mux_64_4(clk, + rst, + current_test, + + input_0_udp_hdr_valid, + input_0_udp_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_udp_source_port, + input_0_udp_dest_port, + input_0_udp_length, + input_0_udp_checksum, + input_0_udp_payload_tdata, + input_0_udp_payload_tkeep, + input_0_udp_payload_tvalid, + input_0_udp_payload_tready, + input_0_udp_payload_tlast, + input_0_udp_payload_tuser, + input_1_udp_hdr_valid, + input_1_udp_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_udp_source_port, + input_1_udp_dest_port, + input_1_udp_length, + input_1_udp_checksum, + input_1_udp_payload_tdata, + input_1_udp_payload_tkeep, + input_1_udp_payload_tvalid, + input_1_udp_payload_tready, + input_1_udp_payload_tlast, + input_1_udp_payload_tuser, + input_2_udp_hdr_valid, + input_2_udp_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_udp_source_port, + input_2_udp_dest_port, + input_2_udp_length, + input_2_udp_checksum, + input_2_udp_payload_tdata, + input_2_udp_payload_tkeep, + input_2_udp_payload_tvalid, + input_2_udp_payload_tready, + input_2_udp_payload_tlast, + input_2_udp_payload_tuser, + input_3_udp_hdr_valid, + input_3_udp_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_udp_source_port, + input_3_udp_dest_port, + input_3_udp_length, + input_3_udp_checksum, + input_3_udp_payload_tdata, + input_3_udp_payload_tkeep, + input_3_udp_payload_tvalid, + input_3_udp_payload_tready, + input_3_udp_payload_tlast, + input_3_udp_payload_tuser, + + output_udp_hdr_valid, + output_udp_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_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): + + if os.system(build_cmd): + raise Exception("Error running build command") + return Cosimulation("vvp -m myhdl test_%s.vvp -lxt2" % module, + clk=clk, + rst=rst, + current_test=current_test, + + input_0_udp_hdr_valid=input_0_udp_hdr_valid, + input_0_udp_hdr_ready=input_0_udp_hdr_ready, + input_0_eth_dest_mac=input_0_eth_dest_mac, + input_0_eth_src_mac=input_0_eth_src_mac, + input_0_eth_type=input_0_eth_type, + input_0_ip_version=input_0_ip_version, + input_0_ip_ihl=input_0_ip_ihl, + input_0_ip_dscp=input_0_ip_dscp, + input_0_ip_ecn=input_0_ip_ecn, + input_0_ip_length=input_0_ip_length, + input_0_ip_identification=input_0_ip_identification, + input_0_ip_flags=input_0_ip_flags, + input_0_ip_fragment_offset=input_0_ip_fragment_offset, + input_0_ip_ttl=input_0_ip_ttl, + input_0_ip_protocol=input_0_ip_protocol, + input_0_ip_header_checksum=input_0_ip_header_checksum, + input_0_ip_source_ip=input_0_ip_source_ip, + input_0_ip_dest_ip=input_0_ip_dest_ip, + input_0_udp_source_port=input_0_udp_source_port, + input_0_udp_dest_port=input_0_udp_dest_port, + input_0_udp_length=input_0_udp_length, + input_0_udp_checksum=input_0_udp_checksum, + input_0_udp_payload_tdata=input_0_udp_payload_tdata, + input_0_udp_payload_tkeep=input_0_udp_payload_tkeep, + input_0_udp_payload_tvalid=input_0_udp_payload_tvalid, + input_0_udp_payload_tready=input_0_udp_payload_tready, + input_0_udp_payload_tlast=input_0_udp_payload_tlast, + input_0_udp_payload_tuser=input_0_udp_payload_tuser, + input_1_udp_hdr_valid=input_1_udp_hdr_valid, + input_1_udp_hdr_ready=input_1_udp_hdr_ready, + input_1_eth_dest_mac=input_1_eth_dest_mac, + input_1_eth_src_mac=input_1_eth_src_mac, + input_1_eth_type=input_1_eth_type, + input_1_ip_version=input_1_ip_version, + input_1_ip_ihl=input_1_ip_ihl, + input_1_ip_dscp=input_1_ip_dscp, + input_1_ip_ecn=input_1_ip_ecn, + input_1_ip_length=input_1_ip_length, + input_1_ip_identification=input_1_ip_identification, + input_1_ip_flags=input_1_ip_flags, + input_1_ip_fragment_offset=input_1_ip_fragment_offset, + input_1_ip_ttl=input_1_ip_ttl, + input_1_ip_protocol=input_1_ip_protocol, + input_1_ip_header_checksum=input_1_ip_header_checksum, + input_1_ip_source_ip=input_1_ip_source_ip, + input_1_ip_dest_ip=input_1_ip_dest_ip, + input_1_udp_source_port=input_1_udp_source_port, + input_1_udp_dest_port=input_1_udp_dest_port, + input_1_udp_length=input_1_udp_length, + input_1_udp_checksum=input_1_udp_checksum, + input_1_udp_payload_tdata=input_1_udp_payload_tdata, + input_1_udp_payload_tkeep=input_1_udp_payload_tkeep, + input_1_udp_payload_tvalid=input_1_udp_payload_tvalid, + input_1_udp_payload_tready=input_1_udp_payload_tready, + input_1_udp_payload_tlast=input_1_udp_payload_tlast, + input_1_udp_payload_tuser=input_1_udp_payload_tuser, + input_2_udp_hdr_valid=input_2_udp_hdr_valid, + input_2_udp_hdr_ready=input_2_udp_hdr_ready, + input_2_eth_dest_mac=input_2_eth_dest_mac, + input_2_eth_src_mac=input_2_eth_src_mac, + input_2_eth_type=input_2_eth_type, + input_2_ip_version=input_2_ip_version, + input_2_ip_ihl=input_2_ip_ihl, + input_2_ip_dscp=input_2_ip_dscp, + input_2_ip_ecn=input_2_ip_ecn, + input_2_ip_length=input_2_ip_length, + input_2_ip_identification=input_2_ip_identification, + input_2_ip_flags=input_2_ip_flags, + input_2_ip_fragment_offset=input_2_ip_fragment_offset, + input_2_ip_ttl=input_2_ip_ttl, + input_2_ip_protocol=input_2_ip_protocol, + input_2_ip_header_checksum=input_2_ip_header_checksum, + input_2_ip_source_ip=input_2_ip_source_ip, + input_2_ip_dest_ip=input_2_ip_dest_ip, + input_2_udp_source_port=input_2_udp_source_port, + input_2_udp_dest_port=input_2_udp_dest_port, + input_2_udp_length=input_2_udp_length, + input_2_udp_checksum=input_2_udp_checksum, + input_2_udp_payload_tdata=input_2_udp_payload_tdata, + input_2_udp_payload_tkeep=input_2_udp_payload_tkeep, + input_2_udp_payload_tvalid=input_2_udp_payload_tvalid, + input_2_udp_payload_tready=input_2_udp_payload_tready, + input_2_udp_payload_tlast=input_2_udp_payload_tlast, + input_2_udp_payload_tuser=input_2_udp_payload_tuser, + input_3_udp_hdr_valid=input_3_udp_hdr_valid, + input_3_udp_hdr_ready=input_3_udp_hdr_ready, + input_3_eth_dest_mac=input_3_eth_dest_mac, + input_3_eth_src_mac=input_3_eth_src_mac, + input_3_eth_type=input_3_eth_type, + input_3_ip_version=input_3_ip_version, + input_3_ip_ihl=input_3_ip_ihl, + input_3_ip_dscp=input_3_ip_dscp, + input_3_ip_ecn=input_3_ip_ecn, + input_3_ip_length=input_3_ip_length, + input_3_ip_identification=input_3_ip_identification, + input_3_ip_flags=input_3_ip_flags, + input_3_ip_fragment_offset=input_3_ip_fragment_offset, + input_3_ip_ttl=input_3_ip_ttl, + input_3_ip_protocol=input_3_ip_protocol, + input_3_ip_header_checksum=input_3_ip_header_checksum, + input_3_ip_source_ip=input_3_ip_source_ip, + input_3_ip_dest_ip=input_3_ip_dest_ip, + input_3_udp_source_port=input_3_udp_source_port, + input_3_udp_dest_port=input_3_udp_dest_port, + input_3_udp_length=input_3_udp_length, + input_3_udp_checksum=input_3_udp_checksum, + input_3_udp_payload_tdata=input_3_udp_payload_tdata, + input_3_udp_payload_tkeep=input_3_udp_payload_tkeep, + input_3_udp_payload_tvalid=input_3_udp_payload_tvalid, + input_3_udp_payload_tready=input_3_udp_payload_tready, + input_3_udp_payload_tlast=input_3_udp_payload_tlast, + input_3_udp_payload_tuser=input_3_udp_payload_tuser, + + output_udp_hdr_valid=output_udp_hdr_valid, + output_udp_hdr_ready=output_udp_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_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_tkeep=output_udp_payload_tkeep, + 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) + +def bench(): + + # Inputs + clk = Signal(bool(0)) + rst = Signal(bool(0)) + current_test = Signal(intbv(0)[8:]) + + input_0_udp_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_udp_source_port = Signal(intbv(0)[16:]) + input_0_udp_dest_port = Signal(intbv(0)[16:]) + input_0_udp_length = Signal(intbv(0)[16:]) + input_0_udp_checksum = Signal(intbv(0)[16:]) + input_0_udp_payload_tdata = Signal(intbv(0)[64:]) + input_0_udp_payload_tkeep = Signal(intbv(0)[8:]) + input_0_udp_payload_tvalid = Signal(bool(0)) + input_0_udp_payload_tlast = Signal(bool(0)) + input_0_udp_payload_tuser = Signal(bool(0)) + input_1_udp_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_udp_source_port = Signal(intbv(0)[16:]) + input_1_udp_dest_port = Signal(intbv(0)[16:]) + input_1_udp_length = Signal(intbv(0)[16:]) + input_1_udp_checksum = Signal(intbv(0)[16:]) + input_1_udp_payload_tdata = Signal(intbv(0)[64:]) + input_1_udp_payload_tkeep = Signal(intbv(0)[8:]) + input_1_udp_payload_tvalid = Signal(bool(0)) + input_1_udp_payload_tlast = Signal(bool(0)) + input_1_udp_payload_tuser = Signal(bool(0)) + input_2_udp_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_udp_source_port = Signal(intbv(0)[16:]) + input_2_udp_dest_port = Signal(intbv(0)[16:]) + input_2_udp_length = Signal(intbv(0)[16:]) + input_2_udp_checksum = Signal(intbv(0)[16:]) + input_2_udp_payload_tdata = Signal(intbv(0)[64:]) + input_2_udp_payload_tkeep = Signal(intbv(0)[8:]) + input_2_udp_payload_tvalid = Signal(bool(0)) + input_2_udp_payload_tlast = Signal(bool(0)) + input_2_udp_payload_tuser = Signal(bool(0)) + input_3_udp_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_udp_source_port = Signal(intbv(0)[16:]) + input_3_udp_dest_port = Signal(intbv(0)[16:]) + input_3_udp_length = Signal(intbv(0)[16:]) + input_3_udp_checksum = Signal(intbv(0)[16:]) + input_3_udp_payload_tdata = Signal(intbv(0)[64:]) + input_3_udp_payload_tkeep = Signal(intbv(0)[8:]) + input_3_udp_payload_tvalid = Signal(bool(0)) + input_3_udp_payload_tlast = Signal(bool(0)) + input_3_udp_payload_tuser = Signal(bool(0)) + + output_udp_payload_tready = Signal(bool(0)) + output_udp_hdr_ready = Signal(bool(0)) + + # Outputs + input_0_udp_hdr_ready = Signal(bool(0)) + input_0_udp_payload_tready = Signal(bool(0)) + input_1_udp_hdr_ready = Signal(bool(0)) + input_1_udp_payload_tready = Signal(bool(0)) + input_2_udp_hdr_ready = Signal(bool(0)) + input_2_udp_payload_tready = Signal(bool(0)) + input_3_udp_hdr_ready = Signal(bool(0)) + input_3_udp_payload_tready = Signal(bool(0)) + + output_udp_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_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)) + + # 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 = udp_ep.UDPFrameSource(clk, + rst, + udp_hdr_ready=input_0_udp_hdr_ready, + udp_hdr_valid=input_0_udp_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, + udp_source_port=input_0_udp_source_port, + udp_dest_port=input_0_udp_dest_port, + udp_length=input_0_udp_length, + udp_checksum=input_0_udp_checksum, + udp_payload_tdata=input_0_udp_payload_tdata, + udp_payload_tkeep=input_0_udp_payload_tkeep, + udp_payload_tvalid=input_0_udp_payload_tvalid, + udp_payload_tready=input_0_udp_payload_tready, + udp_payload_tlast=input_0_udp_payload_tlast, + udp_payload_tuser=input_0_udp_payload_tuser, + fifo=source_0_queue, + pause=source_0_pause, + name='source0') + + source_1 = udp_ep.UDPFrameSource(clk, + rst, + udp_hdr_ready=input_1_udp_hdr_ready, + udp_hdr_valid=input_1_udp_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, + udp_source_port=input_1_udp_source_port, + udp_dest_port=input_1_udp_dest_port, + udp_length=input_1_udp_length, + udp_checksum=input_1_udp_checksum, + udp_payload_tdata=input_1_udp_payload_tdata, + udp_payload_tkeep=input_1_udp_payload_tkeep, + udp_payload_tvalid=input_1_udp_payload_tvalid, + udp_payload_tready=input_1_udp_payload_tready, + udp_payload_tlast=input_1_udp_payload_tlast, + udp_payload_tuser=input_1_udp_payload_tuser, + fifo=source_1_queue, + pause=source_1_pause, + name='source1') + + source_2 = udp_ep.UDPFrameSource(clk, + rst, + udp_hdr_ready=input_2_udp_hdr_ready, + udp_hdr_valid=input_2_udp_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, + udp_source_port=input_2_udp_source_port, + udp_dest_port=input_2_udp_dest_port, + udp_length=input_2_udp_length, + udp_checksum=input_2_udp_checksum, + udp_payload_tdata=input_2_udp_payload_tdata, + udp_payload_tkeep=input_2_udp_payload_tkeep, + udp_payload_tvalid=input_2_udp_payload_tvalid, + udp_payload_tready=input_2_udp_payload_tready, + udp_payload_tlast=input_2_udp_payload_tlast, + udp_payload_tuser=input_2_udp_payload_tuser, + fifo=source_2_queue, + pause=source_2_pause, + name='source2') + + source_3 = udp_ep.UDPFrameSource(clk, + rst, + udp_hdr_ready=input_3_udp_hdr_ready, + udp_hdr_valid=input_3_udp_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, + udp_source_port=input_3_udp_source_port, + udp_dest_port=input_3_udp_dest_port, + udp_length=input_3_udp_length, + udp_checksum=input_3_udp_checksum, + udp_payload_tdata=input_3_udp_payload_tdata, + udp_payload_tkeep=input_3_udp_payload_tkeep, + udp_payload_tvalid=input_3_udp_payload_tvalid, + udp_payload_tready=input_3_udp_payload_tready, + udp_payload_tlast=input_3_udp_payload_tlast, + udp_payload_tuser=input_3_udp_payload_tuser, + fifo=source_3_queue, + pause=source_3_pause, + name='source3') + + sink = udp_ep.UDPFrameSink(clk, + rst, + udp_hdr_ready=output_udp_hdr_ready, + udp_hdr_valid=output_udp_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, + 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=sink_queue, + pause=sink_pause, + name='sink') + + # DUT + dut = dut_udp_arb_mux_64_4(clk, + rst, + current_test, + + input_0_udp_hdr_valid, + input_0_udp_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_udp_source_port, + input_0_udp_dest_port, + input_0_udp_length, + input_0_udp_checksum, + input_0_udp_payload_tdata, + input_0_udp_payload_tkeep, + input_0_udp_payload_tvalid, + input_0_udp_payload_tready, + input_0_udp_payload_tlast, + input_0_udp_payload_tuser, + input_1_udp_hdr_valid, + input_1_udp_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_udp_source_port, + input_1_udp_dest_port, + input_1_udp_length, + input_1_udp_checksum, + input_1_udp_payload_tdata, + input_1_udp_payload_tkeep, + input_1_udp_payload_tvalid, + input_1_udp_payload_tready, + input_1_udp_payload_tlast, + input_1_udp_payload_tuser, + input_2_udp_hdr_valid, + input_2_udp_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_udp_source_port, + input_2_udp_dest_port, + input_2_udp_length, + input_2_udp_checksum, + input_2_udp_payload_tdata, + input_2_udp_payload_tkeep, + input_2_udp_payload_tvalid, + input_2_udp_payload_tready, + input_2_udp_payload_tlast, + input_2_udp_payload_tuser, + input_3_udp_hdr_valid, + input_3_udp_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_udp_source_port, + input_3_udp_dest_port, + input_3_udp_length, + input_3_udp_checksum, + input_3_udp_payload_tdata, + input_3_udp_payload_tkeep, + input_3_udp_payload_tvalid, + input_3_udp_payload_tready, + input_3_udp_payload_tlast, + input_3_udp_payload_tuser, + + output_udp_hdr_valid, + output_udp_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_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) + + @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 = udp_ep.UDPFrame() + 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.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(32)) + test_frame.build() + + source_0_queue.put(test_frame) + yield clk.posedge + yield clk.posedge + + while input_0_udp_payload_tvalid or input_1_udp_payload_tvalid or input_2_udp_payload_tvalid or input_3_udp_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 = udp_ep.UDPFrame() + 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.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(32)) + test_frame.build() + + source_1_queue.put(test_frame) + yield clk.posedge + yield clk.posedge + + while input_0_udp_payload_tvalid or input_1_udp_payload_tvalid or input_2_udp_payload_tvalid or input_3_udp_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 = udp_ep.UDPFrame() + 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.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(32)) + test_frame1.build() + test_frame2 = udp_ep.UDPFrame() + 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.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(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_udp_payload_tvalid or input_1_udp_payload_tvalid or input_2_udp_payload_tvalid or input_3_udp_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 = udp_ep.UDPFrame() + 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.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(32)) + test_frame1.build() + test_frame2 = udp_ep.UDPFrame() + 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.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(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_udp_payload_tvalid or input_1_udp_payload_tvalid or input_2_udp_payload_tvalid or input_3_udp_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 = udp_ep.UDPFrame() + 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.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(32)) + test_frame1.build() + test_frame2 = udp_ep.UDPFrame() + 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.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(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_udp_payload_tvalid or input_1_udp_payload_tvalid or input_2_udp_payload_tvalid or input_3_udp_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 = udp_ep.UDPFrame() + 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.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(32)) + test_frame1.build() + test_frame2 = udp_ep.UDPFrame() + 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.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(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_udp_payload_tvalid or input_1_udp_payload_tvalid or input_2_udp_payload_tvalid or input_3_udp_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 = udp_ep.UDPFrame() + 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.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(32)) + test_frame1.build() + test_frame2 = udp_ep.UDPFrame() + 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.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(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_udp_payload_tvalid or input_1_udp_payload_tvalid or input_2_udp_payload_tvalid or input_3_udp_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 test_bench(): + os.chdir(os.path.dirname(os.path.abspath(__file__))) + sim = Simulation(bench()) + sim.run() + +if __name__ == '__main__': + print("Running test...") + test_bench() + diff --git a/tb/test_udp_arb_mux_64_4.v b/tb/test_udp_arb_mux_64_4.v new file mode 100644 index 00000000..11f7e7ed --- /dev/null +++ b/tb/test_udp_arb_mux_64_4.v @@ -0,0 +1,480 @@ +/* + +Copyright (c) 2014 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog 2001 + +`timescale 1 ns / 1 ps + +module test_udp_arb_mux_64_4; + +// Inputs +reg clk = 0; +reg rst = 0; +reg [7:0] current_test = 0; + +reg input_0_udp_hdr_valid = 0; +reg [47:0] input_0_eth_dest_mac = 0; +reg [47:0] input_0_eth_src_mac = 0; +reg [15:0] input_0_eth_type = 0; +reg [3:0] input_0_ip_version = 0; +reg [3:0] input_0_ip_ihl = 0; +reg [5:0] input_0_ip_dscp = 0; +reg [1:0] input_0_ip_ecn = 0; +reg [15:0] input_0_ip_length = 0; +reg [15:0] input_0_ip_identification = 0; +reg [2:0] input_0_ip_flags = 0; +reg [12:0] input_0_ip_fragment_offset = 0; +reg [7:0] input_0_ip_ttl = 0; +reg [7:0] input_0_ip_protocol = 0; +reg [15:0] input_0_ip_header_checksum = 0; +reg [31:0] input_0_ip_source_ip = 0; +reg [31:0] input_0_ip_dest_ip = 0; +reg [15:0] input_0_udp_source_port = 0; +reg [15:0] input_0_udp_dest_port = 0; +reg [15:0] input_0_udp_length = 0; +reg [15:0] input_0_udp_checksum = 0; +reg [63:0] input_0_udp_payload_tdata = 0; +reg [7:0] input_0_udp_payload_tkeep = 0; +reg input_0_udp_payload_tvalid = 0; +reg input_0_udp_payload_tlast = 0; +reg input_0_udp_payload_tuser = 0; +reg input_1_udp_hdr_valid = 0; +reg [47:0] input_1_eth_dest_mac = 0; +reg [47:0] input_1_eth_src_mac = 0; +reg [15:0] input_1_eth_type = 0; +reg [3:0] input_1_ip_version = 0; +reg [3:0] input_1_ip_ihl = 0; +reg [5:0] input_1_ip_dscp = 0; +reg [1:0] input_1_ip_ecn = 0; +reg [15:0] input_1_ip_length = 0; +reg [15:0] input_1_ip_identification = 0; +reg [2:0] input_1_ip_flags = 0; +reg [12:0] input_1_ip_fragment_offset = 0; +reg [7:0] input_1_ip_ttl = 0; +reg [7:0] input_1_ip_protocol = 0; +reg [15:0] input_1_ip_header_checksum = 0; +reg [31:0] input_1_ip_source_ip = 0; +reg [31:0] input_1_ip_dest_ip = 0; +reg [15:0] input_1_udp_source_port = 0; +reg [15:0] input_1_udp_dest_port = 0; +reg [15:0] input_1_udp_length = 0; +reg [15:0] input_1_udp_checksum = 0; +reg [63:0] input_1_udp_payload_tdata = 0; +reg [7:0] input_1_udp_payload_tkeep = 0; +reg input_1_udp_payload_tvalid = 0; +reg input_1_udp_payload_tlast = 0; +reg input_1_udp_payload_tuser = 0; +reg input_2_udp_hdr_valid = 0; +reg [47:0] input_2_eth_dest_mac = 0; +reg [47:0] input_2_eth_src_mac = 0; +reg [15:0] input_2_eth_type = 0; +reg [3:0] input_2_ip_version = 0; +reg [3:0] input_2_ip_ihl = 0; +reg [5:0] input_2_ip_dscp = 0; +reg [1:0] input_2_ip_ecn = 0; +reg [15:0] input_2_ip_length = 0; +reg [15:0] input_2_ip_identification = 0; +reg [2:0] input_2_ip_flags = 0; +reg [12:0] input_2_ip_fragment_offset = 0; +reg [7:0] input_2_ip_ttl = 0; +reg [7:0] input_2_ip_protocol = 0; +reg [15:0] input_2_ip_header_checksum = 0; +reg [31:0] input_2_ip_source_ip = 0; +reg [31:0] input_2_ip_dest_ip = 0; +reg [15:0] input_2_udp_source_port = 0; +reg [15:0] input_2_udp_dest_port = 0; +reg [15:0] input_2_udp_length = 0; +reg [15:0] input_2_udp_checksum = 0; +reg [63:0] input_2_udp_payload_tdata = 0; +reg [7:0] input_2_udp_payload_tkeep = 0; +reg input_2_udp_payload_tvalid = 0; +reg input_2_udp_payload_tlast = 0; +reg input_2_udp_payload_tuser = 0; +reg input_3_udp_hdr_valid = 0; +reg [47:0] input_3_eth_dest_mac = 0; +reg [47:0] input_3_eth_src_mac = 0; +reg [15:0] input_3_eth_type = 0; +reg [3:0] input_3_ip_version = 0; +reg [3:0] input_3_ip_ihl = 0; +reg [5:0] input_3_ip_dscp = 0; +reg [1:0] input_3_ip_ecn = 0; +reg [15:0] input_3_ip_length = 0; +reg [15:0] input_3_ip_identification = 0; +reg [2:0] input_3_ip_flags = 0; +reg [12:0] input_3_ip_fragment_offset = 0; +reg [7:0] input_3_ip_ttl = 0; +reg [7:0] input_3_ip_protocol = 0; +reg [15:0] input_3_ip_header_checksum = 0; +reg [31:0] input_3_ip_source_ip = 0; +reg [31:0] input_3_ip_dest_ip = 0; +reg [15:0] input_3_udp_source_port = 0; +reg [15:0] input_3_udp_dest_port = 0; +reg [15:0] input_3_udp_length = 0; +reg [15:0] input_3_udp_checksum = 0; +reg [63:0] input_3_udp_payload_tdata = 0; +reg [7:0] input_3_udp_payload_tkeep = 0; +reg input_3_udp_payload_tvalid = 0; +reg input_3_udp_payload_tlast = 0; +reg input_3_udp_payload_tuser = 0; + +reg output_udp_hdr_ready = 0; +reg output_udp_payload_tready = 0; + +// Outputs +wire input_0_udp_payload_tready; +wire input_0_udp_hdr_ready; +wire input_1_udp_payload_tready; +wire input_1_udp_hdr_ready; +wire input_2_udp_payload_tready; +wire input_2_udp_hdr_ready; +wire input_3_udp_payload_tready; +wire input_3_udp_hdr_ready; + +wire output_udp_hdr_valid; +wire [47:0] output_eth_dest_mac; +wire [47:0] output_eth_src_mac; +wire [15:0] output_eth_type; +wire [3:0] output_ip_version; +wire [3:0] output_ip_ihl; +wire [5:0] output_ip_dscp; +wire [1:0] output_ip_ecn; +wire [15:0] output_ip_length; +wire [15:0] output_ip_identification; +wire [2:0] output_ip_flags; +wire [12:0] output_ip_fragment_offset; +wire [7:0] output_ip_ttl; +wire [7:0] output_ip_protocol; +wire [15:0] output_ip_header_checksum; +wire [31:0] output_ip_source_ip; +wire [31:0] output_ip_dest_ip; +wire [15:0] output_udp_source_port; +wire [15:0] output_udp_dest_port; +wire [15:0] output_udp_length; +wire [15:0] output_udp_checksum; +wire [63:0] output_udp_payload_tdata; +wire [7:0] output_udp_payload_tkeep; +wire output_udp_payload_tvalid; +wire output_udp_payload_tlast; +wire output_udp_payload_tuser; + +initial begin + // myhdl integration + $from_myhdl(clk, + rst, + current_test, + input_0_udp_hdr_valid, + 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_udp_source_port, + input_0_udp_dest_port, + input_0_udp_length, + input_0_udp_checksum, + input_0_udp_payload_tdata, + input_0_udp_payload_tkeep, + input_0_udp_payload_tvalid, + input_0_udp_payload_tlast, + input_0_udp_payload_tuser, + input_1_udp_hdr_valid, + 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_udp_source_port, + input_1_udp_dest_port, + input_1_udp_length, + input_1_udp_checksum, + input_1_udp_payload_tdata, + input_1_udp_payload_tkeep, + input_1_udp_payload_tvalid, + input_1_udp_payload_tlast, + input_1_udp_payload_tuser, + input_2_udp_hdr_valid, + 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_udp_source_port, + input_2_udp_dest_port, + input_2_udp_length, + input_2_udp_checksum, + input_2_udp_payload_tdata, + input_2_udp_payload_tkeep, + input_2_udp_payload_tvalid, + input_2_udp_payload_tlast, + input_2_udp_payload_tuser, + input_3_udp_hdr_valid, + 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_udp_source_port, + input_3_udp_dest_port, + input_3_udp_length, + input_3_udp_checksum, + input_3_udp_payload_tdata, + input_3_udp_payload_tkeep, + input_3_udp_payload_tvalid, + input_3_udp_payload_tlast, + input_3_udp_payload_tuser, + output_udp_hdr_ready, + output_udp_payload_tready); + $to_myhdl(input_0_udp_hdr_ready, + input_0_udp_payload_tready, + input_1_udp_hdr_ready, + input_1_udp_payload_tready, + input_2_udp_hdr_ready, + input_2_udp_payload_tready, + input_3_udp_hdr_ready, + input_3_udp_payload_tready, + output_udp_hdr_valid, + 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_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_tlast, + output_udp_payload_tuser); + + // dump file + $dumpfile("test_udp_arb_mux_64_4.lxt"); + $dumpvars(0, test_udp_arb_mux_64_4); +end + +udp_arb_mux_64_4 +UUT ( + .clk(clk), + .rst(rst), + // UDP frame inputs + .input_0_udp_hdr_valid(input_0_udp_hdr_valid), + .input_0_udp_hdr_ready(input_0_udp_hdr_ready), + .input_0_eth_dest_mac(input_0_eth_dest_mac), + .input_0_eth_src_mac(input_0_eth_src_mac), + .input_0_eth_type(input_0_eth_type), + .input_0_ip_version(input_0_ip_version), + .input_0_ip_ihl(input_0_ip_ihl), + .input_0_ip_dscp(input_0_ip_dscp), + .input_0_ip_ecn(input_0_ip_ecn), + .input_0_ip_length(input_0_ip_length), + .input_0_ip_identification(input_0_ip_identification), + .input_0_ip_flags(input_0_ip_flags), + .input_0_ip_fragment_offset(input_0_ip_fragment_offset), + .input_0_ip_ttl(input_0_ip_ttl), + .input_0_ip_protocol(input_0_ip_protocol), + .input_0_ip_header_checksum(input_0_ip_header_checksum), + .input_0_ip_source_ip(input_0_ip_source_ip), + .input_0_ip_dest_ip(input_0_ip_dest_ip), + .input_0_udp_source_port(input_0_udp_source_port), + .input_0_udp_dest_port(input_0_udp_dest_port), + .input_0_udp_length(input_0_udp_length), + .input_0_udp_checksum(input_0_udp_checksum), + .input_0_udp_payload_tdata(input_0_udp_payload_tdata), + .input_0_udp_payload_tkeep(input_0_udp_payload_tkeep), + .input_0_udp_payload_tvalid(input_0_udp_payload_tvalid), + .input_0_udp_payload_tready(input_0_udp_payload_tready), + .input_0_udp_payload_tlast(input_0_udp_payload_tlast), + .input_0_udp_payload_tuser(input_0_udp_payload_tuser), + .input_1_udp_hdr_valid(input_1_udp_hdr_valid), + .input_1_udp_hdr_ready(input_1_udp_hdr_ready), + .input_1_eth_dest_mac(input_1_eth_dest_mac), + .input_1_eth_src_mac(input_1_eth_src_mac), + .input_1_eth_type(input_1_eth_type), + .input_1_ip_version(input_1_ip_version), + .input_1_ip_ihl(input_1_ip_ihl), + .input_1_ip_dscp(input_1_ip_dscp), + .input_1_ip_ecn(input_1_ip_ecn), + .input_1_ip_length(input_1_ip_length), + .input_1_ip_identification(input_1_ip_identification), + .input_1_ip_flags(input_1_ip_flags), + .input_1_ip_fragment_offset(input_1_ip_fragment_offset), + .input_1_ip_ttl(input_1_ip_ttl), + .input_1_ip_protocol(input_1_ip_protocol), + .input_1_ip_header_checksum(input_1_ip_header_checksum), + .input_1_ip_source_ip(input_1_ip_source_ip), + .input_1_ip_dest_ip(input_1_ip_dest_ip), + .input_1_udp_source_port(input_1_udp_source_port), + .input_1_udp_dest_port(input_1_udp_dest_port), + .input_1_udp_length(input_1_udp_length), + .input_1_udp_checksum(input_1_udp_checksum), + .input_1_udp_payload_tdata(input_1_udp_payload_tdata), + .input_1_udp_payload_tkeep(input_1_udp_payload_tkeep), + .input_1_udp_payload_tvalid(input_1_udp_payload_tvalid), + .input_1_udp_payload_tready(input_1_udp_payload_tready), + .input_1_udp_payload_tlast(input_1_udp_payload_tlast), + .input_1_udp_payload_tuser(input_1_udp_payload_tuser), + .input_2_udp_hdr_valid(input_2_udp_hdr_valid), + .input_2_udp_hdr_ready(input_2_udp_hdr_ready), + .input_2_eth_dest_mac(input_2_eth_dest_mac), + .input_2_eth_src_mac(input_2_eth_src_mac), + .input_2_eth_type(input_2_eth_type), + .input_2_ip_version(input_2_ip_version), + .input_2_ip_ihl(input_2_ip_ihl), + .input_2_ip_dscp(input_2_ip_dscp), + .input_2_ip_ecn(input_2_ip_ecn), + .input_2_ip_length(input_2_ip_length), + .input_2_ip_identification(input_2_ip_identification), + .input_2_ip_flags(input_2_ip_flags), + .input_2_ip_fragment_offset(input_2_ip_fragment_offset), + .input_2_ip_ttl(input_2_ip_ttl), + .input_2_ip_protocol(input_2_ip_protocol), + .input_2_ip_header_checksum(input_2_ip_header_checksum), + .input_2_ip_source_ip(input_2_ip_source_ip), + .input_2_ip_dest_ip(input_2_ip_dest_ip), + .input_2_udp_source_port(input_2_udp_source_port), + .input_2_udp_dest_port(input_2_udp_dest_port), + .input_2_udp_length(input_2_udp_length), + .input_2_udp_checksum(input_2_udp_checksum), + .input_2_udp_payload_tdata(input_2_udp_payload_tdata), + .input_2_udp_payload_tkeep(input_2_udp_payload_tkeep), + .input_2_udp_payload_tvalid(input_2_udp_payload_tvalid), + .input_2_udp_payload_tready(input_2_udp_payload_tready), + .input_2_udp_payload_tlast(input_2_udp_payload_tlast), + .input_2_udp_payload_tuser(input_2_udp_payload_tuser), + .input_3_udp_hdr_valid(input_3_udp_hdr_valid), + .input_3_udp_hdr_ready(input_3_udp_hdr_ready), + .input_3_eth_dest_mac(input_3_eth_dest_mac), + .input_3_eth_src_mac(input_3_eth_src_mac), + .input_3_eth_type(input_3_eth_type), + .input_3_ip_version(input_3_ip_version), + .input_3_ip_ihl(input_3_ip_ihl), + .input_3_ip_dscp(input_3_ip_dscp), + .input_3_ip_ecn(input_3_ip_ecn), + .input_3_ip_length(input_3_ip_length), + .input_3_ip_identification(input_3_ip_identification), + .input_3_ip_flags(input_3_ip_flags), + .input_3_ip_fragment_offset(input_3_ip_fragment_offset), + .input_3_ip_ttl(input_3_ip_ttl), + .input_3_ip_protocol(input_3_ip_protocol), + .input_3_ip_header_checksum(input_3_ip_header_checksum), + .input_3_ip_source_ip(input_3_ip_source_ip), + .input_3_ip_dest_ip(input_3_ip_dest_ip), + .input_3_udp_source_port(input_3_udp_source_port), + .input_3_udp_dest_port(input_3_udp_dest_port), + .input_3_udp_length(input_3_udp_length), + .input_3_udp_checksum(input_3_udp_checksum), + .input_3_udp_payload_tdata(input_3_udp_payload_tdata), + .input_3_udp_payload_tkeep(input_3_udp_payload_tkeep), + .input_3_udp_payload_tvalid(input_3_udp_payload_tvalid), + .input_3_udp_payload_tready(input_3_udp_payload_tready), + .input_3_udp_payload_tlast(input_3_udp_payload_tlast), + .input_3_udp_payload_tuser(input_3_udp_payload_tuser), + // UDP frame output + .output_udp_hdr_valid(output_udp_hdr_valid), + .output_udp_hdr_ready(output_udp_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_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_tkeep(output_udp_payload_tkeep), + .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) +); + +endmodule