From f4e36bd081c3a77c62f44dec3030151b876eedd1 Mon Sep 17 00:00:00 2001 From: Alex Forencich Date: Thu, 2 Oct 2025 23:08:11 -0700 Subject: [PATCH] eth: Optimize padding logic in BASE-R MACs Signed-off-by: Alex Forencich --- src/eth/rtl/taxi_axis_baser_tx_32.sv | 20 ++++++++++---------- src/eth/rtl/taxi_axis_baser_tx_64.sv | 24 ++++++++++-------------- src/eth/rtl/taxi_axis_xgmii_tx_32.sv | 20 ++++++++++---------- src/eth/rtl/taxi_axis_xgmii_tx_64.sv | 24 ++++++++++-------------- 4 files changed, 40 insertions(+), 48 deletions(-) diff --git a/src/eth/rtl/taxi_axis_baser_tx_32.sv b/src/eth/rtl/taxi_axis_baser_tx_32.sv index c0cc096..9c94743 100644 --- a/src/eth/rtl/taxi_axis_baser_tx_32.sv +++ b/src/eth/rtl/taxi_axis_baser_tx_32.sv @@ -514,22 +514,22 @@ always_comb begin frame_oversize_next = frame_len_lim_reg < 4+4; end + if (PADDING_EN && frame_min_count_reg != 0) begin + if (frame_min_count_reg > MIN_LEN_W'(KEEP_W)) begin + s_empty_next = 0; + end else if (keep2empty(s_axis_tx.tkeep) > 2'(KEEP_W-frame_min_count_reg)) begin + s_empty_next = 2'(KEEP_W-frame_min_count_reg); + end + end + if (!s_axis_tx.tvalid || s_axis_tx.tlast || frame_oversize_next) begin s_axis_tx_tready_next = frame_next; // drop frame frame_error_next = !s_axis_tx.tvalid || s_axis_tx.tuser[0] || frame_oversize_next; stat_tx_err_user_next = s_axis_tx.tuser[0]; stat_tx_err_underflow_next = !s_axis_tx.tvalid; - if (PADDING_EN && frame_min_count_reg != 0) begin - if (frame_min_count_reg > MIN_LEN_W'(KEEP_W)) begin - s_empty_next = 0; - state_next = STATE_PAD; - end else begin - if (keep2empty(s_axis_tx.tkeep) > 2'(KEEP_W-frame_min_count_reg)) begin - s_empty_next = 2'(KEEP_W-frame_min_count_reg); - end - state_next = STATE_FCS_1; - end + if (PADDING_EN && frame_min_count_reg != 0 && frame_min_count_reg > MIN_LEN_W'(KEEP_W)) begin + state_next = STATE_PAD; end else begin state_next = STATE_FCS_1; end diff --git a/src/eth/rtl/taxi_axis_baser_tx_64.sv b/src/eth/rtl/taxi_axis_baser_tx_64.sv index 968ad29..6fa8cbf 100644 --- a/src/eth/rtl/taxi_axis_baser_tx_64.sv +++ b/src/eth/rtl/taxi_axis_baser_tx_64.sv @@ -527,26 +527,22 @@ always_comb begin frame_oversize_next = frame_len_lim_reg < 8+8; end + if (PADDING_EN && frame_min_count_reg != 0) begin + if (frame_min_count_reg > MIN_LEN_W'(KEEP_W)) begin + s_empty_next = 0; + end else if (keep2empty(s_axis_tx.tkeep) > 3'(KEEP_W-frame_min_count_reg)) begin + s_empty_next = 3'(KEEP_W-frame_min_count_reg); + end + end + if (!s_axis_tx.tvalid || s_axis_tx.tlast || frame_oversize_next) begin s_axis_tx_tready_next = frame_next; // drop frame frame_error_next = !s_axis_tx.tvalid || s_axis_tx.tuser[0] || frame_oversize_next; stat_tx_err_user_next = s_axis_tx.tuser[0]; stat_tx_err_underflow_next = !s_axis_tx.tvalid; - if (PADDING_EN && frame_min_count_reg != 0) begin - if (frame_min_count_reg > MIN_LEN_W'(KEEP_W)) begin - s_empty_next = 0; - state_next = STATE_PAD; - end else begin - if (keep2empty(s_axis_tx.tkeep) > 3'(KEEP_W-frame_min_count_reg)) begin - s_empty_next = 3'(KEEP_W-frame_min_count_reg); - end - if (frame_error_next) begin - state_next = STATE_ERR; - end else begin - state_next = STATE_FCS_1; - end - end + if (PADDING_EN && frame_min_count_reg != 0 && frame_min_count_reg > MIN_LEN_W'(KEEP_W)) begin + state_next = STATE_PAD; end else begin if (frame_error_next) begin state_next = STATE_ERR; diff --git a/src/eth/rtl/taxi_axis_xgmii_tx_32.sv b/src/eth/rtl/taxi_axis_xgmii_tx_32.sv index cc347d8..8207763 100644 --- a/src/eth/rtl/taxi_axis_xgmii_tx_32.sv +++ b/src/eth/rtl/taxi_axis_xgmii_tx_32.sv @@ -466,22 +466,22 @@ always_comb begin frame_oversize_next = frame_len_lim_reg < 4+4; end + if (PADDING_EN && frame_min_count_reg != 0) begin + if (frame_min_count_reg > MIN_LEN_W'(CTRL_W)) begin + s_empty_next = 0; + end else if (keep2empty(s_axis_tx.tkeep) > 2'(CTRL_W-frame_min_count_reg)) begin + s_empty_next = 2'(CTRL_W-frame_min_count_reg); + end + end + if (!s_axis_tx.tvalid || s_axis_tx.tlast || frame_oversize_next) begin s_axis_tx_tready_next = frame_next; // drop frame frame_error_next = !s_axis_tx.tvalid || s_axis_tx.tuser[0] || frame_oversize_next; stat_tx_err_user_next = s_axis_tx.tuser[0]; stat_tx_err_underflow_next = !s_axis_tx.tvalid; - if (PADDING_EN && frame_min_count_reg != 0) begin - if (frame_min_count_reg > MIN_LEN_W'(CTRL_W)) begin - s_empty_next = 0; - state_next = STATE_PAD; - end else begin - if (keep2empty(s_axis_tx.tkeep) > 2'(CTRL_W-frame_min_count_reg)) begin - s_empty_next = 2'(CTRL_W-frame_min_count_reg); - end - state_next = STATE_FCS_1; - end + if (PADDING_EN && frame_min_count_reg != 0 && frame_min_count_reg > MIN_LEN_W'(CTRL_W)) begin + state_next = STATE_PAD; end else begin state_next = STATE_FCS_1; end diff --git a/src/eth/rtl/taxi_axis_xgmii_tx_64.sv b/src/eth/rtl/taxi_axis_xgmii_tx_64.sv index e512a84..f92f550 100644 --- a/src/eth/rtl/taxi_axis_xgmii_tx_64.sv +++ b/src/eth/rtl/taxi_axis_xgmii_tx_64.sv @@ -471,26 +471,22 @@ always_comb begin frame_oversize_next = frame_len_lim_reg < 8+8; end + if (PADDING_EN && frame_min_count_reg != 0) begin + if (frame_min_count_reg > MIN_LEN_W'(CTRL_W)) begin + s_empty_next = 0; + end else if (keep2empty(s_axis_tx.tkeep) > 3'(CTRL_W-frame_min_count_reg)) begin + s_empty_next = 3'(CTRL_W-frame_min_count_reg); + end + end + if (!s_axis_tx.tvalid || s_axis_tx.tlast || frame_oversize_next) begin s_axis_tx_tready_next = frame_next; // drop frame frame_error_next = !s_axis_tx.tvalid || s_axis_tx.tuser[0] || frame_oversize_next; stat_tx_err_user_next = s_axis_tx.tuser[0]; stat_tx_err_underflow_next = !s_axis_tx.tvalid; - if (PADDING_EN && frame_min_count_reg != 0) begin - if (frame_min_count_reg > MIN_LEN_W'(CTRL_W)) begin - s_empty_next = 0; - state_next = STATE_PAD; - end else begin - if (keep2empty(s_axis_tx.tkeep) > 3'(CTRL_W-frame_min_count_reg)) begin - s_empty_next = 3'(CTRL_W-frame_min_count_reg); - end - if (frame_error_next) begin - state_next = STATE_ERR; - end else begin - state_next = STATE_FCS_1; - end - end + if (PADDING_EN && frame_min_count_reg != 0 && frame_min_count_reg > MIN_LEN_W'(CTRL_W)) begin + state_next = STATE_PAD; end else begin if (frame_error_next) begin state_next = STATE_ERR;