mirror of
https://github.com/fpganinja/taxi.git
synced 2026-05-17 21:10:55 -07:00
eth: Remove padding logic from 10G/25G MAC TX modules
Signed-off-by: Alex Forencich <alex@alexforencich.com>
This commit is contained in:
@@ -21,9 +21,7 @@ module taxi_axis_baser_tx_32 #
|
||||
parameter HDR_W = 2,
|
||||
parameter logic GBX_IF_EN = 1'b0,
|
||||
parameter GBX_CNT = 1,
|
||||
parameter logic PADDING_EN = 1'b1,
|
||||
parameter logic DIC_EN = 1'b1,
|
||||
parameter MIN_FRAME_LEN = 64,
|
||||
parameter logic PTP_TS_EN = 1'b0,
|
||||
parameter PTP_TS_W = 96,
|
||||
parameter logic TX_CPL_CTRL_IN_TUSER = 1'b1
|
||||
@@ -84,7 +82,6 @@ localparam USER_W = TX_CPL_CTRL_IN_TUSER ? 2 : 1;
|
||||
localparam TX_TAG_W = s_axis_tx.ID_W;
|
||||
|
||||
localparam EMPTY_W = $clog2(KEEP_W);
|
||||
localparam MIN_LEN_W = $clog2(MIN_FRAME_LEN-4-KEEP_W+1);
|
||||
|
||||
// check configuration
|
||||
if (DATA_W != 32)
|
||||
@@ -162,7 +159,6 @@ typedef enum logic [3:0] {
|
||||
STATE_IDLE,
|
||||
STATE_PREAMBLE,
|
||||
STATE_PAYLOAD,
|
||||
STATE_PAD,
|
||||
STATE_FCS_1,
|
||||
STATE_FCS_2,
|
||||
STATE_FCS_3,
|
||||
@@ -191,7 +187,6 @@ logic extra_cycle;
|
||||
logic frame_reg = 1'b0, frame_next;
|
||||
logic frame_error_reg = 1'b0, frame_error_next;
|
||||
logic frame_oversize_reg = 1'b0, frame_oversize_next;
|
||||
logic [MIN_LEN_W-1:0] frame_min_count_reg = '0, frame_min_count_next;
|
||||
logic [2:0] hdr_ptr_reg = '0, hdr_ptr_next;
|
||||
logic is_mcast_reg = 1'b0, is_mcast_next;
|
||||
logic is_bcast_reg = 1'b0, is_bcast_next;
|
||||
@@ -355,7 +350,6 @@ always_comb begin
|
||||
frame_next = frame_reg;
|
||||
frame_error_next = frame_error_reg;
|
||||
frame_oversize_next = frame_oversize_reg;
|
||||
frame_min_count_next = frame_min_count_reg;
|
||||
hdr_ptr_next = hdr_ptr_reg;
|
||||
is_mcast_next = is_mcast_reg;
|
||||
is_bcast_next = is_bcast_reg;
|
||||
@@ -415,13 +409,6 @@ always_comb begin
|
||||
state_next = state_reg;
|
||||
s_axis_tx_tready_next = s_axis_tx_tready_reg;
|
||||
end else begin
|
||||
// counter for min frame length enforcement
|
||||
if (frame_min_count_reg > MIN_LEN_W'(KEEP_W)) begin
|
||||
frame_min_count_next = MIN_LEN_W'(frame_min_count_reg - KEEP_W);
|
||||
end else begin
|
||||
frame_min_count_next = 0;
|
||||
end
|
||||
|
||||
// counter to measure frame length
|
||||
if (&frame_len_reg[15:2] == 0) begin
|
||||
frame_len_next = frame_len_reg + 16'(KEEP_W);
|
||||
@@ -468,7 +455,6 @@ always_comb begin
|
||||
// idle state - wait for data
|
||||
frame_error_next = 1'b0;
|
||||
frame_oversize_next = 1'b0;
|
||||
frame_min_count_next = MIN_LEN_W'(MIN_FRAME_LEN-4);
|
||||
hdr_ptr_next = 0;
|
||||
frame_len_next = 0;
|
||||
{frame_len_lim_cyc_next, frame_len_lim_last_next} = cfg_tx_max_pkt_len;
|
||||
@@ -538,50 +524,17 @@ always_comb begin
|
||||
end
|
||||
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 && frame_min_count_reg > MIN_LEN_W'(KEEP_W)) begin
|
||||
state_next = STATE_PAD;
|
||||
end else begin
|
||||
state_next = STATE_FCS_1;
|
||||
end
|
||||
state_next = STATE_FCS_1;
|
||||
end else begin
|
||||
state_next = STATE_PAYLOAD;
|
||||
end
|
||||
end
|
||||
STATE_PAD: begin
|
||||
// pad frame to MIN_FRAME_LEN
|
||||
s_axis_tx_tready_next = frame_next; // drop frame
|
||||
|
||||
output_data_next = s_tdata_reg;
|
||||
output_type_next = OUTPUT_TYPE_DATA;
|
||||
|
||||
s_tdata_next = 32'd0;
|
||||
s_empty_next = 0;
|
||||
|
||||
stat_tx_byte_next = 3'(KEEP_W);
|
||||
|
||||
update_crc = 1'b1;
|
||||
|
||||
if (frame_min_count_reg > MIN_LEN_W'(KEEP_W)) begin
|
||||
state_next = STATE_PAD;
|
||||
end else begin
|
||||
s_empty_next = 2'(KEEP_W-frame_min_count_reg);
|
||||
state_next = STATE_FCS_1;
|
||||
end
|
||||
end
|
||||
STATE_FCS_1: begin
|
||||
// last cycle
|
||||
s_axis_tx_tready_next = frame_next; // drop frame
|
||||
@@ -720,7 +673,6 @@ always_ff @(posedge clk) begin
|
||||
frame_reg <= frame_next;
|
||||
frame_error_reg <= frame_error_next;
|
||||
frame_oversize_reg <= frame_oversize_next;
|
||||
frame_min_count_reg <= frame_min_count_next;
|
||||
hdr_ptr_reg <= hdr_ptr_next;
|
||||
is_mcast_reg <= is_mcast_next;
|
||||
is_bcast_reg <= is_bcast_next;
|
||||
|
||||
@@ -21,9 +21,7 @@ module taxi_axis_baser_tx_64 #
|
||||
parameter HDR_W = 2,
|
||||
parameter logic GBX_IF_EN = 1'b0,
|
||||
parameter GBX_CNT = 1,
|
||||
parameter logic PADDING_EN = 1'b1,
|
||||
parameter logic DIC_EN = 1'b1,
|
||||
parameter MIN_FRAME_LEN = 64,
|
||||
parameter logic PTP_TS_EN = 1'b0,
|
||||
parameter logic PTP_TS_FMT_TOD = 1'b1,
|
||||
parameter PTP_TS_W = PTP_TS_FMT_TOD ? 96 : 64,
|
||||
@@ -85,7 +83,6 @@ localparam USER_W = TX_CPL_CTRL_IN_TUSER ? 2 : 1;
|
||||
localparam TX_TAG_W = s_axis_tx.ID_W;
|
||||
|
||||
localparam EMPTY_W = $clog2(KEEP_W);
|
||||
localparam MIN_LEN_W = $clog2(MIN_FRAME_LEN-4-KEEP_W+1);
|
||||
|
||||
// check configuration
|
||||
if (DATA_W != 64)
|
||||
@@ -167,7 +164,6 @@ typedef enum logic [3:0] {
|
||||
typedef enum logic [2:0] {
|
||||
STATE_IDLE,
|
||||
STATE_PAYLOAD,
|
||||
STATE_PAD,
|
||||
STATE_FCS_1,
|
||||
STATE_FCS_2,
|
||||
STATE_ERR,
|
||||
@@ -200,7 +196,6 @@ logic frame_start_reg = 1'b0, frame_start_next;
|
||||
logic frame_reg = 1'b0, frame_next;
|
||||
logic frame_error_reg = 1'b0, frame_error_next;
|
||||
logic frame_oversize_reg = 1'b0, frame_oversize_next;
|
||||
logic [MIN_LEN_W-1:0] frame_min_count_reg = '0, frame_min_count_next;
|
||||
logic [1:0] hdr_ptr_reg = '0, hdr_ptr_next;
|
||||
logic is_mcast_reg = 1'b0, is_mcast_next;
|
||||
logic is_bcast_reg = 1'b0, is_bcast_next;
|
||||
@@ -399,7 +394,6 @@ always_comb begin
|
||||
frame_next = frame_reg;
|
||||
frame_error_next = frame_error_reg;
|
||||
frame_oversize_next = frame_oversize_reg;
|
||||
frame_min_count_next = frame_min_count_reg;
|
||||
hdr_ptr_next = hdr_ptr_reg;
|
||||
is_mcast_next = is_mcast_reg;
|
||||
is_bcast_next = is_bcast_reg;
|
||||
@@ -445,13 +439,6 @@ always_comb begin
|
||||
frame_start_next = frame_start_reg;
|
||||
s_axis_tx_tready_next = s_axis_tx_tready_reg;
|
||||
end else begin
|
||||
// counter for min frame length enforcement
|
||||
if (frame_min_count_reg > MIN_LEN_W'(KEEP_W)) begin
|
||||
frame_min_count_next = MIN_LEN_W'(frame_min_count_reg - KEEP_W);
|
||||
end else begin
|
||||
frame_min_count_next = 0;
|
||||
end
|
||||
|
||||
// counter to measure frame length
|
||||
if (&frame_len_reg[15:3] == 0) begin
|
||||
frame_len_next = frame_len_reg + 16'(KEEP_W);
|
||||
@@ -503,7 +490,6 @@ always_comb begin
|
||||
// idle state - wait for data
|
||||
frame_error_next = 1'b0;
|
||||
frame_oversize_next = 1'b0;
|
||||
frame_min_count_next = MIN_LEN_W'(MIN_FRAME_LEN-4-KEEP_W);
|
||||
hdr_ptr_next = 0;
|
||||
frame_len_next = 0;
|
||||
{frame_len_lim_cyc_next, frame_len_lim_last_next} = cfg_tx_max_pkt_len ^ 4;
|
||||
@@ -559,56 +545,19 @@ always_comb begin
|
||||
end
|
||||
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 && 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;
|
||||
end else begin
|
||||
state_next = STATE_FCS_1;
|
||||
end
|
||||
end
|
||||
end else begin
|
||||
state_next = STATE_PAYLOAD;
|
||||
end
|
||||
end
|
||||
STATE_PAD: begin
|
||||
// pad frame to MIN_FRAME_LEN
|
||||
s_axis_tx_tready_next = frame_next; // drop frame
|
||||
|
||||
output_data_next = s_tdata_reg;
|
||||
output_type_next = OUTPUT_TYPE_DATA;
|
||||
|
||||
s_tdata_next = 64'd0;
|
||||
s_empty_next = 0;
|
||||
|
||||
stat_tx_byte_next = 4'(KEEP_W);
|
||||
|
||||
update_crc = 1'b1;
|
||||
|
||||
if (frame_min_count_reg > MIN_LEN_W'(KEEP_W)) begin
|
||||
state_next = STATE_PAD;
|
||||
end else begin
|
||||
s_empty_next = 3'(KEEP_W-frame_min_count_reg);
|
||||
if (frame_error_reg) begin
|
||||
if (frame_error_next) begin
|
||||
state_next = STATE_ERR;
|
||||
end else begin
|
||||
state_next = STATE_FCS_1;
|
||||
end
|
||||
end else begin
|
||||
state_next = STATE_PAYLOAD;
|
||||
end
|
||||
end
|
||||
STATE_FCS_1: begin
|
||||
@@ -762,7 +711,6 @@ always_ff @(posedge clk) begin
|
||||
frame_reg <= frame_next;
|
||||
frame_error_reg <= frame_error_next;
|
||||
frame_oversize_reg <= frame_oversize_next;
|
||||
frame_min_count_reg <= frame_min_count_next;
|
||||
hdr_ptr_reg <= hdr_ptr_next;
|
||||
is_mcast_reg <= is_mcast_next;
|
||||
is_bcast_reg <= is_bcast_next;
|
||||
|
||||
@@ -21,9 +21,7 @@ module taxi_axis_xgmii_tx_32 #
|
||||
parameter CTRL_W = (DATA_W/8),
|
||||
parameter logic GBX_IF_EN = 1'b0,
|
||||
parameter GBX_CNT = 1,
|
||||
parameter logic PADDING_EN = 1'b1,
|
||||
parameter logic DIC_EN = 1'b1,
|
||||
parameter MIN_FRAME_LEN = 64,
|
||||
parameter logic PTP_TS_EN = 1'b0,
|
||||
parameter PTP_TS_W = 96,
|
||||
parameter logic TX_CPL_CTRL_IN_TUSER = 1'b1
|
||||
@@ -83,7 +81,6 @@ localparam USER_W = TX_CPL_CTRL_IN_TUSER ? 2 : 1;
|
||||
localparam TX_TAG_W = s_axis_tx.ID_W;
|
||||
|
||||
localparam EMPTY_W = $clog2(KEEP_W);
|
||||
localparam MIN_LEN_W = $clog2(MIN_FRAME_LEN-4-CTRL_W+1);
|
||||
|
||||
// check configuration
|
||||
if (DATA_W != 32)
|
||||
@@ -123,7 +120,6 @@ typedef enum logic [3:0] {
|
||||
STATE_IDLE,
|
||||
STATE_PREAMBLE,
|
||||
STATE_PAYLOAD,
|
||||
STATE_PAD,
|
||||
STATE_FCS_1,
|
||||
STATE_FCS_2,
|
||||
STATE_FCS_3,
|
||||
@@ -152,7 +148,6 @@ logic extra_cycle;
|
||||
logic frame_reg = 1'b0, frame_next;
|
||||
logic frame_error_reg = 1'b0, frame_error_next;
|
||||
logic frame_oversize_reg = 1'b0, frame_oversize_next;
|
||||
logic [MIN_LEN_W-1:0] frame_min_count_reg = '0, frame_min_count_next;
|
||||
logic [2:0] hdr_ptr_reg = '0, hdr_ptr_next;
|
||||
logic is_mcast_reg = 1'b0, is_mcast_next;
|
||||
logic is_bcast_reg = 1'b0, is_bcast_next;
|
||||
@@ -309,7 +304,6 @@ always_comb begin
|
||||
frame_next = frame_reg;
|
||||
frame_error_next = frame_error_reg;
|
||||
frame_oversize_next = frame_oversize_reg;
|
||||
frame_min_count_next = frame_min_count_reg;
|
||||
hdr_ptr_next = hdr_ptr_reg;
|
||||
is_mcast_next = is_mcast_reg;
|
||||
is_bcast_next = is_bcast_reg;
|
||||
@@ -371,13 +365,6 @@ always_comb begin
|
||||
// frame_start_next = frame_start_reg;
|
||||
s_axis_tx_tready_next = s_axis_tx_tready_reg;
|
||||
end else begin
|
||||
// counter for min frame length enforcement
|
||||
if (frame_min_count_reg > MIN_LEN_W'(CTRL_W)) begin
|
||||
frame_min_count_next = MIN_LEN_W'(frame_min_count_reg - CTRL_W);
|
||||
end else begin
|
||||
frame_min_count_next = 0;
|
||||
end
|
||||
|
||||
// counter to measure frame length
|
||||
if (&frame_len_reg[15:2] == 0) begin
|
||||
frame_len_next = frame_len_reg + 16'(CTRL_W);
|
||||
@@ -424,7 +411,6 @@ always_comb begin
|
||||
// idle state - wait for data
|
||||
frame_error_next = 1'b0;
|
||||
frame_oversize_next = 1'b0;
|
||||
frame_min_count_next = MIN_LEN_W'(MIN_FRAME_LEN-4);
|
||||
hdr_ptr_next = 0;
|
||||
frame_len_next = 0;
|
||||
{frame_len_lim_cyc_next, frame_len_lim_last_next} = cfg_tx_max_pkt_len;
|
||||
@@ -495,50 +481,17 @@ always_comb begin
|
||||
end
|
||||
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 && frame_min_count_reg > MIN_LEN_W'(CTRL_W)) begin
|
||||
state_next = STATE_PAD;
|
||||
end else begin
|
||||
state_next = STATE_FCS_1;
|
||||
end
|
||||
state_next = STATE_FCS_1;
|
||||
end else begin
|
||||
state_next = STATE_PAYLOAD;
|
||||
end
|
||||
end
|
||||
STATE_PAD: begin
|
||||
// pad frame to MIN_FRAME_LEN
|
||||
s_axis_tx_tready_next = frame_next; // drop frame
|
||||
|
||||
xgmii_txd_next = s_tdata_reg;
|
||||
xgmii_txc_next = {CTRL_W{1'b0}};
|
||||
|
||||
s_tdata_next = 32'd0;
|
||||
s_empty_next = 0;
|
||||
|
||||
stat_tx_byte_next = 3'(CTRL_W);
|
||||
|
||||
update_crc = 1'b1;
|
||||
|
||||
if (frame_min_count_reg > MIN_LEN_W'(CTRL_W)) begin
|
||||
state_next = STATE_PAD;
|
||||
end else begin
|
||||
s_empty_next = 2'(CTRL_W-frame_min_count_reg);
|
||||
state_next = STATE_FCS_1;
|
||||
end
|
||||
end
|
||||
STATE_FCS_1: begin
|
||||
// last cycle
|
||||
s_axis_tx_tready_next = frame_next; // drop frame
|
||||
@@ -679,7 +632,6 @@ always_ff @(posedge clk) begin
|
||||
frame_reg <= frame_next;
|
||||
frame_error_reg <= frame_error_next;
|
||||
frame_oversize_reg <= frame_oversize_next;
|
||||
frame_min_count_reg <= frame_min_count_next;
|
||||
hdr_ptr_reg <= hdr_ptr_next;
|
||||
is_mcast_reg <= is_mcast_next;
|
||||
is_bcast_reg <= is_bcast_next;
|
||||
|
||||
@@ -21,9 +21,7 @@ module taxi_axis_xgmii_tx_64 #
|
||||
parameter CTRL_W = (DATA_W/8),
|
||||
parameter logic GBX_IF_EN = 1'b0,
|
||||
parameter GBX_CNT = 1,
|
||||
parameter logic PADDING_EN = 1'b1,
|
||||
parameter logic DIC_EN = 1'b1,
|
||||
parameter MIN_FRAME_LEN = 64,
|
||||
parameter logic PTP_TS_EN = 1'b0,
|
||||
parameter logic PTP_TS_FMT_TOD = 1'b1,
|
||||
parameter PTP_TS_W = PTP_TS_FMT_TOD ? 96 : 64,
|
||||
@@ -84,7 +82,6 @@ localparam USER_W = TX_CPL_CTRL_IN_TUSER ? 2 : 1;
|
||||
localparam TX_TAG_W = s_axis_tx.ID_W;
|
||||
|
||||
localparam EMPTY_W = $clog2(KEEP_W);
|
||||
localparam MIN_LEN_W = $clog2(MIN_FRAME_LEN-4-CTRL_W+1);
|
||||
|
||||
// check configuration
|
||||
if (DATA_W != 64)
|
||||
@@ -123,7 +120,6 @@ typedef enum logic [7:0] {
|
||||
typedef enum logic [2:0] {
|
||||
STATE_IDLE,
|
||||
STATE_PAYLOAD,
|
||||
STATE_PAD,
|
||||
STATE_FCS_1,
|
||||
STATE_FCS_2,
|
||||
STATE_ERR,
|
||||
@@ -154,7 +150,6 @@ logic frame_start_reg = 1'b0, frame_start_next;
|
||||
logic frame_reg = 1'b0, frame_next;
|
||||
logic frame_error_reg = 1'b0, frame_error_next;
|
||||
logic frame_oversize_reg = 1'b0, frame_oversize_next;
|
||||
logic [MIN_LEN_W-1:0] frame_min_count_reg = '0, frame_min_count_next;
|
||||
logic [1:0] hdr_ptr_reg = '0, hdr_ptr_next;
|
||||
logic is_mcast_reg = 1'b0, is_mcast_next;
|
||||
logic is_bcast_reg = 1'b0, is_bcast_next;
|
||||
@@ -348,7 +343,6 @@ always_comb begin
|
||||
frame_next = frame_reg;
|
||||
frame_error_next = frame_error_reg;
|
||||
frame_oversize_next = frame_oversize_reg;
|
||||
frame_min_count_next = frame_min_count_reg;
|
||||
hdr_ptr_next = hdr_ptr_reg;
|
||||
is_mcast_next = is_mcast_reg;
|
||||
is_bcast_next = is_bcast_reg;
|
||||
@@ -395,13 +389,6 @@ always_comb begin
|
||||
frame_start_next = frame_start_reg;
|
||||
s_axis_tx_tready_next = s_axis_tx_tready_reg;
|
||||
end else begin
|
||||
// counter for min frame length enforcement
|
||||
if (frame_min_count_reg > MIN_LEN_W'(CTRL_W)) begin
|
||||
frame_min_count_next = MIN_LEN_W'(frame_min_count_reg - CTRL_W);
|
||||
end else begin
|
||||
frame_min_count_next = 0;
|
||||
end
|
||||
|
||||
// counter to measure frame length
|
||||
if (&frame_len_reg[15:3] == 0) begin
|
||||
frame_len_next = frame_len_reg + 16'(CTRL_W);
|
||||
@@ -453,7 +440,6 @@ always_comb begin
|
||||
// idle state - wait for data
|
||||
frame_error_next = 1'b0;
|
||||
frame_oversize_next = 1'b0;
|
||||
frame_min_count_next = MIN_LEN_W'(MIN_FRAME_LEN-4-CTRL_W);
|
||||
hdr_ptr_next = 0;
|
||||
frame_len_next = 0;
|
||||
{frame_len_lim_cyc_next, frame_len_lim_last_next} = cfg_tx_max_pkt_len ^ 4;
|
||||
@@ -510,56 +496,19 @@ always_comb begin
|
||||
end
|
||||
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 && 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;
|
||||
end else begin
|
||||
state_next = STATE_FCS_1;
|
||||
end
|
||||
end
|
||||
end else begin
|
||||
state_next = STATE_PAYLOAD;
|
||||
end
|
||||
end
|
||||
STATE_PAD: begin
|
||||
// pad frame to MIN_FRAME_LEN
|
||||
s_axis_tx_tready_next = frame_next; // drop frame
|
||||
|
||||
xgmii_txd_next = s_tdata_reg;
|
||||
xgmii_txc_next = {CTRL_W{1'b0}};
|
||||
|
||||
s_tdata_next = 64'd0;
|
||||
s_empty_next = 0;
|
||||
|
||||
stat_tx_byte_next = 4'(CTRL_W);
|
||||
|
||||
update_crc = 1'b1;
|
||||
|
||||
if (frame_min_count_reg > MIN_LEN_W'(CTRL_W)) begin
|
||||
state_next = STATE_PAD;
|
||||
end else begin
|
||||
s_empty_next = 3'(CTRL_W-frame_min_count_reg);
|
||||
if (frame_error_reg) begin
|
||||
if (frame_error_next) begin
|
||||
state_next = STATE_ERR;
|
||||
end else begin
|
||||
state_next = STATE_FCS_1;
|
||||
end
|
||||
end else begin
|
||||
state_next = STATE_PAYLOAD;
|
||||
end
|
||||
end
|
||||
STATE_FCS_1: begin
|
||||
@@ -711,7 +660,6 @@ always_ff @(posedge clk) begin
|
||||
frame_reg <= frame_next;
|
||||
frame_error_reg <= frame_error_next;
|
||||
frame_oversize_reg <= frame_oversize_next;
|
||||
frame_min_count_reg <= frame_min_count_next;
|
||||
hdr_ptr_reg <= hdr_ptr_next;
|
||||
is_mcast_reg <= is_mcast_next;
|
||||
is_bcast_reg <= is_bcast_next;
|
||||
|
||||
@@ -445,7 +445,6 @@ if (DATA_W == 64) begin
|
||||
.CTRL_W(CTRL_W),
|
||||
.GBX_IF_EN(TX_GBX_IF_EN),
|
||||
.GBX_CNT(GBX_CNT),
|
||||
.PADDING_EN(1'b0),
|
||||
.DIC_EN(DIC_EN),
|
||||
.PTP_TS_EN(PTP_TS_EN),
|
||||
.PTP_TS_FMT_TOD(PTP_TS_FMT_TOD),
|
||||
@@ -566,7 +565,6 @@ end else if (DATA_W == 32) begin
|
||||
.CTRL_W(CTRL_W),
|
||||
.GBX_IF_EN(TX_GBX_IF_EN),
|
||||
.GBX_CNT(GBX_CNT),
|
||||
.PADDING_EN(1'b0),
|
||||
.DIC_EN(DIC_EN),
|
||||
.PTP_TS_EN(PTP_TS_EN),
|
||||
.PTP_TS_W(PTP_TS_W),
|
||||
|
||||
@@ -140,7 +140,6 @@ if (DATA_W == 64) begin
|
||||
.HDR_W(HDR_W),
|
||||
.GBX_IF_EN(GBX_IF_EN),
|
||||
.GBX_CNT(1),
|
||||
.PADDING_EN(1'b0),
|
||||
.DIC_EN(DIC_EN),
|
||||
.PTP_TS_EN(PTP_TS_EN),
|
||||
.PTP_TS_FMT_TOD(PTP_TS_FMT_TOD),
|
||||
@@ -204,7 +203,6 @@ end else begin
|
||||
.HDR_W(HDR_W),
|
||||
.GBX_IF_EN(GBX_IF_EN),
|
||||
.GBX_CNT(1),
|
||||
.PADDING_EN(1'b0),
|
||||
.DIC_EN(DIC_EN),
|
||||
.PTP_TS_EN(PTP_TS_EN),
|
||||
.PTP_TS_W(PTP_TS_W),
|
||||
|
||||
@@ -38,9 +38,7 @@ export PARAM_DATA_W := 32
|
||||
export PARAM_HDR_W := 2
|
||||
export PARAM_GBX_IF_EN := 1
|
||||
export PARAM_GBX_CNT := 1
|
||||
export PARAM_PADDING_EN := 1
|
||||
export PARAM_DIC_EN := 1
|
||||
export PARAM_MIN_FRAME_LEN := 64
|
||||
export PARAM_PTP_TS_EN := 1
|
||||
export PARAM_PTP_TS_FMT_TOD := 1
|
||||
export PARAM_PTP_TS_W := $(if $(filter-out 1,$(PARAM_PTP_TS_FMT_TOD)),64,96)
|
||||
|
||||
@@ -132,7 +132,7 @@ async def run_test(dut, gbx_cfg=None, payload_lengths=None, payload_data=None, i
|
||||
|
||||
for test_data in test_frames:
|
||||
await tb.source.send(AxiStreamFrame(test_data, tid=0, tuser=0))
|
||||
total_bytes += max(len(test_data), 60)+4
|
||||
total_bytes += len(test_data)+4
|
||||
total_pkts += 1
|
||||
|
||||
for test_data in test_frames:
|
||||
@@ -151,7 +151,7 @@ async def run_test(dut, gbx_cfg=None, payload_lengths=None, payload_data=None, i
|
||||
tb.log.info("RX frame SFD sim time: %f ns", rx_frame_sfd_ns)
|
||||
tb.log.info("Difference: %f ns", abs(rx_frame_sfd_ns - ptp_ts_ns))
|
||||
|
||||
assert rx_frame.get_payload() == test_data.ljust(60, b'\x00')
|
||||
assert rx_frame.get_payload() == test_data
|
||||
assert rx_frame.check_fcs()
|
||||
assert rx_frame.ctrl is None
|
||||
if gbx_cfg is None:
|
||||
@@ -224,8 +224,8 @@ async def run_test_underrun(dut, gbx_cfg=None, ifg=12):
|
||||
for stat, val in tb.stats.items():
|
||||
tb.log.info("%s: %d", stat, val)
|
||||
|
||||
assert tb.stats["stat_tx_byte"] > 64*2 + 32
|
||||
assert tb.stats["stat_tx_pkt_len"] > 64*2 + 32
|
||||
assert tb.stats["stat_tx_byte"] > 64*2 + 8
|
||||
assert tb.stats["stat_tx_pkt_len"] > 64*2 + 8
|
||||
assert tb.stats["stat_tx_pkt_ucast"] == 3
|
||||
assert tb.stats["stat_tx_pkt_mcast"] == 0
|
||||
assert tb.stats["stat_tx_pkt_bcast"] == 0
|
||||
@@ -465,9 +465,7 @@ def test_taxi_axis_baser_tx_32(request, gbx_en, dic_en):
|
||||
parameters['HDR_W'] = 2
|
||||
parameters['GBX_IF_EN'] = gbx_en
|
||||
parameters['GBX_CNT'] = 1
|
||||
parameters['PADDING_EN'] = 1
|
||||
parameters['DIC_EN'] = dic_en
|
||||
parameters['MIN_FRAME_LEN'] = 64
|
||||
parameters['PTP_TS_EN'] = 1
|
||||
parameters['PTP_TS_FMT_TOD'] = 1
|
||||
parameters['PTP_TS_W'] = 96 if parameters['PTP_TS_FMT_TOD'] else 64
|
||||
|
||||
@@ -22,9 +22,7 @@ module test_taxi_axis_baser_tx_32 #
|
||||
parameter HDR_W = 2,
|
||||
parameter logic GBX_IF_EN = 1'b0,
|
||||
parameter GBX_CNT = 1,
|
||||
parameter logic PADDING_EN = 1'b1,
|
||||
parameter logic DIC_EN = 1'b1,
|
||||
parameter MIN_FRAME_LEN = 64,
|
||||
parameter logic PTP_TS_EN = 1'b0,
|
||||
parameter logic PTP_TS_FMT_TOD = 1'b1,
|
||||
parameter PTP_TS_W = PTP_TS_FMT_TOD ? 96 : 64,
|
||||
@@ -73,9 +71,7 @@ taxi_axis_baser_tx_32 #(
|
||||
.DATA_W(DATA_W),
|
||||
.HDR_W(HDR_W),
|
||||
.GBX_IF_EN(GBX_IF_EN),
|
||||
.PADDING_EN(PADDING_EN),
|
||||
.DIC_EN(DIC_EN),
|
||||
.MIN_FRAME_LEN(MIN_FRAME_LEN),
|
||||
.PTP_TS_EN(PTP_TS_EN),
|
||||
.PTP_TS_W(PTP_TS_W),
|
||||
.TX_CPL_CTRL_IN_TUSER(TX_CPL_CTRL_IN_TUSER)
|
||||
|
||||
@@ -38,9 +38,7 @@ export PARAM_DATA_W := 64
|
||||
export PARAM_HDR_W := 2
|
||||
export PARAM_GBX_IF_EN := 1
|
||||
export PARAM_GBX_CNT := 1
|
||||
export PARAM_PADDING_EN := 1
|
||||
export PARAM_DIC_EN := 1
|
||||
export PARAM_MIN_FRAME_LEN := 64
|
||||
export PARAM_PTP_TS_EN := 1
|
||||
export PARAM_PTP_TS_FMT_TOD := 1
|
||||
export PARAM_PTP_TS_W := $(if $(filter-out 1,$(PARAM_PTP_TS_FMT_TOD)),64,96)
|
||||
|
||||
@@ -132,7 +132,7 @@ async def run_test(dut, gbx_cfg=None, payload_lengths=None, payload_data=None, i
|
||||
|
||||
for test_data in test_frames:
|
||||
await tb.source.send(AxiStreamFrame(test_data, tid=0, tuser=0))
|
||||
total_bytes += max(len(test_data), 60)+4
|
||||
total_bytes += len(test_data)+4
|
||||
total_pkts += 1
|
||||
|
||||
for test_data in test_frames:
|
||||
@@ -151,7 +151,7 @@ async def run_test(dut, gbx_cfg=None, payload_lengths=None, payload_data=None, i
|
||||
tb.log.info("RX frame SFD sim time: %f ns", rx_frame_sfd_ns)
|
||||
tb.log.info("Difference: %f ns", abs(rx_frame_sfd_ns - ptp_ts_ns))
|
||||
|
||||
assert rx_frame.get_payload() == test_data.ljust(60, b'\x00')
|
||||
assert rx_frame.get_payload() == test_data
|
||||
assert rx_frame.check_fcs()
|
||||
assert rx_frame.ctrl is None
|
||||
if gbx_cfg is None:
|
||||
@@ -337,8 +337,8 @@ async def run_test_underrun(dut, gbx_cfg=None, ifg=12):
|
||||
for stat, val in tb.stats.items():
|
||||
tb.log.info("%s: %d", stat, val)
|
||||
|
||||
assert tb.stats["stat_tx_byte"] > 64*2 + 32
|
||||
assert tb.stats["stat_tx_pkt_len"] > 64*2 + 32
|
||||
assert tb.stats["stat_tx_byte"] > 64*2 + 8
|
||||
assert tb.stats["stat_tx_pkt_len"] > 64*2 + 8
|
||||
assert tb.stats["stat_tx_pkt_ucast"] == 3
|
||||
assert tb.stats["stat_tx_pkt_mcast"] == 0
|
||||
assert tb.stats["stat_tx_pkt_bcast"] == 0
|
||||
@@ -584,9 +584,7 @@ def test_taxi_axis_baser_tx_64(request, gbx_en, dic_en):
|
||||
parameters['HDR_W'] = 2
|
||||
parameters['GBX_IF_EN'] = gbx_en
|
||||
parameters['GBX_CNT'] = 1
|
||||
parameters['PADDING_EN'] = 1
|
||||
parameters['DIC_EN'] = dic_en
|
||||
parameters['MIN_FRAME_LEN'] = 64
|
||||
parameters['PTP_TS_EN'] = 1
|
||||
parameters['PTP_TS_FMT_TOD'] = 1
|
||||
parameters['PTP_TS_W'] = 96 if parameters['PTP_TS_FMT_TOD'] else 64
|
||||
|
||||
@@ -22,9 +22,7 @@ module test_taxi_axis_baser_tx_64 #
|
||||
parameter HDR_W = 2,
|
||||
parameter logic GBX_IF_EN = 1'b0,
|
||||
parameter GBX_CNT = 1,
|
||||
parameter logic PADDING_EN = 1'b1,
|
||||
parameter logic DIC_EN = 1'b1,
|
||||
parameter MIN_FRAME_LEN = 64,
|
||||
parameter logic PTP_TS_EN = 1'b0,
|
||||
parameter logic PTP_TS_FMT_TOD = 1'b1,
|
||||
parameter PTP_TS_W = PTP_TS_FMT_TOD ? 96 : 64,
|
||||
@@ -73,9 +71,7 @@ taxi_axis_baser_tx_64 #(
|
||||
.DATA_W(DATA_W),
|
||||
.HDR_W(HDR_W),
|
||||
.GBX_IF_EN(GBX_IF_EN),
|
||||
.PADDING_EN(PADDING_EN),
|
||||
.DIC_EN(DIC_EN),
|
||||
.MIN_FRAME_LEN(MIN_FRAME_LEN),
|
||||
.PTP_TS_EN(PTP_TS_EN),
|
||||
.PTP_TS_W(PTP_TS_W),
|
||||
.TX_CPL_CTRL_IN_TUSER(TX_CPL_CTRL_IN_TUSER)
|
||||
|
||||
@@ -37,9 +37,7 @@ VERILOG_SOURCES := $(call uniq_base,$(call process_f_files,$(VERILOG_SOURCES)))
|
||||
export PARAM_DATA_W := 32
|
||||
export PARAM_GBX_IF_EN := 0
|
||||
export PARAM_GBX_CNT := 1
|
||||
export PARAM_PADDING_EN := 1
|
||||
export PARAM_DIC_EN := 1
|
||||
export PARAM_MIN_FRAME_LEN := 64
|
||||
export PARAM_PTP_TS_EN := 1
|
||||
export PARAM_PTP_TS_W := 96
|
||||
export PARAM_TX_TAG_W := 16
|
||||
|
||||
@@ -102,7 +102,7 @@ async def run_test(dut, payload_lengths=None, payload_data=None, ifg=12):
|
||||
|
||||
for test_data in test_frames:
|
||||
await tb.source.send(AxiStreamFrame(test_data, tid=0, tuser=0))
|
||||
total_bytes += max(len(test_data), 60)+4
|
||||
total_bytes += len(test_data)+4
|
||||
total_pkts += 1
|
||||
|
||||
for test_data in test_frames:
|
||||
@@ -117,7 +117,7 @@ async def run_test(dut, payload_lengths=None, payload_data=None, ifg=12):
|
||||
tb.log.info("RX frame SFD sim time: %f ns", rx_frame_sfd_ns)
|
||||
tb.log.info("Difference: %f ns", abs(rx_frame_sfd_ns - ptp_ts_ns))
|
||||
|
||||
assert rx_frame.get_payload() == test_data.ljust(60, b'\x00')
|
||||
assert rx_frame.get_payload() == test_data
|
||||
assert rx_frame.check_fcs()
|
||||
assert rx_frame.ctrl is None
|
||||
assert abs(rx_frame_sfd_ns - ptp_ts_ns - 3.2) < 0.01
|
||||
@@ -292,8 +292,8 @@ async def run_test_underrun(dut, ifg=12):
|
||||
tb.log.info("%s: %d", stat, val)
|
||||
|
||||
assert tb.stats["tx_start_packet"] == 3
|
||||
assert tb.stats["stat_tx_byte"] > 64*2 + 32
|
||||
assert tb.stats["stat_tx_pkt_len"] > 64*2 + 32
|
||||
assert tb.stats["stat_tx_byte"] > 64*2 + 8
|
||||
assert tb.stats["stat_tx_pkt_len"] > 64*2 + 8
|
||||
assert tb.stats["stat_tx_pkt_ucast"] == 3
|
||||
assert tb.stats["stat_tx_pkt_mcast"] == 0
|
||||
assert tb.stats["stat_tx_pkt_bcast"] == 0
|
||||
@@ -522,9 +522,7 @@ def test_taxi_axis_xgmii_tx_32(request, dic_en):
|
||||
parameters['DATA_W'] = 32
|
||||
parameters['GBX_IF_EN'] = 0
|
||||
parameters['GBX_CNT'] = 1
|
||||
parameters['PADDING_EN'] = 1
|
||||
parameters['DIC_EN'] = dic_en
|
||||
parameters['MIN_FRAME_LEN'] = 64
|
||||
parameters['PTP_TS_EN'] = 1
|
||||
parameters['PTP_TS_W'] = 96
|
||||
parameters['TX_TAG_W'] = 16
|
||||
|
||||
@@ -21,9 +21,7 @@ module test_taxi_axis_xgmii_tx_32 #
|
||||
parameter DATA_W = 32,
|
||||
parameter logic GBX_IF_EN = 1'b0,
|
||||
parameter GBX_CNT = 1,
|
||||
parameter logic PADDING_EN = 1'b1,
|
||||
parameter logic DIC_EN = 1'b1,
|
||||
parameter MIN_FRAME_LEN = 64,
|
||||
parameter logic PTP_TS_EN = 1'b0,
|
||||
parameter PTP_TS_W = 96,
|
||||
parameter TX_TAG_W = 16,
|
||||
@@ -72,9 +70,7 @@ taxi_axis_xgmii_tx_32 #(
|
||||
.CTRL_W(CTRL_W),
|
||||
.GBX_IF_EN(GBX_IF_EN),
|
||||
.GBX_CNT(GBX_CNT),
|
||||
.PADDING_EN(PADDING_EN),
|
||||
.DIC_EN(DIC_EN),
|
||||
.MIN_FRAME_LEN(MIN_FRAME_LEN),
|
||||
.PTP_TS_EN(PTP_TS_EN),
|
||||
.PTP_TS_W(PTP_TS_W),
|
||||
.TX_CPL_CTRL_IN_TUSER(TX_CPL_CTRL_IN_TUSER)
|
||||
|
||||
@@ -37,9 +37,7 @@ VERILOG_SOURCES := $(call uniq_base,$(call process_f_files,$(VERILOG_SOURCES)))
|
||||
export PARAM_DATA_W := 64
|
||||
export PARAM_GBX_IF_EN := 0
|
||||
export PARAM_GBX_CNT := 1
|
||||
export PARAM_PADDING_EN := 1
|
||||
export PARAM_DIC_EN := 1
|
||||
export PARAM_MIN_FRAME_LEN := 64
|
||||
export PARAM_PTP_TS_EN := 1
|
||||
export PARAM_PTP_TS_FMT_TOD := 1
|
||||
export PARAM_PTP_TS_W := $(if $(filter-out 1,$(PARAM_PTP_TS_FMT_TOD)),64,96)
|
||||
|
||||
@@ -101,7 +101,7 @@ async def run_test(dut, payload_lengths=None, payload_data=None, ifg=12):
|
||||
|
||||
for test_data in test_frames:
|
||||
await tb.source.send(AxiStreamFrame(test_data, tid=0, tuser=0))
|
||||
total_bytes += max(len(test_data), 60)+4
|
||||
total_bytes += len(test_data)+4
|
||||
total_pkts += 1
|
||||
|
||||
for test_data in test_frames:
|
||||
@@ -120,7 +120,7 @@ async def run_test(dut, payload_lengths=None, payload_data=None, ifg=12):
|
||||
tb.log.info("RX frame SFD sim time: %f ns", rx_frame_sfd_ns)
|
||||
tb.log.info("Difference: %f ns", abs(rx_frame_sfd_ns - ptp_ts_ns))
|
||||
|
||||
assert rx_frame.get_payload() == test_data.ljust(60, b'\x00')
|
||||
assert rx_frame.get_payload() == test_data
|
||||
assert rx_frame.check_fcs()
|
||||
assert rx_frame.ctrl is None
|
||||
assert abs(rx_frame_sfd_ns - ptp_ts_ns - 6.4) < 0.01
|
||||
@@ -296,8 +296,8 @@ async def run_test_underrun(dut, ifg=12):
|
||||
for stat, val in tb.stats.items():
|
||||
tb.log.info("%s: %d", stat, val)
|
||||
|
||||
assert tb.stats["stat_tx_byte"] > 64*2 + 32
|
||||
assert tb.stats["stat_tx_pkt_len"] > 64*2 + 32
|
||||
assert tb.stats["stat_tx_byte"] > 64*2 + 8
|
||||
assert tb.stats["stat_tx_pkt_len"] > 64*2 + 8
|
||||
assert tb.stats["stat_tx_pkt_ucast"] == 3
|
||||
assert tb.stats["stat_tx_pkt_mcast"] == 0
|
||||
assert tb.stats["stat_tx_pkt_bcast"] == 0
|
||||
@@ -524,9 +524,7 @@ def test_taxi_axis_xgmii_tx_64(request, enable_dic):
|
||||
parameters['DATA_W'] = 64
|
||||
parameters['GBX_IF_EN'] = 0
|
||||
parameters['GBX_CNT'] = 1
|
||||
parameters['PADDING_EN'] = 1
|
||||
parameters['DIC_EN'] = enable_dic
|
||||
parameters['MIN_FRAME_LEN'] = 64
|
||||
parameters['PTP_TS_EN'] = 1
|
||||
parameters['PTP_TS_FMT_TOD'] = 1
|
||||
parameters['PTP_TS_W'] = 96 if parameters['PTP_TS_FMT_TOD'] else 64
|
||||
|
||||
@@ -21,9 +21,7 @@ module test_taxi_axis_xgmii_tx_64 #
|
||||
parameter DATA_W = 64,
|
||||
parameter logic GBX_IF_EN = 1'b0,
|
||||
parameter GBX_CNT = 1,
|
||||
parameter logic PADDING_EN = 1'b1,
|
||||
parameter logic DIC_EN = 1'b1,
|
||||
parameter MIN_FRAME_LEN = 64,
|
||||
parameter logic PTP_TS_EN = 1'b0,
|
||||
parameter logic PTP_TS_FMT_TOD = 1'b1,
|
||||
parameter PTP_TS_W = PTP_TS_FMT_TOD ? 96 : 64,
|
||||
@@ -73,9 +71,7 @@ taxi_axis_xgmii_tx_64 #(
|
||||
.CTRL_W(CTRL_W),
|
||||
.GBX_IF_EN(GBX_IF_EN),
|
||||
.GBX_CNT(GBX_CNT),
|
||||
.PADDING_EN(PADDING_EN),
|
||||
.DIC_EN(DIC_EN),
|
||||
.MIN_FRAME_LEN(MIN_FRAME_LEN),
|
||||
.PTP_TS_EN(PTP_TS_EN),
|
||||
.PTP_TS_W(PTP_TS_W),
|
||||
.TX_CPL_CTRL_IN_TUSER(TX_CPL_CTRL_IN_TUSER)
|
||||
|
||||
Reference in New Issue
Block a user