cndm: Clean up multiple quad handling

Signed-off-by: Alex Forencich <alex@alexforencich.com>
This commit is contained in:
Alex Forencich
2026-04-05 18:36:55 -07:00
parent bbe4353c3a
commit fb9757106d
9 changed files with 196 additions and 196 deletions

View File

@@ -321,7 +321,7 @@ assign qsfp_rx_n[4*0 +: 4] = qsfp_0_rx_n;
assign qsfp_rx_p[4*1 +: 4] = qsfp_1_rx_p; assign qsfp_rx_p[4*1 +: 4] = qsfp_1_rx_p;
assign qsfp_rx_n[4*1 +: 4] = qsfp_1_rx_n; assign qsfp_rx_n[4*1 +: 4] = qsfp_1_rx_n;
for (genvar n = 0; n < 2; n = n + 1) begin : gty_quad for (genvar n = 0; n < 2; n = n + 1) begin : gt_quad
localparam CNT = 4; localparam CNT = 4;

View File

@@ -9,6 +9,7 @@ Authors:
""" """
import itertools
import logging import logging
import os import os
import sys import sys
@@ -282,48 +283,47 @@ class TB:
self.qsfp_sources = [] self.qsfp_sources = []
self.qsfp_sinks = [] self.qsfp_sinks = []
for inst in dut.uut.gty_quad: for ch in itertools.chain.from_iterable([inst.mac_inst.ch for inst in dut.uut.gt_quad]):
for ch in inst.mac_inst.ch: gt_inst = ch.ch_inst.gt.gt_inst
gt_inst = ch.ch_inst.gt.gt_inst
if ch.ch_inst.DATA_W.value == 64: if ch.ch_inst.DATA_W.value == 64:
if ch.ch_inst.CFG_LOW_LATENCY.value: if ch.ch_inst.CFG_LOW_LATENCY.value:
clk = 2.482 clk = 2.482
gbx_cfg = (66, [64, 65]) gbx_cfg = (66, [64, 65])
else:
clk = 2.56
gbx_cfg = None
else: else:
if ch.ch_inst.CFG_LOW_LATENCY.value: clk = 2.56
clk = 3.102 gbx_cfg = None
gbx_cfg = (66, [64, 65]) else:
else: if ch.ch_inst.CFG_LOW_LATENCY.value:
clk = 3.2 clk = 3.102
gbx_cfg = None 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())
self.qsfp_sources.append(BaseRSerdesSource( self.qsfp_sources.append(BaseRSerdesSource(
data=gt_inst.serdes_rx_data, data=gt_inst.serdes_rx_data,
data_valid=gt_inst.serdes_rx_data_valid, data_valid=gt_inst.serdes_rx_data_valid,
hdr=gt_inst.serdes_rx_hdr, hdr=gt_inst.serdes_rx_hdr,
hdr_valid=gt_inst.serdes_rx_hdr_valid, hdr_valid=gt_inst.serdes_rx_hdr_valid,
clock=gt_inst.rx_clk, clock=gt_inst.rx_clk,
slip=gt_inst.serdes_rx_bitslip, slip=gt_inst.serdes_rx_bitslip,
reverse=True, reverse=True,
gbx_cfg=gbx_cfg gbx_cfg=gbx_cfg
)) ))
self.qsfp_sinks.append(BaseRSerdesSink( self.qsfp_sinks.append(BaseRSerdesSink(
data=gt_inst.serdes_tx_data, data=gt_inst.serdes_tx_data,
data_valid=gt_inst.serdes_tx_data_valid, data_valid=gt_inst.serdes_tx_data_valid,
hdr=gt_inst.serdes_tx_hdr, hdr=gt_inst.serdes_tx_hdr,
hdr_valid=gt_inst.serdes_tx_hdr_valid, hdr_valid=gt_inst.serdes_tx_hdr_valid,
gbx_sync=gt_inst.serdes_tx_gbx_sync, gbx_sync=gt_inst.serdes_tx_gbx_sync,
clock=gt_inst.tx_clk, clock=gt_inst.tx_clk,
reverse=True, reverse=True,
gbx_cfg=gbx_cfg gbx_cfg=gbx_cfg
)) ))
dut.user_sw.setimmediatevalue(0) dut.user_sw.setimmediatevalue(0)
dut.qsfp_0_modprs_l.setimmediatevalue(0) dut.qsfp_0_modprs_l.setimmediatevalue(0)

