eth: Update VCU108 example design to use 32-bit MACs at 10G

Signed-off-by: Alex Forencich <alex@alexforencich.com>
This commit is contained in:
Alex Forencich
2025-11-05 21:49:33 -08:00
parent 31081b6a23
commit 0f5bc4eba8
8 changed files with 103 additions and 18 deletions

View File

@@ -38,6 +38,9 @@ XDC_FILES += $(TAXI_SRC_DIR)/sync/syn/vivado/taxi_sync_signal.tcl
IP_TCL_FILES = ../ip/sgmii_pcs_pma_0.tcl IP_TCL_FILES = ../ip/sgmii_pcs_pma_0.tcl
IP_TCL_FILES += $(TAXI_SRC_DIR)/eth/rtl/us/taxi_eth_phy_25g_us_gty_25g_156.tcl IP_TCL_FILES += $(TAXI_SRC_DIR)/eth/rtl/us/taxi_eth_phy_25g_us_gty_25g_156.tcl
# Configuration
CONFIG_TCL_FILES = ./config.tcl
include ../common/vivado.mk include ../common/vivado.mk
program: $(PROJECT).bit program: $(PROJECT).bit
@@ -88,4 +91,3 @@ flash: $(PROJECT).mcs $(PROJECT).prm
echo "boot_hw_device [current_hw_device]" >> flash.tcl echo "boot_hw_device [current_hw_device]" >> flash.tcl
echo "exit" >> flash.tcl echo "exit" >> flash.tcl
vivado -nojournal -nolog -mode batch -source flash.tcl vivado -nojournal -nolog -mode batch -source flash.tcl

View File

@@ -0,0 +1,22 @@
# SPDX-License-Identifier: MIT
#
# Copyright (c) 2025 FPGA Ninja, LLC
#
# Authors:
# - Alex Forencich
#
set params [dict create]
# 10G MAC configuration
dict set params CFG_LOW_LATENCY "1"
dict set params COMBINED_MAC_PCS "1"
dict set params MAC_DATA_W "64"
# apply parameters to top-level
set param_list {}
dict for {name value} $params {
lappend param_list $name=$value
}
set_property generic $param_list [get_filesets sources_1]

View File

@@ -36,7 +36,10 @@ XDC_FILES += $(TAXI_SRC_DIR)/sync/syn/vivado/taxi_sync_signal.tcl
# IP # IP
IP_TCL_FILES = ../ip/sgmii_pcs_pma_0.tcl IP_TCL_FILES = ../ip/sgmii_pcs_pma_0.tcl
IP_TCL_FILES += $(TAXI_SRC_DIR)/eth/rtl/us/taxi_eth_phy_25g_us_gty_10g_156.tcl IP_TCL_FILES += $(TAXI_SRC_DIR)/eth/rtl/us/taxi_eth_phy_10g_us_gty_156.tcl
# Configuration
CONFIG_TCL_FILES = ./config.tcl
include ../common/vivado.mk include ../common/vivado.mk
@@ -88,4 +91,3 @@ flash: $(PROJECT).mcs $(PROJECT).prm
echo "boot_hw_device [current_hw_device]" >> flash.tcl echo "boot_hw_device [current_hw_device]" >> flash.tcl
echo "exit" >> flash.tcl echo "exit" >> flash.tcl
vivado -nojournal -nolog -mode batch -source flash.tcl vivado -nojournal -nolog -mode batch -source flash.tcl

View File

@@ -0,0 +1,22 @@
# SPDX-License-Identifier: MIT
#
# Copyright (c) 2025 FPGA Ninja, LLC
#
# Authors:
# - Alex Forencich
#
set params [dict create]
# 10G MAC configuration
dict set params CFG_LOW_LATENCY "1"
dict set params COMBINED_MAC_PCS "1"
dict set params MAC_DATA_W "32"
# apply parameters to top-level
set param_list {}
dict for {name value} $params {
lappend param_list $name=$value
}
set_property generic $param_list [get_filesets sources_1]

