diff --git a/example/ADM_PCIE_9V3/fpga/rtl/fpga_core.sv b/example/ADM_PCIE_9V3/fpga/rtl/fpga_core.sv index 4e82683..b13274b 100644 --- a/example/ADM_PCIE_9V3/fpga/rtl/fpga_core.sv +++ b/example/ADM_PCIE_9V3/fpga/rtl/fpga_core.sv @@ -82,9 +82,10 @@ wire qsfp_0_mgt_refclk_bufg; wire qsfp_rst; -taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_qsfp_tx[7:0](); -taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) axis_qsfp_tx_cpl[7:0](); -taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_qsfp_rx[7:0](); +taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_qsfp_tx[8](); +taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) axis_qsfp_tx_cpl[8](); +taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_qsfp_rx[8](); +taxi_axis_if #(.DATA_W(16), .KEEP_W(1), .KEEP_EN(0), .LAST_EN(0), .USER_EN(1), .USER_W(1), .ID_EN(1), .ID_W(8)) axis_qsfp_stat[2](); if (SIM) begin @@ -157,7 +158,8 @@ for (genvar n = 0; n < 2; n = n + 1) begin : gty_quad .PRBS31_EN(1'b0), .TX_SERDES_PIPELINE(1), .RX_SERDES_PIPELINE(1), - .COUNT_125US(125000/6.4) + .COUNT_125US(125000/6.4), + .STAT_EN(1'b0) ) mac_inst ( .xcvr_ctrl_clk(clk_125mhz), @@ -235,20 +237,49 @@ for (genvar n = 0; n < 2; n = n + 1) begin : gty_quad .tx_pause_req('0), .tx_pause_ack(), + /* + * Statistics + */ + .stat_clk(clk_125mhz), + .stat_rst(rst_125mhz), + .m_axis_stat(axis_qsfp_stat[n]), + /* * Status */ .tx_start_packet(), - .tx_error_underflow(), + .stat_tx_byte(), + .stat_tx_pkt_len(), + .stat_tx_pkt_ucast(), + .stat_tx_pkt_mcast(), + .stat_tx_pkt_bcast(), + .stat_tx_pkt_vlan(), + .stat_tx_pkt_good(), + .stat_tx_pkt_bad(), + .stat_tx_err_oversize(), + .stat_tx_err_user(), + .stat_tx_err_underflow(), .rx_start_packet(), .rx_error_count(), - .rx_error_bad_frame(), - .rx_error_bad_fcs(), - .rx_bad_block(), - .rx_sequence_error(), .rx_block_lock(), .rx_high_ber(), .rx_status(qsfp_rx_status[n*CNT +: CNT]), + .stat_rx_byte(), + .stat_rx_pkt_len(), + .stat_rx_pkt_fragment(), + .stat_rx_pkt_jabber(), + .stat_rx_pkt_ucast(), + .stat_rx_pkt_mcast(), + .stat_rx_pkt_bcast(), + .stat_rx_pkt_vlan(), + .stat_rx_pkt_good(), + .stat_rx_pkt_bad(), + .stat_rx_err_oversize(), + .stat_rx_err_bad_fcs(), + .stat_rx_err_bad_block(), + .stat_rx_err_framing(), + .stat_rx_err_preamble(), + .stat_rx_fifo_drop('0), .stat_tx_mcf(), .stat_rx_mcf(), .stat_tx_lfc_pkt(), @@ -271,8 +302,10 @@ for (genvar n = 0; n < 2; n = n + 1) begin : gty_quad /* * Configuration */ - .cfg_ifg('{CNT{8'd12}}), + .cfg_tx_max_pkt_len('{CNT{16'd9218}}), + .cfg_tx_ifg('{CNT{8'd12}}), .cfg_tx_enable('1), + .cfg_rx_max_pkt_len('{CNT{16'd9218}}), .cfg_rx_enable('1), .cfg_tx_prbs31_enable('0), .cfg_rx_prbs31_enable('0), diff --git a/example/Alveo/fpga/rtl/fpga_core.sv b/example/Alveo/fpga/rtl/fpga_core.sv index c65796b..59d54de 100644 --- a/example/Alveo/fpga/rtl/fpga_core.sv +++ b/example/Alveo/fpga/rtl/fpga_core.sv @@ -121,12 +121,14 @@ assign eth_port_lpmode = '0; wire [GTY_CNT-1:0] eth_gty_tx_clk; wire [GTY_CNT-1:0] eth_gty_tx_rst; -taxi_axis_if #(.DATA_W(64), .ID_W(8)) eth_gty_axis_tx[GTY_CNT-1:0](); -taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) eth_gty_axis_tx_cpl[GTY_CNT-1:0](); +taxi_axis_if #(.DATA_W(64), .ID_W(8)) eth_gty_axis_tx[GTY_CNT](); +taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) eth_gty_axis_tx_cpl[GTY_CNT](); wire [GTY_CNT-1:0] eth_gty_rx_clk; wire [GTY_CNT-1:0] eth_gty_rx_rst; -taxi_axis_if #(.DATA_W(64), .ID_W(8)) eth_gty_axis_rx[GTY_CNT-1:0](); +taxi_axis_if #(.DATA_W(64), .ID_W(8)) eth_gty_axis_rx[GTY_CNT](); + +taxi_axis_if #(.DATA_W(16), .KEEP_W(1), .KEEP_EN(0), .LAST_EN(0), .USER_EN(1), .USER_W(1), .ID_EN(1), .ID_W(8)) eth_gty_axis_stat[GTY_QUAD_CNT](); wire [GTY_CNT-1:0] eth_gty_rx_status; @@ -207,7 +209,8 @@ for (genvar n = 0; n < GTY_QUAD_CNT; n = n + 1) begin : gty_quad .PRBS31_EN(1'b0), .TX_SERDES_PIPELINE(1), .RX_SERDES_PIPELINE(1), - .COUNT_125US(125000/6.4) + .COUNT_125US(125000/6.4), + .STAT_EN(1'b0) ) mac_inst ( .xcvr_ctrl_clk(clk_125mhz), @@ -285,20 +288,49 @@ for (genvar n = 0; n < GTY_QUAD_CNT; n = n + 1) begin : gty_quad .tx_pause_req('0), .tx_pause_ack(), + /* + * Statistics + */ + .stat_clk(clk_125mhz), + .stat_rst(rst_125mhz), + .m_axis_stat(eth_gty_axis_stat[n]), + /* * Status */ .tx_start_packet(), - .tx_error_underflow(), + .stat_tx_byte(), + .stat_tx_pkt_len(), + .stat_tx_pkt_ucast(), + .stat_tx_pkt_mcast(), + .stat_tx_pkt_bcast(), + .stat_tx_pkt_vlan(), + .stat_tx_pkt_good(), + .stat_tx_pkt_bad(), + .stat_tx_err_oversize(), + .stat_tx_err_user(), + .stat_tx_err_underflow(), .rx_start_packet(), .rx_error_count(), - .rx_error_bad_frame(), - .rx_error_bad_fcs(), - .rx_bad_block(), - .rx_sequence_error(), .rx_block_lock(), .rx_high_ber(), .rx_status(eth_gty_rx_status[n*CNT +: CNT]), + .stat_rx_byte(), + .stat_rx_pkt_len(), + .stat_rx_pkt_fragment(), + .stat_rx_pkt_jabber(), + .stat_rx_pkt_ucast(), + .stat_rx_pkt_mcast(), + .stat_rx_pkt_bcast(), + .stat_rx_pkt_vlan(), + .stat_rx_pkt_good(), + .stat_rx_pkt_bad(), + .stat_rx_err_oversize(), + .stat_rx_err_bad_fcs(), + .stat_rx_err_bad_block(), + .stat_rx_err_framing(), + .stat_rx_err_preamble(), + .stat_rx_fifo_drop('0), .stat_tx_mcf(), .stat_rx_mcf(), .stat_tx_lfc_pkt(), @@ -321,8 +353,10 @@ for (genvar n = 0; n < GTY_QUAD_CNT; n = n + 1) begin : gty_quad /* * Configuration */ - .cfg_ifg('{CNT{8'd12}}), + .cfg_tx_max_pkt_len('{CNT{16'd9218}}), + .cfg_tx_ifg('{CNT{8'd12}}), .cfg_tx_enable('1), + .cfg_rx_max_pkt_len('{CNT{16'd9218}}), .cfg_rx_enable('1), .cfg_tx_prbs31_enable('0), .cfg_rx_prbs31_enable('0), diff --git a/example/KCU105/fpga/rtl/fpga_core.sv b/example/KCU105/fpga/rtl/fpga_core.sv index 5c52cb1..4c63150 100644 --- a/example/KCU105/fpga/rtl/fpga_core.sv +++ b/example/KCU105/fpga/rtl/fpga_core.sv @@ -408,9 +408,10 @@ end else begin : sfp_mac wire sfp_rst; - taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_tx[1:0](); - taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) axis_sfp_tx_cpl[1:0](); - taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_rx[1:0](); + taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_tx[2](); + taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) axis_sfp_tx_cpl[2](); + taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_rx[2](); + taxi_axis_if #(.DATA_W(16), .KEEP_W(1), .KEEP_EN(0), .LAST_EN(0), .USER_EN(1), .USER_W(1), .ID_EN(1), .ID_W(8)) axis_sfp_stat(); if (SIM) begin @@ -469,7 +470,8 @@ end else begin : sfp_mac .PRBS31_EN(1'b0), .TX_SERDES_PIPELINE(1), .RX_SERDES_PIPELINE(1), - .COUNT_125US(125000/6.4) + .COUNT_125US(125000/6.4), + .STAT_EN(1'b0) ) sfp_mac_inst ( .xcvr_ctrl_clk(clk), @@ -547,20 +549,49 @@ end else begin : sfp_mac .tx_pause_req('0), .tx_pause_ack(), + /* + * Statistics + */ + .stat_clk(clk), + .stat_rst(rst), + .m_axis_stat(axis_sfp_stat), + /* * Status */ .tx_start_packet(), - .tx_error_underflow(), + .stat_tx_byte(), + .stat_tx_pkt_len(), + .stat_tx_pkt_ucast(), + .stat_tx_pkt_mcast(), + .stat_tx_pkt_bcast(), + .stat_tx_pkt_vlan(), + .stat_tx_pkt_good(), + .stat_tx_pkt_bad(), + .stat_tx_err_oversize(), + .stat_tx_err_user(), + .stat_tx_err_underflow(), .rx_start_packet(), .rx_error_count(), - .rx_error_bad_frame(), - .rx_error_bad_fcs(), - .rx_bad_block(), - .rx_sequence_error(), .rx_block_lock(), .rx_high_ber(), .rx_status(sfp_rx_status), + .stat_rx_byte(), + .stat_rx_pkt_len(), + .stat_rx_pkt_fragment(), + .stat_rx_pkt_jabber(), + .stat_rx_pkt_ucast(), + .stat_rx_pkt_mcast(), + .stat_rx_pkt_bcast(), + .stat_rx_pkt_vlan(), + .stat_rx_pkt_good(), + .stat_rx_pkt_bad(), + .stat_rx_err_oversize(), + .stat_rx_err_bad_fcs(), + .stat_rx_err_bad_block(), + .stat_rx_err_framing(), + .stat_rx_err_preamble(), + .stat_rx_fifo_drop('0), .stat_tx_mcf(), .stat_rx_mcf(), .stat_tx_lfc_pkt(), @@ -583,8 +614,10 @@ end else begin : sfp_mac /* * Configuration */ - .cfg_ifg('{2{8'd12}}), + .cfg_tx_max_pkt_len('{2{16'd9218}}), + .cfg_tx_ifg('{2{8'd12}}), .cfg_tx_enable('1), + .cfg_rx_max_pkt_len('{2{16'd9218}}), .cfg_rx_enable('1), .cfg_tx_prbs31_enable('0), .cfg_rx_prbs31_enable('0), diff --git a/example/KR260/fpga/rtl/fpga_core.sv b/example/KR260/fpga/rtl/fpga_core.sv index d5ff94c..3fa9167 100644 --- a/example/KR260/fpga/rtl/fpga_core.sv +++ b/example/KR260/fpga/rtl/fpga_core.sv @@ -356,6 +356,7 @@ end else begin : sfp_mac taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_tx[0:0](); taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) axis_sfp_tx_cpl[0:0](); taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_rx[0:0](); + taxi_axis_if #(.DATA_W(16), .KEEP_W(1), .KEEP_EN(0), .LAST_EN(0), .USER_EN(1), .USER_W(1), .ID_EN(1), .ID_W(8)) axis_sfp_stat(); if (SIM) begin @@ -414,7 +415,8 @@ end else begin : sfp_mac .PRBS31_EN(1'b0), .TX_SERDES_PIPELINE(1), .RX_SERDES_PIPELINE(1), - .COUNT_125US(125000/6.4) + .COUNT_125US(125000/6.4), + .STAT_EN(1'b0) ) sfp_mac_inst ( .xcvr_ctrl_clk(clk), @@ -492,20 +494,49 @@ end else begin : sfp_mac .tx_pause_req('0), .tx_pause_ack(), + /* + * Statistics + */ + .stat_clk(clk), + .stat_rst(rst), + .m_axis_stat(axis_sfp_stat), + /* * Status */ .tx_start_packet(), - .tx_error_underflow(), + .stat_tx_byte(), + .stat_tx_pkt_len(), + .stat_tx_pkt_ucast(), + .stat_tx_pkt_mcast(), + .stat_tx_pkt_bcast(), + .stat_tx_pkt_vlan(), + .stat_tx_pkt_good(), + .stat_tx_pkt_bad(), + .stat_tx_err_oversize(), + .stat_tx_err_user(), + .stat_tx_err_underflow(), .rx_start_packet(), .rx_error_count(), - .rx_error_bad_frame(), - .rx_error_bad_fcs(), - .rx_bad_block(), - .rx_sequence_error(), .rx_block_lock(), .rx_high_ber(), .rx_status(sfp_rx_status), + .stat_rx_byte(), + .stat_rx_pkt_len(), + .stat_rx_pkt_fragment(), + .stat_rx_pkt_jabber(), + .stat_rx_pkt_ucast(), + .stat_rx_pkt_mcast(), + .stat_rx_pkt_bcast(), + .stat_rx_pkt_vlan(), + .stat_rx_pkt_good(), + .stat_rx_pkt_bad(), + .stat_rx_err_oversize(), + .stat_rx_err_bad_fcs(), + .stat_rx_err_bad_block(), + .stat_rx_err_framing(), + .stat_rx_err_preamble(), + .stat_rx_fifo_drop('0), .stat_tx_mcf(), .stat_rx_mcf(), .stat_tx_lfc_pkt(), @@ -528,8 +559,10 @@ end else begin : sfp_mac /* * Configuration */ - .cfg_ifg('{1{8'd12}}), + .cfg_tx_max_pkt_len('{1{16'd9218}}), + .cfg_tx_ifg('{1{8'd12}}), .cfg_tx_enable('1), + .cfg_rx_max_pkt_len('{1{16'd9218}}), .cfg_rx_enable('1), .cfg_tx_prbs31_enable('0), .cfg_rx_prbs31_enable('0), diff --git a/example/Nexus_K3P_Q/fpga/rtl/fpga_core.sv b/example/Nexus_K3P_Q/fpga/rtl/fpga_core.sv index 335f967..132910b 100644 --- a/example/Nexus_K3P_Q/fpga/rtl/fpga_core.sv +++ b/example/Nexus_K3P_Q/fpga/rtl/fpga_core.sv @@ -97,9 +97,10 @@ assign qsfp_mgt_refclk_out = qsfp_mgt_refclk_bufg; wire qsfp_rst; -taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_qsfp_tx[7:0](); -taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) axis_qsfp_tx_cpl[7:0](); -taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_qsfp_rx[7:0](); +taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_qsfp_tx[8](); +taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) axis_qsfp_tx_cpl[8](); +taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_qsfp_rx[8](); +taxi_axis_if #(.DATA_W(16), .KEEP_W(1), .KEEP_EN(0), .LAST_EN(0), .USER_EN(1), .USER_W(1), .ID_EN(1), .ID_W(8)) axis_qsfp_stat[2](); if (SIM) begin @@ -176,7 +177,8 @@ for (genvar n = 0; n < 2; n = n + 1) begin : gty_quad .PRBS31_EN(1'b0), .TX_SERDES_PIPELINE(1), .RX_SERDES_PIPELINE(1), - .COUNT_125US(125000/6.4) + .COUNT_125US(125000/6.4), + .STAT_EN(1'b0) ) mac_inst ( .xcvr_ctrl_clk(clk_125mhz), @@ -254,20 +256,49 @@ for (genvar n = 0; n < 2; n = n + 1) begin : gty_quad .tx_pause_req('0), .tx_pause_ack(), + /* + * Statistics + */ + .stat_clk(clk_125mhz), + .stat_rst(rst_125mhz), + .m_axis_stat(axis_qsfp_stat[n]), + /* * Status */ .tx_start_packet(), - .tx_error_underflow(), + .stat_tx_byte(), + .stat_tx_pkt_len(), + .stat_tx_pkt_ucast(), + .stat_tx_pkt_mcast(), + .stat_tx_pkt_bcast(), + .stat_tx_pkt_vlan(), + .stat_tx_pkt_good(), + .stat_tx_pkt_bad(), + .stat_tx_err_oversize(), + .stat_tx_err_user(), + .stat_tx_err_underflow(), .rx_start_packet(), .rx_error_count(), - .rx_error_bad_frame(), - .rx_error_bad_fcs(), - .rx_bad_block(), - .rx_sequence_error(), .rx_block_lock(), .rx_high_ber(), .rx_status(qsfp_rx_status[n*CNT +: CNT]), + .stat_rx_byte(), + .stat_rx_pkt_len(), + .stat_rx_pkt_fragment(), + .stat_rx_pkt_jabber(), + .stat_rx_pkt_ucast(), + .stat_rx_pkt_mcast(), + .stat_rx_pkt_bcast(), + .stat_rx_pkt_vlan(), + .stat_rx_pkt_good(), + .stat_rx_pkt_bad(), + .stat_rx_err_oversize(), + .stat_rx_err_bad_fcs(), + .stat_rx_err_bad_block(), + .stat_rx_err_framing(), + .stat_rx_err_preamble(), + .stat_rx_fifo_drop('0), .stat_tx_mcf(), .stat_rx_mcf(), .stat_tx_lfc_pkt(), @@ -290,8 +321,10 @@ for (genvar n = 0; n < 2; n = n + 1) begin : gty_quad /* * Configuration */ - .cfg_ifg('{CNT{8'd12}}), + .cfg_tx_max_pkt_len('{CNT{16'd9218}}), + .cfg_tx_ifg('{CNT{8'd12}}), .cfg_tx_enable('1), + .cfg_rx_max_pkt_len('{CNT{16'd9218}}), .cfg_rx_enable('1), .cfg_tx_prbs31_enable('0), .cfg_rx_prbs31_enable('0), diff --git a/example/Nexus_K3P_S/fpga/rtl/fpga_core.sv b/example/Nexus_K3P_S/fpga/rtl/fpga_core.sv index 89d3b48..17edf3b 100644 --- a/example/Nexus_K3P_S/fpga/rtl/fpga_core.sv +++ b/example/Nexus_K3P_S/fpga/rtl/fpga_core.sv @@ -78,9 +78,10 @@ assign sfp_mgt_refclk_out = sfp_mgt_refclk_bufg; wire sfp_rst; -taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_tx[1:0](); -taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) axis_sfp_tx_cpl[1:0](); -taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_rx[1:0](); +taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_tx[2](); +taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) axis_sfp_tx_cpl[2](); +taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_rx[2](); +taxi_axis_if #(.DATA_W(16), .KEEP_W(1), .KEEP_EN(0), .LAST_EN(0), .USER_EN(1), .USER_W(1), .ID_EN(1), .ID_W(8)) axis_sfp_stat(); if (SIM) begin @@ -157,7 +158,8 @@ taxi_eth_mac_25g_us #( .PRBS31_EN(1'b0), .TX_SERDES_PIPELINE(1), .RX_SERDES_PIPELINE(1), - .COUNT_125US(125000/6.4) + .COUNT_125US(125000/6.4), + .STAT_EN(1'b0) ) sfp_mac_inst ( .xcvr_ctrl_clk(clk_125mhz), @@ -235,20 +237,49 @@ sfp_mac_inst ( .tx_pause_req('0), .tx_pause_ack(), + /* + * Statistics + */ + .stat_clk(clk_125mhz), + .stat_rst(rst_125mhz), + .m_axis_stat(axis_sfp_stat), + /* * Status */ .tx_start_packet(), - .tx_error_underflow(), + .stat_tx_byte(), + .stat_tx_pkt_len(), + .stat_tx_pkt_ucast(), + .stat_tx_pkt_mcast(), + .stat_tx_pkt_bcast(), + .stat_tx_pkt_vlan(), + .stat_tx_pkt_good(), + .stat_tx_pkt_bad(), + .stat_tx_err_oversize(), + .stat_tx_err_user(), + .stat_tx_err_underflow(), .rx_start_packet(), .rx_error_count(), - .rx_error_bad_frame(), - .rx_error_bad_fcs(), - .rx_bad_block(), - .rx_sequence_error(), .rx_block_lock(), .rx_high_ber(), .rx_status(sfp_rx_status), + .stat_rx_byte(), + .stat_rx_pkt_len(), + .stat_rx_pkt_fragment(), + .stat_rx_pkt_jabber(), + .stat_rx_pkt_ucast(), + .stat_rx_pkt_mcast(), + .stat_rx_pkt_bcast(), + .stat_rx_pkt_vlan(), + .stat_rx_pkt_good(), + .stat_rx_pkt_bad(), + .stat_rx_err_oversize(), + .stat_rx_err_bad_fcs(), + .stat_rx_err_bad_block(), + .stat_rx_err_framing(), + .stat_rx_err_preamble(), + .stat_rx_fifo_drop('0), .stat_tx_mcf(), .stat_rx_mcf(), .stat_tx_lfc_pkt(), @@ -271,8 +302,10 @@ sfp_mac_inst ( /* * Configuration */ - .cfg_ifg('{2{8'd12}}), + .cfg_tx_max_pkt_len('{2{16'd9218}}), + .cfg_tx_ifg('{2{8'd12}}), .cfg_tx_enable('1), + .cfg_rx_max_pkt_len('{2{16'd9218}}), .cfg_rx_enable('1), .cfg_tx_prbs31_enable('0), .cfg_rx_prbs31_enable('0), diff --git a/example/VCU108/fpga/rtl/fpga_core.sv b/example/VCU108/fpga/rtl/fpga_core.sv index f3c51ba..1269c09 100644 --- a/example/VCU108/fpga/rtl/fpga_core.sv +++ b/example/VCU108/fpga/rtl/fpga_core.sv @@ -230,9 +230,10 @@ wire qsfp_mgt_refclk_0_bufg; wire qsfp_rst; -taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_qsfp_tx[3:0](); -taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) axis_qsfp_tx_cpl[3:0](); -taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_qsfp_rx[3:0](); +taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_qsfp_tx[4](); +taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) axis_qsfp_tx_cpl[4](); +taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_qsfp_rx[4](); +taxi_axis_if #(.DATA_W(16), .KEEP_W(1), .KEEP_EN(0), .LAST_EN(0), .USER_EN(1), .USER_W(1), .ID_EN(1), .ID_W(8)) axis_qsfp_stat(); if (SIM) begin @@ -291,7 +292,8 @@ taxi_eth_mac_25g_us #( .PRBS31_EN(1'b0), .TX_SERDES_PIPELINE(1), .RX_SERDES_PIPELINE(1), - .COUNT_125US(125000/6.4) + .COUNT_125US(125000/6.4), + .STAT_EN(1'b0) ) qsfp_mac_inst ( .xcvr_ctrl_clk(clk), @@ -369,20 +371,49 @@ qsfp_mac_inst ( .tx_pause_req('0), .tx_pause_ack(), + /* + * Statistics + */ + .stat_clk(clk), + .stat_rst(rst), + .m_axis_stat(axis_qsfp_stat), + /* * Status */ .tx_start_packet(), - .tx_error_underflow(), + .stat_tx_byte(), + .stat_tx_pkt_len(), + .stat_tx_pkt_ucast(), + .stat_tx_pkt_mcast(), + .stat_tx_pkt_bcast(), + .stat_tx_pkt_vlan(), + .stat_tx_pkt_good(), + .stat_tx_pkt_bad(), + .stat_tx_err_oversize(), + .stat_tx_err_user(), + .stat_tx_err_underflow(), .rx_start_packet(), .rx_error_count(), - .rx_error_bad_frame(), - .rx_error_bad_fcs(), - .rx_bad_block(), - .rx_sequence_error(), .rx_block_lock(), .rx_high_ber(), .rx_status(qsfp_rx_status), + .stat_rx_byte(), + .stat_rx_pkt_len(), + .stat_rx_pkt_fragment(), + .stat_rx_pkt_jabber(), + .stat_rx_pkt_ucast(), + .stat_rx_pkt_mcast(), + .stat_rx_pkt_bcast(), + .stat_rx_pkt_vlan(), + .stat_rx_pkt_good(), + .stat_rx_pkt_bad(), + .stat_rx_err_oversize(), + .stat_rx_err_bad_fcs(), + .stat_rx_err_bad_block(), + .stat_rx_err_framing(), + .stat_rx_err_preamble(), + .stat_rx_fifo_drop('0), .stat_tx_mcf(), .stat_rx_mcf(), .stat_tx_lfc_pkt(), @@ -405,8 +436,10 @@ qsfp_mac_inst ( /* * Configuration */ - .cfg_ifg('{4{8'd12}}), + .cfg_tx_max_pkt_len('{4{16'd9218}}), + .cfg_tx_ifg('{4{8'd12}}), .cfg_tx_enable('1), + .cfg_rx_max_pkt_len('{4{16'd9218}}), .cfg_rx_enable('1), .cfg_tx_prbs31_enable('0), .cfg_rx_prbs31_enable('0), diff --git a/example/VCU118/fpga/rtl/fpga_core.sv b/example/VCU118/fpga/rtl/fpga_core.sv index 4fc7fa5..b441221 100644 --- a/example/VCU118/fpga/rtl/fpga_core.sv +++ b/example/VCU118/fpga/rtl/fpga_core.sv @@ -412,9 +412,10 @@ wire qsfp1_mgt_refclk_0_bufg; wire qsfp_rst; -taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_qsfp_tx[7:0](); -taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) axis_qsfp_tx_cpl[7:0](); -taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_qsfp_rx[7:0](); +taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_qsfp_tx[8](); +taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) axis_qsfp_tx_cpl[8](); +taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_qsfp_rx[8](); +taxi_axis_if #(.DATA_W(16), .KEEP_W(1), .KEEP_EN(0), .LAST_EN(0), .USER_EN(1), .USER_W(1), .ID_EN(1), .ID_W(8)) axis_qsfp_stat[2](); if (SIM) begin @@ -487,7 +488,8 @@ for (genvar n = 0; n < 2; n = n + 1) begin : gty_quad .PRBS31_EN(1'b0), .TX_SERDES_PIPELINE(1), .RX_SERDES_PIPELINE(1), - .COUNT_125US(125000/6.4) + .COUNT_125US(125000/6.4), + .STAT_EN(1'b0) ) mac_inst ( .xcvr_ctrl_clk(clk_125mhz), @@ -565,20 +567,49 @@ for (genvar n = 0; n < 2; n = n + 1) begin : gty_quad .tx_pause_req('0), .tx_pause_ack(), + /* + * Statistics + */ + .stat_clk(clk_125mhz), + .stat_rst(rst_125mhz), + .m_axis_stat(axis_qsfp_stat[n]), + /* * Status */ .tx_start_packet(), - .tx_error_underflow(), + .stat_tx_byte(), + .stat_tx_pkt_len(), + .stat_tx_pkt_ucast(), + .stat_tx_pkt_mcast(), + .stat_tx_pkt_bcast(), + .stat_tx_pkt_vlan(), + .stat_tx_pkt_good(), + .stat_tx_pkt_bad(), + .stat_tx_err_oversize(), + .stat_tx_err_user(), + .stat_tx_err_underflow(), .rx_start_packet(), .rx_error_count(), - .rx_error_bad_frame(), - .rx_error_bad_fcs(), - .rx_bad_block(), - .rx_sequence_error(), .rx_block_lock(), .rx_high_ber(), .rx_status(qsfp_rx_status[n*CNT +: CNT]), + .stat_rx_byte(), + .stat_rx_pkt_len(), + .stat_rx_pkt_fragment(), + .stat_rx_pkt_jabber(), + .stat_rx_pkt_ucast(), + .stat_rx_pkt_mcast(), + .stat_rx_pkt_bcast(), + .stat_rx_pkt_vlan(), + .stat_rx_pkt_good(), + .stat_rx_pkt_bad(), + .stat_rx_err_oversize(), + .stat_rx_err_bad_fcs(), + .stat_rx_err_bad_block(), + .stat_rx_err_framing(), + .stat_rx_err_preamble(), + .stat_rx_fifo_drop('0), .stat_tx_mcf(), .stat_rx_mcf(), .stat_tx_lfc_pkt(), @@ -601,8 +632,10 @@ for (genvar n = 0; n < 2; n = n + 1) begin : gty_quad /* * Configuration */ - .cfg_ifg('{CNT{8'd12}}), + .cfg_tx_max_pkt_len('{CNT{16'd9218}}), + .cfg_tx_ifg('{CNT{8'd12}}), .cfg_tx_enable('1), + .cfg_rx_max_pkt_len('{CNT{16'd9218}}), .cfg_rx_enable('1), .cfg_tx_prbs31_enable('0), .cfg_rx_prbs31_enable('0), diff --git a/example/ZCU102/fpga/rtl/fpga_core.sv b/example/ZCU102/fpga/rtl/fpga_core.sv index c1c1837..dfb86aa 100644 --- a/example/ZCU102/fpga/rtl/fpga_core.sv +++ b/example/ZCU102/fpga/rtl/fpga_core.sv @@ -490,9 +490,10 @@ end else begin : sfp_mac wire sfp_rst; - taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_tx[3:0](); - taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) axis_sfp_tx_cpl[3:0](); - taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_rx[3:0](); + taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_tx[4](); + taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) axis_sfp_tx_cpl[4](); + taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_rx[4](); + taxi_axis_if #(.DATA_W(16), .KEEP_W(1), .KEEP_EN(0), .LAST_EN(0), .USER_EN(1), .USER_W(1), .ID_EN(1), .ID_W(8)) axis_sfp_stat(); if (SIM) begin @@ -551,7 +552,8 @@ end else begin : sfp_mac .PRBS31_EN(1'b0), .TX_SERDES_PIPELINE(1), .RX_SERDES_PIPELINE(1), - .COUNT_125US(125000/6.4) + .COUNT_125US(125000/6.4), + .STAT_EN(1'b0) ) sfp_mac_inst ( .xcvr_ctrl_clk(clk_125mhz), @@ -629,20 +631,49 @@ end else begin : sfp_mac .tx_pause_req('0), .tx_pause_ack(), + /* + * Statistics + */ + .stat_clk(clk_125mhz), + .stat_rst(rst_125mhz), + .m_axis_stat(axis_sfp_stat), + /* * Status */ .tx_start_packet(), - .tx_error_underflow(), + .stat_tx_byte(), + .stat_tx_pkt_len(), + .stat_tx_pkt_ucast(), + .stat_tx_pkt_mcast(), + .stat_tx_pkt_bcast(), + .stat_tx_pkt_vlan(), + .stat_tx_pkt_good(), + .stat_tx_pkt_bad(), + .stat_tx_err_oversize(), + .stat_tx_err_user(), + .stat_tx_err_underflow(), .rx_start_packet(), .rx_error_count(), - .rx_error_bad_frame(), - .rx_error_bad_fcs(), - .rx_bad_block(), - .rx_sequence_error(), .rx_block_lock(), .rx_high_ber(), .rx_status(sfp_rx_status), + .stat_rx_byte(), + .stat_rx_pkt_len(), + .stat_rx_pkt_fragment(), + .stat_rx_pkt_jabber(), + .stat_rx_pkt_ucast(), + .stat_rx_pkt_mcast(), + .stat_rx_pkt_bcast(), + .stat_rx_pkt_vlan(), + .stat_rx_pkt_good(), + .stat_rx_pkt_bad(), + .stat_rx_err_oversize(), + .stat_rx_err_bad_fcs(), + .stat_rx_err_bad_block(), + .stat_rx_err_framing(), + .stat_rx_err_preamble(), + .stat_rx_fifo_drop('0), .stat_tx_mcf(), .stat_rx_mcf(), .stat_tx_lfc_pkt(), @@ -665,8 +696,10 @@ end else begin : sfp_mac /* * Configuration */ - .cfg_ifg('{4{8'd12}}), + .cfg_tx_max_pkt_len('{4{16'd9218}}), + .cfg_tx_ifg('{4{8'd12}}), .cfg_tx_enable('1), + .cfg_rx_max_pkt_len('{4{16'd9218}}), .cfg_rx_enable('1), .cfg_tx_prbs31_enable('0), .cfg_rx_prbs31_enable('0), diff --git a/example/ZCU106/fpga/rtl/fpga_core.sv b/example/ZCU106/fpga/rtl/fpga_core.sv index 00a04a6..087f1d9 100644 --- a/example/ZCU106/fpga/rtl/fpga_core.sv +++ b/example/ZCU106/fpga/rtl/fpga_core.sv @@ -310,9 +310,10 @@ end else begin : sfp_mac wire sfp_rst; - taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_tx[1:0](); - taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) axis_sfp_tx_cpl[1:0](); - taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_rx[1:0](); + taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_tx[2](); + taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) axis_sfp_tx_cpl[2](); + taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_rx[2](); + taxi_axis_if #(.DATA_W(16), .KEEP_W(1), .KEEP_EN(0), .LAST_EN(0), .USER_EN(1), .USER_W(1), .ID_EN(1), .ID_W(8)) axis_sfp_stat(); if (SIM) begin @@ -371,7 +372,8 @@ end else begin : sfp_mac .PRBS31_EN(1'b0), .TX_SERDES_PIPELINE(1), .RX_SERDES_PIPELINE(1), - .COUNT_125US(125000/6.4) + .COUNT_125US(125000/6.4), + .STAT_EN(1'b0) ) sfp_mac_inst ( .xcvr_ctrl_clk(clk_125mhz), @@ -449,20 +451,49 @@ end else begin : sfp_mac .tx_pause_req('0), .tx_pause_ack(), + /* + * Statistics + */ + .stat_clk(clk_125mhz), + .stat_rst(rst_125mhz), + .m_axis_stat(axis_sfp_stat), + /* * Status */ .tx_start_packet(), - .tx_error_underflow(), + .stat_tx_byte(), + .stat_tx_pkt_len(), + .stat_tx_pkt_ucast(), + .stat_tx_pkt_mcast(), + .stat_tx_pkt_bcast(), + .stat_tx_pkt_vlan(), + .stat_tx_pkt_good(), + .stat_tx_pkt_bad(), + .stat_tx_err_oversize(), + .stat_tx_err_user(), + .stat_tx_err_underflow(), .rx_start_packet(), .rx_error_count(), - .rx_error_bad_frame(), - .rx_error_bad_fcs(), - .rx_bad_block(), - .rx_sequence_error(), .rx_block_lock(), .rx_high_ber(), .rx_status(sfp_rx_status), + .stat_rx_byte(), + .stat_rx_pkt_len(), + .stat_rx_pkt_fragment(), + .stat_rx_pkt_jabber(), + .stat_rx_pkt_ucast(), + .stat_rx_pkt_mcast(), + .stat_rx_pkt_bcast(), + .stat_rx_pkt_vlan(), + .stat_rx_pkt_good(), + .stat_rx_pkt_bad(), + .stat_rx_err_oversize(), + .stat_rx_err_bad_fcs(), + .stat_rx_err_bad_block(), + .stat_rx_err_framing(), + .stat_rx_err_preamble(), + .stat_rx_fifo_drop('0), .stat_tx_mcf(), .stat_rx_mcf(), .stat_tx_lfc_pkt(), @@ -485,8 +516,10 @@ end else begin : sfp_mac /* * Configuration */ - .cfg_ifg('{2{8'd12}}), + .cfg_tx_max_pkt_len('{2{16'd9218}}), + .cfg_tx_ifg('{2{8'd12}}), .cfg_tx_enable('1), + .cfg_rx_max_pkt_len('{2{16'd9218}}), .cfg_rx_enable('1), .cfg_tx_prbs31_enable('0), .cfg_rx_prbs31_enable('0), diff --git a/example/ZCU111/fpga/rtl/fpga_core.sv b/example/ZCU111/fpga/rtl/fpga_core.sv index 156ae54..4abde66 100644 --- a/example/ZCU111/fpga/rtl/fpga_core.sv +++ b/example/ZCU111/fpga/rtl/fpga_core.sv @@ -124,9 +124,10 @@ wire sfp_mgt_refclk_0_bufg; wire sfp_rst; -taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_tx[3:0](); -taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) axis_sfp_tx_cpl[3:0](); -taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_rx[3:0](); +taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_tx[4](); +taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) axis_sfp_tx_cpl[4](); +taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_sfp_rx[4](); +taxi_axis_if #(.DATA_W(16), .KEEP_W(1), .KEEP_EN(0), .LAST_EN(0), .USER_EN(1), .USER_W(1), .ID_EN(1), .ID_W(8)) axis_sfp_stat(); if (SIM) begin @@ -185,7 +186,8 @@ taxi_eth_mac_25g_us #( .PRBS31_EN(1'b0), .TX_SERDES_PIPELINE(1), .RX_SERDES_PIPELINE(1), - .COUNT_125US(125000/6.4) + .COUNT_125US(125000/6.4), + .STAT_EN(1'b0) ) sfp_mac_inst ( .xcvr_ctrl_clk(clk_125mhz), @@ -263,20 +265,49 @@ sfp_mac_inst ( .tx_pause_req('0), .tx_pause_ack(), + /* + * Statistics + */ + .stat_clk(clk_125mhz), + .stat_rst(rst_125mhz), + .m_axis_stat(axis_sfp_stat), + /* * Status */ .tx_start_packet(), - .tx_error_underflow(), + .stat_tx_byte(), + .stat_tx_pkt_len(), + .stat_tx_pkt_ucast(), + .stat_tx_pkt_mcast(), + .stat_tx_pkt_bcast(), + .stat_tx_pkt_vlan(), + .stat_tx_pkt_good(), + .stat_tx_pkt_bad(), + .stat_tx_err_oversize(), + .stat_tx_err_user(), + .stat_tx_err_underflow(), .rx_start_packet(), .rx_error_count(), - .rx_error_bad_frame(), - .rx_error_bad_fcs(), - .rx_bad_block(), - .rx_sequence_error(), .rx_block_lock(), .rx_high_ber(), .rx_status(sfp_rx_status), + .stat_rx_byte(), + .stat_rx_pkt_len(), + .stat_rx_pkt_fragment(), + .stat_rx_pkt_jabber(), + .stat_rx_pkt_ucast(), + .stat_rx_pkt_mcast(), + .stat_rx_pkt_bcast(), + .stat_rx_pkt_vlan(), + .stat_rx_pkt_good(), + .stat_rx_pkt_bad(), + .stat_rx_err_oversize(), + .stat_rx_err_bad_fcs(), + .stat_rx_err_bad_block(), + .stat_rx_err_framing(), + .stat_rx_err_preamble(), + .stat_rx_fifo_drop('0), .stat_tx_mcf(), .stat_rx_mcf(), .stat_tx_lfc_pkt(), @@ -299,8 +330,10 @@ sfp_mac_inst ( /* * Configuration */ - .cfg_ifg('{4{8'd12}}), + .cfg_tx_max_pkt_len('{4{16'd9218}}), + .cfg_tx_ifg('{4{8'd12}}), .cfg_tx_enable('1), + .cfg_rx_max_pkt_len('{4{16'd9218}}), .cfg_rx_enable('1), .cfg_tx_prbs31_enable('0), .cfg_rx_prbs31_enable('0), diff --git a/example/fb2CG/fpga/rtl/fpga_core.sv b/example/fb2CG/fpga/rtl/fpga_core.sv index a314923..c9834c1 100644 --- a/example/fb2CG/fpga/rtl/fpga_core.sv +++ b/example/fb2CG/fpga/rtl/fpga_core.sv @@ -107,9 +107,10 @@ assign led_exp = '1; wire [1:0] qsfp_gtpowergood; -taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_qsfp_tx[7:0](); -taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) axis_qsfp_tx_cpl[7:0](); -taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_qsfp_rx[7:0](); +taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_qsfp_tx[8](); +taxi_axis_if #(.DATA_W(96), .KEEP_W(1), .ID_W(8)) axis_qsfp_tx_cpl[8](); +taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_qsfp_rx[8](); +taxi_axis_if #(.DATA_W(16), .KEEP_W(1), .KEEP_EN(0), .LAST_EN(0), .USER_EN(1), .USER_W(1), .ID_EN(1), .ID_W(8)) axis_qsfp_stat[2](); wire [1:0] qsfp_mgt_refclk_p = {qsfp_1_mgt_refclk_p, qsfp_0_mgt_refclk_p}; wire [1:0] qsfp_mgt_refclk_n = {qsfp_1_mgt_refclk_n, qsfp_0_mgt_refclk_n}; @@ -197,7 +198,8 @@ for (genvar n = 0; n < 2; n = n + 1) begin : gty_quad .PRBS31_EN(1'b0), .TX_SERDES_PIPELINE(1), .RX_SERDES_PIPELINE(1), - .COUNT_125US(125000/6.4) + .COUNT_125US(125000/6.4), + .STAT_EN(1'b0) ) mac_inst ( .xcvr_ctrl_clk(clk_125mhz), @@ -275,20 +277,49 @@ for (genvar n = 0; n < 2; n = n + 1) begin : gty_quad .tx_pause_req('0), .tx_pause_ack(), + /* + * Statistics + */ + .stat_clk(clk_125mhz), + .stat_rst(rst_125mhz), + .m_axis_stat(axis_qsfp_stat[n]), + /* * Status */ .tx_start_packet(), - .tx_error_underflow(), + .stat_tx_byte(), + .stat_tx_pkt_len(), + .stat_tx_pkt_ucast(), + .stat_tx_pkt_mcast(), + .stat_tx_pkt_bcast(), + .stat_tx_pkt_vlan(), + .stat_tx_pkt_good(), + .stat_tx_pkt_bad(), + .stat_tx_err_oversize(), + .stat_tx_err_user(), + .stat_tx_err_underflow(), .rx_start_packet(), .rx_error_count(), - .rx_error_bad_frame(), - .rx_error_bad_fcs(), - .rx_bad_block(), - .rx_sequence_error(), .rx_block_lock(), .rx_high_ber(), .rx_status(qsfp_rx_status[n*CNT +: CNT]), + .stat_rx_byte(), + .stat_rx_pkt_len(), + .stat_rx_pkt_fragment(), + .stat_rx_pkt_jabber(), + .stat_rx_pkt_ucast(), + .stat_rx_pkt_mcast(), + .stat_rx_pkt_bcast(), + .stat_rx_pkt_vlan(), + .stat_rx_pkt_good(), + .stat_rx_pkt_bad(), + .stat_rx_err_oversize(), + .stat_rx_err_bad_fcs(), + .stat_rx_err_bad_block(), + .stat_rx_err_framing(), + .stat_rx_err_preamble(), + .stat_rx_fifo_drop('0), .stat_tx_mcf(), .stat_rx_mcf(), .stat_tx_lfc_pkt(), @@ -311,8 +342,10 @@ for (genvar n = 0; n < 2; n = n + 1) begin : gty_quad /* * Configuration */ - .cfg_ifg('{CNT{8'd12}}), + .cfg_tx_max_pkt_len('{CNT{16'd9218}}), + .cfg_tx_ifg('{CNT{8'd12}}), .cfg_tx_enable('1), + .cfg_rx_max_pkt_len('{CNT{16'd9218}}), .cfg_rx_enable('1), .cfg_tx_prbs31_enable('0), .cfg_rx_prbs31_enable('0),