View File

@@ -412,7 +412,7 @@ wire eth_gty_mgt_refclk_bufg[GTY_CLK_CNT];
wire eth_gty_rst[GTY_CLK_CNT]; wire eth_gty_rst[GTY_CLK_CNT];
for (genvar n = 0; n < GTY_CLK_CNT; n = n + 1) begin : gty_clk for (genvar n = 0; n < GTY_CLK_CNT; n = n + 1) begin : gt_clk
wire eth_gty_mgt_refclk_int; wire eth_gty_mgt_refclk_int;
@@ -469,7 +469,7 @@ assign led[0] = ptp_pps_str;
localparam logic [8*8-1:0] STAT_PREFIX_STR_QSFP1[4] = '{"QSFP1.1", "QSFP1.2", "QSFP1.3", "QSFP1.4"}; localparam logic [8*8-1:0] STAT_PREFIX_STR_QSFP1[4] = '{"QSFP1.1", "QSFP1.2", "QSFP1.3", "QSFP1.4"};
localparam logic [8*8-1:0] STAT_PREFIX_STR_QSFP2[4] = '{"QSFP2.1", "QSFP2.2", "QSFP2.3", "QSFP2.4"}; localparam logic [8*8-1:0] STAT_PREFIX_STR_QSFP2[4] = '{"QSFP2.1", "QSFP2.2", "QSFP2.3", "QSFP2.4"};
for (genvar n = 0; n < GTY_QUAD_CNT; n = n + 1) begin : gty_quad for (genvar n = 0; n < GTY_QUAD_CNT; n = n + 1) begin : gt_quad
localparam CLK = n; localparam CLK = n;
localparam CNT = 4; localparam CNT = 4;

View File

@@ -9,6 +9,7 @@ Authors:
""" """
import itertools
import logging import logging
import os import os
import sys import sys
@@ -293,48 +294,47 @@ class TB:
self.qsfp_sources = [] self.qsfp_sources = []
self.qsfp_sinks = [] self.qsfp_sinks = []
for inst in dut.uut.gty_quad: for ch in itertools.chain.from_iterable([inst.mac_inst.ch for inst in dut.uut.gt_quad]):
for ch in inst.mac_inst.ch: gt_inst = ch.ch_inst.gt.gt_inst
gt_inst = ch.ch_inst.gt.gt_inst
if ch.ch_inst.DATA_W.value == 64: if ch.ch_inst.DATA_W.value == 64:
if ch.ch_inst.CFG_LOW_LATENCY.value: if ch.ch_inst.CFG_LOW_LATENCY.value:
clk = 2.482 clk = 2.482
gbx_cfg = (66, [64, 65]) gbx_cfg = (66, [64, 65])
else:
clk = 2.56
gbx_cfg = None
else: else:
if ch.ch_inst.CFG_LOW_LATENCY.value: clk = 2.56
clk = 3.102 gbx_cfg = None
gbx_cfg = (66, [64, 65]) else:
else: if ch.ch_inst.CFG_LOW_LATENCY.value:
clk = 3.2 clk = 3.102
gbx_cfg = None 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())
self.qsfp_sources.append(BaseRSerdesSource( self.qsfp_sources.append(BaseRSerdesSource(
data=gt_inst.serdes_rx_data, data=gt_inst.serdes_rx_data,
data_valid=gt_inst.serdes_rx_data_valid, data_valid=gt_inst.serdes_rx_data_valid,
hdr=gt_inst.serdes_rx_hdr, hdr=gt_inst.serdes_rx_hdr,
hdr_valid=gt_inst.serdes_rx_hdr_valid, hdr_valid=gt_inst.serdes_rx_hdr_valid,
clock=gt_inst.rx_clk, clock=gt_inst.rx_clk,
slip=gt_inst.serdes_rx_bitslip, slip=gt_inst.serdes_rx_bitslip,
reverse=True, reverse=True,
gbx_cfg=gbx_cfg gbx_cfg=gbx_cfg
)) ))
self.qsfp_sinks.append(BaseRSerdesSink( self.qsfp_sinks.append(BaseRSerdesSink(
data=gt_inst.serdes_tx_data, data=gt_inst.serdes_tx_data,
data_valid=gt_inst.serdes_tx_data_valid, data_valid=gt_inst.serdes_tx_data_valid,
hdr=gt_inst.serdes_tx_hdr, hdr=gt_inst.serdes_tx_hdr,
hdr_valid=gt_inst.serdes_tx_hdr_valid, hdr_valid=gt_inst.serdes_tx_hdr_valid,
gbx_sync=gt_inst.serdes_tx_gbx_sync, gbx_sync=gt_inst.serdes_tx_gbx_sync,
clock=gt_inst.tx_clk, clock=gt_inst.tx_clk,
reverse=True, reverse=True,
gbx_cfg=gbx_cfg gbx_cfg=gbx_cfg
)) ))
dut.sw.setimmediatevalue(0) dut.sw.setimmediatevalue(0)
dut.eth_port_modprsl.setimmediatevalue(0) dut.eth_port_modprsl.setimmediatevalue(0)

