diff --git a/hw/super6502_fpga/src/sub/network_processor/doc/tcp.drawio b/hw/super6502_fpga/src/sub/network_processor/doc/tcp.drawio index 3c7b473..41bdbc0 100644 --- a/hw/super6502_fpga/src/sub/network_processor/doc/tcp.drawio +++ b/hw/super6502_fpga/src/sub/network_processor/doc/tcp.drawio @@ -1,6 +1,6 @@ - + - + @@ -15,7 +15,7 @@ - + @@ -114,7 +114,7 @@ - + @@ -213,7 +213,7 @@ - + @@ -368,14 +368,12 @@ - + + - - - @@ -416,12 +414,12 @@ - + - + @@ -497,34 +495,34 @@ - + - + - + - + - + - + - + - + - + - + @@ -668,6 +666,20 @@ + + + + + + + + + + + + + + diff --git a/hw/super6502_fpga/src/sub/network_processor/doc/tcp.drawio.png b/hw/super6502_fpga/src/sub/network_processor/doc/tcp.drawio.png index c9116f3..7c1e3fb 100644 Binary files a/hw/super6502_fpga/src/sub/network_processor/doc/tcp.drawio.png and b/hw/super6502_fpga/src/sub/network_processor/doc/tcp.drawio.png differ diff --git a/hw/super6502_fpga/src/sub/network_processor/src/network_processor.sv b/hw/super6502_fpga/src/sub/network_processor/src/network_processor.sv index 4d01cf1..9b0b08f 100644 --- a/hw/super6502_fpga/src/sub/network_processor/src/network_processor.sv +++ b/hw/super6502_fpga/src/sub/network_processor/src/network_processor.sv @@ -151,29 +151,29 @@ logic tcp_tx_ip_payload_axis_tready; logic tcp_tx_ip_payload_axis_tlast; logic tcp_tx_ip_payload_axis_tuser; -logic udp_ip_hdr_valid; -logic udp_ip_hdr_ready; -logic [47:0] udp_ip_eth_dest_mac; -logic [47:0] udp_ip_eth_src_mac; -logic [15:0] udp_ip_eth_type; -logic [3:0] udp_ip_version; -logic [3:0] udp_ip_ihl; -logic [5:0] udp_ip_dscp; -logic [1:0] udp_ip_ecn; -logic [15:0] udp_ip_length; -logic [15:0] udp_ip_identification; -logic [2:0] udp_ip_flags; -logic [12:0] udp_ip_fragment_offset; -logic [7:0] udp_ip_ttl; -logic [7:0] udp_ip_protocol; -logic [15:0] udp_ip_header_checksum; -logic [31:0] udp_ip_source_ip; -logic [31:0] udp_ip_dest_ip; -logic [7:0] udp_ip_payload_axis_tdata; -logic udp_ip_payload_axis_tvalid; -logic udp_ip_payload_axis_tready; -logic udp_ip_payload_axis_tlast; -logic udp_ip_payload_axis_tuser; +logic udp_rx_ip_hdr_valid; +logic udp_rx_ip_hdr_ready; +logic [47:0] udp_rx_ip_eth_dest_mac; +logic [47:0] udp_rx_ip_eth_src_mac; +logic [15:0] udp_rx_ip_eth_type; +logic [3:0] udp_rx_ip_version; +logic [3:0] udp_rx_ip_ihl; +logic [5:0] udp_rx_ip_dscp; +logic [1:0] udp_rx_ip_ecn; +logic [15:0] udp_rx_ip_length; +logic [15:0] udp_rx_ip_identification; +logic [2:0] udp_rx_ip_flags; +logic [12:0] udp_rx_ip_fragment_offset; +logic [7:0] udp_rx_ip_ttl; +logic [7:0] udp_rx_ip_protocol; +logic [15:0] udp_rx_ip_header_checksum; +logic [31:0] udp_rx_ip_source_ip; +logic [31:0] udp_rx_ip_dest_ip; +logic [7:0] udp_rx_ip_payload_axis_tdata; +logic udp_rx_ip_payload_axis_tvalid; +logic udp_rx_ip_payload_axis_tready; +logic udp_rx_ip_payload_axis_tlast; +logic udp_rx_ip_payload_axis_tuser; // tx is less because IP adds it automatically. logic udp_tx_ip_hdr_valid; @@ -191,29 +191,29 @@ logic udp_tx_ip_payload_axis_tready; logic udp_tx_ip_payload_axis_tlast; logic udp_tx_ip_payload_axis_tuser; -logic icmp_ip_hdr_valid; -logic icmp_ip_hdr_ready; -logic [47:0] icmp_ip_eth_dest_mac; -logic [47:0] icmp_ip_eth_src_mac; -logic [15:0] icmp_ip_eth_type; -logic [3:0] icmp_ip_version; -logic [3:0] icmp_ip_ihl; -logic [5:0] icmp_ip_dscp; -logic [1:0] icmp_ip_ecn; -logic [15:0] icmp_ip_length; -logic [15:0] icmp_ip_identification; -logic [2:0] icmp_ip_flags; -logic [12:0] icmp_ip_fragment_offset; -logic [7:0] icmp_ip_ttl; -logic [7:0] icmp_ip_protocol; -logic [15:0] icmp_ip_header_checksum; -logic [31:0] icmp_ip_source_ip; -logic [31:0] icmp_ip_dest_ip; -logic [7:0] icmp_ip_payload_axis_tdata; -logic icmp_ip_payload_axis_tvalid; -logic icmp_ip_payload_axis_tready; -logic icmp_ip_payload_axis_tlast; -logic icmp_ip_payload_axis_tuser; +logic icmp_rx_ip_hdr_valid; +logic icmp_rx_ip_hdr_ready; +logic [47:0] icmp_rx_ip_eth_dest_mac; +logic [47:0] icmp_rx_ip_eth_src_mac; +logic [15:0] icmp_rx_ip_eth_type; +logic [3:0] icmp_rx_ip_version; +logic [3:0] icmp_rx_ip_ihl; +logic [5:0] icmp_rx_ip_dscp; +logic [1:0] icmp_rx_ip_ecn; +logic [15:0] icmp_rx_ip_length; +logic [15:0] icmp_rx_ip_identification; +logic [2:0] icmp_rx_ip_flags; +logic [12:0] icmp_rx_ip_fragment_offset; +logic [7:0] icmp_rx_ip_ttl; +logic [7:0] icmp_rx_ip_protocol; +logic [15:0] icmp_rx_ip_header_checksum; +logic [31:0] icmp_rx_ip_source_ip; +logic [31:0] icmp_rx_ip_dest_ip; +logic [7:0] icmp_rx_ip_payload_axis_tdata; +logic icmp_rx_ip_payload_axis_tvalid; +logic icmp_rx_ip_payload_axis_tready; +logic icmp_rx_ip_payload_axis_tlast; +logic icmp_rx_ip_payload_axis_tuser; // tx is less because IP adds it automatically. logic icmp_tx_ip_hdr_valid; @@ -446,6 +446,12 @@ ip_complete #( ); +logic ip_demux_drop; +assign ip_demux_drop = !((rx_ip_protocol == `PROTO_ICMP) || (rx_ip_protocol == `PROTO_UDP) || (rx_ip_protocol == `PROTO_TCP)); + +logic [1:0] ip_demux_sel; +assign ip_demux_sel = (rx_ip_protocol == `PROTO_ICMP) ? 2'h2 : (rx_ip_protocol == `PROTO_UDP) ? 2'h1 : 2'h0; + ip_demux #( .M_COUNT(3), .DATA_WIDTH(MAC_DATA_WIDTH) @@ -477,37 +483,103 @@ ip_demux #( .s_ip_payload_axis_tlast (rx_ip_payload_axis_tlast), .s_ip_payload_axis_tuser (rx_ip_payload_axis_tuser), - .m_ip_hdr_valid ({icmp_ip_hdr_valid, udp_ip_hdr_valid, tcp_tx_ip_hdr_valid}), - .m_ip_hdr_ready ({icmp_ip_hdr_ready, udp_ip_hdr_ready, tcp_tx_ip_hdr_ready}), - .m_eth_dest_mac ({icmp_ip_eth_dest_mac, udp_ip_eth_dest_mac, tcp_tx_ip_eth_dest_mac}), - .m_eth_src_mac ({icmp_ip_eth_src_mac, udp_ip_eth_src_mac, tcp_tx_ip_eth_src_mac}), - .m_eth_type ({icmp_ip_eth_type, udp_ip_eth_type, tcp_tx_ip_eth_type}), - .m_ip_version ({icmp_ip_version, udp_ip_version, tcp_tx_ip_version}), - .m_ip_ihl ({icmp_ip_ihl, udp_ip_ihl, tcp_tx_ip_ihl}), - .m_ip_dscp ({icmp_ip_dscp, udp_ip_dscp, tcp_tx_ip_dscp}), - .m_ip_ecn ({icmp_ip_ecn, udp_ip_ecn, tcp_tx_ip_ecn}), - .m_ip_length ({icmp_ip_length, udp_ip_length, tcp_tx_ip_length}), - .m_ip_identification ({icmp_ip_identification, udp_ip_identification, tcp_tx_ip_identification}), - .m_ip_flags ({icmp_ip_flags, udp_ip_flags, tcp_tx_ip_flags}), - .m_ip_fragment_offset ({icmp_ip_fragment_offset, udp_ip_fragment_offset, tcp_tx_ip_fragment_offset}), - .m_ip_ttl ({icmp_ip_ttl, udp_ip_ttl, tcp_tx_ip_ttl}), - .m_ip_protocol ({icmp_ip_protocol, udp_ip_protocol, tcp_tx_ip_protocol}), - .m_ip_header_checksum ({icmp_ip_header_checksum, udp_ip_header_checksum, tcp_tx_ip_header_checksum}), - .m_ip_source_ip ({icmp_ip_source_ip, udp_ip_source_ip, tcp_tx_ip_source_ip}), - .m_ip_dest_ip ({icmp_ip_dest_ip, udp_ip_dest_ip, tcp_tx_ip_dest_ip}), - .m_ip_payload_axis_tdata ({icmp_ip_payload_axis_tdata, udp_ip_payload_axis_tdata, tcp_tx_ip_payload_axis_tdata}), + .m_ip_hdr_valid ({icmp_rx_ip_hdr_valid, udp_rx_ip_hdr_valid, tcp_rx_ip_hdr_valid}), + .m_ip_hdr_ready ({icmp_rx_ip_hdr_ready, udp_rx_ip_hdr_ready, tcp_rx_ip_hdr_ready}), + .m_eth_dest_mac ({icmp_rx_ip_eth_dest_mac, udp_rx_ip_eth_dest_mac, tcp_rx_ip_eth_dest_mac}), + .m_eth_src_mac ({icmp_rx_ip_eth_src_mac, udp_rx_ip_eth_src_mac, tcp_rx_ip_eth_src_mac}), + .m_eth_type ({icmp_rx_ip_eth_type, udp_rx_ip_eth_type, tcp_rx_ip_eth_type}), + .m_ip_version ({icmp_rx_ip_version, udp_rx_ip_version, tcp_rx_ip_version}), + .m_ip_ihl ({icmp_rx_ip_ihl, udp_rx_ip_ihl, tcp_rx_ip_ihl}), + .m_ip_dscp ({icmp_rx_ip_dscp, udp_rx_ip_dscp, tcp_rx_ip_dscp}), + .m_ip_ecn ({icmp_rx_ip_ecn, udp_rx_ip_ecn, tcp_rx_ip_ecn}), + .m_ip_length ({icmp_rx_ip_length, udp_rx_ip_length, tcp_rx_ip_length}), + .m_ip_identification ({icmp_rx_ip_identification, udp_rx_ip_identification, tcp_rx_ip_identification}), + .m_ip_flags ({icmp_rx_ip_flags, udp_rx_ip_flags, tcp_rx_ip_flags}), + .m_ip_fragment_offset ({icmp_rx_ip_fragment_offset, udp_rx_ip_fragment_offset, tcp_rx_ip_fragment_offset}), + .m_ip_ttl ({icmp_rx_ip_ttl, udp_rx_ip_ttl, tcp_rx_ip_ttl}), + .m_ip_protocol ({icmp_rx_ip_protocol, udp_rx_ip_protocol, tcp_rx_ip_protocol}), + .m_ip_header_checksum ({icmp_rx_ip_header_checksum, udp_rx_ip_header_checksum, tcp_rx_ip_header_checksum}), + .m_ip_source_ip ({icmp_rx_ip_source_ip, udp_rx_ip_source_ip, tcp_rx_ip_source_ip}), + .m_ip_dest_ip ({icmp_rx_ip_dest_ip, udp_rx_ip_dest_ip, tcp_rx_ip_dest_ip}), + .m_ip_payload_axis_tdata ({icmp_rx_ip_payload_axis_tdata, udp_rx_ip_payload_axis_tdata, tcp_rx_ip_payload_axis_tdata}), .m_ip_payload_axis_tkeep (), - .m_ip_payload_axis_tvalid ({icmp_ip_payload_axis_tvalid, udp_ip_payload_axis_tvalid, tcp_tx_ip_payload_axis_tvalid}), - .m_ip_payload_axis_tready ({icmp_ip_payload_axis_tready, udp_ip_payload_axis_tready, tcp_tx_ip_payload_axis_tready}), - .m_ip_payload_axis_tlast ({icmp_ip_payload_axis_tlast, udp_ip_payload_axis_tlast, tcp_tx_ip_payload_axis_tlast}), + .m_ip_payload_axis_tvalid ({icmp_rx_ip_payload_axis_tvalid, udp_rx_ip_payload_axis_tvalid, tcp_rx_ip_payload_axis_tvalid}), + .m_ip_payload_axis_tready ({icmp_rx_ip_payload_axis_tready, udp_rx_ip_payload_axis_tready, tcp_rx_ip_payload_axis_tready}), + .m_ip_payload_axis_tlast ({icmp_rx_ip_payload_axis_tlast, udp_rx_ip_payload_axis_tlast, tcp_rx_ip_payload_axis_tlast}), .m_ip_payload_axis_tid (), .m_ip_payload_axis_tdest (), - .m_ip_payload_axis_tuser ({icmp_ip_payload_axis_tuser, udp_ip_payload_axis_tuser, tcp_tx_ip_payload_axis_tuser}), + .m_ip_payload_axis_tuser ({icmp_rx_ip_payload_axis_tuser, udp_rx_ip_payload_axis_tuser, tcp_rx_ip_payload_axis_tuser}), + .enable ('1), .drop (ip_demux_drop), .select (ip_demux_sel) ); +assign icmp_rx_ip_hdr_ready = '1; +assign icmp_rx_ip_payload_axis_tready = '1; +assign udp_rx_ip_hdr_ready = '1; +assign udp_rx_ip_payload_axis_tready = '1; + + +ip_arb_mux #( + .S_COUNT(3), + .DATA_WIDTH(MAC_DATA_WIDTH) +) u_ip_arb_mux ( + .clk (i_clk), + .rst (i_rst), + + .s_ip_hdr_valid ({icmp_tx_ip_hdr_valid, udp_tx_ip_hdr_valid, tcp_tx_ip_hdr_valid}), + .s_ip_hdr_ready ({icmp_tx_ip_hdr_ready, udp_tx_ip_hdr_ready, tcp_tx_ip_hdr_ready}), + .s_eth_dest_mac ('0), + .s_eth_src_mac ('0), + .s_eth_type ('0), + .s_ip_version ('0), + .s_ip_ihl ('0), + .s_ip_dscp ({icmp_tx_ip_dscp, udp_tx_ip_dscp, tcp_tx_ip_dscp}), + .s_ip_ecn ({icmp_tx_ip_ecn, udp_tx_ip_ecn, tcp_tx_ip_ecn}), + .s_ip_length ({icmp_tx_ip_length, udp_tx_ip_length, tcp_tx_ip_length}), + .s_ip_identification ('0), + .s_ip_flags ('0), + .s_ip_fragment_offset ('0), + .s_ip_ttl ({icmp_tx_ip_ttl, udp_tx_ip_ttl, tcp_tx_ip_ttl}), + .s_ip_protocol ({icmp_tx_ip_protocol, udp_tx_ip_protocol, tcp_tx_ip_protocol}), + .s_ip_header_checksum ('0), + .s_ip_source_ip ({icmp_tx_ip_source_ip, udp_tx_ip_source_ip, tcp_tx_ip_source_ip}), + .s_ip_dest_ip ({icmp_tx_ip_dest_ip, udp_tx_ip_dest_ip, tcp_tx_ip_dest_ip}), + .s_ip_payload_axis_tdata ({icmp_tx_ip_payload_axis_tdata, udp_tx_ip_payload_axis_tdata, tcp_tx_ip_payload_axis_tdata}), + .s_ip_payload_axis_tkeep ('1), + .s_ip_payload_axis_tvalid ({icmp_tx_ip_payload_axis_tvalid, udp_tx_ip_payload_axis_tvalid, tcp_tx_ip_payload_axis_tvalid}), + .s_ip_payload_axis_tready ({icmp_tx_ip_payload_axis_tready, udp_tx_ip_payload_axis_tready, tcp_tx_ip_payload_axis_tready}), + .s_ip_payload_axis_tlast ({icmp_tx_ip_payload_axis_tlast, udp_tx_ip_payload_axis_tlast, tcp_tx_ip_payload_axis_tlast}), + .s_ip_payload_axis_tid ('0), + .s_ip_payload_axis_tdest ('0), + .s_ip_payload_axis_tuser ({icmp_tx_ip_payload_axis_tuser, udp_tx_ip_payload_axis_tuser, tcp_tx_ip_payload_axis_tuser}), + + .m_ip_hdr_valid (tx_ip_hdr_valid), + .m_ip_hdr_ready (tx_ip_hdr_ready), + .m_eth_dest_mac (), + .m_eth_src_mac (), + .m_eth_type (), + .m_ip_version (), + .m_ip_ihl (), + .m_ip_dscp (tx_ip_dscp), + .m_ip_ecn (tx_ip_ecn), + .m_ip_length (), + .m_ip_identification (), + .m_ip_flags (), + .m_ip_fragment_offset (), + .m_ip_ttl (tx_ip_ttl), + .m_ip_protocol (tx_ip_protocol), + .m_ip_header_checksum (), + .m_ip_source_ip (tx_ip_source_ip), + .m_ip_dest_ip (tx_ip_dest_ip), + .m_ip_payload_axis_tdata (tx_ip_payload_axis_tdata), + .m_ip_payload_axis_tvalid (tx_ip_payload_axis_tvalid), + .m_ip_payload_axis_tready (tx_ip_payload_axis_tready), + .m_ip_payload_axis_tlast (tx_ip_payload_axis_tlast), + .m_ip_payload_axis_tuser (tx_ip_payload_axis_tuser) +); + tcp #( .NUM_TCP(NUM_TCP) ) tcp ( diff --git a/hw/super6502_fpga/src/sub/network_processor/src/tcp.sv b/hw/super6502_fpga/src/sub/network_processor/src/tcp.sv index 6353ae2..a07919a 100644 --- a/hw/super6502_fpga/src/sub/network_processor/src/tcp.sv +++ b/hw/super6502_fpga/src/sub/network_processor/src/tcp.sv @@ -61,7 +61,53 @@ module tcp #( output wire m_ip_payload_axis_tvalid, input wire m_ip_payload_axis_tready, output wire m_ip_payload_axis_tlast, - output wire m_ip_payload_axis_tuser + output wire m_ip_payload_axis_tuser, + + /* + * AXI DMA Interface + */ + input wire m_dma_axil_awready, + output wire m_dma_axil_awvalid, + output wire [31:0] m_dma_axil_awaddr, + output wire [2:0] m_dma_axil_awprot, + input wire m_dma_axil_wready, + output wire m_dma_axil_wvalid, + output wire [31:0] m_dma_axil_wdata, + output wire [3:0] m_dma_axil_wstrb, + output wire m_dma_axil_bready, + input wire m_dma_axil_bvalid, + input wire [1:0] m_dma_axil_bresp, + input wire m_dma_axil_arready, + output wire m_dma_axil_arvalid, + output wire [31:0] m_dma_axil_araddr, + output wire [2:0] m_dma_axil_arprot, + output wire m_dma_axil_rready, + input wire m_dma_axil_rvalid, + input wire [31:0] m_dma_axil_rdata, + input wire [1:0] m_dma_axil_rresp, + + /* + * AXI Ring buffer Interface + */ + input wire m_rb_axil_awready, + output wire m_rb_axil_awvalid, + output wire [31:0] m_rb_axil_awaddr, + output wire [2:0] m_rb_axil_awprot, + input wire m_rb_axil_wready, + output wire m_rb_axil_wvalid, + output wire [31:0] m_rb_axil_wdata, + output wire [3:0] m_rb_axil_wstrb, + output wire m_rb_axil_bready, + input wire m_rb_axil_bvalid, + input wire [1:0] m_rb_axil_bresp, + input wire m_rb_axil_arready, + output wire m_rb_axil_arvalid, + output wire [31:0] m_rb_axil_araddr, + output wire [2:0] m_rb_axil_arprot, + output wire m_rb_axil_rready, + input wire m_rb_axil_rvalid, + input wire [31:0] m_rb_axil_rdata, + input wire [1:0] m_rb_axil_rresp ); tcp_top_regfile_pkg::tcp_top_regfile__in_t tcp_hwif_in; @@ -110,6 +156,22 @@ logic s2m_rx_axis_tlast; logic [DEST_WIDTH-1:0] s2m_rx_axis_tdest; logic [USER_WIDTH-1:0] s2m_rx_axis_tuser; +logic [NUM_TCP*DATA_WIDTH-1:0] stream_tx_axis_tdata; +logic [NUM_TCP*KEEP_WIDTH-1:0] stream_tx_axis_tkeep; +logic [NUM_TCP-1:0] stream_tx_axis_tvalid; +logic [NUM_TCP-1:0] stream_tx_axis_tready; +logic [NUM_TCP-1:0] stream_tx_axis_tlast; +logic [NUM_TCP*DEST_WIDTH-1:0] stream_tx_axis_tdest; +logic [NUM_TCP*USER_WIDTH-1:0] stream_tx_axis_tuser; + +logic [NUM_TCP*DATA_WIDTH-1:0] stream_rx_axis_tdata; +logic [NUM_TCP*KEEP_WIDTH-1:0] stream_rx_axis_tkeep; +logic [NUM_TCP-1:0] stream_rx_axis_tvalid; +logic [NUM_TCP-1:0] stream_rx_axis_tready; +logic [NUM_TCP-1:0] stream_rx_axis_tlast; +logic [NUM_TCP*DEST_WIDTH-1:0] stream_rx_axis_tdest; +logic [NUM_TCP*USER_WIDTH-1:0] stream_rx_axis_tuser; + logic [NUM_TCP-1:0] tcp_rx_ip_hdr_valid; logic [NUM_TCP-1:0] tcp_rx_ip_hdr_ready; logic [NUM_TCP*48-1:0] tcp_rx_eth_dest_mac; @@ -153,13 +215,138 @@ logic [NUM_TCP-1:0] tcp_tx_ip_payload_axis_tlast; logic [NUM_TCP*USER_WIDTH-1:0] tcp_tx_ip_payload_axis_tuser; +// ring buffer manager + //m2s dma +// axis demux +axis_demux #( + .M_COUNT(NUM_TCP), + .DATA_WIDTH(DATA_WIDTH), + .DEST_ENABLE(1), + .TDEST_ROUTE(1) +) u_stream_tx_demux ( + .clk (i_clk), + .rst (i_rst), + + .s_axis_tdata (m2s_tx_axis_tdata), + .s_axis_tkeep (m2s_tx_axis_tkeep), + .s_axis_tvalid (m2s_tx_axis_tvalid), + .s_axis_tready (m2s_tx_axis_tready), + .s_axis_tlast (m2s_tx_axis_tlast), + .s_axis_tid ('0), + .s_axis_tdest (m2s_tx_axis_tdest), + .s_axis_tuser (m2s_tx_axis_tuser), + + .m_axis_tdata (stream_tx_axis_tdata), + .m_axis_tkeep (stream_tx_axis_tkeep), + .m_axis_tvalid (stream_tx_axis_tvalid), + .m_axis_tready (stream_tx_axis_tready), + .m_axis_tlast (stream_tx_axis_tlast), + .m_axis_tid (), + .m_axis_tdest (stream_tx_axis_tdest), + .m_axis_tuser (stream_tx_axis_tuser), + + .enable ('1), + .drop ('0), + .select ('0) // route selected by tdest +); + //s2m dma -// tx_stream demux (ip) +// axis mux +axis_arb_mux #( + .S_COUNT(NUM_TCP), + .DATA_WIDTH(DATA_WIDTH), + .DEST_ENABLE(1) +) u_stream_rx_arb_mux ( + .clk (i_clk), + .rst (i_rst), -// rx_stream arb (ip) + .s_axis_tdata (stream_rx_axis_tdata), + .s_axis_tkeep (stream_rx_axis_tkeep), + .s_axis_tvalid (stream_rx_axis_tvalid), + .s_axis_tready (stream_rx_axis_tready), + .s_axis_tlast (stream_rx_axis_tlast), + .s_axis_tid ('0), + .s_axis_tdest (stream_rx_axis_tdest), + .s_axis_tuser (stream_rx_axis_tuser), + + .m_axis_tdata (s2m_rx_axis_tdata), + .m_axis_tkeep (s2m_rx_axis_tkeep), + .m_axis_tvalid (s2m_rx_axis_tvalid), + .m_axis_tready (s2m_rx_axis_tready), + .m_axis_tlast (s2m_rx_axis_tlast), + .m_axis_tid (), + .m_axis_tdest (s2m_rx_axis_tdest), + .m_axis_tuser (s2m_rx_axis_tuser) +); + +// tx_stream arb mux (ip) +ip_arb_mux #( + .S_COUNT(NUM_TCP), + .DATA_WIDTH(DATA_WIDTH) +) u_tx_stream_arb_mux ( + .clk (i_clk), + .rst (i_rst), + + .s_ip_hdr_valid (tcp_tx_ip_hdr_valid), + .s_ip_hdr_ready (tcp_tx_ip_hdr_ready), + .s_eth_dest_mac ('0), + .s_eth_src_mac ('0), + .s_eth_type ('0), + .s_ip_version ('0), + .s_ip_ihl ('0), + .s_ip_dscp (tcp_tx_ip_dscp), + .s_ip_ecn (tcp_tx_ip_ecn), + .s_ip_length (tcp_tx_ip_length), + .s_ip_identification ('0), + .s_ip_flags ('0), + .s_ip_fragment_offset ('0), + .s_ip_ttl (tcp_tx_ip_ttl), + .s_ip_protocol (tcp_tx_ip_protocol), + .s_ip_header_checksum ('0), + .s_ip_source_ip (tcp_tx_ip_source_ip), + .s_ip_dest_ip (tcp_tx_ip_dest_ip), + .s_ip_payload_axis_tdata (tcp_tx_ip_payload_axis_tdata), + .s_ip_payload_axis_tkeep ('1), + .s_ip_payload_axis_tvalid (tcp_tx_ip_payload_axis_tvalid), + .s_ip_payload_axis_tready (tcp_tx_ip_payload_axis_tready), + .s_ip_payload_axis_tlast (tcp_tx_ip_payload_axis_tlast), + .s_ip_payload_axis_tid ('0), + .s_ip_payload_axis_tdest ('0), + .s_ip_payload_axis_tuser (tcp_tx_ip_payload_axis_tuser), + + .m_ip_hdr_valid (m_ip_hdr_valid), + .m_ip_hdr_ready (m_ip_hdr_ready), + .m_eth_dest_mac (), + .m_eth_src_mac (), + .m_eth_type (), + .m_ip_version (), + .m_ip_ihl (), + .m_ip_dscp (m_ip_dscp), + .m_ip_ecn (m_ip_ecn), + .m_ip_length (m_ip_length), + .m_ip_identification (), + .m_ip_flags (), + .m_ip_fragment_offset (), + .m_ip_ttl (m_ip_ttl), + .m_ip_protocol (m_ip_protocol), + .m_ip_header_checksum (), + .m_ip_source_ip (m_ip_source_ip), + .m_ip_dest_ip (m_ip_dest_ip), + .m_ip_payload_axis_tdata (m_ip_payload_axis_tdata), + .m_ip_payload_axis_tkeep (), + .m_ip_payload_axis_tvalid (m_ip_payload_axis_tvalid), + .m_ip_payload_axis_tready (m_ip_payload_axis_tready), + .m_ip_payload_axis_tlast (m_ip_payload_axis_tlast), + .m_ip_payload_axis_tid (), + .m_ip_payload_axis_tdest (), + .m_ip_payload_axis_tuser (m_ip_payload_axis_tuser) +); + + +// rx_stream demux (ip) generate @@ -178,22 +365,61 @@ generate assign wr_biten = tcp_hwif_out.tcp_streams[i].wr_biten; tcp_stream u_tcp_stream ( - .clk (i_clk), - .rst (i_rst), + .clk (i_clk), + .rst (i_rst), // This is the hacky decoder alex was telling me about - .s_cpuif_req (req), - .s_cpuif_req_is_wr (req_is_wr), - .s_cpuif_addr (addr), - .s_cpuif_wr_data (wr_data), - .s_cpuif_wr_biten (wr_biten), - .s_cpuif_req_stall_wr (), - .s_cpuif_req_stall_rd (), - .s_cpuif_rd_ack (tcp_hwif_in.tcp_streams[i].rd_ack), - .s_cpuif_rd_err (), - .s_cpuif_rd_data (tcp_hwif_in.tcp_streams[i].rd_data), - .s_cpuif_wr_ack (tcp_hwif_in.tcp_streams[i].wr_ack), - .s_cpuif_wr_err () + .s_cpuif_req (req), + .s_cpuif_req_is_wr (req_is_wr), + .s_cpuif_addr (addr), + .s_cpuif_wr_data (wr_data), + .s_cpuif_wr_biten (wr_biten), + .s_cpuif_req_stall_wr (), + .s_cpuif_req_stall_rd (), + .s_cpuif_rd_ack (tcp_hwif_in.tcp_streams[i].rd_ack), + .s_cpuif_rd_err (), + .s_cpuif_rd_data (tcp_hwif_in.tcp_streams[i].rd_data), + .s_cpuif_wr_ack (tcp_hwif_in.tcp_streams[i].wr_ack), + .s_cpuif_wr_err (), + + .s_ip_hdr_valid (tcp_rx_ip_hdr_valid[i]), + .s_ip_hdr_ready (tcp_rx_ip_hdr_ready[i]), + .s_ip_eth_dest_mac (tcp_rx_eth_dest_mac[i*48+:48]), + .s_ip_eth_src_mac (tcp_rx_eth_src_mac[i*48+:48]), + .s_ip_eth_type (tcp_rx_eth_type[i*16+:16]), + .s_ip_version (tcp_rx_ip_version[i*4+:4]), + .s_ip_ihl (tcp_rx_ip_ihl[i*4+:4]), + .s_ip_dscp (tcp_rx_ip_dscp[i*6+:6]), + .s_ip_ecn (tcp_rx_ip_ecn), + .s_ip_length (tcp_rx_ip_length), + .s_ip_identification (tcp_rx_ip_identification), + .s_ip_flags (tcp_rx_ip_flags), + .s_ip_fragment_offset (tcp_rx_ip_fragment_offset), + .s_ip_ttl (tcp_rx_ip_ttl), + .s_ip_protocol (tcp_rx_ip_protocol), + .s_ip_header_checksum (tcp_rx_ip_header_checksum), + .s_ip_source_ip (tcp_rx_ip_source_ip), + .s_ip_dest_ip (tcp_rx_ip_dest_ip), + .s_ip_payload_axis_tdata (tcp_rx_ip_payload_axis_tdata), + .s_ip_payload_axis_tvalid (tcp_rx_ip_payload_axis_tvalid), + .s_ip_payload_axis_tready (tcp_rx_ip_payload_axis_tready), + .s_ip_payload_axis_tlast (tcp_rx_ip_payload_axis_tlast), + .s_ip_payload_axis_tuser (tcp_rx_ip_payload_axis_tuser), + + .m_ip_hdr_valid (tcp_tx_ip_hdr_valid), + .m_ip_hdr_ready (tcp_tx_ip_hdr_ready), + .m_ip_dscp (tcp_tx_ip_dscp), + .m_ip_ecn (tcp_tx_ip_ecn), + .m_ip_length (tcp_tx_ip_length), + .m_ip_ttl (tcp_tx_ip_ttl), + .m_ip_protocol (tcp_tx_ip_protocol), + .m_ip_source_ip (tcp_tx_ip_source_ip), + .m_ip_dest_ip (tcp_tx_ip_dest_ip), + .m_ip_payload_axis_tdata (tcp_tx_ip_payload_axis_tdata), + .m_ip_payload_axis_tvalid (tcp_tx_ip_payload_axis_tvalid), + .m_ip_payload_axis_tready (tcp_tx_ip_payload_axis_tready), + .m_ip_payload_axis_tlast (tcp_tx_ip_payload_axis_tlast), + .m_ip_payload_axis_tuser (tcp_tx_ip_payload_axis_tuser) ); end endgenerate