mirror of
https://github.com/corundum/corundum.git
synced 2025-01-16 08:12:53 +08:00
6b0df7f33f
Signed-off-by: Alex Forencich <alex@alexforencich.com>
675 lines
24 KiB
Verilog
675 lines
24 KiB
Verilog
/*
|
|
|
|
Copyright 2021-2022, The Regents of the University of California.
|
|
All rights reserved.
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
modification, are permitted provided that the following conditions are met:
|
|
|
|
1. Redistributions of source code must retain the above copyright notice,
|
|
this list of conditions and the following disclaimer.
|
|
|
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
this list of conditions and the following disclaimer in the documentation
|
|
and/or other materials provided with the distribution.
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE REGENTS OF THE UNIVERSITY OF CALIFORNIA ''AS
|
|
IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF CALIFORNIA OR
|
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
|
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
|
OF SUCH DAMAGE.
|
|
|
|
The views and conclusions contained in the software and documentation are those
|
|
of the authors and should not be interpreted as representing official policies,
|
|
either expressed or implied, of The Regents of the University of California.
|
|
|
|
*/
|
|
|
|
// Language: Verilog 2001
|
|
|
|
`resetall
|
|
`timescale 1ns / 1ps
|
|
`default_nettype none
|
|
|
|
/*
|
|
* NIC Interface RX path
|
|
*/
|
|
module mqnic_interface_rx #
|
|
(
|
|
// Structural configuration
|
|
parameter PORTS = 1,
|
|
|
|
// PTP configuration
|
|
parameter PTP_TS_WIDTH = 96,
|
|
|
|
// Queue manager configuration (interface)
|
|
parameter RX_QUEUE_INDEX_WIDTH = 8,
|
|
parameter QUEUE_INDEX_WIDTH = RX_QUEUE_INDEX_WIDTH,
|
|
parameter RX_CPL_QUEUE_INDEX_WIDTH = RX_QUEUE_INDEX_WIDTH,
|
|
parameter CPL_QUEUE_INDEX_WIDTH = RX_CPL_QUEUE_INDEX_WIDTH,
|
|
parameter QUEUE_PTR_WIDTH = 16,
|
|
parameter LOG_QUEUE_SIZE_WIDTH = 4,
|
|
parameter LOG_BLOCK_SIZE_WIDTH = 2,
|
|
|
|
// Descriptor management
|
|
parameter RX_MAX_DESC_REQ = 16,
|
|
parameter RX_DESC_FIFO_SIZE = RX_MAX_DESC_REQ*8,
|
|
parameter DESC_SIZE = 16,
|
|
parameter CPL_SIZE = 32,
|
|
parameter AXIS_DESC_DATA_WIDTH = DESC_SIZE*8,
|
|
parameter AXIS_DESC_KEEP_WIDTH = AXIS_DESC_DATA_WIDTH/8,
|
|
parameter DESC_REQ_TAG_WIDTH = 8,
|
|
parameter QUEUE_REQ_TAG_WIDTH = 8,
|
|
parameter QUEUE_OP_TAG_WIDTH = 8,
|
|
|
|
// TX and RX engine configuration
|
|
parameter RX_DESC_TABLE_SIZE = 32,
|
|
parameter DESC_TABLE_DMA_OP_COUNT_WIDTH = 4,
|
|
|
|
// Interface configuration
|
|
parameter PTP_TS_ENABLE = 1,
|
|
parameter RX_RSS_ENABLE = 1,
|
|
parameter RX_HASH_ENABLE = 1,
|
|
parameter RX_CHECKSUM_ENABLE = 1,
|
|
parameter MAX_RX_SIZE = 9214,
|
|
parameter RX_RAM_SIZE = 32768,
|
|
|
|
// DMA interface configuration
|
|
parameter DMA_ADDR_WIDTH = 64,
|
|
parameter DMA_LEN_WIDTH = 16,
|
|
parameter DMA_TAG_WIDTH = 16,
|
|
parameter RAM_ADDR_WIDTH = $clog2(RX_RAM_SIZE),
|
|
parameter RAM_SEG_COUNT = 2,
|
|
parameter RAM_SEG_DATA_WIDTH = 256*2/RAM_SEG_COUNT,
|
|
parameter RAM_SEG_BE_WIDTH = RAM_SEG_DATA_WIDTH/8,
|
|
parameter RAM_SEG_ADDR_WIDTH = RAM_ADDR_WIDTH-$clog2(RAM_SEG_COUNT*RAM_SEG_BE_WIDTH),
|
|
parameter RAM_PIPELINE = 2,
|
|
|
|
// Register interface configuration
|
|
parameter REG_ADDR_WIDTH = 7,
|
|
parameter REG_DATA_WIDTH = 32,
|
|
parameter REG_STRB_WIDTH = (REG_DATA_WIDTH/8),
|
|
parameter RB_BASE_ADDR = 0,
|
|
parameter RB_NEXT_PTR = 0,
|
|
|
|
// Streaming interface configuration
|
|
parameter AXIS_DATA_WIDTH = 512*2**$clog2(PORTS),
|
|
parameter AXIS_KEEP_WIDTH = AXIS_DATA_WIDTH/8,
|
|
parameter AXIS_RX_ID_WIDTH = PORTS > 1 ? $clog2(PORTS) : 1,
|
|
parameter AXIS_RX_DEST_WIDTH = RX_QUEUE_INDEX_WIDTH,
|
|
parameter AXIS_RX_USER_WIDTH = (PTP_TS_ENABLE ? PTP_TS_WIDTH : 0) + 1
|
|
)
|
|
(
|
|
input wire clk,
|
|
input wire rst,
|
|
|
|
/*
|
|
* Control register interface
|
|
*/
|
|
input wire [REG_ADDR_WIDTH-1:0] ctrl_reg_wr_addr,
|
|
input wire [REG_DATA_WIDTH-1:0] ctrl_reg_wr_data,
|
|
input wire [REG_STRB_WIDTH-1:0] ctrl_reg_wr_strb,
|
|
input wire ctrl_reg_wr_en,
|
|
output wire ctrl_reg_wr_wait,
|
|
output wire ctrl_reg_wr_ack,
|
|
input wire [REG_ADDR_WIDTH-1:0] ctrl_reg_rd_addr,
|
|
input wire ctrl_reg_rd_en,
|
|
output wire [REG_DATA_WIDTH-1:0] ctrl_reg_rd_data,
|
|
output wire ctrl_reg_rd_wait,
|
|
output wire ctrl_reg_rd_ack,
|
|
|
|
/*
|
|
* Descriptor request output
|
|
*/
|
|
output wire [QUEUE_INDEX_WIDTH-1:0] m_axis_desc_req_queue,
|
|
output wire [DESC_REQ_TAG_WIDTH-1:0] m_axis_desc_req_tag,
|
|
output wire m_axis_desc_req_valid,
|
|
input wire m_axis_desc_req_ready,
|
|
|
|
/*
|
|
* Descriptor request status input
|
|
*/
|
|
input wire [QUEUE_INDEX_WIDTH-1:0] s_axis_desc_req_status_queue,
|
|
input wire [QUEUE_PTR_WIDTH-1:0] s_axis_desc_req_status_ptr,
|
|
input wire [CPL_QUEUE_INDEX_WIDTH-1:0] s_axis_desc_req_status_cpl,
|
|
input wire [DESC_REQ_TAG_WIDTH-1:0] s_axis_desc_req_status_tag,
|
|
input wire s_axis_desc_req_status_empty,
|
|
input wire s_axis_desc_req_status_error,
|
|
input wire s_axis_desc_req_status_valid,
|
|
|
|
/*
|
|
* Descriptor data input
|
|
*/
|
|
input wire [AXIS_DESC_DATA_WIDTH-1:0] s_axis_desc_tdata,
|
|
input wire [AXIS_DESC_KEEP_WIDTH-1:0] s_axis_desc_tkeep,
|
|
input wire s_axis_desc_tvalid,
|
|
output wire s_axis_desc_tready,
|
|
input wire s_axis_desc_tlast,
|
|
input wire [DESC_REQ_TAG_WIDTH-1:0] s_axis_desc_tid,
|
|
input wire s_axis_desc_tuser,
|
|
|
|
/*
|
|
* Completion request output
|
|
*/
|
|
output wire [QUEUE_INDEX_WIDTH-1:0] m_axis_cpl_req_queue,
|
|
output wire [DESC_REQ_TAG_WIDTH-1:0] m_axis_cpl_req_tag,
|
|
output wire [CPL_SIZE*8-1:0] m_axis_cpl_req_data,
|
|
output wire m_axis_cpl_req_valid,
|
|
input wire m_axis_cpl_req_ready,
|
|
|
|
/*
|
|
* Completion request status input
|
|
*/
|
|
input wire [DESC_REQ_TAG_WIDTH-1:0] s_axis_cpl_req_status_tag,
|
|
input wire s_axis_cpl_req_status_full,
|
|
input wire s_axis_cpl_req_status_error,
|
|
input wire s_axis_cpl_req_status_valid,
|
|
|
|
/*
|
|
* DMA write descriptor output (data)
|
|
*/
|
|
output wire [DMA_ADDR_WIDTH-1:0] m_axis_dma_write_desc_dma_addr,
|
|
output wire [RAM_ADDR_WIDTH-1:0] m_axis_dma_write_desc_ram_addr,
|
|
output wire [DMA_LEN_WIDTH-1:0] m_axis_dma_write_desc_len,
|
|
output wire [DMA_TAG_WIDTH-1:0] m_axis_dma_write_desc_tag,
|
|
output wire m_axis_dma_write_desc_valid,
|
|
input wire m_axis_dma_write_desc_ready,
|
|
|
|
/*
|
|
* DMA write descriptor status input (data)
|
|
*/
|
|
input wire [DMA_TAG_WIDTH-1:0] s_axis_dma_write_desc_status_tag,
|
|
input wire [3:0] s_axis_dma_write_desc_status_error,
|
|
input wire s_axis_dma_write_desc_status_valid,
|
|
|
|
/*
|
|
* RAM interface (data)
|
|
*/
|
|
input wire [RAM_SEG_COUNT*RAM_SEG_ADDR_WIDTH-1:0] dma_ram_rd_cmd_addr,
|
|
input wire [RAM_SEG_COUNT-1:0] dma_ram_rd_cmd_valid,
|
|
output wire [RAM_SEG_COUNT-1:0] dma_ram_rd_cmd_ready,
|
|
output wire [RAM_SEG_COUNT*RAM_SEG_DATA_WIDTH-1:0] dma_ram_rd_resp_data,
|
|
output wire [RAM_SEG_COUNT-1:0] dma_ram_rd_resp_valid,
|
|
input wire [RAM_SEG_COUNT-1:0] dma_ram_rd_resp_ready,
|
|
|
|
/*
|
|
* Receive data input
|
|
*/
|
|
input wire [AXIS_DATA_WIDTH-1:0] s_axis_rx_tdata,
|
|
input wire [AXIS_KEEP_WIDTH-1:0] s_axis_rx_tkeep,
|
|
input wire s_axis_rx_tvalid,
|
|
output wire s_axis_rx_tready,
|
|
input wire s_axis_rx_tlast,
|
|
input wire [AXIS_RX_ID_WIDTH-1:0] s_axis_rx_tid,
|
|
input wire [AXIS_RX_DEST_WIDTH-1:0] s_axis_rx_tdest,
|
|
input wire [AXIS_RX_USER_WIDTH-1:0] s_axis_rx_tuser,
|
|
|
|
/*
|
|
* Configuration
|
|
*/
|
|
input wire [DMA_CLIENT_LEN_WIDTH-1:0] mtu
|
|
);
|
|
|
|
parameter DMA_CLIENT_TAG_WIDTH = $clog2(RX_DESC_TABLE_SIZE);
|
|
parameter DMA_CLIENT_LEN_WIDTH = DMA_LEN_WIDTH;
|
|
|
|
parameter REQ_TAG_WIDTH = $clog2(RX_DESC_TABLE_SIZE);
|
|
|
|
localparam RX_HASH_WIDTH = 32;
|
|
localparam RX_HASH_TYPE_WIDTH = 4;
|
|
|
|
localparam TUSER_HASH_OFFSET = AXIS_RX_USER_WIDTH;
|
|
localparam TUSER_HASH_TYPE_OFFSET = TUSER_HASH_OFFSET + (RX_HASH_ENABLE ? RX_HASH_WIDTH : 0);
|
|
localparam INT_AXIS_RX_USER_WIDTH = TUSER_HASH_TYPE_OFFSET + (RX_HASH_ENABLE ? RX_HASH_TYPE_WIDTH : 0);
|
|
|
|
wire [AXIS_DESC_DATA_WIDTH-1:0] rx_fifo_desc_tdata;
|
|
wire [AXIS_DESC_KEEP_WIDTH-1:0] rx_fifo_desc_tkeep;
|
|
wire rx_fifo_desc_tvalid;
|
|
wire rx_fifo_desc_tready;
|
|
wire rx_fifo_desc_tlast;
|
|
wire [DESC_REQ_TAG_WIDTH-1:0] rx_fifo_desc_tid;
|
|
wire rx_fifo_desc_tuser;
|
|
|
|
axis_fifo #(
|
|
.DEPTH(RX_DESC_FIFO_SIZE*DESC_SIZE),
|
|
.DATA_WIDTH(AXIS_DESC_DATA_WIDTH),
|
|
.KEEP_WIDTH(AXIS_DESC_KEEP_WIDTH),
|
|
.LAST_ENABLE(1),
|
|
.ID_ENABLE(1),
|
|
.ID_WIDTH(DESC_REQ_TAG_WIDTH),
|
|
.DEST_ENABLE(0),
|
|
.USER_ENABLE(0),
|
|
.PIPELINE_OUTPUT(3),
|
|
.FRAME_FIFO(0)
|
|
)
|
|
rx_desc_fifo (
|
|
.clk(clk),
|
|
.rst(rst),
|
|
|
|
// AXI input
|
|
.s_axis_tdata(s_axis_desc_tdata),
|
|
.s_axis_tkeep(s_axis_desc_tkeep),
|
|
.s_axis_tvalid(s_axis_desc_tvalid),
|
|
.s_axis_tready(s_axis_desc_tready),
|
|
.s_axis_tlast(s_axis_desc_tlast),
|
|
.s_axis_tid(s_axis_desc_tid),
|
|
.s_axis_tdest(0),
|
|
.s_axis_tuser(s_axis_desc_tuser),
|
|
|
|
// AXI output
|
|
.m_axis_tdata(rx_fifo_desc_tdata),
|
|
.m_axis_tkeep(rx_fifo_desc_tkeep),
|
|
.m_axis_tvalid(rx_fifo_desc_tvalid),
|
|
.m_axis_tready(rx_fifo_desc_tready),
|
|
.m_axis_tlast(rx_fifo_desc_tlast),
|
|
.m_axis_tid(rx_fifo_desc_tid),
|
|
.m_axis_tdest(),
|
|
.m_axis_tuser(rx_fifo_desc_tuser),
|
|
|
|
// Status
|
|
.status_overflow(),
|
|
.status_bad_frame(),
|
|
.status_good_frame()
|
|
);
|
|
|
|
wire [15:0] rx_csum;
|
|
wire rx_csum_valid;
|
|
wire rx_csum_ready;
|
|
|
|
wire [RAM_ADDR_WIDTH-1:0] dma_rx_desc_addr;
|
|
wire [DMA_CLIENT_LEN_WIDTH-1:0] dma_rx_desc_len;
|
|
wire [DMA_CLIENT_TAG_WIDTH-1:0] dma_rx_desc_tag;
|
|
wire dma_rx_desc_valid;
|
|
wire dma_rx_desc_ready;
|
|
|
|
wire [DMA_CLIENT_LEN_WIDTH-1:0] dma_rx_desc_status_len;
|
|
wire [DMA_CLIENT_TAG_WIDTH-1:0] dma_rx_desc_status_tag;
|
|
wire [AXIS_RX_ID_WIDTH-1:0] dma_rx_desc_status_id;
|
|
wire [AXIS_RX_DEST_WIDTH-1:0] dma_rx_desc_status_dest;
|
|
wire [INT_AXIS_RX_USER_WIDTH-1:0] dma_rx_desc_status_user;
|
|
wire [3:0] dma_rx_desc_status_error;
|
|
wire dma_rx_desc_status_valid;
|
|
|
|
// Generate RX requests
|
|
reg rx_frame_reg = 1'b0;
|
|
reg [5:0] rx_req_cnt_reg = 0;
|
|
|
|
wire rx_req_valid = rx_req_cnt_reg != 0;
|
|
wire rx_req_ready;
|
|
|
|
always @(posedge clk) begin
|
|
if (rx_req_valid && rx_req_ready) begin
|
|
rx_req_cnt_reg <= rx_req_cnt_reg - 1;
|
|
end
|
|
|
|
if (s_axis_rx_tvalid) begin
|
|
if (!rx_frame_reg) begin
|
|
if (rx_req_valid && rx_req_ready) begin
|
|
rx_req_cnt_reg <= rx_req_cnt_reg;
|
|
end else begin
|
|
rx_req_cnt_reg <= rx_req_cnt_reg + 1;
|
|
end
|
|
rx_frame_reg <= 1'b1;
|
|
end
|
|
if (s_axis_rx_tready && s_axis_rx_tvalid && s_axis_rx_tlast) begin
|
|
rx_frame_reg <= 1'b0;
|
|
end
|
|
end
|
|
|
|
if (rst) begin
|
|
rx_frame_reg <= 1'b0;
|
|
rx_req_cnt_reg <= 0;
|
|
end
|
|
end
|
|
|
|
rx_engine #(
|
|
.PORTS(PORTS),
|
|
.REG_ADDR_WIDTH(REG_ADDR_WIDTH),
|
|
.REG_DATA_WIDTH(REG_DATA_WIDTH),
|
|
.REG_STRB_WIDTH(REG_STRB_WIDTH),
|
|
.RB_BASE_ADDR(RB_BASE_ADDR),
|
|
.RB_NEXT_PTR(RB_NEXT_PTR),
|
|
.RAM_ADDR_WIDTH(RAM_ADDR_WIDTH),
|
|
.DMA_ADDR_WIDTH(DMA_ADDR_WIDTH),
|
|
.DMA_LEN_WIDTH(DMA_LEN_WIDTH),
|
|
.DMA_CLIENT_LEN_WIDTH(DMA_CLIENT_LEN_WIDTH),
|
|
.REQ_TAG_WIDTH(REQ_TAG_WIDTH),
|
|
.DESC_REQ_TAG_WIDTH(DESC_REQ_TAG_WIDTH),
|
|
.DMA_TAG_WIDTH(DMA_TAG_WIDTH),
|
|
.DMA_CLIENT_TAG_WIDTH(DMA_CLIENT_TAG_WIDTH),
|
|
.QUEUE_REQ_TAG_WIDTH(QUEUE_REQ_TAG_WIDTH),
|
|
.QUEUE_OP_TAG_WIDTH(QUEUE_OP_TAG_WIDTH),
|
|
.QUEUE_INDEX_WIDTH(RX_QUEUE_INDEX_WIDTH),
|
|
.QUEUE_PTR_WIDTH(QUEUE_PTR_WIDTH),
|
|
.CPL_QUEUE_INDEX_WIDTH(RX_CPL_QUEUE_INDEX_WIDTH),
|
|
.DESC_TABLE_SIZE(RX_DESC_TABLE_SIZE),
|
|
.DESC_TABLE_DMA_OP_COUNT_WIDTH(DESC_TABLE_DMA_OP_COUNT_WIDTH),
|
|
.MAX_RX_SIZE(MAX_RX_SIZE),
|
|
.RX_BUFFER_OFFSET(0),
|
|
.RX_BUFFER_SIZE(RX_RAM_SIZE),
|
|
.RX_BUFFER_STEP_SIZE(RAM_SEG_COUNT*RAM_SEG_BE_WIDTH),
|
|
.DESC_SIZE(DESC_SIZE),
|
|
.CPL_SIZE(CPL_SIZE),
|
|
.MAX_DESC_REQ(RX_MAX_DESC_REQ),
|
|
.AXIS_DESC_DATA_WIDTH(AXIS_DESC_DATA_WIDTH),
|
|
.AXIS_DESC_KEEP_WIDTH(AXIS_DESC_KEEP_WIDTH),
|
|
.PTP_TS_ENABLE(PTP_TS_ENABLE),
|
|
.PTP_TS_WIDTH(PTP_TS_WIDTH),
|
|
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
|
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
|
.AXIS_RX_ID_WIDTH(AXIS_RX_ID_WIDTH),
|
|
.AXIS_RX_DEST_WIDTH(AXIS_RX_DEST_WIDTH),
|
|
.AXIS_RX_USER_WIDTH(INT_AXIS_RX_USER_WIDTH)
|
|
)
|
|
rx_engine_inst (
|
|
.clk(clk),
|
|
.rst(rst),
|
|
|
|
/*
|
|
* Control register interface
|
|
*/
|
|
.ctrl_reg_wr_addr(ctrl_reg_wr_addr),
|
|
.ctrl_reg_wr_data(ctrl_reg_wr_data),
|
|
.ctrl_reg_wr_strb(ctrl_reg_wr_strb),
|
|
.ctrl_reg_wr_en(ctrl_reg_wr_en),
|
|
.ctrl_reg_wr_wait(ctrl_reg_wr_wait),
|
|
.ctrl_reg_wr_ack(ctrl_reg_wr_ack),
|
|
.ctrl_reg_rd_addr(ctrl_reg_rd_addr),
|
|
.ctrl_reg_rd_en(ctrl_reg_rd_en),
|
|
.ctrl_reg_rd_data(ctrl_reg_rd_data),
|
|
.ctrl_reg_rd_wait(ctrl_reg_rd_wait),
|
|
.ctrl_reg_rd_ack(ctrl_reg_rd_ack),
|
|
|
|
/*
|
|
* Receive request input (queue index)
|
|
*/
|
|
.s_axis_rx_req_tag(0),
|
|
.s_axis_rx_req_valid(rx_req_valid),
|
|
.s_axis_rx_req_ready(rx_req_ready),
|
|
|
|
/*
|
|
* Receive request status output
|
|
*/
|
|
.m_axis_rx_req_status_tag(),
|
|
.m_axis_rx_req_status_len(),
|
|
.m_axis_rx_req_status_valid(),
|
|
|
|
/*
|
|
* Descriptor request output
|
|
*/
|
|
.m_axis_desc_req_queue(m_axis_desc_req_queue),
|
|
.m_axis_desc_req_tag(m_axis_desc_req_tag),
|
|
.m_axis_desc_req_valid(m_axis_desc_req_valid),
|
|
.m_axis_desc_req_ready(m_axis_desc_req_ready),
|
|
|
|
/*
|
|
* Descriptor request status input
|
|
*/
|
|
.s_axis_desc_req_status_queue(s_axis_desc_req_status_queue),
|
|
.s_axis_desc_req_status_ptr(s_axis_desc_req_status_ptr),
|
|
.s_axis_desc_req_status_cpl(s_axis_desc_req_status_cpl),
|
|
.s_axis_desc_req_status_tag(s_axis_desc_req_status_tag),
|
|
.s_axis_desc_req_status_empty(s_axis_desc_req_status_empty),
|
|
.s_axis_desc_req_status_error(s_axis_desc_req_status_error),
|
|
.s_axis_desc_req_status_valid(s_axis_desc_req_status_valid),
|
|
|
|
/*
|
|
* Descriptor data input
|
|
*/
|
|
.s_axis_desc_tdata(rx_fifo_desc_tdata),
|
|
.s_axis_desc_tkeep(rx_fifo_desc_tkeep),
|
|
.s_axis_desc_tvalid(rx_fifo_desc_tvalid),
|
|
.s_axis_desc_tready(rx_fifo_desc_tready),
|
|
.s_axis_desc_tlast(rx_fifo_desc_tlast),
|
|
.s_axis_desc_tid(rx_fifo_desc_tid),
|
|
.s_axis_desc_tuser(rx_fifo_desc_tuser),
|
|
|
|
/*
|
|
* Completion request output
|
|
*/
|
|
.m_axis_cpl_req_queue(m_axis_cpl_req_queue),
|
|
.m_axis_cpl_req_tag(m_axis_cpl_req_tag),
|
|
.m_axis_cpl_req_data(m_axis_cpl_req_data),
|
|
.m_axis_cpl_req_valid(m_axis_cpl_req_valid),
|
|
.m_axis_cpl_req_ready(m_axis_cpl_req_ready),
|
|
|
|
/*
|
|
* Completion request status input
|
|
*/
|
|
.s_axis_cpl_req_status_tag(s_axis_cpl_req_status_tag),
|
|
.s_axis_cpl_req_status_full(s_axis_cpl_req_status_full),
|
|
.s_axis_cpl_req_status_error(s_axis_cpl_req_status_error),
|
|
.s_axis_cpl_req_status_valid(s_axis_cpl_req_status_valid),
|
|
|
|
/*
|
|
* DMA write descriptor output
|
|
*/
|
|
.m_axis_dma_write_desc_dma_addr(m_axis_dma_write_desc_dma_addr),
|
|
.m_axis_dma_write_desc_ram_addr(m_axis_dma_write_desc_ram_addr),
|
|
.m_axis_dma_write_desc_len(m_axis_dma_write_desc_len),
|
|
.m_axis_dma_write_desc_tag(m_axis_dma_write_desc_tag),
|
|
.m_axis_dma_write_desc_valid(m_axis_dma_write_desc_valid),
|
|
.m_axis_dma_write_desc_ready(m_axis_dma_write_desc_ready),
|
|
|
|
/*
|
|
* DMA write descriptor status input
|
|
*/
|
|
.s_axis_dma_write_desc_status_tag(s_axis_dma_write_desc_status_tag),
|
|
.s_axis_dma_write_desc_status_error(s_axis_dma_write_desc_status_error),
|
|
.s_axis_dma_write_desc_status_valid(s_axis_dma_write_desc_status_valid),
|
|
|
|
/*
|
|
* Receive descriptor output
|
|
*/
|
|
.m_axis_rx_desc_addr(dma_rx_desc_addr),
|
|
.m_axis_rx_desc_len(dma_rx_desc_len),
|
|
.m_axis_rx_desc_tag(dma_rx_desc_tag),
|
|
.m_axis_rx_desc_valid(dma_rx_desc_valid),
|
|
.m_axis_rx_desc_ready(dma_rx_desc_ready),
|
|
|
|
/*
|
|
* Receive descriptor status input
|
|
*/
|
|
.s_axis_rx_desc_status_len(dma_rx_desc_status_len),
|
|
.s_axis_rx_desc_status_tag(dma_rx_desc_status_tag),
|
|
.s_axis_rx_desc_status_id(dma_rx_desc_status_id),
|
|
.s_axis_rx_desc_status_dest(dma_rx_desc_status_dest),
|
|
.s_axis_rx_desc_status_user(dma_rx_desc_status_user),
|
|
.s_axis_rx_desc_status_error(dma_rx_desc_status_error),
|
|
.s_axis_rx_desc_status_valid(dma_rx_desc_status_valid),
|
|
|
|
/*
|
|
* Receive checksum input
|
|
*/
|
|
.s_axis_rx_csum(rx_csum),
|
|
.s_axis_rx_csum_valid(rx_csum_valid),
|
|
.s_axis_rx_csum_ready(rx_csum_ready),
|
|
|
|
/*
|
|
* Configuration
|
|
*/
|
|
.mtu(mtu),
|
|
.enable(1'b1)
|
|
);
|
|
|
|
wire [RAM_SEG_COUNT*RAM_SEG_BE_WIDTH-1:0] dma_ram_wr_cmd_be_int;
|
|
wire [RAM_SEG_COUNT*RAM_SEG_ADDR_WIDTH-1:0] dma_ram_wr_cmd_addr_int;
|
|
wire [RAM_SEG_COUNT*RAM_SEG_DATA_WIDTH-1:0] dma_ram_wr_cmd_data_int;
|
|
wire [RAM_SEG_COUNT-1:0] dma_ram_wr_cmd_valid_int;
|
|
wire [RAM_SEG_COUNT-1:0] dma_ram_wr_cmd_ready_int;
|
|
wire [RAM_SEG_COUNT-1:0] dma_ram_wr_done_int;
|
|
|
|
dma_psdpram #(
|
|
.SIZE(RX_RAM_SIZE),
|
|
.SEG_COUNT(RAM_SEG_COUNT),
|
|
.SEG_DATA_WIDTH(RAM_SEG_DATA_WIDTH),
|
|
.SEG_BE_WIDTH(RAM_SEG_BE_WIDTH),
|
|
.SEG_ADDR_WIDTH(RAM_SEG_ADDR_WIDTH),
|
|
.PIPELINE(RAM_PIPELINE)
|
|
)
|
|
dma_psdpram_rx_inst (
|
|
.clk(clk),
|
|
.rst(rst),
|
|
|
|
/*
|
|
* Write port
|
|
*/
|
|
.wr_cmd_be(dma_ram_wr_cmd_be_int),
|
|
.wr_cmd_addr(dma_ram_wr_cmd_addr_int),
|
|
.wr_cmd_data(dma_ram_wr_cmd_data_int),
|
|
.wr_cmd_valid(dma_ram_wr_cmd_valid_int),
|
|
.wr_cmd_ready(dma_ram_wr_cmd_ready_int),
|
|
.wr_done(dma_ram_wr_done_int),
|
|
|
|
/*
|
|
* Read port
|
|
*/
|
|
.rd_cmd_addr(dma_ram_rd_cmd_addr),
|
|
.rd_cmd_valid(dma_ram_rd_cmd_valid),
|
|
.rd_cmd_ready(dma_ram_rd_cmd_ready),
|
|
.rd_resp_data(dma_ram_rd_resp_data),
|
|
.rd_resp_valid(dma_ram_rd_resp_valid),
|
|
.rd_resp_ready(dma_ram_rd_resp_ready)
|
|
);
|
|
|
|
wire [AXIS_DATA_WIDTH-1:0] rx_axis_tdata_int;
|
|
wire [AXIS_KEEP_WIDTH-1:0] rx_axis_tkeep_int;
|
|
wire rx_axis_tvalid_int;
|
|
wire rx_axis_tready_int;
|
|
wire rx_axis_tlast_int;
|
|
wire [AXIS_RX_ID_WIDTH-1:0] rx_axis_tid_int;
|
|
wire [AXIS_RX_DEST_WIDTH-1:0] rx_axis_tdest_int;
|
|
wire [INT_AXIS_RX_USER_WIDTH-1:0] rx_axis_tuser_int;
|
|
|
|
mqnic_ingress #(
|
|
.REQ_TAG_WIDTH(REQ_TAG_WIDTH),
|
|
.RX_QUEUE_INDEX_WIDTH(RX_QUEUE_INDEX_WIDTH),
|
|
.RX_RSS_ENABLE(RX_RSS_ENABLE),
|
|
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
|
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
|
.AXIS_DATA_WIDTH(AXIS_DATA_WIDTH),
|
|
.AXIS_KEEP_WIDTH(AXIS_KEEP_WIDTH),
|
|
.AXIS_ID_WIDTH(AXIS_RX_ID_WIDTH),
|
|
.AXIS_DEST_WIDTH(AXIS_RX_DEST_WIDTH),
|
|
.S_AXIS_USER_WIDTH(AXIS_RX_USER_WIDTH),
|
|
.M_AXIS_USER_WIDTH(INT_AXIS_RX_USER_WIDTH),
|
|
.MAX_RX_SIZE(MAX_RX_SIZE)
|
|
)
|
|
ingress_inst (
|
|
.clk(clk),
|
|
.rst(rst),
|
|
|
|
/*
|
|
* Receive data input
|
|
*/
|
|
.s_axis_tdata(s_axis_rx_tdata),
|
|
.s_axis_tkeep(s_axis_rx_tkeep),
|
|
.s_axis_tvalid(s_axis_rx_tvalid),
|
|
.s_axis_tready(s_axis_rx_tready),
|
|
.s_axis_tlast(s_axis_rx_tlast),
|
|
.s_axis_tid(s_axis_rx_tid),
|
|
.s_axis_tdest(s_axis_rx_tdest),
|
|
.s_axis_tuser(s_axis_rx_tuser),
|
|
|
|
/*
|
|
* Receive data output
|
|
*/
|
|
.m_axis_tdata(rx_axis_tdata_int),
|
|
.m_axis_tkeep(rx_axis_tkeep_int),
|
|
.m_axis_tvalid(rx_axis_tvalid_int),
|
|
.m_axis_tready(rx_axis_tready_int),
|
|
.m_axis_tlast(rx_axis_tlast_int),
|
|
.m_axis_tid(rx_axis_tid_int),
|
|
.m_axis_tdest(rx_axis_tdest_int),
|
|
.m_axis_tuser(rx_axis_tuser_int),
|
|
|
|
/*
|
|
* RX checksum output
|
|
*/
|
|
.rx_csum(rx_csum),
|
|
.rx_csum_valid(rx_csum_valid),
|
|
.rx_csum_ready(rx_csum_ready)
|
|
);
|
|
|
|
dma_client_axis_sink #(
|
|
.RAM_ADDR_WIDTH(RAM_ADDR_WIDTH),
|
|
.SEG_COUNT(RAM_SEG_COUNT),
|
|
.SEG_DATA_WIDTH(RAM_SEG_DATA_WIDTH),
|
|
.SEG_BE_WIDTH(RAM_SEG_BE_WIDTH),
|
|
.SEG_ADDR_WIDTH(RAM_SEG_ADDR_WIDTH),
|
|
.AXIS_DATA_WIDTH(AXIS_DATA_WIDTH),
|
|
.AXIS_KEEP_ENABLE(AXIS_KEEP_WIDTH > 1),
|
|
.AXIS_KEEP_WIDTH(AXIS_KEEP_WIDTH),
|
|
.AXIS_LAST_ENABLE(1),
|
|
.AXIS_ID_ENABLE(1),
|
|
.AXIS_ID_WIDTH(AXIS_RX_ID_WIDTH),
|
|
.AXIS_DEST_ENABLE(1),
|
|
.AXIS_DEST_WIDTH(AXIS_RX_DEST_WIDTH),
|
|
.AXIS_USER_ENABLE(1),
|
|
.AXIS_USER_WIDTH(INT_AXIS_RX_USER_WIDTH),
|
|
.LEN_WIDTH(DMA_CLIENT_LEN_WIDTH),
|
|
.TAG_WIDTH(DMA_CLIENT_TAG_WIDTH)
|
|
)
|
|
dma_client_axis_sink_inst (
|
|
.clk(clk),
|
|
.rst(rst),
|
|
|
|
/*
|
|
* DMA write descriptor input
|
|
*/
|
|
.s_axis_write_desc_ram_addr(dma_rx_desc_addr),
|
|
.s_axis_write_desc_len(dma_rx_desc_len),
|
|
.s_axis_write_desc_tag(dma_rx_desc_tag),
|
|
.s_axis_write_desc_valid(dma_rx_desc_valid),
|
|
.s_axis_write_desc_ready(dma_rx_desc_ready),
|
|
|
|
/*
|
|
* DMA write descriptor status output
|
|
*/
|
|
.m_axis_write_desc_status_len(dma_rx_desc_status_len),
|
|
.m_axis_write_desc_status_tag(dma_rx_desc_status_tag),
|
|
.m_axis_write_desc_status_id(dma_rx_desc_status_id),
|
|
.m_axis_write_desc_status_dest(dma_rx_desc_status_dest),
|
|
.m_axis_write_desc_status_user(dma_rx_desc_status_user),
|
|
.m_axis_write_desc_status_error(dma_rx_desc_status_error),
|
|
.m_axis_write_desc_status_valid(dma_rx_desc_status_valid),
|
|
|
|
/*
|
|
* AXI stream write data input
|
|
*/
|
|
.s_axis_write_data_tdata(rx_axis_tdata_int),
|
|
.s_axis_write_data_tkeep(rx_axis_tkeep_int),
|
|
.s_axis_write_data_tvalid(rx_axis_tvalid_int),
|
|
.s_axis_write_data_tready(rx_axis_tready_int),
|
|
.s_axis_write_data_tlast(rx_axis_tlast_int),
|
|
.s_axis_write_data_tid(rx_axis_tid_int),
|
|
.s_axis_write_data_tdest(rx_axis_tdest_int),
|
|
.s_axis_write_data_tuser(rx_axis_tuser_int),
|
|
|
|
/*
|
|
* RAM interface
|
|
*/
|
|
.ram_wr_cmd_be(dma_ram_wr_cmd_be_int),
|
|
.ram_wr_cmd_addr(dma_ram_wr_cmd_addr_int),
|
|
.ram_wr_cmd_data(dma_ram_wr_cmd_data_int),
|
|
.ram_wr_cmd_valid(dma_ram_wr_cmd_valid_int),
|
|
.ram_wr_cmd_ready(dma_ram_wr_cmd_ready_int),
|
|
.ram_wr_done(dma_ram_wr_done_int),
|
|
|
|
/*
|
|
* Configuration
|
|
*/
|
|
.enable(1'b1),
|
|
.abort(1'b0)
|
|
);
|
|
|
|
endmodule
|
|
|
|
`resetall
|