View File

@@ -9,6 +9,7 @@ Authors:
""" """
import itertools
import logging import logging
import os import os
import sys import sys
@@ -259,48 +260,47 @@ class TB:
self.qsfp_sources = [] self.qsfp_sources = []
self.qsfp_sinks = [] self.qsfp_sinks = []
for inst in dut.uut.gt_quad: for ch in itertools.chain.from_iterable([inst.mac_inst.ch for inst in dut.uut.gt_quad]):
for ch in inst.mac_inst.ch: gt_inst = ch.ch_inst.gt.gt_inst
gt_inst = ch.ch_inst.gt.gt_inst
if ch.ch_inst.DATA_W.value == 64: if ch.ch_inst.DATA_W.value == 64:
if ch.ch_inst.CFG_LOW_LATENCY.value: if ch.ch_inst.CFG_LOW_LATENCY.value:
clk = 6.206 clk = 6.206
gbx_cfg = (66, [64, 65]) gbx_cfg = (66, [64, 65])
else:
clk = 6.4
gbx_cfg = None
else: else:
if ch.ch_inst.CFG_LOW_LATENCY.value: clk = 6.4
clk = 3.102 gbx_cfg = None
gbx_cfg = (66, [64, 65]) else:
else: if ch.ch_inst.CFG_LOW_LATENCY.value:
clk = 3.2 clk = 3.102
gbx_cfg = None 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())
self.qsfp_sources.append(BaseRSerdesSource( self.qsfp_sources.append(BaseRSerdesSource(
data=gt_inst.serdes_rx_data, data=gt_inst.serdes_rx_data,
data_valid=gt_inst.serdes_rx_data_valid, data_valid=gt_inst.serdes_rx_data_valid,
hdr=gt_inst.serdes_rx_hdr, hdr=gt_inst.serdes_rx_hdr,
hdr_valid=gt_inst.serdes_rx_hdr_valid, hdr_valid=gt_inst.serdes_rx_hdr_valid,
clock=gt_inst.rx_clk, clock=gt_inst.rx_clk,
slip=gt_inst.serdes_rx_bitslip, slip=gt_inst.serdes_rx_bitslip,
reverse=True, reverse=True,
gbx_cfg=gbx_cfg gbx_cfg=gbx_cfg
)) ))
self.qsfp_sinks.append(BaseRSerdesSink( self.qsfp_sinks.append(BaseRSerdesSink(
data=gt_inst.serdes_tx_data, data=gt_inst.serdes_tx_data,
data_valid=gt_inst.serdes_tx_data_valid, data_valid=gt_inst.serdes_tx_data_valid,
hdr=gt_inst.serdes_tx_hdr, hdr=gt_inst.serdes_tx_hdr,
hdr_valid=gt_inst.serdes_tx_hdr_valid, hdr_valid=gt_inst.serdes_tx_hdr_valid,
gbx_sync=gt_inst.serdes_tx_gbx_sync, gbx_sync=gt_inst.serdes_tx_gbx_sync,
clock=gt_inst.tx_clk, clock=gt_inst.tx_clk,
reverse=True, reverse=True,
gbx_cfg=gbx_cfg gbx_cfg=gbx_cfg
)) ))
self.loopback_enable = False self.loopback_enable = False
cocotb.start_soon(self._run_loopback()) cocotb.start_soon(self._run_loopback())

View File

