Files
b210-k7-fpga/lib/rfnoc/xport_sv/eth_ipv4_interface_wrapper.sv
T
Wade Fife 6981891978 fpga: lib: Add verilog-compatible wrapper for eth_ipv4_interface
Original-commit: 7052a4f02bb5cab0a2ee7339af5f1e15da087a7b
2022-08-29 17:01:45 -05:00

249 lines
8.1 KiB
Systemverilog

//
// Copyright 2022 Ettus Research, a National Instruments Brand
//
// SPDX-License-Identifier: LGPL-3.0-or-later
//
// Module: eth_ipv4_interface_wrapper.
//
// Description:
//
// Verilog-compatible wrapper for eth_ipv4_interface. This converts the
// interfaces to individual ports. See eth_ipv4_interface for additional
// details.
//
`default_nettype none
module eth_ipv4_interface_wrapper #(
parameter logic [15:0] PROTOVER = {8'd1, 8'd0},
parameter int CPU_FIFO_SIZE = $clog2(8*1024),
parameter int CHDR_FIFO_SIZE = $clog2(8*1024),
parameter int NODE_INST = 0,
parameter int RT_TBL_SIZE = 6,
parameter int REG_AWIDTH = 14,
parameter int BASE = 0,
parameter bit DROP_UNKNOWN_MAC = 0,
parameter bit DROP_MIN_PACKET = 0,
parameter int PREAMBLE_BYTES = 6,
parameter bit ADD_SOF = 1,
parameter bit SYNC = 0,
parameter bit PAUSE_EN = 0,
parameter int ENET_W = 64,
parameter int CPU_W = 64,
parameter int CHDR_W = 64,
parameter int NET_CHDR_W = CHDR_W,
parameter int EN_RX_KV_MAP_CFG = 1,
parameter int EN_RX_RAW_PYLD = 1,
// Trailing bytes
localparam int CHDR_USER_W = $clog2(CHDR_W/8),
// SOF, Trailing bytes
localparam int CPU_USER_W = $clog2(CPU_W/8)+1,
// Error, Trailing bytes
localparam int ENET_USER_W = $clog2(ENET_W/8)+1
) (
input wire bus_clk,
input wire bus_rst,
input wire [15:0] device_id,
//-----------------------------------
// Register Interface
//-----------------------------------
// Register port: Write port (domain: bus_clk)
input wire reg_wr_req,
input wire [REG_AWIDTH-1:0] reg_wr_addr,
input wire [31:0] reg_wr_data,
// Register port: Read port (domain: bus_clk)
input wire reg_rd_req,
input wire [REG_AWIDTH-1:0] reg_rd_addr,
output logic reg_rd_resp,
output logic [31:0] reg_rd_data,
//-----------------------------------
// Device Port Info
//-----------------------------------
// Status ports (domain: bus_clk)
output logic [47:0] my_mac,
output logic [31:0] my_ip,
output logic [15:0] my_udp_chdr_port,
//-----------------------------------
// Ethernet Interface
//-----------------------------------
// Ethernet
input wire eth_clk,
input wire eth_rst,
// Pause frame control (domain: eth_clk)
output logic eth_pause_req,
// Ethernet MAC Interface (domain: eth_clk)
output logic [ ENET_W-1:0] eth_tx_tdata,
output logic [ENET_USER_W-1:0] eth_tx_tuser, // {1'b0, trailing bytes}
output logic [ ENET_W/8-1:0] eth_tx_tkeep, // Trailing bytes as byte enables
output logic eth_tx_tlast,
output logic eth_tx_tvalid,
input wire eth_tx_tready,
//
input wire [ ENET_W-1:0] eth_rx_tdata,
input wire [ENET_USER_W-1:0] eth_rx_tuser, // {Error, trailing bytes}
input wire eth_rx_tlast,
input wire eth_rx_tvalid,
output logic eth_rx_tready,
//-----------------------------------
// RFNoC CHDR Interface
//-----------------------------------
// RFNoC CHDR Interface (domain: bus_clk)
output logic [CHDR_W-1:0] e2v_tdata,
output logic e2v_tlast,
output logic e2v_tvalid,
input wire e2v_tready,
//
input wire [CHDR_W-1:0] v2e_tdata,
input wire v2e_tlast,
input wire v2e_tvalid,
output logic v2e_tready,
//-----------------------------------
// CPU DMA Interface
//-----------------------------------
input wire cpu_clk,
input wire cpu_rst,
// CPU DMA Interface (domain: cpu_clk)
output logic [ CPU_W-1:0] e2c_tdata,
output logic [CPU_USER_W-1:0] e2c_tuser, // {SOF, trailing bytes}
output logic e2c_tlast,
output logic e2c_tvalid,
input wire e2c_tready,
//
input wire [ CPU_W-1:0] c2e_tdata,
input wire [CPU_USER_W-1:0] c2e_tuser, // {1'b0, trailing bytes}
input wire c2e_tlast,
input wire c2e_tvalid,
output logic c2e_tready
);
//---------------------------------------------------------------------------
// Interface
//---------------------------------------------------------------------------
AxiStreamIf #(.DATA_WIDTH(ENET_W), .USER_WIDTH(ENET_USER_W))
eth_tx (eth_clk, eth_rst);
AxiStreamIf #(.DATA_WIDTH(ENET_W), .USER_WIDTH(ENET_USER_W))
eth_rx (eth_clk, eth_rst);
AxiStreamIf #(.DATA_WIDTH(CHDR_W), .USER_WIDTH(CHDR_USER_W), .TKEEP(0), .TUSER(0))
v2e (bus_clk, bus_rst);
AxiStreamIf #(.DATA_WIDTH(CHDR_W), .USER_WIDTH(CHDR_USER_W), .TKEEP(0), .TUSER(0))
e2v (bus_clk, bus_rst);
AxiStreamIf #(.DATA_WIDTH(CPU_W), .USER_WIDTH(CPU_USER_W), .TUSER(0))
c2e (cpu_clk, cpu_rst);
AxiStreamIf #(.DATA_WIDTH(CPU_W), .USER_WIDTH(CPU_USER_W), .TUSER(0))
e2c (cpu_clk, cpu_rst);
//---------------------------------------------------------------------------
// Translate Between Signals and Interfaces
//---------------------------------------------------------------------------
always_comb begin
eth_tx_tdata = eth_tx.tdata;
eth_tx_tuser = eth_tx.tuser;
eth_tx_tkeep = eth_tx.tkeep;
eth_tx_tlast = eth_tx.tlast;
eth_tx_tvalid = eth_tx.tvalid;
eth_tx.tready = eth_tx_tready;
eth_rx.tdata = eth_rx_tdata;
eth_rx.tuser = eth_rx_tuser;
eth_rx.tlast = eth_rx_tlast;
eth_rx.tvalid = eth_rx_tvalid;
eth_rx_tready = eth_rx.tready;
e2v_tdata = e2v.tdata;
e2v_tlast = e2v.tlast;
e2v_tvalid = e2v.tvalid;
e2v.tready = e2v_tready;
v2e.tdata = v2e_tdata;
v2e.tlast = v2e_tlast;
v2e.tvalid = v2e_tvalid;
v2e_tready = v2e.tready;
e2c_tdata = e2c.tdata;
e2c_tuser = e2c.tuser;
e2c_tlast = e2c.tlast;
e2c_tvalid = e2c.tvalid;
e2c.tready = e2c_tready;
c2e.tdata = c2e_tdata;
c2e.tuser = c2e_tuser;
c2e.tlast = c2e_tlast;
c2e.tvalid = c2e_tvalid;
c2e_tready = c2e.tready;
end
//---------------------------------------------------------------------------
// Ethernet Transport Adapter
//---------------------------------------------------------------------------
eth_ipv4_interface #(
.PROTOVER (PROTOVER ),
.CPU_FIFO_SIZE (CPU_FIFO_SIZE ),
.CHDR_FIFO_SIZE (CHDR_FIFO_SIZE ),
.NODE_INST (NODE_INST ),
.RT_TBL_SIZE (RT_TBL_SIZE ),
.REG_AWIDTH (REG_AWIDTH ),
.BASE (BASE ),
.DROP_UNKNOWN_MAC(DROP_UNKNOWN_MAC),
.DROP_MIN_PACKET (DROP_MIN_PACKET ),
.PREAMBLE_BYTES (PREAMBLE_BYTES ),
.ADD_SOF (ADD_SOF ),
.SYNC (SYNC ),
.PAUSE_EN (PAUSE_EN ),
.ENET_W (ENET_W ),
.CPU_W (CPU_W ),
.CHDR_W (CHDR_W ),
.NET_CHDR_W (NET_CHDR_W ),
.EN_RX_KV_MAP_CFG(EN_RX_KV_MAP_CFG),
.EN_RX_RAW_PYLD (EN_RX_RAW_PYLD )
) eth_ipv4_interface_i (
.bus_clk (bus_clk ),
.bus_rst (bus_rst ),
.device_id (device_id ),
.reg_wr_req (reg_wr_req ),
.reg_wr_addr (reg_wr_addr ),
.reg_wr_data (reg_wr_data ),
.reg_rd_req (reg_rd_req ),
.reg_rd_addr (reg_rd_addr ),
.reg_rd_resp (reg_rd_resp ),
.reg_rd_data (reg_rd_data ),
.my_mac (my_mac ),
.my_ip (my_ip ),
.my_udp_chdr_port(my_udp_chdr_port),
.eth_pause_req (eth_pause_req ),
.eth_tx (eth_tx ),
.eth_rx (eth_rx ),
.e2v (e2v ),
.v2e (v2e ),
.e2c (e2c ),
.c2e (c2e )
);
endmodule : eth_ipv4_interface_wrapper
`default_nettype wire