diff --git a/.gitignore b/.gitignore
index e135391..5cd66f4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,3 +26,11 @@ sim_top
# Allow sources.list specifically
!*sources.list
+
+# Cocotb
+sim_build
+*.fst
+__pycache__
+*.vcd
+*.fst.*
+results.xml
\ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
index 481289d..15d4af3 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -19,3 +19,6 @@
[submodule "hw/super6502_fpga/src/sub/stream_dmas"]
path = hw/super6502_fpga/src/sub/stream_dmas
url = ../stream_dmas.git
+[submodule "hw/super6502_fpga/src/sub/interfaces"]
+ path = hw/super6502_fpga/src/sub/interfaces
+ url = ../interfaces.git
\ No newline at end of file
diff --git a/hw/super6502_fpga/sources.list b/hw/super6502_fpga/sources.list
index 36c354f..adb8699 100644
--- a/hw/super6502_fpga/sources.list
+++ b/hw/super6502_fpga/sources.list
@@ -1,3 +1,4 @@
+src/sub/interfaces/sources.list
src/rtl/super_6502_fpga.sv
ip/sdram_controller/sdram_controller.v
src/sub/cpu_wrapper/sources.list
diff --git a/hw/super6502_fpga/src/sub/interfaces b/hw/super6502_fpga/src/sub/interfaces
new file mode 160000
index 0000000..13c389d
--- /dev/null
+++ b/hw/super6502_fpga/src/sub/interfaces
@@ -0,0 +1 @@
+Subproject commit 13c389dc18b37f613113d19c0724533de772c79f
diff --git a/hw/super6502_fpga/src/sub/network_processor/sim/cocotb/Makefile b/hw/super6502_fpga/src/sub/network_processor/sim/cocotb/Makefile
new file mode 100644
index 0000000..570a0ee
--- /dev/null
+++ b/hw/super6502_fpga/src/sub/network_processor/sim/cocotb/Makefile
@@ -0,0 +1,24 @@
+RTL_SRCS_LIST=$(REPO_TOP)/hw/super6502_fpga/sources.list
+SIM_SRCS_LIST=tb/sources.list
+
+RTL_SOURCES=$(shell rtl-manifest $(RTL_SRCS_LIST))
+SIM_SOURCES=$(shell rtl-manifest $(SIM_SRCS_LIST))
+
+VERILOG_SOURCES= $(INTF_SOURCES) $(RTL_SOURCES) $(SIM_SOURCES)
+
+TOPLEVEL_LANG ?= verilog
+
+SIM ?= verilator
+
+EXTRA_ARGS += --trace --trace-fst --trace-structs -Wno-fatal -Wno-PINMISSING
+
+
+TOPLEVEL = tb_top
+
+GPI_IMPL := vpi
+
+export PYTHONPATH := $(PWD)/tests:$(PYTHONPATH)
+export TOPLEVEL_LANG
+MODULE=sanity
+
+include $(shell cocotb-config --makefiles)/Makefile.sim
\ No newline at end of file
diff --git a/hw/super6502_fpga/src/sub/network_processor/sim/cocotb/tb/sources.list b/hw/super6502_fpga/src/sub/network_processor/sim/cocotb/tb/sources.list
new file mode 100644
index 0000000..bd036c2
--- /dev/null
+++ b/hw/super6502_fpga/src/sub/network_processor/sim/cocotb/tb/sources.list
@@ -0,0 +1 @@
+tb_top.sv
\ No newline at end of file
diff --git a/hw/super6502_fpga/src/sub/network_processor/sim/cocotb/tb/tb_top.sv b/hw/super6502_fpga/src/sub/network_processor/sim/cocotb/tb/tb_top.sv
new file mode 100644
index 0000000..5a27636
--- /dev/null
+++ b/hw/super6502_fpga/src/sub/network_processor/sim/cocotb/tb/tb_top.sv
@@ -0,0 +1,120 @@
+module tb_top(
+ input wire clk,
+ input wire rst,
+
+ output wire s_regs_axil_awready,
+ input wire s_regs_axil_awvalid,
+ input wire [31:0] s_regs_axil_awaddr,
+ input wire [2:0] s_regs_axil_awprot,
+ output wire s_regs_axil_wready,
+ input wire s_regs_axil_wvalid,
+ input wire [31:0] s_regs_axil_wdata,
+ input wire [3:0] s_regs_axil_wstrb,
+ input wire s_regs_axil_bready,
+ output wire s_regs_axil_bvalid,
+ output wire [1:0] s_regs_axil_bresp,
+ output wire s_regs_axil_arready,
+ input wire s_regs_axil_arvalid,
+ input wire [31:0] s_regs_axil_araddr,
+ input wire [2:0] s_regs_axil_arprot,
+ input wire s_regs_axil_rready,
+ output wire s_regs_axil_rvalid,
+ output wire [31:0] s_regs_axil_rdata,
+ output wire [1:0] s_regs_axil_rresp,
+
+ 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,
+
+ //MII Interface
+ input wire mii_rx_clk,
+ input wire [3:0] mii_rxd,
+ input wire mii_rx_dv,
+ input wire mii_rx_er,
+ input wire mii_tx_clk,
+ output wire [3:0] mii_txd,
+ output wire mii_tx_en,
+ output wire mii_tx_er
+);
+
+axil_intf regs_axil();
+axil_intf dma_axil();
+
+assign dma_axil.awready = m_dma_axil_awready;
+assign m_dma_axil_awvalid = dma_axil.awvalid;
+assign m_dma_axil_awaddr = dma_axil.awaddr;
+assign m_dma_axil_awprot = dma_axil.awprot;
+assign dma_axil.wready = m_dma_axil_wready;
+assign m_dma_axil_wvalid = dma_axil.wvalid;
+assign m_dma_axil_wdata = dma_axil.wdata;
+assign m_dma_axil_wstrb = dma_axil.wstrb;
+assign m_dma_axil_bready = dma_axil.bready;
+assign dma_axil.bvalid = m_dma_axil_bvalid;
+assign dma_axil.bresp = m_dma_axil_bresp;
+assign dma_axil.arready = m_dma_axil_arready;
+assign m_dma_axil_arvalid = dma_axil.arvalid;
+assign m_dma_axil_araddr = dma_axil.araddr;
+assign m_dma_axil_arprot = dma_axil.arprot;
+assign m_dma_axil_rready = dma_axil.rready;
+assign dma_axil.rvalid = m_dma_axil_rvalid;
+assign dma_axil.rdata = m_dma_axil_rdata;
+assign dma_axil.rresp = m_dma_axil_rresp;
+
+assign s_regs_axil_awready = regs_axil.awready;
+assign regs_axil.awvalid = s_regs_axil_awvalid;
+assign regs_axil.awaddr = s_regs_axil_awaddr;
+assign regs_axil.awprot = s_regs_axil_awprot;
+assign s_regs_axil_wready = regs_axil.wready;
+assign regs_axil.wvalid = s_regs_axil_wvalid;
+assign regs_axil.wdata = s_regs_axil_wdata;
+assign regs_axil.wstrb = s_regs_axil_wstrb;
+assign regs_axil.bready = s_regs_axil_bready;
+assign s_regs_axil_bvalid = regs_axil.bvalid;
+assign s_regs_axil_bresp = regs_axil.bresp;
+assign s_regs_axil_arready = regs_axil.arready;
+assign regs_axil.arvalid = s_regs_axil_arvalid;
+assign regs_axil.araddr = s_regs_axil_araddr;
+assign regs_axil.arprot = s_regs_axil_arprot;
+assign regs_axil.rready = s_regs_axil_rready;
+assign s_regs_axil_rvalid = regs_axil.rvalid;
+assign s_regs_axil_rdata = regs_axil.rdata;
+assign s_regs_axil_rresp = regs_axil.rresp;
+
+
+
+network_processor #(
+ .NUM_TCP(8)
+) u_network_processor (
+ .i_clk (clk),
+ .i_rst (rst),
+
+ .s_reg_axil (regs_axil),
+ .m_dma_axil (dma_axil),
+
+ .mii_rx_clk (mii_rx_clk),
+ .mii_rxd (mii_rxd),
+ .mii_rx_dv (mii_rx_dv),
+ .mii_rx_er (mii_rx_er),
+ .mii_tx_clk (mii_tx_clk),
+ .mii_txd (mii_txd),
+ .mii_tx_en (mii_tx_en),
+ .mii_tx_er (mii_tx_er)
+);
+
+endmodule
\ No newline at end of file
diff --git a/hw/super6502_fpga/src/sub/network_processor/sim/cocotb/tests/sanity.py b/hw/super6502_fpga/src/sub/network_processor/sim/cocotb/tests/sanity.py
new file mode 100644
index 0000000..a2cb400
--- /dev/null
+++ b/hw/super6502_fpga/src/sub/network_processor/sim/cocotb/tests/sanity.py
@@ -0,0 +1,44 @@
+import cocotb
+from cocotb.clock import Clock
+from cocotb.triggers import Timer
+from cocotb.triggers import RisingEdge
+from cocotbext.axi import AxiLiteBus, AxiLiteMaster, AxiLiteRam, AxiStreamBus, AxiStreamSink
+
+import logging
+
+from decimal import Decimal
+
+CLK_PERIOD_NS = 10
+
+class TB:
+ def __init__(self, dut):
+ self.dut = dut
+
+ self.log = logging.getLogger("cocotb.tb")
+ self.log.setLevel(logging.DEBUG)
+
+ cocotb.start_soon(Clock(dut.clk, CLK_PERIOD_NS, units="ns").start())
+
+ self.axil_master = AxiLiteMaster(AxiLiteBus.from_prefix(dut, "s_regs_axil"), dut.clk, dut.rst)
+ self.axil_ram = AxiLiteRam(AxiLiteBus.from_prefix(dut, "m_dma_axil"), dut.clk, dut.rst, size=2**16)
+
+ async def cycle_reset(self):
+ self.dut.rst.setimmediatevalue(0)
+ await RisingEdge(self.dut.clk) # type: ignore
+ await RisingEdge(self.dut.clk) # type: ignore
+ self.dut.rst.value = 1
+ await RisingEdge(self.dut.clk) # type: ignore
+ await RisingEdge(self.dut.clk) # type: ignore
+ self.dut.rst.value = 0
+ await RisingEdge(self.dut.clk) # type: ignore
+ await RisingEdge(self.dut.clk) # type: ignore
+
+@cocotb.test()
+async def test_simple(dut):
+ tb = TB(dut)
+
+ await tb.cycle_reset()
+
+ await tb.axil_master.write_dword(0, 0xffff)
+
+ await Timer(Decimal(CLK_PERIOD_NS * 400), units='ns')
\ No newline at end of file
diff --git a/hw/super6502_fpga/src/sub/network_processor/sources.list b/hw/super6502_fpga/src/sub/network_processor/sources.list
index 9759a59..acacd6a 100644
--- a/hw/super6502_fpga/src/sub/network_processor/sources.list
+++ b/hw/super6502_fpga/src/sub/network_processor/sources.list
@@ -10,4 +10,6 @@ src/network_processor.sv
src/tcp_state_manager.sv
src/tcp_stream.sv
src/tcp.sv
-src/eth_wrapper.sv
\ No newline at end of file
+src/eth_wrapper.sv
+src/ip_arb_mux_wrapper.sv
+src/ip_demux_wrapper.sv
\ No newline at end of file
diff --git a/hw/super6502_fpga/src/sub/network_processor/src/eth_wrapper.sv b/hw/super6502_fpga/src/sub/network_processor/src/eth_wrapper.sv
index eca314e..1e8551c 100644
--- a/hw/super6502_fpga/src/sub/network_processor/src/eth_wrapper.sv
+++ b/hw/super6502_fpga/src/sub/network_processor/src/eth_wrapper.sv
@@ -5,25 +5,8 @@ module eth_wrapper #(
input wire rst,
input wire clk_sys,
- /*
- * AXI input
- */
- input wire [MAC_DATA_WIDTH-1:0] tx_axis_tdata,
- input wire [MAC_KEEP_WIDTH-1:0] tx_axis_tkeep,
- input wire tx_axis_tvalid,
- output wire tx_axis_tready,
- input wire tx_axis_tlast,
- input wire tx_axis_tuser,
-
- /*
- * AXI output
- */
- output wire [MAC_DATA_WIDTH-1:0] rx_axis_tdata,
- output wire [MAC_KEEP_WIDTH-1:0] rx_axis_tkeep,
- output wire rx_axis_tvalid,
- input wire rx_axis_tready,
- output wire rx_axis_tlast,
- output wire rx_axis_tuser,
+ axis_intf.SLAVE tx_axis,
+ axis_intf.MASTER rx_axis,
/*
* MII interface
@@ -105,28 +88,28 @@ eth_mac_mii_fifo #(
.RX_FIFO_RAM_PIPELINE(1),
.RX_FRAME_FIFO(1)
) u_mac (
- .rst (reset),
- .logic_clk (clk_100),
- .logic_rst (reset),
+ .rst (rst),
+ .logic_clk (clk_sys),
+ .logic_rst (rst),
- .tx_axis_tdata (tx_axis_tdata),
- .tx_axis_tkeep (tx_axis_tkeep),
- .tx_axis_tvalid (tx_axis_tvalid),
- .tx_axis_tready (tx_axis_tready),
- .tx_axis_tlast (tx_axis_tlast),
+ .tx_axis_tdata (tx_axis.tdata),
+ .tx_axis_tkeep (tx_axis.tkeep),
+ .tx_axis_tvalid (tx_axis.tvalid),
+ .tx_axis_tready (tx_axis.tready),
+ .tx_axis_tlast (tx_axis.tlast),
.tx_axis_tuser ('0),
- .rx_axis_tdata (rx_axis_tdata),
- .rx_axis_tkeep (rx_axis_tkeep),
- .rx_axis_tvalid (rx_axis_tvalid),
- .rx_axis_tready (rx_axis_tready),
- .rx_axis_tlast (rx_axis_tlast),
- .rx_axis_tuser (rx_axis_tuser),
+ .rx_axis_tdata (rx_axis.tdata),
+ .rx_axis_tkeep (rx_axis.tkeep),
+ .rx_axis_tvalid (rx_axis.tvalid),
+ .rx_axis_tready (rx_axis.tready),
+ .rx_axis_tlast (rx_axis.tlast),
+ .rx_axis_tuser (rx_axis.tuser),
.mii_rx_clk (mii_rx_clk),
- .mii_rxd (mii_rxd_mux),
- .mii_rx_dv (mii_rx_dv_mux),
- .mii_rx_er (mii_rx_er_mux),
+ .mii_rxd (mii_rxd),
+ .mii_rx_dv (mii_rx_dv),
+ .mii_rx_er (mii_rx_er),
.mii_tx_clk (mii_tx_clk),
.mii_txd (mii_txd),
.mii_tx_en (mii_tx_en),
diff --git a/hw/super6502_fpga/src/sub/network_processor/src/ip_arb_mux_wrapper.sv b/hw/super6502_fpga/src/sub/network_processor/src/ip_arb_mux_wrapper.sv
new file mode 100644
index 0000000..dd6d197
--- /dev/null
+++ b/hw/super6502_fpga/src/sub/network_processor/src/ip_arb_mux_wrapper.sv
@@ -0,0 +1,154 @@
+module ip_arb_mux_wrapper #(
+ parameter S_COUNT = 4,
+ parameter DATA_WIDTH = 8,
+ parameter KEEP_ENABLE = (DATA_WIDTH>8),
+ parameter KEEP_WIDTH = (DATA_WIDTH/8),
+ parameter ID_ENABLE = 0,
+ parameter ID_WIDTH = 8,
+ parameter DEST_ENABLE = 0,
+ parameter DEST_WIDTH = 8,
+ parameter USER_ENABLE = 1,
+ parameter USER_WIDTH = 1,
+ // select round robin arbitration
+ parameter ARB_TYPE_ROUND_ROBIN = 0,
+ // LSB priority selection
+ parameter ARB_LSB_HIGH_PRIORITY = 1
+) (
+ input i_clk,
+ input i_rst,
+
+ ip_intf.SLAVE s_ip [S_COUNT],
+ ip_intf.MASTER m_ip
+);
+
+logic [S_COUNT-1:0] s_ip_hdr_valid;
+logic [S_COUNT-1:0] s_ip_hdr_ready;
+logic [S_COUNT*48-1:0] s_eth_dest_mac;
+logic [S_COUNT*48-1:0] s_eth_src_mac;
+logic [S_COUNT*16-1:0] s_eth_type;
+logic [S_COUNT*4-1:0] s_ip_version;
+logic [S_COUNT*4-1:0] s_ip_ihl;
+logic [S_COUNT*6-1:0] s_ip_dscp;
+logic [S_COUNT*2-1:0] s_ip_ecn;
+logic [S_COUNT*16-1:0] s_ip_length;
+logic [S_COUNT*16-1:0] s_ip_identification;
+logic [S_COUNT*3-1:0] s_ip_flags;
+logic [S_COUNT*13-1:0] s_ip_fragment_offset;
+logic [S_COUNT*8-1:0] s_ip_ttl;
+logic [S_COUNT*8-1:0] s_ip_protocol;
+logic [S_COUNT*16-1:0] s_ip_header_checksum;
+logic [S_COUNT*32-1:0] s_ip_source_ip;
+logic [S_COUNT*32-1:0] s_ip_dest_ip;
+logic [S_COUNT*DATA_WIDTH-1:0] s_ip_payload_axis_tdata;
+logic [S_COUNT*KEEP_WIDTH-1:0] s_ip_payload_axis_tkeep;
+logic [S_COUNT-1:0] s_ip_payload_axis_tvalid;
+logic [S_COUNT-1:0] s_ip_payload_axis_tready;
+logic [S_COUNT-1:0] s_ip_payload_axis_tlast;
+logic [S_COUNT*ID_WIDTH-1:0] s_ip_payload_axis_tid;
+logic [S_COUNT*DEST_WIDTH-1:0] s_ip_payload_axis_tdest;
+logic [S_COUNT*USER_WIDTH-1:0] s_ip_payload_axis_tuser;
+
+generate
+ for (genvar i = 0; i < S_COUNT; i++) begin
+ assign s_ip_hdr_valid[i] = s_ip[i].ip_hdr_valid;
+ assign s_ip[i].ip_hdr_ready = s_ip_hdr_ready[i];
+ assign s_eth_dest_mac[i*48+:48] = s_ip[i].eth_dest_mac;
+ assign s_eth_src_mac[i*48+:48] = s_ip[i].eth_src_mac;
+ assign s_eth_type[i*16+:16] = s_ip[i].eth_type;
+ assign s_ip_version[i*4+:4] = s_ip[i].ip_version;
+ assign s_ip_ihl[i*4+:4] = s_ip[i].ip_ihl;
+ assign s_ip_dscp[i*6+:6] = s_ip[i].ip_dscp;
+ assign s_ip_ecn[i*2+:2] = s_ip[i].ip_ecn;
+ assign s_ip_length[i*16+:16] = s_ip[i].ip_length;
+ assign s_ip_identification[i*16+:16] = s_ip[i].ip_identification;
+ assign s_ip_flags[i*3+:3] = s_ip[i].ip_flags;
+ assign s_ip_fragment_offset[i*13+:13] = s_ip[i].ip_fragment_offset;
+ assign s_ip_ttl[i*8+:8] = s_ip[i].ip_ttl;
+ assign s_ip_protocol[i*8+:8] = s_ip[i].ip_protocol;
+ assign s_ip_header_checksum[i*16+:16] = s_ip[i].ip_header_checksum;
+ assign s_ip_source_ip[i*32+:32] = s_ip[i].ip_source_ip;
+ assign s_ip_dest_ip[i*32+:32] = s_ip[i].ip_dest_ip;
+ assign s_ip_payload_axis_tdata[i*DATA_WIDTH+:DATA_WIDTH] = s_ip[i].ip_payload_axis_tdata;
+ assign s_ip_payload_axis_tkeep[i*KEEP_WIDTH+:KEEP_WIDTH] = s_ip[i].ip_payload_axis_tkeep;
+ assign s_ip_payload_axis_tvalid[i*KEEP_WIDTH+:KEEP_WIDTH] = s_ip[i].ip_payload_axis_tvalid;
+ assign s_ip[i].ip_payload_axis_tready = s_ip_payload_axis_tready[i];
+ assign s_ip_payload_axis_tlast[i] = s_ip[i].ip_payload_axis_tlast;
+ assign s_ip_payload_axis_tid[i*ID_WIDTH+:ID_WIDTH] = s_ip[i].ip_payload_axis_tid;
+ assign s_ip_payload_axis_tdest[i*DEST_WIDTH+:DEST_WIDTH] = s_ip[i].ip_payload_axis_tdest;
+ assign s_ip_payload_axis_tuser[i*USER_WIDTH+:USER_WIDTH] = s_ip[i].ip_payload_axis_tuser;
+ end
+endgenerate
+
+ip_arb_mux #(
+ .S_COUNT(S_COUNT),
+ .DATA_WIDTH(DATA_WIDTH),
+ .KEEP_ENABLE(KEEP_ENABLE),
+ .KEEP_WIDTH(KEEP_WIDTH),
+ .ID_ENABLE(ID_ENABLE),
+ .ID_WIDTH(ID_WIDTH),
+ .DEST_ENABLE(DEST_ENABLE),
+ .DEST_WIDTH(DEST_WIDTH),
+ .USER_ENABLE(USER_ENABLE),
+ .USER_WIDTH(USER_WIDTH),
+ .ARB_TYPE_ROUND_ROBIN(ARB_TYPE_ROUND_ROBIN),
+ .ARB_LSB_HIGH_PRIORITY(ARB_LSB_HIGH_PRIORITY)
+) u_arb_mux (
+ .clk (i_clk),
+ .rst (i_rst),
+
+ .s_ip_hdr_valid (s_ip_hdr_valid ),
+ .s_ip_hdr_ready (s_ip_hdr_ready ),
+ .s_eth_dest_mac (s_eth_dest_mac ),
+ .s_eth_src_mac (s_eth_src_mac ),
+ .s_eth_type (s_eth_type ),
+ .s_ip_version (s_ip_version ),
+ .s_ip_ihl (s_ip_ihl ),
+ .s_ip_dscp (s_ip_dscp ),
+ .s_ip_ecn (s_ip_ecn ),
+ .s_ip_length (s_ip_length ),
+ .s_ip_identification (s_ip_identification ),
+ .s_ip_flags (s_ip_flags ),
+ .s_ip_fragment_offset (s_ip_fragment_offset ),
+ .s_ip_ttl (s_ip_ttl ),
+ .s_ip_protocol (s_ip_protocol ),
+ .s_ip_header_checksum (s_ip_header_checksum ),
+ .s_ip_source_ip (s_ip_source_ip ),
+ .s_ip_dest_ip (s_ip_dest_ip ),
+ .s_ip_payload_axis_tdata (s_ip_payload_axis_tdata ),
+ .s_ip_payload_axis_tkeep (s_ip_payload_axis_tkeep ),
+ .s_ip_payload_axis_tvalid (s_ip_payload_axis_tvalid ),
+ .s_ip_payload_axis_tready (s_ip_payload_axis_tready ),
+ .s_ip_payload_axis_tlast (s_ip_payload_axis_tlast ),
+ .s_ip_payload_axis_tid (s_ip_payload_axis_tid ),
+ .s_ip_payload_axis_tdest (s_ip_payload_axis_tdest ),
+ .s_ip_payload_axis_tuser (s_ip_payload_axis_tuser ),
+
+ .m_ip_hdr_valid (m_ip.ip_hdr_valid ),
+ .m_ip_hdr_ready (m_ip.ip_hdr_ready ),
+ .m_eth_dest_mac (m_ip.eth_dest_mac ),
+ .m_eth_src_mac (m_ip.eth_src_mac ),
+ .m_eth_type (m_ip.eth_type ),
+ .m_ip_version (m_ip.ip_version ),
+ .m_ip_ihl (m_ip.ip_ihl ),
+ .m_ip_dscp (m_ip.ip_dscp ),
+ .m_ip_ecn (m_ip.ip_ecn ),
+ .m_ip_length (m_ip.ip_length ),
+ .m_ip_identification (m_ip.ip_identification ),
+ .m_ip_flags (m_ip.ip_flags ),
+ .m_ip_fragment_offset (m_ip.ip_fragment_offset ),
+ .m_ip_ttl (m_ip.ip_ttl ),
+ .m_ip_protocol (m_ip.ip_protocol ),
+ .m_ip_header_checksum (m_ip.ip_header_checksum ),
+ .m_ip_source_ip (m_ip.ip_source_ip ),
+ .m_ip_dest_ip (m_ip.ip_dest_ip ),
+ .m_ip_payload_axis_tdata (m_ip.ip_payload_axis_tdata ),
+ .m_ip_payload_axis_tkeep (m_ip.ip_payload_axis_tkeep ),
+ .m_ip_payload_axis_tvalid (m_ip.ip_payload_axis_tvalid ),
+ .m_ip_payload_axis_tready (m_ip.ip_payload_axis_tready ),
+ .m_ip_payload_axis_tlast (m_ip.ip_payload_axis_tlast ),
+ .m_ip_payload_axis_tid (m_ip.ip_payload_axis_tid ),
+ .m_ip_payload_axis_tdest (m_ip.ip_payload_axis_tdest ),
+ .m_ip_payload_axis_tuser (m_ip.ip_payload_axis_tuser )
+);
+
+endmodule
\ No newline at end of file
diff --git a/hw/super6502_fpga/src/sub/network_processor/src/ip_demux_wrapper.sv b/hw/super6502_fpga/src/sub/network_processor/src/ip_demux_wrapper.sv
new file mode 100644
index 0000000..acdca83
--- /dev/null
+++ b/hw/super6502_fpga/src/sub/network_processor/src/ip_demux_wrapper.sv
@@ -0,0 +1,151 @@
+module ip_demux_wrapper #(
+ parameter M_COUNT = 4,
+ parameter DATA_WIDTH = 8,
+ parameter KEEP_ENABLE = (DATA_WIDTH>8),
+ parameter KEEP_WIDTH = (DATA_WIDTH/8),
+ parameter ID_ENABLE = 0,
+ parameter ID_WIDTH = 8,
+ parameter DEST_ENABLE = 0,
+ parameter DEST_WIDTH = 8,
+ parameter USER_ENABLE = 1,
+ parameter USER_WIDTH = 1
+)
+(
+ input wire clk,
+ input wire rst,
+
+ ip_intf.SLAVE s_ip,
+ ip_intf.MASTER m_ip [M_COUNT],
+
+ input wire enable,
+ input wire drop,
+ input wire [$clog2(M_COUNT)-1:0] select
+);
+
+logic [M_COUNT-1:0] m_ip_hdr_valid;
+logic [M_COUNT-1:0] m_ip_hdr_ready;
+logic [M_COUNT*48-1:0] m_eth_dest_mac;
+logic [M_COUNT*48-1:0] m_eth_src_mac;
+logic [M_COUNT*16-1:0] m_eth_type;
+logic [M_COUNT*4-1:0] m_ip_version;
+logic [M_COUNT*4-1:0] m_ip_ihl;
+logic [M_COUNT*6-1:0] m_ip_dscp;
+logic [M_COUNT*2-1:0] m_ip_ecn;
+logic [M_COUNT*16-1:0] m_ip_length;
+logic [M_COUNT*16-1:0] m_ip_identification;
+logic [M_COUNT*3-1:0] m_ip_flags;
+logic [M_COUNT*13-1:0] m_ip_fragment_offset;
+logic [M_COUNT*8-1:0] m_ip_ttl;
+logic [M_COUNT*8-1:0] m_ip_protocol;
+logic [M_COUNT*16-1:0] m_ip_header_checksum;
+logic [M_COUNT*32-1:0] m_ip_source_ip;
+logic [M_COUNT*32-1:0] m_ip_dest_ip;
+logic [M_COUNT*DATA_WIDTH-1:0] m_ip_payload_axis_tdata;
+logic [M_COUNT*KEEP_WIDTH-1:0] m_ip_payload_axis_tkeep;
+logic [M_COUNT-1:0] m_ip_payload_axis_tvalid;
+logic [M_COUNT-1:0] m_ip_payload_axis_tready;
+logic [M_COUNT-1:0] m_ip_payload_axis_tlast;
+logic [M_COUNT*ID_WIDTH-1:0] m_ip_payload_axis_tid;
+logic [M_COUNT*DEST_WIDTH-1:0] m_ip_payload_axis_tdest;
+logic [M_COUNT*USER_WIDTH-1:0] m_ip_payload_axis_tuser;
+
+
+generate
+ for (genvar i = 0; i < M_COUNT; i++) begin
+ assign m_ip[i].ip_hdr_valid = m_ip_hdr_valid[i];
+ assign m_ip_hdr_ready[i] = m_ip[i].ip_hdr_ready;
+ assign m_ip[i].eth_dest_mac = m_eth_dest_mac[i*48+:48];
+ assign m_ip[i].eth_src_mac = m_eth_src_mac[i*48+:48];
+ assign m_ip[i].eth_type = m_eth_type[i*16+:16];
+ assign m_ip[i].ip_version = m_ip_version[i*4+:4];
+ assign m_ip[i].ip_ihl = m_ip_ihl[i*4+:4];
+ assign m_ip[i].ip_dscp = m_ip_dscp[i*6+:6];
+ assign m_ip[i].ip_ecn = m_ip_ecn[i*2+:2];
+ assign m_ip[i].ip_length = m_ip_length[i*16+:16];
+ assign m_ip[i].ip_identification = m_ip_identification[i*16+:16];
+ assign m_ip[i].ip_flags = m_ip_flags[i*3+:3];
+ assign m_ip[i].ip_fragment_offset = m_ip_fragment_offset[i*13+:13];
+ assign m_ip[i].ip_ttl = m_ip_ttl[i*8+:8];
+ assign m_ip[i].ip_protocol = m_ip_protocol[i*8+:8];
+ assign m_ip[i].ip_header_checksum = m_ip_header_checksum[i*16+:16];
+ assign m_ip[i].ip_source_ip = m_ip_source_ip[i*32+:32];
+ assign m_ip[i].ip_dest_ip = m_ip_dest_ip[i*32+:32];
+ assign m_ip[i].ip_payload_axis_tdata = m_ip_payload_axis_tdata[i*DATA_WIDTH+:DATA_WIDTH];
+ assign m_ip[i].ip_payload_axis_tkeep = m_ip_payload_axis_tkeep[i*KEEP_WIDTH+:KEEP_WIDTH];
+ assign m_ip[i].ip_payload_axis_tvalid = m_ip_payload_axis_tvalid[i*KEEP_WIDTH+:KEEP_WIDTH];
+ assign m_ip_payload_axis_tready[i] = m_ip[i].ip_payload_axis_tready;
+ assign m_ip[i].ip_payload_axis_tlast = m_ip_payload_axis_tlast[i];
+ assign m_ip[i].ip_payload_axis_tid = m_ip_payload_axis_tid[i*ID_WIDTH+:ID_WIDTH];
+ assign m_ip[i].ip_payload_axis_tdest = m_ip_payload_axis_tdest[i*DEST_WIDTH+:DEST_WIDTH];
+ assign m_ip[i].ip_payload_axis_tuser = m_ip_payload_axis_tuser[i*USER_WIDTH+:USER_WIDTH];
+ end
+endgenerate
+
+ip_demux #(
+ .M_COUNT(M_COUNT),
+ .DATA_WIDTH(DATA_WIDTH),
+ .KEEP_ENABLE(KEEP_ENABLE),
+ .KEEP_WIDTH(KEEP_WIDTH),
+ .ID_ENABLE(ID_ENABLE),
+ .ID_WIDTH(ID_WIDTH),
+ .DEST_ENABLE(DEST_ENABLE),
+ .DEST_WIDTH(DEST_WIDTH),
+ .USER_ENABLE(USER_ENABLE),
+ .USER_WIDTH(USER_WIDTH)
+) u_ip_demux (
+ .s_ip_hdr_valid (s_ip.ip_hdr_valid ),
+ .s_ip_hdr_ready (s_ip.ip_hdr_ready ),
+ .s_eth_dest_mac (s_ip.eth_dest_mac ),
+ .s_eth_src_mac (s_ip.eth_src_mac ),
+ .s_eth_type (s_ip.eth_type ),
+ .s_ip_version (s_ip.ip_version ),
+ .s_ip_ihl (s_ip.ip_ihl ),
+ .s_ip_dscp (s_ip.ip_dscp ),
+ .s_ip_ecn (s_ip.ip_ecn ),
+ .s_ip_length (s_ip.ip_length ),
+ .s_ip_identification (s_ip.ip_identification ),
+ .s_ip_flags (s_ip.ip_flags ),
+ .s_ip_fragment_offset (s_ip.ip_fragment_offset ),
+ .s_ip_ttl (s_ip.ip_ttl ),
+ .s_ip_protocol (s_ip.ip_protocol ),
+ .s_ip_header_checksum (s_ip.ip_header_checksum ),
+ .s_ip_source_ip (s_ip.ip_source_ip ),
+ .s_ip_dest_ip (s_ip.ip_dest_ip ),
+ .s_ip_payload_axis_tdata (s_ip.ip_payload_axis_tdata ),
+ .s_ip_payload_axis_tkeep (s_ip.ip_payload_axis_tkeep ),
+ .s_ip_payload_axis_tvalid (s_ip.ip_payload_axis_tvalid ),
+ .s_ip_payload_axis_tready (s_ip.ip_payload_axis_tready ),
+ .s_ip_payload_axis_tlast (s_ip.ip_payload_axis_tlast ),
+ .s_ip_payload_axis_tid (s_ip.ip_payload_axis_tid ),
+ .s_ip_payload_axis_tdest (s_ip.ip_payload_axis_tdest ),
+ .s_ip_payload_axis_tuser (s_ip.ip_payload_axis_tuser ),
+
+ .m_ip_hdr_valid (m_ip_hdr_valid ),
+ .m_ip_hdr_ready (m_ip_hdr_ready ),
+ .m_eth_dest_mac (m_eth_dest_mac ),
+ .m_eth_src_mac (m_eth_src_mac ),
+ .m_eth_type (m_eth_type ),
+ .m_ip_version (m_ip_version ),
+ .m_ip_ihl (m_ip_ihl ),
+ .m_ip_dscp (m_ip_dscp ),
+ .m_ip_ecn (m_ip_ecn ),
+ .m_ip_length (m_ip_length ),
+ .m_ip_identification (m_ip_identification ),
+ .m_ip_flags (m_ip_flags ),
+ .m_ip_fragment_offset (m_ip_fragment_offset ),
+ .m_ip_ttl (m_ip_ttl ),
+ .m_ip_protocol (m_ip_protocol ),
+ .m_ip_header_checksum (m_ip_header_checksum ),
+ .m_ip_source_ip (m_ip_source_ip ),
+ .m_ip_dest_ip (m_ip_dest_ip ),
+ .m_ip_payload_axis_tdata (m_ip_payload_axis_tdata ),
+ .m_ip_payload_axis_tkeep (m_ip_payload_axis_tkeep ),
+ .m_ip_payload_axis_tvalid (m_ip_payload_axis_tvalid ),
+ .m_ip_payload_axis_tready (m_ip_payload_axis_tready ),
+ .m_ip_payload_axis_tlast (m_ip_payload_axis_tlast ),
+ .m_ip_payload_axis_tid (m_ip_payload_axis_tid ),
+ .m_ip_payload_axis_tdest (m_ip_payload_axis_tdest ),
+ .m_ip_payload_axis_tuser (m_ip_payload_axis_tuser )
+);
+
+endmodule
\ No newline at end of file
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 9b0b08f..4763f01 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
@@ -4,29 +4,8 @@ module network_processor #(
input i_clk,
input i_rst,
- output logic s_reg_axil_awready,
- input wire s_reg_axil_awvalid,
- input wire [8:0] s_reg_axil_awaddr,
- input wire [2:0] s_reg_axil_awprot,
- output logic s_reg_axil_wready,
- input wire s_reg_axil_wvalid,
- input wire [31:0] s_reg_axil_wdata,
- input wire [3:0] s_reg_axil_wstrb,
- input wire s_reg_axil_bready,
- output logic s_reg_axil_bvalid,
- output logic [1:0] s_reg_axil_bresp,
- output logic s_reg_axil_arready,
- input wire s_reg_axil_arvalid,
- input wire [8:0] s_reg_axil_araddr,
- input wire [2:0] s_reg_axil_arprot,
- input wire s_reg_axil_rready,
- output logic s_reg_axil_rvalid,
- output logic [31:0] s_reg_axil_rdata,
- output logic [1:0] s_reg_axil_rresp,
-
- // axil for m2s/s2m dma (can be combined into 1 or separate)
-
- // axil for ring buffer managers
+ axil_intf.SLAVE s_reg_axil,
+ axil_intf.MASTER m_dma_axil,
//MII Interface
input wire mii_rx_clk,
@@ -52,184 +31,28 @@ module network_processor #(
`define PROTO_TCP 8'h6
`define PROTO_UDP 8'h11
+localparam ICMP_IDX = 0;
+localparam UDP_IDX = 1;
+localparam TCP_IDX = 2;
+
localparam MAC_DATA_WIDTH = 8;
localparam AXIS_DATA_WIDTH = 8;
localparam AXIS_KEEP_WIDTH = ((AXIS_DATA_WIDTH+7)/8);
-logic [AXIS_DATA_WIDTH-1:0] mac_tx_axis_tdata;
-logic mac_tx_axis_tvalid;
-logic mac_tx_axis_tready;
-logic mac_tx_axis_tlast;
-logic mac_tx_axis_tuser;
-logic [AXIS_KEEP_WIDTH-1:0] mac_tx_axis_tkeep;
+axis_intf #(.DATA_WIDTH(MAC_DATA_WIDTH)) mac_tx_axis();
+axis_intf #(.DATA_WIDTH(MAC_DATA_WIDTH)) mac_rx_axis();
-logic [AXIS_DATA_WIDTH-1:0] mac_rx_axis_tdata;
-logic mac_rx_axis_tvalid;
-logic mac_rx_axis_tready;
-logic mac_rx_axis_tlast;
-logic mac_rx_axis_tuser;
-logic [AXIS_KEEP_WIDTH-1:0] mac_rx_axis_tkeep;
+ip_intf #(.DATA_WIDTH(MAC_DATA_WIDTH)) mac_tx_ip();
+ip_intf #(.DATA_WIDTH(MAC_DATA_WIDTH)) mac_rx_ip();
-logic mac_tx_eth_hdr_valid;
-logic mac_tx_eth_hdr_ready;
-logic [47:0] mac_tx_eth_dest_mac;
-logic [47:0] mac_tx_eth_src_mac;
-logic [15:0] mac_tx_eth_type;
-logic [AXIS_DATA_WIDTH-1:0] mac_tx_eth_payload_axis_tdata;
-logic [AXIS_KEEP_WIDTH-1:0] mac_tx_eth_payload_axis_tkeep;
-logic mac_tx_eth_payload_axis_tvalid;
-logic mac_tx_eth_payload_axis_tready;
-logic mac_tx_eth_payload_axis_tlast;
-logic mac_tx_eth_payload_axis_tuser;
+eth_intf #(.DATA_WIDTH(MAC_DATA_WIDTH)) mac_tx_eth();
+eth_intf #(.DATA_WIDTH(MAC_DATA_WIDTH)) mac_rx_eth();
-logic mac_rx_eth_hdr_valid;
-logic mac_rx_eth_hdr_ready;
-logic [47:0] mac_rx_eth_dest_mac;
-logic [47:0] mac_rx_eth_src_mac;
-logic [15:0] mac_rx_eth_type;
-logic [AXIS_DATA_WIDTH-1:0] mac_rx_eth_payload_axis_tdata;
-logic [AXIS_KEEP_WIDTH-1:0] mac_rx_eth_payload_axis_tkeep;
-logic mac_rx_eth_payload_axis_tvalid;
-logic mac_rx_eth_payload_axis_tready;
-logic mac_rx_eth_payload_axis_tlast;
-logic mac_rx_eth_payload_axis_tuser;
+ip_intf #(.DATA_WIDTH(MAC_DATA_WIDTH)) ntw_tx_ip();
+ip_intf #(.DATA_WIDTH(MAC_DATA_WIDTH)) ntw_rx_ip();
-
-// tx is less because IP adds it automatically.
-logic tx_ip_hdr_valid;
-logic tx_ip_hdr_ready;
-logic [5:0] tx_ip_dscp;
-logic [1:0] tx_ip_ecn;
-logic [15:0] tx_ip_length;
-logic [7:0] tx_ip_ttl;
-logic [7:0] tx_ip_protocol;
-logic [31:0] tx_ip_source_ip;
-logic [31:0] tx_ip_dest_ip;
-logic [7:0] tx_ip_payload_axis_tdata;
-logic tx_ip_payload_axis_tvalid;
-logic tx_ip_payload_axis_tready;
-logic tx_ip_payload_axis_tlast;
-logic tx_ip_payload_axis_tuser;
-
-logic tcp_rx_ip_hdr_valid;
-logic tcp_rx_ip_hdr_ready;
-logic [47:0] tcp_rx_ip_eth_dest_mac;
-logic [47:0] tcp_rx_ip_eth_src_mac;
-logic [15:0] tcp_rx_ip_eth_type;
-logic [3:0] tcp_rx_ip_version;
-logic [3:0] tcp_rx_ip_ihl;
-logic [5:0] tcp_rx_ip_dscp;
-logic [1:0] tcp_rx_ip_ecn;
-logic [15:0] tcp_rx_ip_length;
-logic [15:0] tcp_rx_ip_identification;
-logic [2:0] tcp_rx_ip_flags;
-logic [12:0] tcp_rx_ip_fragment_offset;
-logic [7:0] tcp_rx_ip_ttl;
-logic [7:0] tcp_rx_ip_protocol;
-logic [15:0] tcp_rx_ip_header_checksum;
-logic [31:0] tcp_rx_ip_source_ip;
-logic [31:0] tcp_rx_ip_dest_ip;
-logic [7:0] tcp_rx_ip_payload_axis_tdata;
-logic tcp_rx_ip_payload_axis_tvalid;
-logic tcp_rx_ip_payload_axis_tready;
-logic tcp_rx_ip_payload_axis_tlast;
-logic tcp_rx_ip_payload_axis_tuser;
-
-// tx is less because IP adds it automatically.
-logic tcp_tx_ip_hdr_valid;
-logic tcp_tx_ip_hdr_ready;
-logic [5:0] tcp_tx_ip_dscp;
-logic [1:0] tcp_tx_ip_ecn;
-logic [15:0] tcp_tx_ip_length;
-logic [7:0] tcp_tx_ip_ttl;
-logic [7:0] tcp_tx_ip_protocol;
-logic [31:0] tcp_tx_ip_source_ip;
-logic [31:0] tcp_tx_ip_dest_ip;
-logic [7:0] tcp_tx_ip_payload_axis_tdata;
-logic tcp_tx_ip_payload_axis_tvalid;
-logic tcp_tx_ip_payload_axis_tready;
-logic tcp_tx_ip_payload_axis_tlast;
-logic tcp_tx_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;
-logic udp_tx_ip_hdr_ready;
-logic [5:0] udp_tx_ip_dscp;
-logic [1:0] udp_tx_ip_ecn;
-logic [15:0] udp_tx_ip_length;
-logic [7:0] udp_tx_ip_ttl;
-logic [7:0] udp_tx_ip_protocol;
-logic [31:0] udp_tx_ip_source_ip;
-logic [31:0] udp_tx_ip_dest_ip;
-logic [7:0] udp_tx_ip_payload_axis_tdata;
-logic udp_tx_ip_payload_axis_tvalid;
-logic udp_tx_ip_payload_axis_tready;
-logic udp_tx_ip_payload_axis_tlast;
-logic udp_tx_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;
-logic icmp_tx_ip_hdr_ready;
-logic [5:0] icmp_tx_ip_dscp;
-logic [1:0] icmp_tx_ip_ecn;
-logic [15:0] icmp_tx_ip_length;
-logic [7:0] icmp_tx_ip_ttl;
-logic [7:0] icmp_tx_ip_protocol;
-logic [31:0] icmp_tx_ip_source_ip;
-logic [31:0] icmp_tx_ip_dest_ip;
-logic [7:0] icmp_tx_ip_payload_axis_tdata;
-logic icmp_tx_ip_payload_axis_tvalid;
-logic icmp_tx_ip_payload_axis_tready;
-logic icmp_tx_ip_payload_axis_tlast;
-logic icmp_tx_ip_payload_axis_tuser;
+ip_intf #(.DATA_WIDTH(MAC_DATA_WIDTH)) proto_rx_ip[3]();
+ip_intf #(.DATA_WIDTH(MAC_DATA_WIDTH)) proto_tx_ip[3]();
ntw_top_regfile_pkg::ntw_top_regfile__in_t hwif_in;
ntw_top_regfile_pkg::ntw_top_regfile__out_t hwif_out;
@@ -238,25 +61,25 @@ ntw_top_regfile u_ntw_top_regfile (
.clk (i_clk),
.rst (i_rst),
- .s_axil_awready (s_reg_axil_awready),
- .s_axil_awvalid (s_reg_axil_awvalid),
- .s_axil_awaddr (s_reg_axil_awaddr),
- .s_axil_awprot (s_reg_axil_awprot),
- .s_axil_wready (s_reg_axil_wready),
- .s_axil_wvalid (s_reg_axil_wvalid),
- .s_axil_wdata (s_reg_axil_wdata),
- .s_axil_wstrb (s_reg_axil_wstrb),
- .s_axil_bready (s_reg_axil_bready),
- .s_axil_bvalid (s_reg_axil_bvalid),
- .s_axil_bresp (s_reg_axil_bresp),
- .s_axil_arready (s_reg_axil_arready),
- .s_axil_arvalid (s_reg_axil_arvalid),
- .s_axil_araddr (s_reg_axil_araddr),
- .s_axil_arprot (s_reg_axil_arprot),
- .s_axil_rready (s_reg_axil_rready),
- .s_axil_rvalid (s_reg_axil_rvalid),
- .s_axil_rdata (s_reg_axil_rdata),
- .s_axil_rresp (s_reg_axil_rresp),
+ .s_axil_awready (s_reg_axil.awready),
+ .s_axil_awvalid (s_reg_axil.awvalid),
+ .s_axil_awaddr (s_reg_axil.awaddr),
+ .s_axil_awprot (s_reg_axil.awprot),
+ .s_axil_wready (s_reg_axil.wready),
+ .s_axil_wvalid (s_reg_axil.wvalid),
+ .s_axil_wdata (s_reg_axil.wdata),
+ .s_axil_wstrb (s_reg_axil.wstrb),
+ .s_axil_bready (s_reg_axil.bready),
+ .s_axil_bvalid (s_reg_axil.bvalid),
+ .s_axil_bresp (s_reg_axil.bresp),
+ .s_axil_arready (s_reg_axil.arready),
+ .s_axil_arvalid (s_reg_axil.arvalid),
+ .s_axil_araddr (s_reg_axil.araddr),
+ .s_axil_arprot (s_reg_axil.arprot),
+ .s_axil_rready (s_reg_axil.rready),
+ .s_axil_rvalid (s_reg_axil.rvalid),
+ .s_axil_rdata (s_reg_axil.rdata),
+ .s_axil_rresp (s_reg_axil.rresp),
.hwif_in (hwif_in),
.hwif_out (hwif_out)
@@ -269,6 +92,19 @@ eth_wrapper #(
.rst (i_rst),
.clk_sys (i_clk),
+ .s_cpuif_req (hwif_out.mac.req),
+ .s_cpuif_req_is_wr (hwif_out.mac.req_is_wr),
+ .s_cpuif_addr (hwif_out.mac.addr),
+ .s_cpuif_wr_data (hwif_out.mac.wr_data),
+ .s_cpuif_wr_biten (hwif_out.mac.wr_biten),
+ .s_cpuif_req_stall_wr (),
+ .s_cpuif_req_stall_rd (),
+ .s_cpuif_rd_ack (hwif_in.mac.rd_ack),
+ .s_cpuif_rd_err (),
+ .s_cpuif_rd_data (hwif_in.mac.rd_data),
+ .s_cpuif_wr_ack (hwif_in.mac.wr_ack),
+ .s_cpuif_wr_err (),
+
// MII
.mii_rx_clk (mii_rx_clk),
.mii_rxd (mii_rxd),
@@ -279,19 +115,8 @@ eth_wrapper #(
.mii_tx_en (mii_tx_en),
.mii_tx_er (mii_tx_er),
- .tx_axis_tdata (mac_tx_axis_tdata),
- .tx_axis_tvalid (mac_tx_axis_tvalid),
- .tx_axis_tready (mac_tx_axis_tready),
- .tx_axis_tlast (mac_tx_axis_tlast),
- .tx_axis_tuser (mac_tx_axis_tuser),
- .tx_axis_tkeep (mac_tx_axis_tkeep),
-
- .rx_axis_tdata (mac_rx_axis_tdata),
- .rx_axis_tvalid (mac_rx_axis_tvalid),
- .rx_axis_tready (mac_rx_axis_tready),
- .rx_axis_tlast (mac_rx_axis_tlast),
- .rx_axis_tuser (mac_rx_axis_tuser),
- .rx_axis_tkeep (mac_rx_axis_tkeep),
+ .tx_axis (mac_tx_axis),
+ .rx_axis (mac_rx_axis),
.Mdi (i_Mdi),
.Mdo (o_Mdo),
@@ -305,24 +130,24 @@ eth_axis_rx #(
.clk (i_clk),
.rst (i_rst),
- .s_axis_tdata (mac_rx_axis_tdata),
- .s_axis_tvalid (mac_rx_axis_tvalid),
- .s_axis_tready (mac_rx_axis_tready),
- .s_axis_tlast (mac_rx_axis_tlast),
- .s_axis_tuser (mac_rx_axis_tuser),
- .s_axis_tkeep (mac_rx_axis_tkeep),
+ .s_axis_tdata (mac_rx_axis.tdata),
+ .s_axis_tvalid (mac_rx_axis.tvalid),
+ .s_axis_tready (mac_rx_axis.tready),
+ .s_axis_tlast (mac_rx_axis.tlast),
+ .s_axis_tuser (mac_rx_axis.tuser),
+ .s_axis_tkeep (mac_rx_axis.tkeep),
- .m_eth_hdr_valid (mac_rx_eth_hdr_valid),
- .m_eth_hdr_ready (mac_rx_eth_hdr_ready),
- .m_eth_dest_mac (mac_rx_eth_dest_mac),
- .m_eth_src_mac (mac_rx_eth_src_mac),
- .m_eth_type (mac_rx_eth_type),
- .m_eth_payload_axis_tdata (mac_rx_eth_payload_axis_tdata),
- .m_eth_payload_axis_tkeep (mac_rx_eth_payload_axis_tkeep),
- .m_eth_payload_axis_tvalid (mac_rx_eth_payload_axis_tvalid),
- .m_eth_payload_axis_tready (mac_rx_eth_payload_axis_tready),
- .m_eth_payload_axis_tlast (mac_rx_eth_payload_axis_tlast),
- .m_eth_payload_axis_tuser (mac_rx_eth_payload_axis_tuser),
+ .m_eth_hdr_valid (mac_rx_eth.eth_hdr_valid),
+ .m_eth_hdr_ready (mac_rx_eth.eth_hdr_ready),
+ .m_eth_dest_mac (mac_rx_eth.eth_dest_mac),
+ .m_eth_src_mac (mac_rx_eth.eth_src_mac),
+ .m_eth_type (mac_rx_eth.eth_type),
+ .m_eth_payload_axis_tdata (mac_rx_eth.eth_payload_axis_tdata),
+ .m_eth_payload_axis_tkeep (mac_rx_eth.eth_payload_axis_tkeep),
+ .m_eth_payload_axis_tvalid (mac_rx_eth.eth_payload_axis_tvalid),
+ .m_eth_payload_axis_tready (mac_rx_eth.eth_payload_axis_tready),
+ .m_eth_payload_axis_tlast (mac_rx_eth.eth_payload_axis_tlast),
+ .m_eth_payload_axis_tuser (mac_rx_eth.eth_payload_axis_tuser),
.busy (),
.error_header_early_termination () // We can add this to a register
@@ -334,24 +159,24 @@ eth_axis_tx #(
.clk (i_clk),
.rst (i_rst),
- .s_eth_hdr_valid (mac_tx_eth_hdr_valid),
- .s_eth_hdr_ready (mac_tx_eth_hdr_ready),
- .s_eth_dest_mac (mac_tx_eth_dest_mac),
- .s_eth_src_mac (mac_tx_eth_src_mac),
- .s_eth_type (mac_tx_eth_type),
- .s_eth_payload_axis_tdata (mac_tx_eth_payload_axis_tdata),
- .s_eth_payload_axis_tkeep (mac_tx_eth_payload_axis_tkeep),
- .s_eth_payload_axis_tvalid (mac_tx_eth_payload_axis_tvalid),
- .s_eth_payload_axis_tready (mac_tx_eth_payload_axis_tready),
- .s_eth_payload_axis_tlast (mac_tx_eth_payload_axis_tlast),
- .s_eth_payload_axis_tuser (mac_tx_eth_payload_axis_tuser),
+ .s_eth_hdr_valid (mac_tx_eth.eth_hdr_valid),
+ .s_eth_hdr_ready (mac_tx_eth.eth_hdr_ready),
+ .s_eth_dest_mac (mac_tx_eth.eth_dest_mac),
+ .s_eth_src_mac (mac_tx_eth.eth_src_mac),
+ .s_eth_type (mac_tx_eth.eth_type),
+ .s_eth_payload_axis_tdata (mac_tx_eth.eth_payload_axis_tdata),
+ .s_eth_payload_axis_tkeep (mac_tx_eth.eth_payload_axis_tkeep),
+ .s_eth_payload_axis_tvalid (mac_tx_eth.eth_payload_axis_tvalid),
+ .s_eth_payload_axis_tready (mac_tx_eth.eth_payload_axis_tready),
+ .s_eth_payload_axis_tlast (mac_tx_eth.eth_payload_axis_tlast),
+ .s_eth_payload_axis_tuser (mac_tx_eth.eth_payload_axis_tuser),
- .m_axis_tdata (mac_tx_axis_tdata),
- .m_axis_tvalid (mac_tx_axis_tvalid),
- .m_axis_tready (mac_tx_axis_tready),
- .m_axis_tlast (mac_tx_axis_tlast),
- .m_axis_tuser (mac_tx_axis_tuser),
- .m_axis_tkeep (mac_tx_axis_tkeep),
+ .m_axis_tdata (mac_tx_axis.tdata),
+ .m_axis_tvalid (mac_tx_axis.tvalid),
+ .m_axis_tready (mac_tx_axis.tready),
+ .m_axis_tlast (mac_tx_axis.tlast),
+ .m_axis_tuser (mac_tx_axis.tuser),
+ .m_axis_tkeep (mac_tx_axis.tkeep),
.busy ()
);
@@ -368,66 +193,66 @@ ip_complete #(
.clk (i_clk),
.rst (i_rst),
- .s_eth_hdr_valid (mac_rx_eth_hdr_valid),
- .s_eth_hdr_ready (mac_rx_eth_hdr_ready),
- .s_eth_dest_mac (mac_rx_eth_dest_mac),
- .s_eth_src_mac (mac_rx_eth_src_mac),
- .s_eth_type (mac_rx_eth_type),
- .s_eth_payload_axis_tdata (mac_rx_eth_payload_axis_tdata),
- .s_eth_payload_axis_tvalid (mac_rx_eth_payload_axis_tvalid),
- .s_eth_payload_axis_tready (mac_rx_eth_payload_axis_tready),
- .s_eth_payload_axis_tlast (mac_rx_eth_payload_axis_tlast),
- .s_eth_payload_axis_tuser (mac_rx_eth_payload_axis_tuser),
+ .s_eth_hdr_valid (mac_rx_eth.eth_hdr_valid),
+ .s_eth_hdr_ready (mac_rx_eth.eth_hdr_ready),
+ .s_eth_dest_mac (mac_rx_eth.eth_dest_mac),
+ .s_eth_src_mac (mac_rx_eth.eth_src_mac),
+ .s_eth_type (mac_rx_eth.eth_type),
+ .s_eth_payload_axis_tdata (mac_rx_eth.eth_payload_axis_tdata),
+ .s_eth_payload_axis_tvalid (mac_rx_eth.eth_payload_axis_tvalid),
+ .s_eth_payload_axis_tready (mac_rx_eth.eth_payload_axis_tready),
+ .s_eth_payload_axis_tlast (mac_rx_eth.eth_payload_axis_tlast),
+ .s_eth_payload_axis_tuser (mac_rx_eth.eth_payload_axis_tuser),
- .m_eth_hdr_valid (mac_tx_eth_hdr_valid),
- .m_eth_hdr_ready (mac_tx_eth_hdr_ready),
- .m_eth_dest_mac (mac_tx_eth_dest_mac),
- .m_eth_src_mac (mac_tx_eth_src_mac),
- .m_eth_type (mac_tx_eth_type),
- .m_eth_payload_axis_tdata (mac_tx_eth_payload_axis_tdata),
- .m_eth_payload_axis_tvalid (mac_tx_eth_payload_axis_tvalid),
- .m_eth_payload_axis_tready (mac_tx_eth_payload_axis_tready),
- .m_eth_payload_axis_tlast (mac_tx_eth_payload_axis_tlast),
- .m_eth_payload_axis_tuser (mac_tx_eth_payload_axis_tuser),
+ .m_eth_hdr_valid (mac_tx_eth.eth_hdr_valid),
+ .m_eth_hdr_ready (mac_tx_eth.eth_hdr_ready),
+ .m_eth_dest_mac (mac_tx_eth.eth_dest_mac),
+ .m_eth_src_mac (mac_tx_eth.eth_src_mac),
+ .m_eth_type (mac_tx_eth.eth_type),
+ .m_eth_payload_axis_tdata (mac_tx_eth.eth_payload_axis_tdata),
+ .m_eth_payload_axis_tvalid (mac_tx_eth.eth_payload_axis_tvalid),
+ .m_eth_payload_axis_tready (mac_tx_eth.eth_payload_axis_tready),
+ .m_eth_payload_axis_tlast (mac_tx_eth.eth_payload_axis_tlast),
+ .m_eth_payload_axis_tuser (mac_tx_eth.eth_payload_axis_tuser),
- .s_ip_hdr_valid (tx_ip_hdr_valid),
- .s_ip_hdr_ready (tx_ip_hdr_ready),
- .s_ip_dscp (tx_ip_dscp),
- .s_ip_ecn (tx_ip_ecn),
- .s_ip_length (tx_ip_length),
- .s_ip_ttl (tx_ip_ttl),
- .s_ip_protocol (tx_ip_protocol),
- .s_ip_source_ip (tx_ip_source_ip),
- .s_ip_dest_ip (tx_ip_dest_ip),
- .s_ip_payload_axis_tdata (tx_ip_payload_axis_tdata),
- .s_ip_payload_axis_tvalid (tx_ip_payload_axis_tvalid),
- .s_ip_payload_axis_tready (tx_ip_payload_axis_tready),
- .s_ip_payload_axis_tlast (tx_ip_payload_axis_tlast),
- .s_ip_payload_axis_tuser (tx_ip_payload_axis_tuser),
+ .s_ip_hdr_valid (ntw_tx_ip.ip_hdr_valid),
+ .s_ip_hdr_ready (ntw_tx_ip.ip_hdr_ready),
+ .s_ip_dscp (ntw_tx_ip.ip_dscp),
+ .s_ip_ecn (ntw_tx_ip.ip_ecn),
+ .s_ip_length (ntw_tx_ip.ip_length),
+ .s_ip_ttl (ntw_tx_ip.ip_ttl),
+ .s_ip_protocol (ntw_tx_ip.ip_protocol),
+ .s_ip_source_ip (ntw_tx_ip.ip_source_ip),
+ .s_ip_dest_ip (ntw_tx_ip.ip_dest_ip),
+ .s_ip_payload_axis_tdata (ntw_tx_ip.ip_payload_axis_tdata),
+ .s_ip_payload_axis_tvalid (ntw_tx_ip.ip_payload_axis_tvalid),
+ .s_ip_payload_axis_tready (ntw_tx_ip.ip_payload_axis_tready),
+ .s_ip_payload_axis_tlast (ntw_tx_ip.ip_payload_axis_tlast),
+ .s_ip_payload_axis_tuser (ntw_tx_ip.ip_payload_axis_tuser),
- .m_ip_hdr_valid (rx_ip_hdr_valid),
- .m_ip_hdr_ready (rx_ip_hdr_ready),
- .m_ip_eth_dest_mac (rx_ip_eth_dest_mac),
- .m_ip_eth_src_mac (rx_ip_eth_src_mac),
- .m_ip_eth_type (rx_ip_eth_type),
- .m_ip_version (rx_ip_version),
- .m_ip_ihl (rx_ip_ihl),
- .m_ip_dscp (rx_ip_dscp),
- .m_ip_ecn (rx_ip_ecn),
- .m_ip_length (rx_ip_length),
- .m_ip_identification (rx_ip_identification),
- .m_ip_flags (rx_ip_flags),
- .m_ip_fragment_offset (rx_ip_fragment_offset),
- .m_ip_ttl (rx_ip_ttl),
- .m_ip_protocol (rx_ip_protocol),
- .m_ip_header_checksum (rx_ip_header_checksum),
- .m_ip_source_ip (rx_ip_source_ip),
- .m_ip_dest_ip (rx_ip_dest_ip),
- .m_ip_payload_axis_tdata (rx_ip_payload_axis_tdata),
- .m_ip_payload_axis_tvalid (rx_ip_payload_axis_tvalid),
- .m_ip_payload_axis_tready (rx_ip_payload_axis_tready),
- .m_ip_payload_axis_tlast (rx_ip_payload_axis_tlast),
- .m_ip_payload_axis_tuser (rx_ip_payload_axis_tuser),
+ .m_ip_hdr_valid (ntw_rx_ip.ip_hdr_valid),
+ .m_ip_hdr_ready (ntw_rx_ip.ip_hdr_ready),
+ .m_ip_eth_dest_mac (ntw_rx_ip.eth_dest_mac),
+ .m_ip_eth_src_mac (ntw_rx_ip.eth_src_mac),
+ .m_ip_eth_type (ntw_rx_ip.eth_type),
+ .m_ip_version (ntw_rx_ip.ip_version),
+ .m_ip_ihl (ntw_rx_ip.ip_ihl),
+ .m_ip_dscp (ntw_rx_ip.ip_dscp),
+ .m_ip_ecn (ntw_rx_ip.ip_ecn),
+ .m_ip_length (ntw_rx_ip.ip_length),
+ .m_ip_identification (ntw_rx_ip.ip_identification),
+ .m_ip_flags (ntw_rx_ip.ip_flags),
+ .m_ip_fragment_offset (ntw_rx_ip.ip_fragment_offset),
+ .m_ip_ttl (ntw_rx_ip.ip_ttl),
+ .m_ip_protocol (ntw_rx_ip.ip_protocol),
+ .m_ip_header_checksum (ntw_rx_ip.ip_header_checksum),
+ .m_ip_source_ip (ntw_rx_ip.ip_source_ip),
+ .m_ip_dest_ip (ntw_rx_ip.ip_dest_ip),
+ .m_ip_payload_axis_tdata (ntw_rx_ip.ip_payload_axis_tdata),
+ .m_ip_payload_axis_tvalid (ntw_rx_ip.ip_payload_axis_tvalid),
+ .m_ip_payload_axis_tready (ntw_rx_ip.ip_payload_axis_tready),
+ .m_ip_payload_axis_tlast (ntw_rx_ip.ip_payload_axis_tlast),
+ .m_ip_payload_axis_tuser (ntw_rx_ip.ip_payload_axis_tuser),
.rx_busy (), // should go to stats register
.tx_busy (), // should go to stats register
@@ -447,139 +272,45 @@ 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));
+assign ip_demux_drop = !((ntw_rx_ip.ip_protocol == `PROTO_ICMP) || (ntw_rx_ip.ip_protocol == `PROTO_UDP) || (ntw_rx_ip.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;
+assign ip_demux_sel = (ntw_rx_ip.ip_protocol == `PROTO_ICMP) ? 2'h2 : (ntw_rx_ip.ip_protocol == `PROTO_UDP) ? 2'h1 : 2'h0;
-ip_demux #(
+
+ip_demux_wrapper #(
.M_COUNT(3),
.DATA_WIDTH(MAC_DATA_WIDTH)
) u_ip_demux (
.clk (i_clk),
.rst (i_rst),
- .s_ip_hdr_valid (rx_ip_hdr_valid),
- .s_ip_hdr_ready (rx_ip_hdr_ready),
- .s_eth_dest_mac (rx_ip_eth_dest_mac),
- .s_eth_src_mac (rx_ip_eth_src_mac),
- .s_eth_type (rx_ip_eth_type),
- .s_ip_version (rx_ip_version),
- .s_ip_ihl (rx_ip_ihl),
- .s_ip_dscp (rx_ip_dscp),
- .s_ip_ecn (rx_ip_ecn),
- .s_ip_length (rx_ip_length),
- .s_ip_identification (rx_ip_identification),
- .s_ip_flags (rx_ip_flags),
- .s_ip_fragment_offset (rx_ip_fragment_offset),
- .s_ip_ttl (rx_ip_ttl),
- .s_ip_protocol (rx_ip_protocol),
- .s_ip_header_checksum (rx_ip_header_checksum),
- .s_ip_source_ip (rx_ip_source_ip),
- .s_ip_dest_ip (rx_ip_dest_ip),
- .s_ip_payload_axis_tdata (rx_ip_payload_axis_tdata),
- .s_ip_payload_axis_tvalid (rx_ip_payload_axis_tvalid),
- .s_ip_payload_axis_tready (rx_ip_payload_axis_tready),
- .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_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_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_rx_ip_payload_axis_tuser, udp_rx_ip_payload_axis_tuser, tcp_rx_ip_payload_axis_tuser}),
+ .s_ip (ntw_rx_ip),
+ .m_ip (proto_rx_ip),
.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;
+assign proto_rx_ip[ICMP_IDX].ip_hdr_ready = '1;
+assign proto_rx_ip[ICMP_IDX].ip_payload_axis_tready = '1;
+assign proto_rx_ip[UDP_IDX].ip_hdr_ready = '1;
+assign proto_rx_ip[UDP_IDX].ip_payload_axis_tready = '1;
-
-ip_arb_mux #(
+ip_arb_mux_wrapper #(
.S_COUNT(3),
.DATA_WIDTH(MAC_DATA_WIDTH)
-) u_ip_arb_mux (
- .clk (i_clk),
- .rst (i_rst),
+) u_ip_arb_mux (
+ .i_clk (i_clk),
+ .i_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)
+ .s_ip (proto_tx_ip),
+ .m_ip (ntw_tx_ip)
);
+axil_intf dummy();
+
tcp #(
.NUM_TCP(NUM_TCP)
) tcp (
@@ -597,6 +328,12 @@ tcp #(
.s_cpuif_rd_err (),
.s_cpuif_rd_data (hwif_in.tcp_top.rd_data),
.s_cpuif_wr_ack (hwif_in.tcp_top.wr_ack),
- .s_cpuif_wr_err ()
+ .s_cpuif_wr_err (),
+
+ .s_ip (proto_rx_ip[TCP_IDX]),
+ .m_ip (proto_tx_ip[TCP_IDX]),
+
+ .m_dma_m2s_axi (m_dma_axil), // HACK
+ .m_dma_s2m_axi (dummy)
);
endmodule
\ No newline at end of file
diff --git a/hw/super6502_fpga/src/sub/network_processor/src/regs/ntw_top_regs.rdl b/hw/super6502_fpga/src/sub/network_processor/src/regs/ntw_top_regs.rdl
index 0df410e..a68d66f 100644
--- a/hw/super6502_fpga/src/sub/network_processor/src/regs/ntw_top_regs.rdl
+++ b/hw/super6502_fpga/src/sub/network_processor/src/regs/ntw_top_regs.rdl
@@ -1,4 +1,4 @@
addrmap ntw_top_regfile {
- external mac_regs mac;
- external tcp_top_regfile tcp_top;
+ external mac_regs mac @ 0x0;
+ external tcp_top_regfile tcp_top @ 0x200;
};
\ No newline at end of file
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 9b71487..6a997ef 100644
--- a/hw/super6502_fpga/src/sub/network_processor/src/tcp.sv
+++ b/hw/super6502_fpga/src/sub/network_processor/src/tcp.sv
@@ -21,93 +21,19 @@ module tcp #(
/*
* IP input
*/
- input wire s_ip_hdr_valid,
- output wire s_ip_hdr_ready,
- input wire [47:0] s_ip_eth_dest_mac,
- input wire [47:0] s_ip_eth_src_mac,
- input wire [15:0] s_ip_eth_type,
- input wire [3:0] s_ip_version,
- input wire [3:0] s_ip_ihl,
- input wire [5:0] s_ip_dscp,
- input wire [1:0] s_ip_ecn,
- input wire [15:0] s_ip_length,
- input wire [15:0] s_ip_identification,
- input wire [2:0] s_ip_flags,
- input wire [12:0] s_ip_fragment_offset,
- input wire [7:0] s_ip_ttl,
- input wire [7:0] s_ip_protocol,
- input wire [15:0] s_ip_header_checksum,
- input wire [31:0] s_ip_source_ip,
- input wire [31:0] s_ip_dest_ip,
- input wire [7:0] s_ip_payload_axis_tdata,
- input wire s_ip_payload_axis_tvalid,
- output wire s_ip_payload_axis_tready,
- input wire s_ip_payload_axis_tlast,
- input wire s_ip_payload_axis_tuser,
+ ip_intf.SLAVE s_ip,
/*
* IP output
*/
- output wire m_ip_hdr_valid,
- input wire m_ip_hdr_ready,
- output wire [5:0] m_ip_dscp,
- output wire [1:0] m_ip_ecn,
- output wire [15:0] m_ip_length,
- output wire [7:0] m_ip_ttl,
- output wire [7:0] m_ip_protocol,
- output wire [31:0] m_ip_source_ip,
- output wire [31:0] m_ip_dest_ip,
- output wire [7:0] m_ip_payload_axis_tdata,
- 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,
+ ip_intf.MASTER m_ip,
/*
* 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,
+ axil_intf.MASTER m_dma_m2s_axi,
+ axil_intf.MASTER m_dma_s2m_axi
- /*
- * 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;
@@ -140,209 +66,144 @@ localparam USER_WIDTH = 1;
localparam DEST_WIDTH = 8;
localparam ID_WIDTH = 8;
-logic [DATA_WIDTH-1:0] m2s_tx_axis_tdata;
-logic [KEEP_WIDTH-1:0] m2s_tx_axis_tkeep;
-logic m2s_tx_axis_tvalid;
-logic m2s_tx_axis_tready;
-logic m2s_tx_axis_tlast;
-logic [DEST_WIDTH-1:0] m2s_tx_axis_tdest;
-logic [USER_WIDTH-1:0] m2s_tx_axis_tuser;
+ip_intf #(.DATA_WIDTH(8)) tcp_tx_ip();
+ip_intf #(.DATA_WIDTH(8)) tcp_stream_tx_ip [NUM_TCP]();
+ip_intf #(.DATA_WIDTH(8)) tcp_rx_ip [NUM_TCP]();
+ip_intf #(.DATA_WIDTH(8)) tcp_stream_rx_ip [NUM_TCP]();
-logic [DATA_WIDTH-1:0] s2m_rx_axis_tdata;
-logic [KEEP_WIDTH-1:0] s2m_rx_axis_tkeep;
-logic s2m_rx_axis_tvalid;
-logic s2m_rx_axis_tready;
-logic s2m_rx_axis_tlast;
-logic [DEST_WIDTH-1:0] s2m_rx_axis_tdest;
-logic [USER_WIDTH-1:0] s2m_rx_axis_tuser;
+axis_intf #(.DATA_WIDTH(8)) tcp_stream_rx_axis [NUM_TCP]();
-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;
+axil_intf m2s_stream_axil[NUM_TCP]();
+axil_intf s2m_stream_axil[NUM_TCP]();
-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;
-logic [NUM_TCP*48-1:0] tcp_rx_eth_src_mac;
-logic [NUM_TCP*16-1:0] tcp_rx_eth_type;
-logic [NUM_TCP*4-1:0] tcp_rx_ip_version;
-logic [NUM_TCP*4-1:0] tcp_rx_ip_ihl;
-logic [NUM_TCP*6-1:0] tcp_rx_ip_dscp;
-logic [NUM_TCP*2-1:0] tcp_rx_ip_ecn;
-logic [NUM_TCP*16-1:0] tcp_rx_ip_length;
-logic [NUM_TCP*16-1:0] tcp_rx_ip_identification;
-logic [NUM_TCP*3-1:0] tcp_rx_ip_flags;
-logic [NUM_TCP*13-1:0] tcp_rx_ip_fragment_offset;
-logic [NUM_TCP*8-1:0] tcp_rx_ip_ttl;
-logic [NUM_TCP*8-1:0] tcp_rx_ip_protocol;
-logic [NUM_TCP*16-1:0] tcp_rx_ip_header_checksum;
-logic [NUM_TCP*32-1:0] tcp_rx_ip_source_ip;
-logic [NUM_TCP*32-1:0] tcp_rx_ip_dest_ip;
-logic [NUM_TCP*DATA_WIDTH-1:0] tcp_rx_ip_payload_axis_tdata;
-logic [NUM_TCP*KEEP_WIDTH-1:0] tcp_rx_ip_payload_axis_tkeep;
-logic [NUM_TCP-1:0] tcp_rx_ip_payload_axis_tvalid;
-logic [NUM_TCP-1:0] tcp_rx_ip_payload_axis_tready;
-logic [NUM_TCP-1:0] tcp_rx_ip_payload_axis_tlast;
-logic [NUM_TCP*ID_WIDTH-1:0] tcp_rx_ip_payload_axis_tid;
-logic [NUM_TCP*DEST_WIDTH-1:0] tcp_rx_ip_payload_axis_tdest;
-logic [NUM_TCP*USER_WIDTH-1:0] tcp_rx_ip_payload_axis_tuser;
-
-logic [NUM_TCP-1:0] tcp_tx_ip_hdr_valid;
-logic [NUM_TCP-1:0] tcp_tx_ip_hdr_ready;
-logic [NUM_TCP*6-1:0] tcp_tx_ip_dscp;
-logic [NUM_TCP*2-1:0] tcp_tx_ip_ecn;
-logic [NUM_TCP*16-1:0] tcp_tx_ip_length;
-logic [NUM_TCP*8-1:0] tcp_tx_ip_ttl;
-logic [NUM_TCP*8-1:0] tcp_tx_ip_protocol;
-logic [NUM_TCP*32-1:0] tcp_tx_ip_source_ip;
-logic [NUM_TCP*32-1:0] tcp_tx_ip_dest_ip;
-logic [NUM_TCP*DATA_WIDTH-1:0] tcp_tx_ip_payload_axis_tdata;
-logic [NUM_TCP-1:0] tcp_tx_ip_payload_axis_tvalid;
-logic [NUM_TCP-1:0] tcp_tx_ip_payload_axis_tready;
-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),
+wire [NUM_TCP-1:0] xbar_s_m2s_axi_arvalid;
+wire [NUM_TCP-1:0] xbar_s_m2s_axi_arready;
+wire [NUM_TCP*32-1:0] xbar_s_m2s_axi_araddr;
+wire [NUM_TCP*3-1:0] xbar_s_m2s_axi_arprot;
+wire [NUM_TCP-1:0] xbar_s_m2s_axi_rvalid;
+wire [NUM_TCP-1:0] xbar_s_m2s_axi_rready;
+wire [NUM_TCP*32-1:0] xbar_s_m2s_axi_rdata;
+wire [NUM_TCP*2-1:0] xbar_s_m2s_axi_rresp;
- .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),
+axilxbar #(
+ .NM(NUM_TCP),
+ .NS(1),
+ .SLAVE_ADDR(
+ {32'h0, 32'hffffffff} // full address space
+ )
+) u_m2s_xbar (
+ .S_AXI_ACLK (i_clk),
+ .S_AXI_ARESETN (~i_rst),
- .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),
+ // No write channel
+ .S_AXI_AWVALID ('0),
+ .S_AXI_AWREADY (),
+ .S_AXI_AWADDR ('0),
+ .S_AXI_AWPROT ('0),
+ .S_AXI_WVALID ('0),
+ .S_AXI_WREADY (),
+ .S_AXI_WDATA ('0),
+ .S_AXI_WSTRB ('0),
+ .S_AXI_BVALID (),
+ .S_AXI_BREADY ('0),
+ .S_AXI_BRESP (),
- .enable ('1),
- .drop ('0),
- .select ('0) // route selected by tdest
+ .S_AXI_ARVALID (xbar_s_m2s_axi_arvalid),
+ .S_AXI_ARREADY (xbar_s_m2s_axi_arready),
+ .S_AXI_ARADDR (xbar_s_m2s_axi_araddr),
+ .S_AXI_ARPROT (xbar_s_m2s_axi_arprot),
+ .S_AXI_RVALID (xbar_s_m2s_axi_rvalid),
+ .S_AXI_RREADY (xbar_s_m2s_axi_rready),
+ .S_AXI_RDATA (xbar_s_m2s_axi_rdata),
+ .S_AXI_RRESP (xbar_s_m2s_axi_rresp),
+
+ .M_AXI_AWADDR (),
+ .M_AXI_AWPROT (),
+ .M_AXI_AWVALID (),
+ .M_AXI_AWREADY ('0),
+ .M_AXI_WDATA (),
+ .M_AXI_WSTRB (),
+ .M_AXI_WVALID (),
+ .M_AXI_WREADY ('0),
+ .M_AXI_BRESP ('0),
+ .M_AXI_BVALID ('0),
+ .M_AXI_BREADY (),
+
+ .M_AXI_ARADDR (m_dma_s2m_axi.araddr),
+ .M_AXI_ARPROT (m_dma_s2m_axi.arprot),
+ .M_AXI_ARVALID (m_dma_s2m_axi.arvalid),
+ .M_AXI_ARREADY (m_dma_s2m_axi.arready),
+ .M_AXI_RDATA (m_dma_s2m_axi.rdata),
+ .M_AXI_RRESP (m_dma_s2m_axi.rresp),
+ .M_AXI_RVALID (m_dma_s2m_axi.rvalid),
+ .M_AXI_RREADY (m_dma_s2m_axi.rready)
);
+generate
+ for (genvar i = 0; i < NUM_TCP; i++) begin
+ logic req;
+ logic req_is_wr;
+ logic [5:0] addr;
+ logic [31:0] wr_data;
+ logic [31:0] wr_biten;
+
+ assign req = tcp_hwif_out.tcp_streams[i].req;
+ assign req_is_wr = tcp_hwif_out.tcp_streams[i].req_is_wr;
+ assign addr = tcp_hwif_out.tcp_streams[i].addr;
+ assign wr_data = tcp_hwif_out.tcp_streams[i].wr_data;
+ assign wr_biten = tcp_hwif_out.tcp_streams[i].wr_biten;
+
+ assign xbar_s_m2s_axi_arvalid[i] = m2s_stream_axil[i].arvalid;
+ assign m2s_stream_axil[i].arready = xbar_s_m2s_axi_arready[i];
+ assign xbar_s_m2s_axi_araddr[32*i+:32] = m2s_stream_axil[i].araddr;
+ assign xbar_s_m2s_axi_arprot[3*i+:3] = m2s_stream_axil[i].arprot;
+ assign m2s_stream_axil[i].rvalid = xbar_s_m2s_axi_rvalid[i];
+ assign xbar_s_m2s_axi_rready[i] = m2s_stream_axil[i].rready;
+ assign m2s_stream_axil[i].rdata = xbar_s_m2s_axi_rdata[32*i+:32];
+ assign m2s_stream_axil[i].rresp = xbar_s_m2s_axi_rresp[2*i+:2];
+
+ m2s_dma #(
+ .AXIS_DATA_WIDTH(8)
+ ) u_m2s_dma (
+ .i_clk (i_clk),
+ .i_rst (i_rst),
+
+ .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 (),
+
+ .m_axil (m2s_stream_axil[i]),
+ .m_axis (tcp_stream_rx_axis[i])
+ );
+ end
+endgenerate
+
+
//s2m dma
-// 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),
-
- .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 #(
+ip_arb_mux_wrapper #(
.S_COUNT(NUM_TCP),
.DATA_WIDTH(DATA_WIDTH)
) u_tx_stream_arb_mux (
- .clk (i_clk),
- .rst (i_rst),
+ .i_clk (i_clk),
+ .i_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)
+ .s_ip (tcp_stream_tx_ip),
+ .m_ip (tcp_tx_ip)
);
@@ -382,44 +243,8 @@ generate
.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[i*2+:2]),
- .s_ip_length (tcp_rx_ip_length[i*16+:16]),
- .s_ip_identification (tcp_rx_ip_identification[i*16+:16]),
- .s_ip_flags (tcp_rx_ip_flags[i*3+:3]),
- .s_ip_fragment_offset (tcp_rx_ip_fragment_offset[i*13+:13]),
- .s_ip_ttl (tcp_rx_ip_ttl[i*8+:8]),
- .s_ip_protocol (tcp_rx_ip_protocol[i*8+:8]),
- .s_ip_header_checksum (tcp_rx_ip_header_checksum[i*16+:16]),
- .s_ip_source_ip (tcp_rx_ip_source_ip[i*32+:32]),
- .s_ip_dest_ip (tcp_rx_ip_dest_ip[i*32+:32]),
- .s_ip_payload_axis_tdata (tcp_rx_ip_payload_axis_tdata[i*DATA_WIDTH+:DATA_WIDTH]),
- .s_ip_payload_axis_tvalid (tcp_rx_ip_payload_axis_tvalid[i*KEEP_WIDTH+:KEEP_WIDTH]),
- .s_ip_payload_axis_tready (tcp_rx_ip_payload_axis_tready[i]),
- .s_ip_payload_axis_tlast (tcp_rx_ip_payload_axis_tlast[i]),
- .s_ip_payload_axis_tuser (tcp_rx_ip_payload_axis_tuser[i*USER_WIDTH+:USER_WIDTH]),
-
- .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)
+ .s_ip_rx (tcp_stream_rx_ip[i]),
+ .m_ip_tx (tcp_stream_tx_ip[i])
);
end
endgenerate
diff --git a/hw/super6502_fpga/src/sub/network_processor/src/tcp_stream.sv b/hw/super6502_fpga/src/sub/network_processor/src/tcp_stream.sv
index 0b3d685..1568579 100644
--- a/hw/super6502_fpga/src/sub/network_processor/src/tcp_stream.sv
+++ b/hw/super6502_fpga/src/sub/network_processor/src/tcp_stream.sv
@@ -20,52 +20,11 @@ module tcp_stream #(
output wire s_cpuif_wr_ack,
output wire s_cpuif_wr_err,
- /*
- * IP input
- */
- input wire s_ip_hdr_valid,
- output wire s_ip_hdr_ready,
- input wire [47:0] s_ip_eth_dest_mac,
- input wire [47:0] s_ip_eth_src_mac,
- input wire [15:0] s_ip_eth_type,
- input wire [3:0] s_ip_version,
- input wire [3:0] s_ip_ihl,
- input wire [5:0] s_ip_dscp,
- input wire [1:0] s_ip_ecn,
- input wire [15:0] s_ip_length,
- input wire [15:0] s_ip_identification,
- input wire [2:0] s_ip_flags,
- input wire [12:0] s_ip_fragment_offset,
- input wire [7:0] s_ip_ttl,
- input wire [7:0] s_ip_protocol,
- input wire [15:0] s_ip_header_checksum,
- input wire [31:0] s_ip_source_ip,
- input wire [31:0] s_ip_dest_ip,
- input wire [7:0] s_ip_payload_axis_tdata,
- input wire s_ip_payload_axis_tvalid,
- output wire s_ip_payload_axis_tready,
- input wire s_ip_payload_axis_tlast,
- input wire s_ip_payload_axis_tuser,
-
- /*
- * IP output
- */
- output wire m_ip_hdr_valid,
- input wire m_ip_hdr_ready,
- output wire [5:0] m_ip_dscp,
- output wire [1:0] m_ip_ecn,
- output wire [15:0] m_ip_length,
- output wire [7:0] m_ip_ttl,
- output wire [7:0] m_ip_protocol,
- output wire [31:0] m_ip_source_ip,
- output wire [31:0] m_ip_dest_ip,
- output wire [7:0] m_ip_payload_axis_tdata,
- 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
+ ip_intf.SLAVE s_ip_rx,
+ ip_intf.MASTER m_ip_tx
);
+
// regs
tcp_stream_regs_pkg::tcp_stream_regs__in_t hwif_in;
tcp_stream_regs_pkg::tcp_stream_regs__out_t hwif_out;
diff --git a/hw/super6502_fpga/src/sub/network_processor/sub/verilog-ethernet b/hw/super6502_fpga/src/sub/network_processor/sub/verilog-ethernet
new file mode 160000
index 0000000..2542187
--- /dev/null
+++ b/hw/super6502_fpga/src/sub/network_processor/sub/verilog-ethernet
@@ -0,0 +1 @@
+Subproject commit 2542187ec93b7bf1c1dbdfc02981aad0eb01054a
diff --git a/hw/super6502_fpga/src/sub/stream_dmas b/hw/super6502_fpga/src/sub/stream_dmas
index e65b6c6..84b9e38 160000
--- a/hw/super6502_fpga/src/sub/stream_dmas
+++ b/hw/super6502_fpga/src/sub/stream_dmas
@@ -1 +1 @@
-Subproject commit e65b6c607f5b10286bbe35389a5e76c59977d618
+Subproject commit 84b9e384ed1ae8224a127fb8d0fa4a0107ab006b
diff --git a/hw/super6502_fpga/super6502_fpga.xml b/hw/super6502_fpga/super6502_fpga.xml
index b6c9487..9138c2a 100644
--- a/hw/super6502_fpga/super6502_fpga.xml
+++ b/hw/super6502_fpga/super6502_fpga.xml
@@ -48,8 +48,6 @@
-
-
diff --git a/init_env.sh b/init_env.sh
index d37bf8d..4e3ef12 100644
--- a/init_env.sh
+++ b/init_env.sh
@@ -14,8 +14,6 @@ python3.11 -m venv .user_venv
pip install -r requirements.txt
-module load efinity/2023.1
-module load verilator
-module load gtkwave/3.3_gtk3
-
-# pip install -r requirements.txt
+# module load efinity/2023.1
+# module load verilator
+# module load gtkwave/3.3_gtk3
diff --git a/requirements.txt b/requirements.txt
index 43a64b5..0b62cb3 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,3 +1,6 @@
-i https://git.byronlathi.com/api/v4/projects/95/packages/pypi/simple
peakrdl==1.1.0
-rtl-manifest>=0.2.0
\ No newline at end of file
+rtl-manifest>=0.2.0
+cocotb
+cocotbext-axi
+cocotbext-eth
\ No newline at end of file