@@ -720,7 +720,7 @@ wire ptp_pps_str;
localparam logic [8*8-1:0] STAT_PREFIX_STR_QSFP1[4] = '{"QSFP1.1", "QSFP1.2", "QSFP1.3", "QSFP1.4"}; localparam logic [8*8-1:0] STAT_PREFIX_STR_QSFP1[4] = '{"QSFP1.1", "QSFP1.2", "QSFP1.3", "QSFP1.4"};
localparam logic [8*8-1:0] STAT_PREFIX_STR_QSFP2[4] = '{"QSFP2.1", "QSFP2.2", "QSFP2.3", "QSFP2.4"}; localparam logic [8*8-1:0] STAT_PREFIX_STR_QSFP2[4] = '{"QSFP2.1", "QSFP2.2", "QSFP2.3", "QSFP2.4"};
for (genvar n = 0; n < 2; n = n + 1) begin : gty_quad for (genvar n = 0; n < 2; n = n + 1) begin : gt_quad
localparam CNT = 4; localparam CNT = 4;

View File

@@ -9,6 +9,7 @@ Authors:
""" """
import itertools
import logging import logging
import os import os
import sys import sys
@@ -293,48 +294,47 @@ class TB:
self.qsfp_sources = [] self.qsfp_sources = []
self.qsfp_sinks = [] self.qsfp_sinks = []
for inst in dut.uut.gty_quad: for ch in itertools.chain.from_iterable([inst.mac_inst.ch for inst in dut.uut.gt_quad]):
for ch in inst.mac_inst.ch: gt_inst = ch.ch_inst.gt.gt_inst
gt_inst = ch.ch_inst.gt.gt_inst
if ch.ch_inst.DATA_W.value == 64: if ch.ch_inst.DATA_W.value == 64:
if ch.ch_inst.CFG_LOW_LATENCY.value: if ch.ch_inst.CFG_LOW_LATENCY.value:
clk = 2.482 clk = 2.482
gbx_cfg = (66, [64, 65]) gbx_cfg = (66, [64, 65])
else:
clk = 2.56
gbx_cfg = None
else: else:
if ch.ch_inst.CFG_LOW_LATENCY.value: clk = 2.56
clk = 3.102 gbx_cfg = None
gbx_cfg = (66, [64, 65]) else:
else: if ch.ch_inst.CFG_LOW_LATENCY.value:
clk = 3.2 clk = 3.102
gbx_cfg = None 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())
self.qsfp_sources.append(BaseRSerdesSource( self.qsfp_sources.append(BaseRSerdesSource(
data=gt_inst.serdes_rx_data, data=gt_inst.serdes_rx_data,
data_valid=gt_inst.serdes_rx_data_valid, data_valid=gt_inst.serdes_rx_data_valid,
hdr=gt_inst.serdes_rx_hdr, hdr=gt_inst.serdes_rx_hdr,
hdr_valid=gt_inst.serdes_rx_hdr_valid, hdr_valid=gt_inst.serdes_rx_hdr_valid,
clock=gt_inst.rx_clk, clock=gt_inst.rx_clk,
slip=gt_inst.serdes_rx_bitslip, slip=gt_inst.serdes_rx_bitslip,
reverse=True, reverse=True,
gbx_cfg=gbx_cfg gbx_cfg=gbx_cfg
)) ))
self.qsfp_sinks.append(BaseRSerdesSink( self.qsfp_sinks.append(BaseRSerdesSink(
data=gt_inst.serdes_tx_data, data=gt_inst.serdes_tx_data,
data_valid=gt_inst.serdes_tx_data_valid, data_valid=gt_inst.serdes_tx_data_valid,
hdr=gt_inst.serdes_tx_hdr, hdr=gt_inst.serdes_tx_hdr,
hdr_valid=gt_inst.serdes_tx_hdr_valid, hdr_valid=gt_inst.serdes_tx_hdr_valid,
gbx_sync=gt_inst.serdes_tx_gbx_sync, gbx_sync=gt_inst.serdes_tx_gbx_sync,
clock=gt_inst.tx_clk, clock=gt_inst.tx_clk,
reverse=True, reverse=True,
gbx_cfg=gbx_cfg gbx_cfg=gbx_cfg
)) ))
dut.phy_gmii_clk_en.setimmediatevalue(1) dut.phy_gmii_clk_en.setimmediatevalue(1)

View File

