mirror of
https://github.com/fpganinja/taxi.git
synced 2026-04-09 05:18:44 -07:00
eth: Clean up multiple quad handling in Ethernet example designs
Signed-off-by: Alex Forencich <alex@alexforencich.com>
This commit is contained in:
@@ -146,7 +146,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;
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ Authors:
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import itertools
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
@@ -46,48 +47,47 @@ class TB:
|
|||||||
self.qsfp_sources = []
|
self.qsfp_sources = []
|
||||||
self.qsfp_sinks = []
|
self.qsfp_sinks = []
|
||||||
|
|
||||||
for inst in dut.gty_quad:
|
for ch in itertools.chain.from_iterable([inst.mac_inst.ch for inst in dut.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)
|
||||||
|
|
||||||
|
|||||||
@@ -249,7 +249,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;
|
||||||
|
|
||||||
@@ -297,7 +297,7 @@ end
|
|||||||
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;
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ Authors:
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import itertools
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
@@ -51,48 +52,47 @@ class TB:
|
|||||||
for clk in dut.eth_gty_mgt_refclk_p:
|
for clk in dut.eth_gty_mgt_refclk_p:
|
||||||
cocotb.start_soon(Clock(clk, 6.4, units="ns").start())
|
cocotb.start_soon(Clock(clk, 6.4, units="ns").start())
|
||||||
|
|
||||||
for inst in dut.gty_quad:
|
for ch in itertools.chain.from_iterable([inst.mac_inst.ch for inst in dut.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)
|
||||||
|
|||||||
@@ -317,7 +317,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;
|
||||||
|
|
||||||
@@ -378,7 +378,7 @@ localparam logic [8*8-1:0] STAT_PREFIX_STR_QSFP13[4] = '{"QSFP13.1", "QSFP13.2",
|
|||||||
localparam logic [8*8-1:0] STAT_PREFIX_STR_QSFP14[4] = '{"QSFP14.1", "QSFP14.2", "QSFP14.3", "QSFP14.4"};
|
localparam logic [8*8-1:0] STAT_PREFIX_STR_QSFP14[4] = '{"QSFP14.1", "QSFP14.2", "QSFP14.3", "QSFP14.4"};
|
||||||
localparam logic [8*8-1:0] STAT_PREFIX_STR_QSFP15[4] = '{"QSFP15.1", "QSFP15.2", "QSFP15.3", "QSFP15.4"};
|
localparam logic [8*8-1:0] STAT_PREFIX_STR_QSFP15[4] = '{"QSFP15.1", "QSFP15.2", "QSFP15.3", "QSFP15.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;
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ Authors:
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import itertools
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
@@ -52,48 +53,47 @@ class TB:
|
|||||||
for clk in dut.eth_gty_mgt_refclk_p:
|
for clk in dut.eth_gty_mgt_refclk_p:
|
||||||
cocotb.start_soon(Clock(clk, 6.206, units="ns").start())
|
cocotb.start_soon(Clock(clk, 6.206, units="ns").start())
|
||||||
|
|
||||||
for inst in dut.gty_quad:
|
for ch in itertools.chain.from_iterable([inst.mac_inst.ch for inst in dut.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.i2c_scl_i.setimmediatevalue(1)
|
dut.i2c_scl_i.setimmediatevalue(1)
|
||||||
dut.i2c_sda_i.setimmediatevalue(1)
|
dut.i2c_sda_i.setimmediatevalue(1)
|
||||||
|
|||||||
@@ -161,7 +161,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;
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ Authors:
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import itertools
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
@@ -46,48 +47,47 @@ class TB:
|
|||||||
self.qsfp_sources = []
|
self.qsfp_sources = []
|
||||||
self.qsfp_sinks = []
|
self.qsfp_sinks = []
|
||||||
|
|
||||||
for inst in dut.gty_quad:
|
for ch in itertools.chain.from_iterable([inst.mac_inst.ch for inst in dut.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_modprsl.setimmediatevalue(0)
|
dut.qsfp_0_modprsl.setimmediatevalue(0)
|
||||||
dut.qsfp_0_intl.setimmediatevalue(0)
|
dut.qsfp_0_intl.setimmediatevalue(0)
|
||||||
|
|||||||
@@ -550,7 +550,7 @@ assign qsfp_rx_n[4*1 +: 4] = qsfp2_rx_n;
|
|||||||
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;
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ Authors:
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import itertools
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
@@ -57,48 +58,47 @@ class TB:
|
|||||||
self.qsfp_sources = []
|
self.qsfp_sources = []
|
||||||
self.qsfp_sinks = []
|
self.qsfp_sinks = []
|
||||||
|
|
||||||
for inst in dut.gty_quad:
|
for ch in itertools.chain.from_iterable([inst.mac_inst.ch for inst in dut.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)
|
||||||
|
|
||||||
|
|||||||
@@ -215,7 +215,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;
|
||||||
|
|
||||||
@@ -277,7 +277,7 @@ localparam logic [8*8-1:0] STAT_PREFIX_STR_QSFP1[4] = '{"QSFP1.1", "QSFP1.2", "Q
|
|||||||
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"};
|
||||||
localparam logic [8*8-1:0] STAT_PREFIX_STR_QSFP3[4] = '{"QSFP3.1", "QSFP3.2", "QSFP3.3", "QSFP3.4"};
|
localparam logic [8*8-1:0] STAT_PREFIX_STR_QSFP3[4] = '{"QSFP3.1", "QSFP3.2", "QSFP3.3", "QSFP3.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 CNT = 4;
|
localparam CNT = 4;
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ Authors:
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import itertools
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
@@ -52,48 +53,47 @@ class TB:
|
|||||||
for clk in dut.eth_gty_mgt_refclk_p:
|
for clk in dut.eth_gty_mgt_refclk_p:
|
||||||
cocotb.start_soon(Clock(clk, 3.102, units="ns").start())
|
cocotb.start_soon(Clock(clk, 3.102, units="ns").start())
|
||||||
|
|
||||||
for inst in dut.gty_quad:
|
for ch in itertools.chain.from_iterable([inst.mac_inst.ch for inst in dut.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
|
||||||
))
|
))
|
||||||
|
|
||||||
async def init(self):
|
async def init(self):
|
||||||
|
|
||||||
|
|||||||
@@ -135,7 +135,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;
|
||||||
|
|
||||||
@@ -192,7 +192,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;
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ Authors:
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import itertools
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
@@ -47,48 +48,47 @@ class TB:
|
|||||||
self.qsfp_sources = []
|
self.qsfp_sources = []
|
||||||
self.qsfp_sinks = []
|
self.qsfp_sinks = []
|
||||||
|
|
||||||
for inst in dut.gty_quad:
|
for ch in itertools.chain.from_iterable([inst.mac_inst.ch for inst in dut.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)
|
||||||
|
|||||||
Reference in New Issue
Block a user