From 67bfb947f43a218a4c820b0e588cebed66e8d1b8 Mon Sep 17 00:00:00 2001 From: Alex Forencich Date: Wed, 6 Aug 2025 15:09:04 -0700 Subject: [PATCH] zircon: Add TX buffer module Signed-off-by: Alex Forencich --- src/zircon/rtl/zircon_ip_tx_buffer.sv | 135 ++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 src/zircon/rtl/zircon_ip_tx_buffer.sv diff --git a/src/zircon/rtl/zircon_ip_tx_buffer.sv b/src/zircon/rtl/zircon_ip_tx_buffer.sv new file mode 100644 index 0000000..8462871 --- /dev/null +++ b/src/zircon/rtl/zircon_ip_tx_buffer.sv @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: CERN-OHL-S-2.0 +/* + +Copyright (c) 2025 FPGA Ninja, LLC + +Authors: +- Alex Forencich + +*/ + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * Zircon IP stack - TX packet buffer + */ +module zircon_ip_tx_buffer # +( + parameter N_UI = 4, + parameter TX_RAM_SIZE = 32768 +) +( + input wire logic clk, + input wire logic rst, + + /* + * Packet data input + */ + taxi_axis_if.snk s_axis_pkt_ui[N_UI], + + /* + * Metadata output + */ + taxi_axis_if.src m_axis_meta_len, + + /* + * Transfer command input and packet data output + */ + taxi_axis_if.src m_axis_pkt +); + +localparam DATA_W = m_axis_pkt.DATA_W; +localparam TX_USER_W = m_axis_pkt.USER_W; +localparam TX_TAG_W = m_axis_pkt.ID_W; + +taxi_axis_if #(.DATA_W(DATA_W), .USER_EN(1), .USER_W(TX_USER_W), .ID_EN(1), .ID_W(TX_TAG_W)) axis_pkt_1(); +taxi_axis_if #(.DATA_W(DATA_W), .USER_EN(1), .USER_W(TX_USER_W), .ID_EN(1), .ID_W(TX_TAG_W)) axis_pkt_2(); + +taxi_axis_arb_mux #( + .S_COUNT(N_UI), + .UPDATE_TID(1'b0), + .ARB_ROUND_ROBIN(1'b1), + .ARB_LSB_HIGH_PRIO(1'b1) +) +mux_inst ( + .clk(clk), + .rst(rst), + + /* + * AXI4-Stream inputs (sink) + */ + .s_axis(s_axis_pkt_ui), + + /* + * AXI4-Stream output (source) + */ + .m_axis(axis_pkt_1) +); + +zircon_ip_len_cksum #( + .START_OFFSET(0) +) +tx_len_cksum_inst ( + .clk(clk), + .rst(rst), + + /* + * Packet passthrough + */ + .s_axis_pkt(axis_pkt_1), + .m_axis_pkt(axis_pkt_2), + + /* + * Packet metadata output + */ + .m_axis_meta(m_axis_meta_len) +); + +taxi_axis_fifo #( + .DEPTH(TX_RAM_SIZE), + .RAM_PIPELINE(1), + .OUTPUT_FIFO_EN(1'b0), + .FRAME_FIFO(1'b0), + .USER_BAD_FRAME_VALUE(1'b1), + .USER_BAD_FRAME_MASK(1'b1), + .DROP_OVERSIZE_FRAME(1'b0), + .DROP_BAD_FRAME(1'b0), + .DROP_WHEN_FULL(1'b0), + .MARK_WHEN_FULL(1'b0), + .PAUSE_EN(1'b0) +) +tx_fifo_inst ( + .clk(clk), + .rst(rst), + + /* + * AXI4-Stream input (sink) + */ + .s_axis(axis_pkt_2), + + /* + * AXI4-Stream output (source) + */ + .m_axis(m_axis_pkt), + + /* + * Pause + */ + .pause_req(1'b0), + .pause_ack(), + + /* + * Status + */ + .status_depth(), + .status_depth_commit(), + .status_overflow(), + .status_bad_frame(), + .status_good_frame() +); + +endmodule + +`resetall