View File

@@ -17,9 +17,16 @@ Authors:
*/ */
module fpga # module fpga #
( (
// simulation (set to avoid vendor primitives)
parameter logic SIM = 1'b0, parameter logic SIM = 1'b0,
// vendor ("GENERIC", "XILINX", "ALTERA")
parameter string VENDOR = "XILINX", parameter string VENDOR = "XILINX",
parameter string FAMILY = "virtexu" // device family
parameter string FAMILY = "virtexu",
// 10G/25G MAC configuration
parameter logic CFG_LOW_LATENCY = 1'b1,
parameter logic COMBINED_MAC_PCS = 1'b1,
parameter MAC_DATA_W = 64
) )
( (
/* /*
@@ -96,12 +103,12 @@ wire mmcm_clkfb;
IBUFGDS #( IBUFGDS #(
.DIFF_TERM("FALSE"), .DIFF_TERM("FALSE"),
.IBUF_LOW_PWR("FALSE") .IBUF_LOW_PWR("FALSE")
) )
clk_125mhz_ibufg_inst ( clk_125mhz_ibufg_inst (
.O (clk_125mhz_ibufg), .O (clk_125mhz_ibufg),
.I (clk_125mhz_p), .I (clk_125mhz_p),
.IB (clk_125mhz_n) .IB (clk_125mhz_n)
); );
// MMCM instance // MMCM instance
@@ -351,7 +358,10 @@ assign led = sw[3] ? (sw[0] ? pcspma_status_vector[15:8] : pcspma_status_vector[
fpga_core #( fpga_core #(
.SIM(SIM), .SIM(SIM),
.VENDOR(VENDOR), .VENDOR(VENDOR),
.FAMILY(FAMILY) .FAMILY(FAMILY),
.CFG_LOW_LATENCY(CFG_LOW_LATENCY),
.COMBINED_MAC_PCS(COMBINED_MAC_PCS),
.MAC_DATA_W(MAC_DATA_W)
) )
core_inst ( core_inst (
/* /*

View File

@@ -17,9 +17,16 @@ Authors:
*/ */
module fpga_core # module fpga_core #
( (
// simulation (set to avoid vendor primitives)
parameter logic SIM = 1'b0, parameter logic SIM = 1'b0,
// vendor ("GENERIC", "XILINX", "ALTERA")
parameter string VENDOR = "XILINX", parameter string VENDOR = "XILINX",
parameter string FAMILY = "virtexu" // device family
parameter string FAMILY = "virtexu",
// 10G/25G MAC configuration
parameter logic CFG_LOW_LATENCY = 1'b1,
parameter logic COMBINED_MAC_PCS = 1'b1,
parameter MAC_DATA_W = 64
) )
( (
/* /*
@@ -306,9 +313,9 @@ wire qsfp_mgt_refclk_0_bufg;
wire qsfp_rst; wire qsfp_rst;
taxi_axis_if #(.DATA_W(64), .ID_W(8)) axis_qsfp_tx[4](); taxi_axis_if #(.DATA_W(MAC_DATA_W), .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(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(MAC_DATA_W), .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(); 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 if (SIM) begin
@@ -356,12 +363,14 @@ taxi_eth_mac_25g_us #(
.CNT(4), .CNT(4),
// GT config // GT config
.CFG_LOW_LATENCY(1), .CFG_LOW_LATENCY(CFG_LOW_LATENCY),
// GT type // GT type
.GT_TYPE("GTY"), .GT_TYPE("GTY"),
// PHY parameters // MAC/PHY config
.COMBINED_MAC_PCS(COMBINED_MAC_PCS),
.DATA_W(MAC_DATA_W),
.PADDING_EN(1'b1), .PADDING_EN(1'b1),
.DIC_EN(1'b1), .DIC_EN(1'b1),
.MIN_FRAME_LEN(64), .MIN_FRAME_LEN(64),

View File

@@ -42,6 +42,9 @@ VERILOG_SOURCES := $(call uniq_base,$(call process_f_files,$(VERILOG_SOURCES)))
export PARAM_SIM := "1'b1" export PARAM_SIM := "1'b1"
export PARAM_VENDOR := "\"XILINX\"" export PARAM_VENDOR := "\"XILINX\""
export PARAM_FAMILY := "\"virtexu\"" export PARAM_FAMILY := "\"virtexu\""
export PARAM_CFG_LOW_LATENCY := "1'b1"
export PARAM_COMBINED_MAC_PCS := "1'b1"
export PARAM_MAC_DATA_W := "64"
ifeq ($(SIM), icarus) ifeq ($(SIM), icarus)
PLUSARGS += -fst PLUSARGS += -fst

View File

@@ -13,6 +13,7 @@ import logging
import os import os
import sys import sys
import pytest
import cocotb_test.simulator import cocotb_test.simulator
import cocotb import cocotb
@@ -60,12 +61,20 @@ class TB:
for ch in dut.qsfp_mac_inst.ch: for ch in dut.qsfp_mac_inst.ch:
gt_inst = ch.ch_inst.gt.gt_inst gt_inst = ch.ch_inst.gt.gt_inst
if ch.ch_inst.CFG_LOW_LATENCY.value: if ch.ch_inst.DATA_W.value == 64:
clk = 2.482 if ch.ch_inst.CFG_LOW_LATENCY.value:
gbx_cfg = (66, [64, 65]) clk = 2.482
gbx_cfg = (66, [64, 65])
else:
clk = 2.56
gbx_cfg = None
else: else:
clk = 2.56 if ch.ch_inst.CFG_LOW_LATENCY.value:
gbx_cfg = None clk = 3.102
gbx_cfg = (66, [64, 65])
else:
clk = 3.2
gbx_cfg = None
cocotb.start_soon(Clock(gt_inst.tx_clk, clk, units="ns").start()) cocotb.start_soon(Clock(gt_inst.tx_clk, clk, units="ns").start())
cocotb.start_soon(Clock(gt_inst.rx_clk, clk, units="ns").start()) cocotb.start_soon(Clock(gt_inst.rx_clk, clk, units="ns").start())
@@ -171,6 +180,8 @@ async def mac_test_25g(tb, source, sink):
for k in range(1200): for k in range(1200):
await RisingEdge(tb.dut.clk) await RisingEdge(tb.dut.clk)
sink.clear()
tb.log.info("Multiple small packets") tb.log.info("Multiple small packets")
count = 64 count = 64
@@ -253,7 +264,8 @@ def process_f_files(files):
return list(lst.values()) return list(lst.values())
def test_fpga_core(request): @pytest.mark.parametrize("mac_data_w", [32, 64])
def test_fpga_core(request, mac_data_w):
dut = "fpga_core" dut = "fpga_core"
module = os.path.splitext(os.path.basename(__file__))[0] module = os.path.splitext(os.path.basename(__file__))[0]
toplevel = dut toplevel = dut
@@ -277,6 +289,9 @@ def test_fpga_core(request):
parameters['SIM'] = "1'b1" parameters['SIM'] = "1'b1"
parameters['VENDOR'] = "\"XILINX\"" parameters['VENDOR'] = "\"XILINX\""
parameters['FAMILY'] = "\"virtexu\"" parameters['FAMILY'] = "\"virtexu\""
parameters['CFG_LOW_LATENCY'] = "1'b1"
parameters['COMBINED_MAC_PCS'] = "1'b1"
parameters['MAC_DATA_W'] = mac_data_w
extra_env = {f'PARAM_{k}': str(v) for k, v in parameters.items()} extra_env = {f'PARAM_{k}': str(v) for k, v in parameters.items()}