From 42463cec5c7a6dfecb52d2d20d9ed6627e19a979 Mon Sep 17 00:00:00 2001 From: Alex Forencich Date: Tue, 21 Jul 2026 10:06:26 -0700 Subject: [PATCH] eth: Add support for SGMII symbol replication in 1000BASE-X MAC+PCS Signed-off-by: Alex Forencich --- src/eth/rtl/taxi_eth_mac_phy_1g_basex.sv | 54 +++++++++++++++++---- src/eth/rtl/taxi_eth_mac_phy_1g_basex_rx.sv | 11 ++++- src/eth/rtl/taxi_eth_mac_phy_1g_basex_tx.sv | 11 ++++- 3 files changed, 65 insertions(+), 11 deletions(-) diff --git a/src/eth/rtl/taxi_eth_mac_phy_1g_basex.sv b/src/eth/rtl/taxi_eth_mac_phy_1g_basex.sv index 4dc2db8..00d1e83 100644 --- a/src/eth/rtl/taxi_eth_mac_phy_1g_basex.sv +++ b/src/eth/rtl/taxi_eth_mac_phy_1g_basex.sv @@ -380,15 +380,20 @@ end else begin end // Autonegotiation -wire logic [15:0] rx_an_cfg; -wire logic rx_an_cfg_valid; -wire logic rx_an_ability_match; -wire logic rx_an_ack_match; -wire logic rx_an_idle_match; +wire [15:0] rx_an_cfg; +wire rx_an_cfg_valid; +wire rx_an_ability_match; +wire rx_an_ack_match; +wire rx_an_idle_match; -wire logic [15:0] tx_an_cfg; -wire logic tx_an_cfg_valid; -wire logic tx_an_cfg_ready; +wire [15:0] tx_an_cfg; +wire tx_an_cfg_valid; +wire tx_an_cfg_ready; + +wire cfg_tx_sgmii_en; +wire [1:0] cfg_tx_sgmii_speed; +wire cfg_rx_sgmii_en; +wire [1:0] cfg_rx_sgmii_speed; if (AN_EN) begin : an @@ -403,7 +408,7 @@ if (AN_EN) begin : an .WIDTH(16+4), .N(2) ) - sync_inst ( + rx_sync_inst ( .clk(tx_clk), .in({ @@ -422,6 +427,23 @@ if (AN_EN) begin : an }) ); + taxi_sync_signal #( + .WIDTH(1+2), + .N(2) + ) + rx_sync_ctrl_inst ( + .clk(rx_clk), + + .in({ + cfg_tx_sgmii_en, + cfg_tx_sgmii_speed + }), + .out({ + cfg_rx_sgmii_en, + cfg_rx_sgmii_speed + }) + ); + taxi_eth_phy_1g_basex_an #( .DATA_W(DATA_W), .SGMII_EN(SGMII_EN) @@ -468,6 +490,9 @@ if (AN_EN) begin : an .an_res_rx_pause(an_res_rx_pause) ); + assign cfg_tx_sgmii_en = an_sgmii_mode; + assign cfg_tx_sgmii_speed = an_lp_sgmii_speed; + end else begin : an assign tx_an_cfg = '0; @@ -477,12 +502,18 @@ end else begin : an assign an_complete = 1'b0; assign an_lp_adv_ability = '0; + assign cfg_tx_sgmii_en = 1'b0; + assign cfg_tx_sgmii_speed = 2'b10; + assign cfg_rx_sgmii_en = 1'b0; + assign cfg_rx_sgmii_speed = 2'b10; + end taxi_eth_mac_phy_1g_basex_rx #( .DATA_W(DATA_W), .CTRL_W(CTRL_W), .GBX_IF_EN(RX_GBX_IF_EN), + .SGMII_EN(SGMII_EN), .AN_EN(AN_EN), .PTP_TS_EN(PTP_TS_EN), .PTP_TS_FMT_TOD(PTP_TS_FMT_TOD), @@ -552,6 +583,8 @@ rx_inst ( */ .cfg_rx_max_pkt_len(cfg_rx_max_pkt_len), .cfg_rx_enable(cfg_rx_enable), + .cfg_rx_sgmii_en(cfg_rx_sgmii_en), + .cfg_rx_sgmii_speed(cfg_rx_sgmii_speed), .cfg_rx_prbs31_enable(cfg_rx_prbs31_enable) ); @@ -559,6 +592,7 @@ taxi_eth_mac_phy_1g_basex_tx #( .DATA_W(DATA_W), .CTRL_W(CTRL_W), .GBX_IF_EN(TX_GBX_IF_EN), + .SGMII_EN(SGMII_EN), .AN_EN(AN_EN), .DIC_EN(DIC_EN), .PTP_TS_EN(PTP_TS_EN), @@ -629,6 +663,8 @@ tx_inst ( .cfg_tx_max_pkt_len(cfg_tx_max_pkt_len), .cfg_tx_ifg(cfg_tx_ifg), .cfg_tx_enable(cfg_tx_enable), + .cfg_tx_sgmii_en(cfg_tx_sgmii_en), + .cfg_tx_sgmii_speed(cfg_tx_sgmii_speed), .cfg_tx_prbs31_enable(cfg_tx_prbs31_enable) ); diff --git a/src/eth/rtl/taxi_eth_mac_phy_1g_basex_rx.sv b/src/eth/rtl/taxi_eth_mac_phy_1g_basex_rx.sv index 7723ecb..939e012 100644 --- a/src/eth/rtl/taxi_eth_mac_phy_1g_basex_rx.sv +++ b/src/eth/rtl/taxi_eth_mac_phy_1g_basex_rx.sv @@ -20,7 +20,8 @@ module taxi_eth_mac_phy_1g_basex_rx # parameter DATA_W = 16, parameter CTRL_W = (DATA_W/8), parameter logic GBX_IF_EN = 1'b0, - parameter logic AN_EN = 1'b1, + parameter logic SGMII_EN = 1'b1, + parameter logic AN_EN = SGMII_EN, 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, @@ -89,6 +90,8 @@ module taxi_eth_mac_phy_1g_basex_rx # */ input wire logic [15:0] cfg_rx_max_pkt_len = 16'd1518-1, input wire logic cfg_rx_enable, + input wire logic cfg_rx_sgmii_en = 1'b1, + input wire logic [1:0] cfg_rx_sgmii_speed = 2'b10, input wire logic cfg_rx_prbs31_enable ); @@ -146,6 +149,7 @@ if (DATA_W == 16) begin .DATA_W(DATA_W), .CTRL_W(CTRL_W), .GBX_IF_EN(GBX_IF_EN), + .SGMII_EN(SGMII_EN), .AN_EN(AN_EN), .PTP_TS_EN(PTP_TS_EN), .PTP_TS_FMT_TOD(PTP_TS_FMT_TOD), @@ -186,6 +190,8 @@ if (DATA_W == 16) begin */ .cfg_rx_max_pkt_len(cfg_rx_max_pkt_len), .cfg_rx_enable(cfg_rx_enable), + .cfg_rx_sgmii_en(cfg_rx_sgmii_en), + .cfg_rx_sgmii_speed(cfg_rx_sgmii_speed), /* * Status @@ -214,6 +220,7 @@ end else begin .DATA_W(DATA_W), .CTRL_W(CTRL_W), .GBX_IF_EN(GBX_IF_EN), + .SGMII_EN(SGMII_EN), .AN_EN(AN_EN), .PTP_TS_EN(PTP_TS_EN), .PTP_TS_W(PTP_TS_W) @@ -253,6 +260,8 @@ end else begin */ .cfg_rx_max_pkt_len(cfg_rx_max_pkt_len), .cfg_rx_enable(cfg_rx_enable), + .cfg_rx_sgmii_en(cfg_rx_sgmii_en), + .cfg_rx_sgmii_speed(cfg_rx_sgmii_speed), /* * Status diff --git a/src/eth/rtl/taxi_eth_mac_phy_1g_basex_tx.sv b/src/eth/rtl/taxi_eth_mac_phy_1g_basex_tx.sv index 526e04f..558e74d 100644 --- a/src/eth/rtl/taxi_eth_mac_phy_1g_basex_tx.sv +++ b/src/eth/rtl/taxi_eth_mac_phy_1g_basex_tx.sv @@ -20,7 +20,8 @@ module taxi_eth_mac_phy_1g_basex_tx # parameter DATA_W = 16, parameter CTRL_W = (DATA_W/8), parameter logic GBX_IF_EN = 1'b0, - parameter logic AN_EN = 1'b1, + parameter logic SGMII_EN = 1'b1, + parameter logic AN_EN = SGMII_EN, parameter logic DIC_EN = 1'b1, parameter logic PTP_TS_EN = 1'b0, parameter logic PTP_TS_FMT_TOD = 1'b1, @@ -90,6 +91,8 @@ module taxi_eth_mac_phy_1g_basex_tx # input wire logic [15:0] cfg_tx_max_pkt_len = 16'd1518-1, input wire logic [7:0] cfg_tx_ifg = 8'd12, input wire logic cfg_tx_enable, + input wire logic cfg_tx_sgmii_en = 1'b1, + input wire logic [1:0] cfg_tx_sgmii_speed = 2'b10, input wire logic cfg_tx_prbs31_enable ); @@ -150,6 +153,7 @@ if (DATA_W == 16) begin .CTRL_W(CTRL_W), .GBX_IF_EN(GBX_IF_EN), .GBX_CNT(1), + .SGMII_EN(SGMII_EN), .AN_EN(AN_EN), .DIC_EN(DIC_EN), .PTP_TS_EN(PTP_TS_EN), @@ -196,6 +200,8 @@ if (DATA_W == 16) begin .cfg_tx_max_pkt_len(cfg_tx_max_pkt_len), .cfg_tx_ifg(cfg_tx_ifg), .cfg_tx_enable(cfg_tx_enable), + .cfg_tx_sgmii_en(cfg_tx_sgmii_en), + .cfg_tx_sgmii_speed(cfg_tx_sgmii_speed), /* * Status @@ -221,6 +227,7 @@ end else begin .CTRL_W(CTRL_W), .GBX_IF_EN(GBX_IF_EN), .GBX_CNT(1), + .SGMII_EN(SGMII_EN), .AN_EN(AN_EN), .DIC_EN(DIC_EN), .PTP_TS_EN(PTP_TS_EN), @@ -267,6 +274,8 @@ end else begin .cfg_tx_max_pkt_len(cfg_tx_max_pkt_len), .cfg_tx_ifg(cfg_tx_ifg), .cfg_tx_enable(cfg_tx_enable), + .cfg_tx_sgmii_en(cfg_tx_sgmii_en), + .cfg_tx_sgmii_speed(cfg_tx_sgmii_speed), /* * Status