@@ -293,7 +293,7 @@ wire qsfp_mgt_refclk_bufg[2];
wire qsfp_rst[2]; wire qsfp_rst[2];
for (genvar n = 0; n < 2; n = n + 1) begin : gty_clk for (genvar n = 0; n < 2; n = n + 1) begin : gt_clk
wire qsfp_mgt_refclk_int; wire qsfp_mgt_refclk_int;
@@ -363,7 +363,7 @@ assign qsfp_rx_n[4*0 +: 4] = qsfp_0_rx_n;
assign qsfp_rx_p[4*1 +: 4] = qsfp_1_rx_p; assign qsfp_rx_p[4*1 +: 4] = qsfp_1_rx_p;
assign qsfp_rx_n[4*1 +: 4] = qsfp_1_rx_n; assign qsfp_rx_n[4*1 +: 4] = qsfp_1_rx_n;
for (genvar n = 0; n < 2; n = n + 1) begin : gty_quad for (genvar n = 0; n < 2; n = n + 1) begin : gt_quad
localparam CLK = n; localparam CLK = n;
localparam CNT = 4; localparam CNT = 4;

View File

@@ -9,6 +9,7 @@ Authors:
""" """
import itertools
import logging import logging
import os import os
import sys import sys
@@ -283,48 +284,47 @@ class TB:
self.qsfp_sources = [] self.qsfp_sources = []
self.qsfp_sinks = [] self.qsfp_sinks = []
for inst in dut.uut.gty_quad: for ch in itertools.chain.from_iterable([inst.mac_inst.ch for inst in dut.uut.gt_quad]):
for ch in inst.mac_inst.ch: gt_inst = ch.ch_inst.gt.gt_inst
gt_inst = ch.ch_inst.gt.gt_inst
if ch.ch_inst.DATA_W.value == 64: if ch.ch_inst.DATA_W.value == 64:
if ch.ch_inst.CFG_LOW_LATENCY.value: if ch.ch_inst.CFG_LOW_LATENCY.value:
clk = 2.482 clk = 2.482
gbx_cfg = (66, [64, 65]) gbx_cfg = (66, [64, 65])
else:
clk = 2.56
gbx_cfg = None
else: else:
if ch.ch_inst.CFG_LOW_LATENCY.value: clk = 2.56
clk = 3.102 gbx_cfg = None
gbx_cfg = (66, [64, 65]) else:
else: if ch.ch_inst.CFG_LOW_LATENCY.value:
clk = 3.2 clk = 3.102
gbx_cfg = None 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())
self.qsfp_sources.append(BaseRSerdesSource( self.qsfp_sources.append(BaseRSerdesSource(
data=gt_inst.serdes_rx_data, data=gt_inst.serdes_rx_data,
data_valid=gt_inst.serdes_rx_data_valid, data_valid=gt_inst.serdes_rx_data_valid,
hdr=gt_inst.serdes_rx_hdr, hdr=gt_inst.serdes_rx_hdr,
hdr_valid=gt_inst.serdes_rx_hdr_valid, hdr_valid=gt_inst.serdes_rx_hdr_valid,
clock=gt_inst.rx_clk, clock=gt_inst.rx_clk,
slip=gt_inst.serdes_rx_bitslip, slip=gt_inst.serdes_rx_bitslip,
reverse=True, reverse=True,
gbx_cfg=gbx_cfg gbx_cfg=gbx_cfg
)) ))
self.qsfp_sinks.append(BaseRSerdesSink( self.qsfp_sinks.append(BaseRSerdesSink(
data=gt_inst.serdes_tx_data, data=gt_inst.serdes_tx_data,
data_valid=gt_inst.serdes_tx_data_valid, data_valid=gt_inst.serdes_tx_data_valid,
hdr=gt_inst.serdes_tx_hdr, hdr=gt_inst.serdes_tx_hdr,
hdr_valid=gt_inst.serdes_tx_hdr_valid, hdr_valid=gt_inst.serdes_tx_hdr_valid,
gbx_sync=gt_inst.serdes_tx_gbx_sync, gbx_sync=gt_inst.serdes_tx_gbx_sync,
clock=gt_inst.tx_clk, clock=gt_inst.tx_clk,
reverse=True, reverse=True,
gbx_cfg=gbx_cfg gbx_cfg=gbx_cfg
)) ))
dut.qsfp_0_mod_prsnt_n.setimmediatevalue(0) dut.qsfp_0_mod_prsnt_n.setimmediatevalue(0)
dut.qsfp_0_intr_n.setimmediatevalue(0) dut.qsfp_0_intr_n.setimmediatevalue(0)