mirror of
https://github.com/corundum/corundum.git
synced 2025-01-16 08:12:53 +08:00
Add flow control
Signed-off-by: Alex Forencich <alex@alexforencich.com>
This commit is contained in:
parent
a169578cfd
commit
9963674c61
@ -62,6 +62,8 @@ See :ref:`rb_overview` for definitions of the standard register block header fie
|
||||
8 TX checksum offloading
|
||||
9 RX checksum offloading
|
||||
10 RX flow hash offloading
|
||||
11 LFC (IEEE 802.3 annex 31B)
|
||||
12 PFC (IEEE 802.3 annex 31D)
|
||||
=== =======================
|
||||
|
||||
.. object:: Port count
|
||||
|
@ -19,10 +19,30 @@ The port control register block has a header with type 0x0000C003, version 0x000
|
||||
-------- ------------- ------------------------------ -------------
|
||||
RBB+0x0C Features Port feature bits RO -
|
||||
-------- ------------- ------------------------------ -------------
|
||||
RBB+0x10 TX status TX status RO -
|
||||
RBB+0x10 TX control TX control/status RW 0x00000000
|
||||
-------- ------------- ------------------------------ -------------
|
||||
RBB+0x14 RX status RX status RO -
|
||||
======== ============= ============================== =============
|
||||
RBB+0x14 RX control RX control/status RW 0x00000000
|
||||
-------- ------------- ------------------------------ -------------
|
||||
RBB+0x18 FC ctrl RX quanta step TX quanta step RW -
|
||||
-------- ------------- -------------- -------------- -------------
|
||||
RBB+0x1C LFC ctrl ctrl LFC watermark RW 0x00000000
|
||||
-------- ------------- ------ ---------------------- -------------
|
||||
RBB+0x20 PFC ctrl 0 ctrl PFC watermark 0 RW 0x00000000
|
||||
-------- ------------- ------ ---------------------- -------------
|
||||
RBB+0x24 PFC ctrl 1 ctrl PFC watermark 1 RW 0x00000000
|
||||
-------- ------------- ------ ---------------------- -------------
|
||||
RBB+0x28 PFC ctrl 2 ctrl PFC watermark 2 RW 0x00000000
|
||||
-------- ------------- ------ ---------------------- -------------
|
||||
RBB+0x2C PFC ctrl 3 ctrl PFC watermark 3 RW 0x00000000
|
||||
-------- ------------- ------ ---------------------- -------------
|
||||
RBB+0x30 PFC ctrl 4 ctrl PFC watermark 4 RW 0x00000000
|
||||
-------- ------------- ------ ---------------------- -------------
|
||||
RBB+0x34 PFC ctrl 5 ctrl PFC watermark 5 RW 0x00000000
|
||||
-------- ------------- ------ ---------------------- -------------
|
||||
RBB+0x38 PFC ctrl 6 ctrl PFC watermark 6 RW 0x00000000
|
||||
-------- ------------- ------ ---------------------- -------------
|
||||
RBB+0x3C PFC ctrl 7 ctrl PFC watermark 7 RW 0x00000000
|
||||
======== ============= ====== ====================== =============
|
||||
|
||||
See :ref:`rb_overview` for definitions of the standard register block header fields.
|
||||
|
||||
@ -45,19 +65,48 @@ See :ref:`rb_overview` for definitions of the standard register block header fie
|
||||
=== =======================
|
||||
Bit Feature
|
||||
=== =======================
|
||||
\- None implemented
|
||||
0 LFC (IEEE 802.3 annex 31B)
|
||||
1 PFC (IEEE 802.3 annex 31D)
|
||||
2 Internal MAC control
|
||||
=== =======================
|
||||
|
||||
.. object:: TX status
|
||||
.. object:: TX control/status
|
||||
|
||||
The TX status field contains some high-level status information about the transmit size of the link associated with the port.
|
||||
The TX control/status field contains some high-level control and status registers for the transmit side of the link associated with the port.
|
||||
|
||||
.. table::
|
||||
|
||||
======== ====== ====== ====== ====== =============
|
||||
Address 31..24 23..16 15..8 7..0 Reset value
|
||||
======== ====== ====== ====== ====== =============
|
||||
RBB+0x10 TX status RO -
|
||||
RBB+0x10 TX control/status RW 0x00000000
|
||||
======== ============================== =============
|
||||
|
||||
Control bits:
|
||||
|
||||
.. table::
|
||||
|
||||
=== =======================
|
||||
Bit Function
|
||||
=== =======================
|
||||
0 TX enable
|
||||
8 TX pause control (halt TX traffic)
|
||||
16 TX status (link is ready)
|
||||
17 TX reset status (MAC TX is in reset)
|
||||
24 TX pause req status
|
||||
25 TX pause ack status
|
||||
=== =======================
|
||||
|
||||
.. object:: RX control/status
|
||||
|
||||
The RX control/status field contains some high-level control and status registers for the receive side of the link associated with the port.
|
||||
|
||||
.. table::
|
||||
|
||||
======== ====== ====== ====== ====== =============
|
||||
Address 31..24 23..16 15..8 7..0 Reset value
|
||||
======== ====== ====== ====== ====== =============
|
||||
RBB+0x14 RX control/status RO -
|
||||
======== ============================== =============
|
||||
|
||||
Status bits:
|
||||
@ -67,29 +116,72 @@ See :ref:`rb_overview` for definitions of the standard register block header fie
|
||||
=== =======================
|
||||
Bit Function
|
||||
=== =======================
|
||||
0 TX status (link is ready)
|
||||
1 TX reset status (MAC TX is in reset)
|
||||
0 RX enable
|
||||
8 RX pause control (halt RX traffic)
|
||||
16 RX status (link is ready)
|
||||
17 RX reset status (MAC RX is in reset)
|
||||
24 RX pause req status
|
||||
25 RX pause ack status
|
||||
=== =======================
|
||||
|
||||
.. object:: RX status
|
||||
.. object:: FC control
|
||||
|
||||
The RX status field contains some high-level status information about the receive side of the link associated with the port.
|
||||
The FC control field contains the quanta step size per clock cycle in units of 1/256 of one quanta for the internal MAC control layer. Default value is based on the MAC interface width.
|
||||
|
||||
.. table::
|
||||
|
||||
======== ====== ====== ====== ====== =============
|
||||
Address 31..24 23..16 15..8 7..0 Reset value
|
||||
======== ====== ====== ====== ====== =============
|
||||
RBB+0x14 RX status RO -
|
||||
======== ============================== =============
|
||||
RBB+0x18 RX quanta step TX quanta step RW -
|
||||
======== ============== ============== =============
|
||||
|
||||
Status bits:
|
||||
.. object:: LFC control
|
||||
|
||||
The LFC control field contains control and status registers for link-level flow control (LFC) (IEEE 802.3 annex 31B pause frames).
|
||||
|
||||
.. table::
|
||||
|
||||
======== ====== ====== ====== ====== =============
|
||||
Address 31..24 23..16 15..8 7..0 Reset value
|
||||
======== ====== ====== ====== ====== =============
|
||||
RBB+0x1C ctrl LFC watermark RW 0x00000000
|
||||
======== ====== ====================== =============
|
||||
|
||||
control bits:
|
||||
|
||||
.. table::
|
||||
|
||||
=== =======================
|
||||
Bit Function
|
||||
=== =======================
|
||||
0 RX status (link is ready)
|
||||
1 RX reset status (MAC RX is in reset)
|
||||
24 TX LFC en
|
||||
25 RX LFC en
|
||||
28 TX LFC req
|
||||
29 RX LFC req
|
||||
=== =======================
|
||||
|
||||
.. object:: PFC control N
|
||||
|
||||
The PFC control field contains control and status registers for priority flow control (PFC) (IEEE 802.3 annex 31D PFC).
|
||||
|
||||
.. table::
|
||||
|
||||
======== ====== ====== ====== ====== =============
|
||||
Address 31..24 23..16 15..8 7..0 Reset value
|
||||
======== ====== ====== ====== ====== =============
|
||||
RBB+0x20 ctrl PFC watermark RW 0x00000000
|
||||
======== ====== ====================== =============
|
||||
|
||||
control bits:
|
||||
|
||||
.. table::
|
||||
|
||||
=== =======================
|
||||
Bit Function
|
||||
=== =======================
|
||||
24 TX PFC en
|
||||
25 RX PFC en
|
||||
28 TX PFC req
|
||||
29 RX PFC req
|
||||
=== =======================
|
||||
|
@ -56,6 +56,10 @@ VERILOG_SOURCES += ../../rtl/common/tx_scheduler_rr.v
|
||||
VERILOG_SOURCES += ../../rtl/mqnic_app_block_dma_bench.v
|
||||
VERILOG_SOURCES += ../../rtl/dma_bench.v
|
||||
VERILOG_SOURCES += ../../rtl/dram_test_ch.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock_cdc.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_perout.v
|
||||
@ -167,6 +171,9 @@ export PARAM_TX_TAG_WIDTH := 16
|
||||
export PARAM_TX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_RX_HASH_ENABLE := 1
|
||||
export PARAM_RX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_LFC_ENABLE := 1
|
||||
export PARAM_PFC_ENABLE := $(PARAM_LFC_ENABLE)
|
||||
export PARAM_MAC_CTRL_ENABLE := 1
|
||||
export PARAM_TX_FIFO_DEPTH := 32768
|
||||
export PARAM_RX_FIFO_DEPTH := 131072
|
||||
export PARAM_MAX_TX_SIZE := 9214
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
import logging
|
||||
import os
|
||||
import struct
|
||||
import sys
|
||||
|
||||
import scapy.utils
|
||||
@ -321,7 +322,11 @@ class TB(object):
|
||||
self.port_mac.append(mac)
|
||||
|
||||
dut.eth_tx_status.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
dut.eth_tx_fc_quanta_clk_en.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
dut.eth_rx_status.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
dut.eth_rx_lfc_req.setimmediatevalue(0)
|
||||
dut.eth_rx_pfc_req.setimmediatevalue(0)
|
||||
dut.eth_rx_fc_quanta_clk_en.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
|
||||
# DDR
|
||||
self.ddr_group_size = core_inst.DDR_GROUP_SIZE.value
|
||||
@ -645,13 +650,16 @@ async def run_test_nic(dut):
|
||||
|
||||
for block in tb.driver.interfaces[0].sched_blocks:
|
||||
await block.schedulers[0].rb.write_dword(mqnic.MQNIC_RB_SCHED_RR_REG_CTRL, 0x00000001)
|
||||
await tb.driver.interfaces[0].set_rx_queue_map_indir_table(block.index, 0, block.index)
|
||||
await block.interface.set_rx_queue_map_indir_table(block.index, 0, block.index)
|
||||
for k in range(len(block.interface.txq)):
|
||||
if k % len(tb.driver.interfaces[0].sched_blocks) == block.index:
|
||||
if k % len(block.interface.sched_blocks) == block.index:
|
||||
await block.schedulers[0].hw_regs.write_dword(4*k, 0x00000003)
|
||||
else:
|
||||
await block.schedulers[0].hw_regs.write_dword(4*k, 0x00000000)
|
||||
|
||||
await block.interface.ports[block.index].set_tx_ctrl(mqnic.MQNIC_PORT_TX_CTRL_EN)
|
||||
await block.interface.ports[block.index].set_rx_ctrl(mqnic.MQNIC_PORT_RX_CTRL_EN)
|
||||
|
||||
count = 64
|
||||
|
||||
pkts = [bytearray([(x+k) % 256 for x in range(1514)]) for k in range(count)]
|
||||
@ -681,6 +689,35 @@ async def run_test_nic(dut):
|
||||
await block.schedulers[0].rb.write_dword(mqnic.MQNIC_RB_SCHED_RR_REG_CTRL, 0x00000000)
|
||||
await tb.driver.interfaces[0].set_rx_queue_map_indir_table(block.index, 0, 0)
|
||||
|
||||
if tb.driver.interfaces[0].if_feature_lfc:
|
||||
tb.log.info("Test LFC pause frame RX")
|
||||
|
||||
await tb.driver.interfaces[0].ports[0].set_lfc_ctrl(mqnic.MQNIC_PORT_LFC_CTRL_TX_LFC_EN | mqnic.MQNIC_PORT_LFC_CTRL_RX_LFC_EN)
|
||||
await tb.driver.hw_regs.read_dword(0)
|
||||
|
||||
lfc_xoff = Ether(src='DA:D1:D2:D3:D4:D5', dst='01:80:C2:00:00:01', type=0x8808) / struct.pack('!HH', 0x0001, 2000)
|
||||
|
||||
await tb.port_mac[0].rx.send(bytes(lfc_xoff))
|
||||
|
||||
count = 16
|
||||
|
||||
pkts = [bytearray([(x+k) % 256 for x in range(1514)]) for k in range(count)]
|
||||
|
||||
tb.loopback_enable = True
|
||||
|
||||
for p in pkts:
|
||||
await tb.driver.interfaces[0].start_xmit(p, 0)
|
||||
|
||||
for k in range(count):
|
||||
pkt = await tb.driver.interfaces[0].recv()
|
||||
|
||||
tb.log.info("Packet: %s", pkt)
|
||||
assert pkt.data == pkts[k]
|
||||
if tb.driver.interfaces[0].if_feature_rx_csum:
|
||||
assert pkt.rx_checksum == ~scapy.utils.checksum(bytes(pkt.data[14:])) & 0xffff
|
||||
|
||||
tb.loopback_enable = False
|
||||
|
||||
app_reg_blocks = mqnic.RegBlockList()
|
||||
await app_reg_blocks.enumerate_reg_blocks(tb.driver.app_hw_regs)
|
||||
|
||||
@ -974,6 +1011,10 @@ def test_mqnic_core_pcie_us(request, if_count, ports_per_if, axis_pcie_data_widt
|
||||
os.path.join(rtl_dir, "mqnic_app_block_dma_bench.v"),
|
||||
os.path.join(rtl_dir, "dma_bench.v"),
|
||||
os.path.join(rtl_dir, "dram_test_ch.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock_cdc.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_perout.v"),
|
||||
@ -1085,6 +1126,9 @@ def test_mqnic_core_pcie_us(request, if_count, ports_per_if, axis_pcie_data_widt
|
||||
parameters['TX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['RX_HASH_ENABLE'] = 1
|
||||
parameters['RX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['LFC_ENABLE'] = 1
|
||||
parameters['PFC_ENABLE'] = parameters['LFC_ENABLE']
|
||||
parameters['MAC_CTRL_ENABLE'] = 1
|
||||
parameters['TX_FIFO_DEPTH'] = 32768
|
||||
parameters['RX_FIFO_DEPTH'] = 131072
|
||||
parameters['MAX_TX_SIZE'] = 9214
|
||||
|
@ -54,6 +54,10 @@ VERILOG_SOURCES += ../../rtl/common/stats_dma_latency.v
|
||||
VERILOG_SOURCES += ../../rtl/common/mqnic_tx_scheduler_block_rr.v
|
||||
VERILOG_SOURCES += ../../rtl/common/tx_scheduler_rr.v
|
||||
VERILOG_SOURCES += ../../rtl/mqnic_app_block.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock_cdc.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_perout.v
|
||||
@ -161,6 +165,9 @@ export PARAM_TX_TAG_WIDTH := 16
|
||||
export PARAM_TX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_RX_HASH_ENABLE := 1
|
||||
export PARAM_RX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_LFC_ENABLE := 1
|
||||
export PARAM_PFC_ENABLE := $(PARAM_LFC_ENABLE)
|
||||
export PARAM_MAC_CTRL_ENABLE := 1
|
||||
export PARAM_TX_FIFO_DEPTH := 32768
|
||||
export PARAM_RX_FIFO_DEPTH := 131072
|
||||
export PARAM_MAX_TX_SIZE := 9214
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
import logging
|
||||
import os
|
||||
import struct
|
||||
import sys
|
||||
|
||||
import scapy.utils
|
||||
@ -321,7 +322,11 @@ class TB(object):
|
||||
self.port_mac.append(mac)
|
||||
|
||||
dut.eth_tx_status.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
dut.eth_tx_fc_quanta_clk_en.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
dut.eth_rx_status.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
dut.eth_rx_lfc_req.setimmediatevalue(0)
|
||||
dut.eth_rx_pfc_req.setimmediatevalue(0)
|
||||
dut.eth_rx_fc_quanta_clk_en.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
|
||||
# DDR
|
||||
self.ddr_group_size = core_inst.DDR_GROUP_SIZE.value
|
||||
@ -645,13 +650,16 @@ async def run_test_nic(dut):
|
||||
|
||||
for block in tb.driver.interfaces[0].sched_blocks:
|
||||
await block.schedulers[0].rb.write_dword(mqnic.MQNIC_RB_SCHED_RR_REG_CTRL, 0x00000001)
|
||||
await tb.driver.interfaces[0].set_rx_queue_map_indir_table(block.index, 0, block.index)
|
||||
await block.interface.set_rx_queue_map_indir_table(block.index, 0, block.index)
|
||||
for k in range(len(block.interface.txq)):
|
||||
if k % len(tb.driver.interfaces[0].sched_blocks) == block.index:
|
||||
if k % len(block.interface.sched_blocks) == block.index:
|
||||
await block.schedulers[0].hw_regs.write_dword(4*k, 0x00000003)
|
||||
else:
|
||||
await block.schedulers[0].hw_regs.write_dword(4*k, 0x00000000)
|
||||
|
||||
await block.interface.ports[block.index].set_tx_ctrl(mqnic.MQNIC_PORT_TX_CTRL_EN)
|
||||
await block.interface.ports[block.index].set_rx_ctrl(mqnic.MQNIC_PORT_RX_CTRL_EN)
|
||||
|
||||
count = 64
|
||||
|
||||
pkts = [bytearray([(x+k) % 256 for x in range(1514)]) for k in range(count)]
|
||||
@ -681,6 +689,35 @@ async def run_test_nic(dut):
|
||||
await block.schedulers[0].rb.write_dword(mqnic.MQNIC_RB_SCHED_RR_REG_CTRL, 0x00000000)
|
||||
await tb.driver.interfaces[0].set_rx_queue_map_indir_table(block.index, 0, 0)
|
||||
|
||||
if tb.driver.interfaces[0].if_feature_lfc:
|
||||
tb.log.info("Test LFC pause frame RX")
|
||||
|
||||
await tb.driver.interfaces[0].ports[0].set_lfc_ctrl(mqnic.MQNIC_PORT_LFC_CTRL_TX_LFC_EN | mqnic.MQNIC_PORT_LFC_CTRL_RX_LFC_EN)
|
||||
await tb.driver.hw_regs.read_dword(0)
|
||||
|
||||
lfc_xoff = Ether(src='DA:D1:D2:D3:D4:D5', dst='01:80:C2:00:00:01', type=0x8808) / struct.pack('!HH', 0x0001, 2000)
|
||||
|
||||
await tb.port_mac[0].rx.send(bytes(lfc_xoff))
|
||||
|
||||
count = 16
|
||||
|
||||
pkts = [bytearray([(x+k) % 256 for x in range(1514)]) for k in range(count)]
|
||||
|
||||
tb.loopback_enable = True
|
||||
|
||||
for p in pkts:
|
||||
await tb.driver.interfaces[0].start_xmit(p, 0)
|
||||
|
||||
for k in range(count):
|
||||
pkt = await tb.driver.interfaces[0].recv()
|
||||
|
||||
tb.log.info("Packet: %s", pkt)
|
||||
assert pkt.data == pkts[k]
|
||||
if tb.driver.interfaces[0].if_feature_rx_csum:
|
||||
assert pkt.rx_checksum == ~scapy.utils.checksum(bytes(pkt.data[14:])) & 0xffff
|
||||
|
||||
tb.loopback_enable = False
|
||||
|
||||
tb.log.info("Read statistics counters")
|
||||
|
||||
await Timer(2000, 'ns')
|
||||
@ -773,6 +810,10 @@ def test_mqnic_core_pcie_us(request, if_count, ports_per_if, axis_pcie_data_widt
|
||||
os.path.join(rtl_dir, "common", "mqnic_tx_scheduler_block_rr.v"),
|
||||
os.path.join(rtl_dir, "common", "tx_scheduler_rr.v"),
|
||||
os.path.join(rtl_dir, "mqnic_app_block.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock_cdc.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_perout.v"),
|
||||
@ -881,6 +922,9 @@ def test_mqnic_core_pcie_us(request, if_count, ports_per_if, axis_pcie_data_widt
|
||||
parameters['TX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['RX_HASH_ENABLE'] = 1
|
||||
parameters['RX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['LFC_ENABLE'] = 1
|
||||
parameters['PFC_ENABLE'] = parameters['LFC_ENABLE']
|
||||
parameters['MAC_CTRL_ENABLE'] = 1
|
||||
parameters['TX_FIFO_DEPTH'] = 32768
|
||||
parameters['RX_FIFO_DEPTH'] = 131072
|
||||
parameters['MAX_TX_SIZE'] = 9214
|
||||
|
@ -130,6 +130,12 @@ module cmac_gty_wrapper #
|
||||
output wire [15:0] tx_ptp_ts_tag,
|
||||
output wire tx_ptp_ts_valid,
|
||||
|
||||
input wire tx_enable,
|
||||
input wire tx_lfc_en,
|
||||
input wire tx_lfc_req,
|
||||
input wire [7:0] tx_pfc_en,
|
||||
input wire [7:0] tx_pfc_req,
|
||||
|
||||
output wire rx_clk,
|
||||
output wire rx_rst,
|
||||
|
||||
@ -143,7 +149,14 @@ module cmac_gty_wrapper #
|
||||
output wire rx_ptp_rst,
|
||||
input wire [79:0] rx_ptp_time,
|
||||
|
||||
output wire rx_status
|
||||
input wire rx_enable,
|
||||
output wire rx_status,
|
||||
input wire rx_lfc_en,
|
||||
output wire rx_lfc_req,
|
||||
input wire rx_lfc_ack,
|
||||
input wire [7:0] rx_pfc_en,
|
||||
output wire [7:0] rx_pfc_req,
|
||||
input wire [7:0] rx_pfc_ack
|
||||
);
|
||||
|
||||
reg [23:0] drp_addr_reg = 24'd0;
|
||||
@ -1578,7 +1591,48 @@ cmac_usplus cmac_inst (
|
||||
.stat_rx_packet_large(cmac_stat_rx_packet_large),
|
||||
.stat_rx_packet_small(cmac_stat_rx_packet_small),
|
||||
|
||||
.ctl_rx_enable(cmac_ctl_rx_enable_reg),
|
||||
.stat_rx_pause(),
|
||||
.stat_rx_pause_quanta0(),
|
||||
.stat_rx_pause_quanta1(),
|
||||
.stat_rx_pause_quanta2(),
|
||||
.stat_rx_pause_quanta3(),
|
||||
.stat_rx_pause_quanta4(),
|
||||
.stat_rx_pause_quanta5(),
|
||||
.stat_rx_pause_quanta6(),
|
||||
.stat_rx_pause_quanta7(),
|
||||
.stat_rx_pause_quanta8(),
|
||||
.stat_rx_pause_req({rx_lfc_req, rx_pfc_req}),
|
||||
.stat_rx_pause_valid(),
|
||||
.stat_rx_user_pause(),
|
||||
|
||||
.ctl_rx_check_etype_gcp(1'b1),
|
||||
.ctl_rx_check_etype_gpp(1'b1),
|
||||
.ctl_rx_check_etype_pcp(1'b1),
|
||||
.ctl_rx_check_etype_ppp(1'b1),
|
||||
.ctl_rx_check_mcast_gcp(1'b1),
|
||||
.ctl_rx_check_mcast_gpp(1'b1),
|
||||
.ctl_rx_check_mcast_pcp(1'b1),
|
||||
.ctl_rx_check_mcast_ppp(1'b1),
|
||||
.ctl_rx_check_opcode_gcp(1'b1),
|
||||
.ctl_rx_check_opcode_gpp(1'b1),
|
||||
.ctl_rx_check_opcode_pcp(1'b1),
|
||||
.ctl_rx_check_opcode_ppp(1'b1),
|
||||
.ctl_rx_check_sa_gcp(1'b0),
|
||||
.ctl_rx_check_sa_gpp(1'b0),
|
||||
.ctl_rx_check_sa_pcp(1'b0),
|
||||
.ctl_rx_check_sa_ppp(1'b0),
|
||||
.ctl_rx_check_ucast_gcp(1'b0),
|
||||
.ctl_rx_check_ucast_gpp(1'b0),
|
||||
.ctl_rx_check_ucast_pcp(1'b0),
|
||||
.ctl_rx_check_ucast_ppp(1'b0),
|
||||
.ctl_rx_enable_gcp(rx_lfc_en),
|
||||
.ctl_rx_enable_gpp(rx_lfc_en),
|
||||
.ctl_rx_enable_pcp(rx_pfc_en != 0),
|
||||
.ctl_rx_enable_ppp(rx_pfc_en != 0),
|
||||
.ctl_rx_pause_ack({rx_lfc_ack, rx_pfc_ack}),
|
||||
.ctl_rx_pause_enable({rx_lfc_en, rx_pfc_en}),
|
||||
|
||||
.ctl_rx_enable(cmac_ctl_rx_enable_reg && rx_enable),
|
||||
.ctl_rx_force_resync(cmac_ctl_rx_force_resync_reg),
|
||||
.ctl_rx_test_pattern(cmac_ctl_rx_test_pattern_reg),
|
||||
|
||||
@ -1658,7 +1712,7 @@ cmac_usplus cmac_inst (
|
||||
.stat_tx_unicast(cmac_stat_tx_unicast),
|
||||
.stat_tx_vlan(cmac_stat_tx_vlan),
|
||||
|
||||
.ctl_tx_enable(cmac_ctl_tx_enable_reg),
|
||||
.ctl_tx_enable(cmac_ctl_tx_enable_reg && tx_enable),
|
||||
.ctl_tx_send_idle(cmac_ctl_tx_send_idle_reg),
|
||||
.ctl_tx_send_rfi(cmac_ctl_tx_send_rfi_reg),
|
||||
.ctl_tx_send_lfi(cmac_ctl_tx_send_lfi_reg),
|
||||
@ -1666,6 +1720,32 @@ cmac_usplus cmac_inst (
|
||||
|
||||
.tx_clk(tx_clk),
|
||||
|
||||
.stat_tx_pause_valid(),
|
||||
.stat_tx_pause(),
|
||||
.stat_tx_user_pause(),
|
||||
|
||||
.ctl_tx_pause_enable({tx_lfc_en, tx_pfc_en}),
|
||||
.ctl_tx_pause_quanta0(16'hffff),
|
||||
.ctl_tx_pause_quanta1(16'hffff),
|
||||
.ctl_tx_pause_quanta2(16'hffff),
|
||||
.ctl_tx_pause_quanta3(16'hffff),
|
||||
.ctl_tx_pause_quanta4(16'hffff),
|
||||
.ctl_tx_pause_quanta5(16'hffff),
|
||||
.ctl_tx_pause_quanta6(16'hffff),
|
||||
.ctl_tx_pause_quanta7(16'hffff),
|
||||
.ctl_tx_pause_quanta8(16'hffff),
|
||||
.ctl_tx_pause_refresh_timer0(16'h7fff),
|
||||
.ctl_tx_pause_refresh_timer1(16'h7fff),
|
||||
.ctl_tx_pause_refresh_timer2(16'h7fff),
|
||||
.ctl_tx_pause_refresh_timer3(16'h7fff),
|
||||
.ctl_tx_pause_refresh_timer4(16'h7fff),
|
||||
.ctl_tx_pause_refresh_timer5(16'h7fff),
|
||||
.ctl_tx_pause_refresh_timer6(16'h7fff),
|
||||
.ctl_tx_pause_refresh_timer7(16'h7fff),
|
||||
.ctl_tx_pause_refresh_timer8(16'h7fff),
|
||||
.ctl_tx_pause_req({tx_lfc_req, tx_pfc_req}),
|
||||
.ctl_tx_resend_pause(1'b0),
|
||||
|
||||
.tx_axis_tready(cmac_tx_axis_tready),
|
||||
.tx_axis_tvalid(cmac_tx_axis_tvalid),
|
||||
.tx_axis_tdata(cmac_tx_axis_tdata),
|
||||
|
@ -80,6 +80,9 @@ module mqnic_core #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter MAC_CTRL_ENABLE = 0,
|
||||
parameter TX_FIFO_DEPTH = 32768,
|
||||
parameter RX_FIFO_DEPTH = 32768,
|
||||
parameter MAX_TX_SIZE = 9214,
|
||||
@ -410,7 +413,13 @@ module mqnic_core #
|
||||
input wire [PORT_COUNT-1:0] s_axis_tx_cpl_valid,
|
||||
output wire [PORT_COUNT-1:0] s_axis_tx_cpl_ready,
|
||||
|
||||
output wire [PORT_COUNT-1:0] tx_enable,
|
||||
input wire [PORT_COUNT-1:0] tx_status,
|
||||
output wire [PORT_COUNT-1:0] tx_lfc_en,
|
||||
output wire [PORT_COUNT-1:0] tx_lfc_req,
|
||||
output wire [PORT_COUNT*8-1:0] tx_pfc_en,
|
||||
output wire [PORT_COUNT*8-1:0] tx_pfc_req,
|
||||
input wire [PORT_COUNT-1:0] tx_fc_quanta_clk_en,
|
||||
|
||||
input wire [PORT_COUNT-1:0] rx_clk,
|
||||
input wire [PORT_COUNT-1:0] rx_rst,
|
||||
@ -427,7 +436,15 @@ module mqnic_core #
|
||||
input wire [PORT_COUNT-1:0] s_axis_rx_tlast,
|
||||
input wire [PORT_COUNT*AXIS_RX_USER_WIDTH-1:0] s_axis_rx_tuser,
|
||||
|
||||
output wire [PORT_COUNT-1:0] rx_enable,
|
||||
input wire [PORT_COUNT-1:0] rx_status,
|
||||
output wire [PORT_COUNT-1:0] rx_lfc_en,
|
||||
input wire [PORT_COUNT-1:0] rx_lfc_req,
|
||||
output wire [PORT_COUNT-1:0] rx_lfc_ack,
|
||||
output wire [PORT_COUNT*8-1:0] rx_pfc_en,
|
||||
input wire [PORT_COUNT*8-1:0] rx_pfc_req,
|
||||
output wire [PORT_COUNT*8-1:0] rx_pfc_ack,
|
||||
input wire [PORT_COUNT-1:0] rx_fc_quanta_clk_en,
|
||||
|
||||
/*
|
||||
* DDR
|
||||
@ -3060,6 +3077,9 @@ generate
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.MAC_CTRL_ENABLE(MAC_CTRL_ENABLE),
|
||||
.TX_FIFO_DEPTH(TX_FIFO_DEPTH),
|
||||
.RX_FIFO_DEPTH(RX_FIFO_DEPTH),
|
||||
.MAX_TX_SIZE(MAX_TX_SIZE),
|
||||
@ -3433,7 +3453,13 @@ generate
|
||||
.s_axis_tx_cpl_valid(s_axis_tx_cpl_valid[n*PORTS_PER_IF +: PORTS_PER_IF]),
|
||||
.s_axis_tx_cpl_ready(s_axis_tx_cpl_ready[n*PORTS_PER_IF +: PORTS_PER_IF]),
|
||||
|
||||
.tx_enable(tx_enable[n*PORTS_PER_IF +: PORTS_PER_IF]),
|
||||
.tx_status(tx_status[n*PORTS_PER_IF +: PORTS_PER_IF]),
|
||||
.tx_lfc_en(tx_lfc_en[n*PORTS_PER_IF +: PORTS_PER_IF]),
|
||||
.tx_lfc_req(tx_lfc_req[n*PORTS_PER_IF +: PORTS_PER_IF]),
|
||||
.tx_pfc_en(tx_pfc_en[n*PORTS_PER_IF*8 +: PORTS_PER_IF*8]),
|
||||
.tx_pfc_req(tx_pfc_req[n*PORTS_PER_IF*8 +: PORTS_PER_IF*8]),
|
||||
.tx_fc_quanta_clk_en(tx_fc_quanta_clk_en[n*PORTS_PER_IF +: PORTS_PER_IF]),
|
||||
|
||||
/*
|
||||
* Receive data input
|
||||
@ -3448,7 +3474,15 @@ generate
|
||||
.s_axis_rx_tlast(s_axis_rx_tlast[n*PORTS_PER_IF +: PORTS_PER_IF]),
|
||||
.s_axis_rx_tuser(s_axis_rx_tuser[n*PORTS_PER_IF*AXIS_RX_USER_WIDTH +: PORTS_PER_IF*AXIS_RX_USER_WIDTH]),
|
||||
|
||||
.rx_enable(rx_enable[n*PORTS_PER_IF +: PORTS_PER_IF]),
|
||||
.rx_status(rx_status[n*PORTS_PER_IF +: PORTS_PER_IF]),
|
||||
.rx_lfc_en(rx_lfc_en[n*PORTS_PER_IF +: PORTS_PER_IF]),
|
||||
.rx_lfc_req(rx_lfc_req[n*PORTS_PER_IF +: PORTS_PER_IF]),
|
||||
.rx_lfc_ack(rx_lfc_ack[n*PORTS_PER_IF +: PORTS_PER_IF]),
|
||||
.rx_pfc_en(rx_pfc_en[n*PORTS_PER_IF*8 +: PORTS_PER_IF*8]),
|
||||
.rx_pfc_req(rx_pfc_req[n*PORTS_PER_IF*8 +: PORTS_PER_IF*8]),
|
||||
.rx_pfc_ack(rx_pfc_ack[n*PORTS_PER_IF*8 +: PORTS_PER_IF*8]),
|
||||
.rx_fc_quanta_clk_en(rx_fc_quanta_clk_en[n*PORTS_PER_IF +: PORTS_PER_IF]),
|
||||
|
||||
/*
|
||||
* PTP clock
|
||||
|
@ -80,6 +80,9 @@ module mqnic_core_axi #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter MAC_CTRL_ENABLE = 0,
|
||||
parameter TX_FIFO_DEPTH = 32768,
|
||||
parameter RX_FIFO_DEPTH = 32768,
|
||||
parameter MAX_TX_SIZE = 9214,
|
||||
@ -372,7 +375,13 @@ module mqnic_core_axi #
|
||||
input wire [PORT_COUNT-1:0] s_axis_tx_cpl_valid,
|
||||
output wire [PORT_COUNT-1:0] s_axis_tx_cpl_ready,
|
||||
|
||||
output wire [PORT_COUNT-1:0] tx_enable,
|
||||
input wire [PORT_COUNT-1:0] tx_status,
|
||||
output wire [PORT_COUNT-1:0] tx_lfc_en,
|
||||
output wire [PORT_COUNT-1:0] tx_lfc_req,
|
||||
output wire [PORT_COUNT*8-1:0] tx_pfc_en,
|
||||
output wire [PORT_COUNT*8-1:0] tx_pfc_req,
|
||||
input wire [PORT_COUNT-1:0] tx_fc_quanta_clk_en,
|
||||
|
||||
input wire [PORT_COUNT-1:0] rx_clk,
|
||||
input wire [PORT_COUNT-1:0] rx_rst,
|
||||
@ -389,7 +398,15 @@ module mqnic_core_axi #
|
||||
input wire [PORT_COUNT-1:0] s_axis_rx_tlast,
|
||||
input wire [PORT_COUNT*AXIS_RX_USER_WIDTH-1:0] s_axis_rx_tuser,
|
||||
|
||||
output wire [PORT_COUNT-1:0] rx_enable,
|
||||
input wire [PORT_COUNT-1:0] rx_status,
|
||||
output wire [PORT_COUNT-1:0] rx_lfc_en,
|
||||
input wire [PORT_COUNT-1:0] rx_lfc_req,
|
||||
output wire [PORT_COUNT-1:0] rx_lfc_ack,
|
||||
output wire [PORT_COUNT*8-1:0] rx_pfc_en,
|
||||
input wire [PORT_COUNT*8-1:0] rx_pfc_req,
|
||||
output wire [PORT_COUNT*8-1:0] rx_pfc_ack,
|
||||
input wire [PORT_COUNT-1:0] rx_fc_quanta_clk_en,
|
||||
|
||||
/*
|
||||
* DDR
|
||||
@ -994,6 +1011,9 @@ mqnic_core #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.MAC_CTRL_ENABLE(MAC_CTRL_ENABLE),
|
||||
.TX_FIFO_DEPTH(TX_FIFO_DEPTH),
|
||||
.RX_FIFO_DEPTH(RX_FIFO_DEPTH),
|
||||
.MAX_TX_SIZE(MAX_TX_SIZE),
|
||||
@ -1298,7 +1318,13 @@ core_inst (
|
||||
.s_axis_tx_cpl_valid(s_axis_tx_cpl_valid),
|
||||
.s_axis_tx_cpl_ready(s_axis_tx_cpl_ready),
|
||||
|
||||
.tx_enable(tx_enable),
|
||||
.tx_status(tx_status),
|
||||
.tx_lfc_en(tx_lfc_en),
|
||||
.tx_lfc_req(tx_lfc_req),
|
||||
.tx_pfc_en(tx_pfc_en),
|
||||
.tx_pfc_req(tx_pfc_req),
|
||||
.tx_fc_quanta_clk_en(tx_fc_quanta_clk_en),
|
||||
|
||||
.rx_clk(rx_clk),
|
||||
.rx_rst(rx_rst),
|
||||
@ -1315,7 +1341,15 @@ core_inst (
|
||||
.s_axis_rx_tlast(s_axis_rx_tlast),
|
||||
.s_axis_rx_tuser(s_axis_rx_tuser),
|
||||
|
||||
.rx_enable(rx_enable),
|
||||
.rx_status(rx_status),
|
||||
.rx_lfc_en(rx_lfc_en),
|
||||
.rx_lfc_req(rx_lfc_req),
|
||||
.rx_lfc_ack(rx_lfc_ack),
|
||||
.rx_pfc_en(rx_pfc_en),
|
||||
.rx_pfc_req(rx_pfc_req),
|
||||
.rx_pfc_ack(rx_pfc_ack),
|
||||
.rx_fc_quanta_clk_en(rx_fc_quanta_clk_en),
|
||||
|
||||
/*
|
||||
* DDR
|
||||
|
@ -80,6 +80,9 @@ module mqnic_core_pcie #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter MAC_CTRL_ENABLE = 0,
|
||||
parameter TX_FIFO_DEPTH = 32768,
|
||||
parameter RX_FIFO_DEPTH = 32768,
|
||||
parameter MAX_TX_SIZE = 9214,
|
||||
@ -389,7 +392,13 @@ module mqnic_core_pcie #
|
||||
input wire [PORT_COUNT-1:0] s_axis_tx_cpl_valid,
|
||||
output wire [PORT_COUNT-1:0] s_axis_tx_cpl_ready,
|
||||
|
||||
output wire [PORT_COUNT-1:0] tx_enable,
|
||||
input wire [PORT_COUNT-1:0] tx_status,
|
||||
output wire [PORT_COUNT-1:0] tx_lfc_en,
|
||||
output wire [PORT_COUNT-1:0] tx_lfc_req,
|
||||
output wire [PORT_COUNT*8-1:0] tx_pfc_en,
|
||||
output wire [PORT_COUNT*8-1:0] tx_pfc_req,
|
||||
input wire [PORT_COUNT-1:0] tx_fc_quanta_clk_en,
|
||||
|
||||
input wire [PORT_COUNT-1:0] rx_clk,
|
||||
input wire [PORT_COUNT-1:0] rx_rst,
|
||||
@ -406,7 +415,15 @@ module mqnic_core_pcie #
|
||||
input wire [PORT_COUNT-1:0] s_axis_rx_tlast,
|
||||
input wire [PORT_COUNT*AXIS_RX_USER_WIDTH-1:0] s_axis_rx_tuser,
|
||||
|
||||
output wire [PORT_COUNT-1:0] rx_enable,
|
||||
input wire [PORT_COUNT-1:0] rx_status,
|
||||
output wire [PORT_COUNT-1:0] rx_lfc_en,
|
||||
input wire [PORT_COUNT-1:0] rx_lfc_req,
|
||||
output wire [PORT_COUNT-1:0] rx_lfc_ack,
|
||||
output wire [PORT_COUNT*8-1:0] rx_pfc_en,
|
||||
input wire [PORT_COUNT*8-1:0] rx_pfc_req,
|
||||
output wire [PORT_COUNT*8-1:0] rx_pfc_ack,
|
||||
input wire [PORT_COUNT-1:0] rx_fc_quanta_clk_en,
|
||||
|
||||
/*
|
||||
* DDR
|
||||
@ -1626,6 +1643,9 @@ mqnic_core #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.MAC_CTRL_ENABLE(MAC_CTRL_ENABLE),
|
||||
.TX_FIFO_DEPTH(TX_FIFO_DEPTH),
|
||||
.RX_FIFO_DEPTH(RX_FIFO_DEPTH),
|
||||
.MAX_TX_SIZE(MAX_TX_SIZE),
|
||||
@ -1954,7 +1974,13 @@ core_inst (
|
||||
.s_axis_tx_cpl_valid(s_axis_tx_cpl_valid),
|
||||
.s_axis_tx_cpl_ready(s_axis_tx_cpl_ready),
|
||||
|
||||
.tx_enable(tx_enable),
|
||||
.tx_status(tx_status),
|
||||
.tx_lfc_en(tx_lfc_en),
|
||||
.tx_lfc_req(tx_lfc_req),
|
||||
.tx_pfc_en(tx_pfc_en),
|
||||
.tx_pfc_req(tx_pfc_req),
|
||||
.tx_fc_quanta_clk_en(tx_fc_quanta_clk_en),
|
||||
|
||||
.rx_clk(rx_clk),
|
||||
.rx_rst(rx_rst),
|
||||
@ -1971,7 +1997,15 @@ core_inst (
|
||||
.s_axis_rx_tlast(s_axis_rx_tlast),
|
||||
.s_axis_rx_tuser(s_axis_rx_tuser),
|
||||
|
||||
.rx_enable(rx_enable),
|
||||
.rx_status(rx_status),
|
||||
.rx_lfc_en(rx_lfc_en),
|
||||
.rx_lfc_req(rx_lfc_req),
|
||||
.rx_lfc_ack(rx_lfc_ack),
|
||||
.rx_pfc_en(rx_pfc_en),
|
||||
.rx_pfc_req(rx_pfc_req),
|
||||
.rx_pfc_ack(rx_pfc_ack),
|
||||
.rx_fc_quanta_clk_en(rx_fc_quanta_clk_en),
|
||||
|
||||
/*
|
||||
* DDR
|
||||
|
@ -80,6 +80,9 @@ module mqnic_core_pcie_ptile #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter MAC_CTRL_ENABLE = 0,
|
||||
parameter TX_FIFO_DEPTH = 32768,
|
||||
parameter RX_FIFO_DEPTH = 32768,
|
||||
parameter MAX_TX_SIZE = 9214,
|
||||
@ -337,7 +340,13 @@ module mqnic_core_pcie_ptile #
|
||||
input wire [PORT_COUNT-1:0] s_axis_eth_tx_cpl_valid,
|
||||
output wire [PORT_COUNT-1:0] s_axis_eth_tx_cpl_ready,
|
||||
|
||||
output wire [PORT_COUNT-1:0] eth_tx_enable,
|
||||
input wire [PORT_COUNT-1:0] eth_tx_status,
|
||||
output wire [PORT_COUNT-1:0] eth_tx_lfc_en,
|
||||
output wire [PORT_COUNT-1:0] eth_tx_lfc_req,
|
||||
output wire [PORT_COUNT*8-1:0] eth_tx_pfc_en,
|
||||
output wire [PORT_COUNT*8-1:0] eth_tx_pfc_req,
|
||||
input wire [PORT_COUNT-1:0] eth_tx_fc_quanta_clk_en,
|
||||
|
||||
input wire [PORT_COUNT-1:0] eth_rx_clk,
|
||||
input wire [PORT_COUNT-1:0] eth_rx_rst,
|
||||
@ -354,7 +363,15 @@ module mqnic_core_pcie_ptile #
|
||||
input wire [PORT_COUNT-1:0] s_axis_eth_rx_tlast,
|
||||
input wire [PORT_COUNT*AXIS_ETH_RX_USER_WIDTH-1:0] s_axis_eth_rx_tuser,
|
||||
|
||||
output wire [PORT_COUNT-1:0] eth_rx_enable,
|
||||
input wire [PORT_COUNT-1:0] eth_rx_status,
|
||||
output wire [PORT_COUNT-1:0] eth_rx_lfc_en,
|
||||
input wire [PORT_COUNT-1:0] eth_rx_lfc_req,
|
||||
output wire [PORT_COUNT-1:0] eth_rx_lfc_ack,
|
||||
output wire [PORT_COUNT*8-1:0] eth_rx_pfc_en,
|
||||
input wire [PORT_COUNT*8-1:0] eth_rx_pfc_req,
|
||||
output wire [PORT_COUNT*8-1:0] eth_rx_pfc_ack,
|
||||
input wire [PORT_COUNT-1:0] eth_rx_fc_quanta_clk_en,
|
||||
|
||||
/*
|
||||
* DDR
|
||||
@ -788,6 +805,9 @@ mqnic_core_pcie #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.MAC_CTRL_ENABLE(MAC_CTRL_ENABLE),
|
||||
.TX_FIFO_DEPTH(TX_FIFO_DEPTH),
|
||||
.RX_FIFO_DEPTH(RX_FIFO_DEPTH),
|
||||
.MAX_TX_SIZE(MAX_TX_SIZE),
|
||||
@ -1095,7 +1115,13 @@ core_pcie_inst (
|
||||
.s_axis_tx_cpl_valid(s_axis_eth_tx_cpl_valid),
|
||||
.s_axis_tx_cpl_ready(s_axis_eth_tx_cpl_ready),
|
||||
|
||||
.tx_enable(eth_tx_enable),
|
||||
.tx_status(eth_tx_status),
|
||||
.tx_lfc_en(eth_tx_lfc_en),
|
||||
.tx_lfc_req(eth_tx_lfc_req),
|
||||
.tx_pfc_en(eth_tx_pfc_en),
|
||||
.tx_pfc_req(eth_tx_pfc_req),
|
||||
.tx_fc_quanta_clk_en(eth_tx_fc_quanta_clk_en),
|
||||
|
||||
.rx_clk(eth_rx_clk),
|
||||
.rx_rst(eth_rx_rst),
|
||||
@ -1112,7 +1138,15 @@ core_pcie_inst (
|
||||
.s_axis_rx_tlast(s_axis_eth_rx_tlast),
|
||||
.s_axis_rx_tuser(s_axis_eth_rx_tuser),
|
||||
|
||||
.rx_enable(eth_rx_enable),
|
||||
.rx_status(eth_rx_status),
|
||||
.rx_lfc_en(eth_rx_lfc_en),
|
||||
.rx_lfc_req(eth_rx_lfc_req),
|
||||
.rx_lfc_ack(eth_rx_lfc_ack),
|
||||
.rx_pfc_en(eth_rx_pfc_en),
|
||||
.rx_pfc_req(eth_rx_pfc_req),
|
||||
.rx_pfc_ack(eth_rx_pfc_ack),
|
||||
.rx_fc_quanta_clk_en(eth_rx_fc_quanta_clk_en),
|
||||
|
||||
/*
|
||||
* DDR
|
||||
|
@ -80,6 +80,9 @@ module mqnic_core_pcie_s10 #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter MAC_CTRL_ENABLE = 0,
|
||||
parameter TX_FIFO_DEPTH = 32768,
|
||||
parameter RX_FIFO_DEPTH = 32768,
|
||||
parameter MAX_TX_SIZE = 9214,
|
||||
@ -333,7 +336,13 @@ module mqnic_core_pcie_s10 #
|
||||
input wire [PORT_COUNT-1:0] s_axis_eth_tx_cpl_valid,
|
||||
output wire [PORT_COUNT-1:0] s_axis_eth_tx_cpl_ready,
|
||||
|
||||
output wire [PORT_COUNT-1:0] eth_tx_enable,
|
||||
input wire [PORT_COUNT-1:0] eth_tx_status,
|
||||
output wire [PORT_COUNT-1:0] eth_tx_lfc_en,
|
||||
output wire [PORT_COUNT-1:0] eth_tx_lfc_req,
|
||||
output wire [PORT_COUNT*8-1:0] eth_tx_pfc_en,
|
||||
output wire [PORT_COUNT*8-1:0] eth_tx_pfc_req,
|
||||
input wire [PORT_COUNT-1:0] eth_tx_fc_quanta_clk_en,
|
||||
|
||||
input wire [PORT_COUNT-1:0] eth_rx_clk,
|
||||
input wire [PORT_COUNT-1:0] eth_rx_rst,
|
||||
@ -350,7 +359,15 @@ module mqnic_core_pcie_s10 #
|
||||
input wire [PORT_COUNT-1:0] s_axis_eth_rx_tlast,
|
||||
input wire [PORT_COUNT*AXIS_ETH_RX_USER_WIDTH-1:0] s_axis_eth_rx_tuser,
|
||||
|
||||
output wire [PORT_COUNT-1:0] eth_rx_enable,
|
||||
input wire [PORT_COUNT-1:0] eth_rx_status,
|
||||
output wire [PORT_COUNT-1:0] eth_rx_lfc_en,
|
||||
input wire [PORT_COUNT-1:0] eth_rx_lfc_req,
|
||||
output wire [PORT_COUNT-1:0] eth_rx_lfc_ack,
|
||||
output wire [PORT_COUNT*8-1:0] eth_rx_pfc_en,
|
||||
input wire [PORT_COUNT*8-1:0] eth_rx_pfc_req,
|
||||
output wire [PORT_COUNT*8-1:0] eth_rx_pfc_ack,
|
||||
input wire [PORT_COUNT-1:0] eth_rx_fc_quanta_clk_en,
|
||||
|
||||
/*
|
||||
* DDR
|
||||
@ -797,6 +814,9 @@ mqnic_core_pcie #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.MAC_CTRL_ENABLE(MAC_CTRL_ENABLE),
|
||||
.TX_FIFO_DEPTH(TX_FIFO_DEPTH),
|
||||
.RX_FIFO_DEPTH(RX_FIFO_DEPTH),
|
||||
.MAX_TX_SIZE(MAX_TX_SIZE),
|
||||
@ -1104,7 +1124,13 @@ core_pcie_inst (
|
||||
.s_axis_tx_cpl_valid(s_axis_eth_tx_cpl_valid),
|
||||
.s_axis_tx_cpl_ready(s_axis_eth_tx_cpl_ready),
|
||||
|
||||
.tx_enable(eth_tx_enable),
|
||||
.tx_status(eth_tx_status),
|
||||
.tx_lfc_en(eth_tx_lfc_en),
|
||||
.tx_lfc_req(eth_tx_lfc_req),
|
||||
.tx_pfc_en(eth_tx_pfc_en),
|
||||
.tx_pfc_req(eth_tx_pfc_req),
|
||||
.tx_fc_quanta_clk_en(eth_tx_fc_quanta_clk_en),
|
||||
|
||||
.rx_clk(eth_rx_clk),
|
||||
.rx_rst(eth_rx_rst),
|
||||
@ -1121,7 +1147,15 @@ core_pcie_inst (
|
||||
.s_axis_rx_tlast(s_axis_eth_rx_tlast),
|
||||
.s_axis_rx_tuser(s_axis_eth_rx_tuser),
|
||||
|
||||
.rx_enable(eth_rx_enable),
|
||||
.rx_status(eth_rx_status),
|
||||
.rx_lfc_en(eth_rx_lfc_en),
|
||||
.rx_lfc_req(eth_rx_lfc_req),
|
||||
.rx_lfc_ack(eth_rx_lfc_ack),
|
||||
.rx_pfc_en(eth_rx_pfc_en),
|
||||
.rx_pfc_req(eth_rx_pfc_req),
|
||||
.rx_pfc_ack(eth_rx_pfc_ack),
|
||||
.rx_fc_quanta_clk_en(eth_rx_fc_quanta_clk_en),
|
||||
|
||||
/*
|
||||
* DDR
|
||||
|
@ -80,6 +80,9 @@ module mqnic_core_pcie_us #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter MAC_CTRL_ENABLE = 0,
|
||||
parameter TX_FIFO_DEPTH = 32768,
|
||||
parameter RX_FIFO_DEPTH = 32768,
|
||||
parameter MAX_TX_SIZE = 9214,
|
||||
@ -393,7 +396,13 @@ module mqnic_core_pcie_us #
|
||||
input wire [PORT_COUNT-1:0] s_axis_eth_tx_cpl_valid,
|
||||
output wire [PORT_COUNT-1:0] s_axis_eth_tx_cpl_ready,
|
||||
|
||||
output wire [PORT_COUNT-1:0] eth_tx_enable,
|
||||
input wire [PORT_COUNT-1:0] eth_tx_status,
|
||||
output wire [PORT_COUNT-1:0] eth_tx_lfc_en,
|
||||
output wire [PORT_COUNT-1:0] eth_tx_lfc_req,
|
||||
output wire [PORT_COUNT*8-1:0] eth_tx_pfc_en,
|
||||
output wire [PORT_COUNT*8-1:0] eth_tx_pfc_req,
|
||||
input wire [PORT_COUNT-1:0] eth_tx_fc_quanta_clk_en,
|
||||
|
||||
input wire [PORT_COUNT-1:0] eth_rx_clk,
|
||||
input wire [PORT_COUNT-1:0] eth_rx_rst,
|
||||
@ -410,7 +419,15 @@ module mqnic_core_pcie_us #
|
||||
input wire [PORT_COUNT-1:0] s_axis_eth_rx_tlast,
|
||||
input wire [PORT_COUNT*AXIS_ETH_RX_USER_WIDTH-1:0] s_axis_eth_rx_tuser,
|
||||
|
||||
output wire [PORT_COUNT-1:0] eth_rx_enable,
|
||||
input wire [PORT_COUNT-1:0] eth_rx_status,
|
||||
output wire [PORT_COUNT-1:0] eth_rx_lfc_en,
|
||||
input wire [PORT_COUNT-1:0] eth_rx_lfc_req,
|
||||
output wire [PORT_COUNT-1:0] eth_rx_lfc_ack,
|
||||
output wire [PORT_COUNT*8-1:0] eth_rx_pfc_en,
|
||||
input wire [PORT_COUNT*8-1:0] eth_rx_pfc_req,
|
||||
output wire [PORT_COUNT*8-1:0] eth_rx_pfc_ack,
|
||||
input wire [PORT_COUNT-1:0] eth_rx_fc_quanta_clk_en,
|
||||
|
||||
/*
|
||||
* DDR
|
||||
@ -917,6 +934,9 @@ mqnic_core_pcie #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.MAC_CTRL_ENABLE(MAC_CTRL_ENABLE),
|
||||
.TX_FIFO_DEPTH(TX_FIFO_DEPTH),
|
||||
.RX_FIFO_DEPTH(RX_FIFO_DEPTH),
|
||||
.MAX_TX_SIZE(MAX_TX_SIZE),
|
||||
@ -1224,7 +1244,13 @@ core_pcie_inst (
|
||||
.s_axis_tx_cpl_valid(s_axis_eth_tx_cpl_valid),
|
||||
.s_axis_tx_cpl_ready(s_axis_eth_tx_cpl_ready),
|
||||
|
||||
.tx_enable(eth_tx_enable),
|
||||
.tx_status(eth_tx_status),
|
||||
.tx_lfc_en(eth_tx_lfc_en),
|
||||
.tx_lfc_req(eth_tx_lfc_req),
|
||||
.tx_pfc_en(eth_tx_pfc_en),
|
||||
.tx_pfc_req(eth_tx_pfc_req),
|
||||
.tx_fc_quanta_clk_en(eth_tx_fc_quanta_clk_en),
|
||||
|
||||
.rx_clk(eth_rx_clk),
|
||||
.rx_rst(eth_rx_rst),
|
||||
@ -1241,7 +1267,15 @@ core_pcie_inst (
|
||||
.s_axis_rx_tlast(s_axis_eth_rx_tlast),
|
||||
.s_axis_rx_tuser(s_axis_eth_rx_tuser),
|
||||
|
||||
.rx_enable(eth_rx_enable),
|
||||
.rx_status(eth_rx_status),
|
||||
.rx_lfc_en(eth_rx_lfc_en),
|
||||
.rx_lfc_req(eth_rx_lfc_req),
|
||||
.rx_lfc_ack(eth_rx_lfc_ack),
|
||||
.rx_pfc_en(eth_rx_pfc_en),
|
||||
.rx_pfc_req(eth_rx_pfc_req),
|
||||
.rx_pfc_ack(eth_rx_pfc_ack),
|
||||
.rx_fc_quanta_clk_en(eth_rx_fc_quanta_clk_en),
|
||||
|
||||
/*
|
||||
* DDR
|
||||
|
@ -62,6 +62,9 @@ module mqnic_interface #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 0,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter MAC_CTRL_ENABLE = 0,
|
||||
parameter TX_FIFO_DEPTH = 32768,
|
||||
parameter RX_FIFO_DEPTH = 32768,
|
||||
parameter MAX_TX_SIZE = 9214,
|
||||
@ -435,7 +438,13 @@ module mqnic_interface #
|
||||
input wire [PORTS-1:0] s_axis_tx_cpl_valid,
|
||||
output wire [PORTS-1:0] s_axis_tx_cpl_ready,
|
||||
|
||||
output wire [PORTS-1:0] tx_enable,
|
||||
input wire [PORTS-1:0] tx_status,
|
||||
output wire [PORTS-1:0] tx_lfc_en,
|
||||
output wire [PORTS-1:0] tx_lfc_req,
|
||||
output wire [PORTS*8-1:0] tx_pfc_en,
|
||||
output wire [PORTS*8-1:0] tx_pfc_req,
|
||||
input wire [PORTS-1:0] tx_fc_quanta_clk_en,
|
||||
|
||||
/*
|
||||
* Receive data input
|
||||
@ -450,7 +459,15 @@ module mqnic_interface #
|
||||
input wire [PORTS-1:0] s_axis_rx_tlast,
|
||||
input wire [PORTS*AXIS_RX_USER_WIDTH-1:0] s_axis_rx_tuser,
|
||||
|
||||
output wire [PORTS-1:0] rx_enable,
|
||||
input wire [PORTS-1:0] rx_status,
|
||||
output wire [PORTS-1:0] rx_lfc_en,
|
||||
input wire [PORTS-1:0] rx_lfc_req,
|
||||
output wire [PORTS-1:0] rx_lfc_ack,
|
||||
output wire [PORTS*8-1:0] rx_pfc_en,
|
||||
input wire [PORTS*8-1:0] rx_pfc_req,
|
||||
output wire [PORTS*8-1:0] rx_pfc_ack,
|
||||
input wire [PORTS-1:0] rx_fc_quanta_clk_en,
|
||||
|
||||
/*
|
||||
* PTP clock
|
||||
@ -1084,6 +1101,8 @@ always @(posedge clk) begin
|
||||
ctrl_reg_rd_data_reg[8] <= TX_CHECKSUM_ENABLE;
|
||||
ctrl_reg_rd_data_reg[9] <= RX_CHECKSUM_ENABLE;
|
||||
ctrl_reg_rd_data_reg[10] <= RX_HASH_ENABLE;
|
||||
ctrl_reg_rd_data_reg[11] <= LFC_ENABLE;
|
||||
ctrl_reg_rd_data_reg[12] <= PFC_ENABLE;
|
||||
end
|
||||
RBB+8'h10: ctrl_reg_rd_data_reg <= PORTS; // IF ctrl: Port count
|
||||
RBB+8'h14: ctrl_reg_rd_data_reg <= SCHEDULERS; // IF ctrl: Scheduler count
|
||||
@ -3101,6 +3120,9 @@ for (n = 0; n < PORTS; n = n + 1) begin : port
|
||||
.TX_CPL_ENABLE(TX_CPL_ENABLE),
|
||||
.TX_CPL_FIFO_DEPTH(TX_CPL_FIFO_DEPTH),
|
||||
.TX_TAG_WIDTH(TX_TAG_WIDTH),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.MAC_CTRL_ENABLE(MAC_CTRL_ENABLE),
|
||||
.MAX_TX_SIZE(MAX_TX_SIZE),
|
||||
.MAX_RX_SIZE(MAX_RX_SIZE),
|
||||
|
||||
@ -3275,7 +3297,13 @@ for (n = 0; n < PORTS; n = n + 1) begin : port
|
||||
.s_axis_tx_cpl_valid(s_axis_tx_cpl_valid[n +: 1]),
|
||||
.s_axis_tx_cpl_ready(s_axis_tx_cpl_ready[n +: 1]),
|
||||
|
||||
.tx_enable(tx_enable[n +: 1]),
|
||||
.tx_status(tx_status[n +: 1]),
|
||||
.tx_lfc_en(tx_lfc_en[n +: 1]),
|
||||
.tx_lfc_req(tx_lfc_req[n +: 1]),
|
||||
.tx_pfc_en(tx_pfc_en[n*8 +: 8]),
|
||||
.tx_pfc_req(tx_pfc_req[n*8 +: 8]),
|
||||
.tx_fc_quanta_clk_en(tx_fc_quanta_clk_en[n +: 1]),
|
||||
|
||||
/*
|
||||
* Receive data input
|
||||
@ -3290,7 +3318,15 @@ for (n = 0; n < PORTS; n = n + 1) begin : port
|
||||
.s_axis_rx_tlast(s_axis_rx_tlast[n +: 1]),
|
||||
.s_axis_rx_tuser(s_axis_rx_tuser[n*AXIS_RX_USER_WIDTH +: AXIS_RX_USER_WIDTH]),
|
||||
|
||||
.rx_status(rx_status[n +: 1])
|
||||
.rx_enable(rx_enable[n +: 1]),
|
||||
.rx_status(rx_status[n +: 1]),
|
||||
.rx_lfc_en(rx_lfc_en[n +: 1]),
|
||||
.rx_lfc_req(rx_lfc_req[n +: 1]),
|
||||
.rx_lfc_ack(rx_lfc_ack[n +: 1]),
|
||||
.rx_pfc_en(rx_pfc_en[n*8 +: 8]),
|
||||
.rx_pfc_req(rx_pfc_req[n*8 +: 8]),
|
||||
.rx_pfc_ack(rx_pfc_ack[n*8 +: 8]),
|
||||
.rx_fc_quanta_clk_en(rx_fc_quanta_clk_en[n +: 1])
|
||||
);
|
||||
|
||||
end
|
||||
|
@ -14,11 +14,14 @@
|
||||
*/
|
||||
module mqnic_l2_egress #
|
||||
(
|
||||
// Width of AXI stream interfaces in bits
|
||||
// Interface configuration
|
||||
parameter PFC_ENABLE = 0,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter MAC_CTRL_ENABLE = 0,
|
||||
|
||||
// Streaming interface configuration
|
||||
parameter AXIS_DATA_WIDTH = 256,
|
||||
// AXI stream tkeep signal width (words per cycle)
|
||||
parameter AXIS_KEEP_WIDTH = AXIS_DATA_WIDTH/8,
|
||||
// AXI stream tuser signal width
|
||||
parameter AXIS_USER_WIDTH = 1
|
||||
)
|
||||
(
|
||||
@ -43,16 +46,173 @@ module mqnic_l2_egress #
|
||||
output wire m_axis_tvalid,
|
||||
input wire m_axis_tready,
|
||||
output wire m_axis_tlast,
|
||||
output wire [AXIS_USER_WIDTH-1:0] m_axis_tuser
|
||||
output wire [AXIS_USER_WIDTH-1:0] m_axis_tuser,
|
||||
|
||||
/*
|
||||
* Flow control
|
||||
*/
|
||||
input wire tx_lfc_en,
|
||||
input wire tx_lfc_req,
|
||||
input wire [7:0] tx_pfc_en,
|
||||
input wire [7:0] tx_pfc_req,
|
||||
input wire tx_pause_req,
|
||||
output wire tx_pause_ack,
|
||||
input wire [9:0] tx_fc_quanta_step,
|
||||
input wire tx_fc_quanta_clk_en
|
||||
);
|
||||
|
||||
// placeholder
|
||||
assign m_axis_tdata = s_axis_tdata;
|
||||
assign m_axis_tkeep = s_axis_tkeep;
|
||||
assign m_axis_tvalid = s_axis_tvalid;
|
||||
assign s_axis_tready = m_axis_tready;
|
||||
assign m_axis_tlast = s_axis_tlast;
|
||||
assign m_axis_tuser = s_axis_tuser;
|
||||
if ((LFC_ENABLE || PFC_ENABLE) && MAC_CTRL_ENABLE) begin : mac_ctrl
|
||||
|
||||
localparam MCF_PARAMS_SIZE = PFC_ENABLE ? 18 : 2;
|
||||
|
||||
wire tx_mcf_valid;
|
||||
wire tx_mcf_ready;
|
||||
wire [47:0] tx_mcf_eth_dst;
|
||||
wire [47:0] tx_mcf_eth_src;
|
||||
wire [15:0] tx_mcf_eth_type;
|
||||
wire [15:0] tx_mcf_opcode;
|
||||
wire [MCF_PARAMS_SIZE*8-1:0] tx_mcf_params;
|
||||
|
||||
mac_ctrl_tx #(
|
||||
.DATA_WIDTH(AXIS_DATA_WIDTH),
|
||||
.KEEP_ENABLE(AXIS_KEEP_WIDTH > 1),
|
||||
.KEEP_WIDTH(AXIS_KEEP_WIDTH),
|
||||
.ID_ENABLE(0),
|
||||
.DEST_ENABLE(0),
|
||||
.USER_ENABLE(1),
|
||||
.USER_WIDTH(AXIS_USER_WIDTH),
|
||||
.MCF_PARAMS_SIZE(MCF_PARAMS_SIZE)
|
||||
)
|
||||
mac_ctrl_tx_inst (
|
||||
.clk(clk),
|
||||
.rst(rst),
|
||||
|
||||
/*
|
||||
* AXI stream input
|
||||
*/
|
||||
.s_axis_tdata(s_axis_tdata),
|
||||
.s_axis_tkeep(s_axis_tkeep),
|
||||
.s_axis_tvalid(s_axis_tvalid),
|
||||
.s_axis_tready(s_axis_tready),
|
||||
.s_axis_tlast(s_axis_tlast),
|
||||
.s_axis_tid(0),
|
||||
.s_axis_tdest(0),
|
||||
.s_axis_tuser(s_axis_tuser),
|
||||
|
||||
/*
|
||||
* AXI stream output
|
||||
*/
|
||||
.m_axis_tdata(m_axis_tdata),
|
||||
.m_axis_tkeep(m_axis_tkeep),
|
||||
.m_axis_tvalid(m_axis_tvalid),
|
||||
.m_axis_tready(m_axis_tready),
|
||||
.m_axis_tlast(m_axis_tlast),
|
||||
.m_axis_tid(),
|
||||
.m_axis_tdest(),
|
||||
.m_axis_tuser(m_axis_tuser),
|
||||
|
||||
/*
|
||||
* MAC control frame interface
|
||||
*/
|
||||
.mcf_valid(tx_mcf_valid),
|
||||
.mcf_ready(tx_mcf_ready),
|
||||
.mcf_eth_dst(tx_mcf_eth_dst),
|
||||
.mcf_eth_src(tx_mcf_eth_src),
|
||||
.mcf_eth_type(tx_mcf_eth_type),
|
||||
.mcf_opcode(tx_mcf_opcode),
|
||||
.mcf_params(tx_mcf_params),
|
||||
.mcf_id(0),
|
||||
.mcf_dest(0),
|
||||
.mcf_user(0),
|
||||
|
||||
/*
|
||||
* Pause interface
|
||||
*/
|
||||
.tx_pause_req(tx_pause_req),
|
||||
.tx_pause_ack(tx_pause_ack),
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
.stat_tx_mcf()
|
||||
);
|
||||
|
||||
mac_pause_ctrl_tx #(
|
||||
.MCF_PARAMS_SIZE(MCF_PARAMS_SIZE),
|
||||
.PFC_ENABLE(PFC_ENABLE)
|
||||
)
|
||||
mac_pause_ctrl_tx_inst (
|
||||
.clk(clk),
|
||||
.rst(rst),
|
||||
|
||||
/*
|
||||
* MAC control frame interface
|
||||
*/
|
||||
.mcf_valid(tx_mcf_valid),
|
||||
.mcf_ready(tx_mcf_ready),
|
||||
.mcf_eth_dst(tx_mcf_eth_dst),
|
||||
.mcf_eth_src(tx_mcf_eth_src),
|
||||
.mcf_eth_type(tx_mcf_eth_type),
|
||||
.mcf_opcode(tx_mcf_opcode),
|
||||
.mcf_params(tx_mcf_params),
|
||||
|
||||
/*
|
||||
* Pause (IEEE 802.3 annex 31B)
|
||||
*/
|
||||
.tx_lfc_req(tx_lfc_req),
|
||||
.tx_lfc_resend(1'b0),
|
||||
|
||||
/*
|
||||
* Priority Flow Control (PFC) (IEEE 802.3 annex 31D)
|
||||
*/
|
||||
.tx_pfc_req(tx_pfc_req),
|
||||
.tx_pfc_resend(1'b0),
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
.cfg_tx_lfc_eth_dst(48'h01_80_C2_00_00_01),
|
||||
.cfg_tx_lfc_eth_src(48'h80_23_31_43_54_4C),
|
||||
.cfg_tx_lfc_eth_type(16'h8808),
|
||||
.cfg_tx_lfc_opcode(16'h0001),
|
||||
.cfg_tx_lfc_en(tx_lfc_en),
|
||||
.cfg_tx_lfc_quanta(16'hffff),
|
||||
.cfg_tx_lfc_refresh(16'h7fff),
|
||||
.cfg_tx_pfc_eth_dst(48'h01_80_C2_00_00_01),
|
||||
.cfg_tx_pfc_eth_src(48'h80_23_31_43_54_4C),
|
||||
.cfg_tx_pfc_eth_type(16'h8808),
|
||||
.cfg_tx_pfc_opcode(16'h0101),
|
||||
.cfg_tx_pfc_en(tx_pfc_en),
|
||||
.cfg_tx_pfc_quanta({8{16'hffff}}),
|
||||
.cfg_tx_pfc_refresh({8{16'h7fff}}),
|
||||
.cfg_quanta_step(tx_fc_quanta_step),
|
||||
.cfg_quanta_clk_en(tx_fc_quanta_clk_en),
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
.stat_tx_lfc_pkt(),
|
||||
.stat_tx_lfc_xon(),
|
||||
.stat_tx_lfc_xoff(),
|
||||
.stat_tx_lfc_paused(),
|
||||
.stat_tx_pfc_pkt(),
|
||||
.stat_tx_pfc_xon(),
|
||||
.stat_tx_pfc_xoff(),
|
||||
.stat_tx_pfc_paused()
|
||||
);
|
||||
|
||||
end else begin
|
||||
|
||||
assign m_axis_tdata = s_axis_tdata;
|
||||
assign m_axis_tkeep = s_axis_tkeep;
|
||||
assign m_axis_tvalid = s_axis_tvalid;
|
||||
assign s_axis_tready = m_axis_tready;
|
||||
assign m_axis_tlast = s_axis_tlast;
|
||||
assign m_axis_tuser = s_axis_tuser;
|
||||
|
||||
assign tx_pause_ack = 1'b0;
|
||||
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
|
@ -14,47 +14,208 @@
|
||||
*/
|
||||
module mqnic_l2_ingress #
|
||||
(
|
||||
// Width of AXI stream interfaces in bits
|
||||
// Interface configuration
|
||||
parameter PFC_ENABLE = 0,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter MAC_CTRL_ENABLE = 0,
|
||||
|
||||
// Streaming interface configuration
|
||||
parameter AXIS_DATA_WIDTH = 256,
|
||||
// AXI stream tkeep signal width (words per cycle)
|
||||
parameter AXIS_KEEP_WIDTH = AXIS_DATA_WIDTH/8,
|
||||
// AXI stream tuser signal width
|
||||
parameter AXIS_USER_WIDTH = 1,
|
||||
// Can apply backpressure with tready
|
||||
parameter AXIS_USE_READY = 0
|
||||
)
|
||||
(
|
||||
input wire clk,
|
||||
input wire rst,
|
||||
input wire clk,
|
||||
input wire rst,
|
||||
|
||||
/*
|
||||
* Receive data input
|
||||
*/
|
||||
input wire [AXIS_DATA_WIDTH-1:0] s_axis_tdata,
|
||||
input wire [AXIS_KEEP_WIDTH-1:0] s_axis_tkeep,
|
||||
input wire s_axis_tvalid,
|
||||
output wire s_axis_tready,
|
||||
input wire s_axis_tlast,
|
||||
input wire [AXIS_USER_WIDTH-1:0] s_axis_tuser,
|
||||
input wire [AXIS_DATA_WIDTH-1:0] s_axis_tdata,
|
||||
input wire [AXIS_KEEP_WIDTH-1:0] s_axis_tkeep,
|
||||
input wire s_axis_tvalid,
|
||||
output wire s_axis_tready,
|
||||
input wire s_axis_tlast,
|
||||
input wire [AXIS_USER_WIDTH-1:0] s_axis_tuser,
|
||||
|
||||
/*
|
||||
* Receive data output
|
||||
*/
|
||||
output wire [AXIS_DATA_WIDTH-1:0] m_axis_tdata,
|
||||
output wire [AXIS_KEEP_WIDTH-1:0] m_axis_tkeep,
|
||||
output wire m_axis_tvalid,
|
||||
input wire m_axis_tready,
|
||||
output wire m_axis_tlast,
|
||||
output wire [AXIS_USER_WIDTH-1:0] m_axis_tuser
|
||||
output wire [AXIS_DATA_WIDTH-1:0] m_axis_tdata,
|
||||
output wire [AXIS_KEEP_WIDTH-1:0] m_axis_tkeep,
|
||||
output wire m_axis_tvalid,
|
||||
input wire m_axis_tready,
|
||||
output wire m_axis_tlast,
|
||||
output wire [AXIS_USER_WIDTH-1:0] m_axis_tuser,
|
||||
|
||||
/*
|
||||
* Flow control
|
||||
*/
|
||||
input wire rx_lfc_en,
|
||||
output wire rx_lfc_req,
|
||||
input wire rx_lfc_ack,
|
||||
input wire [7:0] rx_pfc_en,
|
||||
output wire [7:0] rx_pfc_req,
|
||||
input wire [7:0] rx_pfc_ack,
|
||||
input wire [9:0] rx_fc_quanta_step,
|
||||
input wire rx_fc_quanta_clk_en
|
||||
);
|
||||
|
||||
// placeholder
|
||||
assign m_axis_tdata = s_axis_tdata;
|
||||
assign m_axis_tkeep = s_axis_tkeep;
|
||||
assign m_axis_tvalid = s_axis_tvalid;
|
||||
assign s_axis_tready = m_axis_tready;
|
||||
assign m_axis_tlast = s_axis_tlast;
|
||||
assign m_axis_tuser = s_axis_tuser;
|
||||
if ((LFC_ENABLE || PFC_ENABLE) && MAC_CTRL_ENABLE) begin : mac_ctrl
|
||||
|
||||
localparam MCF_PARAMS_SIZE = PFC_ENABLE ? 18 : 2;
|
||||
|
||||
wire rx_mcf_valid;
|
||||
wire [47:0] rx_mcf_eth_dst;
|
||||
wire [47:0] rx_mcf_eth_src;
|
||||
wire [15:0] rx_mcf_eth_type;
|
||||
wire [15:0] rx_mcf_opcode;
|
||||
wire [MCF_PARAMS_SIZE*8-1:0] rx_mcf_params;
|
||||
|
||||
mac_ctrl_rx #(
|
||||
.DATA_WIDTH(AXIS_DATA_WIDTH),
|
||||
.KEEP_ENABLE(AXIS_KEEP_WIDTH > 1),
|
||||
.KEEP_WIDTH(AXIS_KEEP_WIDTH),
|
||||
.ID_ENABLE(0),
|
||||
.DEST_ENABLE(0),
|
||||
.USER_ENABLE(1),
|
||||
.USER_WIDTH(AXIS_USER_WIDTH),
|
||||
.USE_READY(AXIS_USE_READY),
|
||||
.MCF_PARAMS_SIZE(MCF_PARAMS_SIZE)
|
||||
)
|
||||
mac_ctrl_rx_inst (
|
||||
.clk(clk),
|
||||
.rst(rst),
|
||||
|
||||
/*
|
||||
* AXI stream input
|
||||
*/
|
||||
.s_axis_tdata(s_axis_tdata),
|
||||
.s_axis_tkeep(s_axis_tkeep),
|
||||
.s_axis_tvalid(s_axis_tvalid),
|
||||
.s_axis_tready(s_axis_tready),
|
||||
.s_axis_tlast(s_axis_tlast),
|
||||
.s_axis_tid(0),
|
||||
.s_axis_tdest(0),
|
||||
.s_axis_tuser(s_axis_tuser),
|
||||
|
||||
/*
|
||||
* AXI stream output
|
||||
*/
|
||||
.m_axis_tdata(m_axis_tdata),
|
||||
.m_axis_tkeep(m_axis_tkeep),
|
||||
.m_axis_tvalid(m_axis_tvalid),
|
||||
.m_axis_tready(m_axis_tready),
|
||||
.m_axis_tlast(m_axis_tlast),
|
||||
.m_axis_tid(),
|
||||
.m_axis_tdest(),
|
||||
.m_axis_tuser(m_axis_tuser),
|
||||
|
||||
/*
|
||||
* MAC control frame interface
|
||||
*/
|
||||
.mcf_valid(rx_mcf_valid),
|
||||
.mcf_eth_dst(rx_mcf_eth_dst),
|
||||
.mcf_eth_src(rx_mcf_eth_src),
|
||||
.mcf_eth_type(rx_mcf_eth_type),
|
||||
.mcf_opcode(rx_mcf_opcode),
|
||||
.mcf_params(rx_mcf_params),
|
||||
.mcf_id(),
|
||||
.mcf_dest(),
|
||||
.mcf_user(),
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
.cfg_mcf_rx_eth_dst_mcast(48'h01_80_C2_00_00_01),
|
||||
.cfg_mcf_rx_check_eth_dst_mcast(1'b1),
|
||||
.cfg_mcf_rx_eth_dst_ucast(48'd0),
|
||||
.cfg_mcf_rx_check_eth_dst_ucast(1'b0),
|
||||
.cfg_mcf_rx_eth_src(48'd0),
|
||||
.cfg_mcf_rx_check_eth_src(1'b0),
|
||||
.cfg_mcf_rx_eth_type(16'h8808),
|
||||
.cfg_mcf_rx_opcode_lfc(16'h0001),
|
||||
.cfg_mcf_rx_check_opcode_lfc(rx_lfc_en),
|
||||
.cfg_mcf_rx_opcode_pfc(16'h0101),
|
||||
.cfg_mcf_rx_check_opcode_pfc(rx_pfc_en != 0),
|
||||
.cfg_mcf_rx_forward(1'b0),
|
||||
.cfg_mcf_rx_enable(rx_lfc_en || rx_pfc_en),
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
.stat_rx_mcf()
|
||||
);
|
||||
|
||||
mac_pause_ctrl_rx #(
|
||||
.MCF_PARAMS_SIZE(18),
|
||||
.PFC_ENABLE(PFC_ENABLE)
|
||||
)
|
||||
mac_pause_ctrl_rx_inst (
|
||||
.clk(clk),
|
||||
.rst(rst),
|
||||
|
||||
/*
|
||||
* MAC control frame interface
|
||||
*/
|
||||
.mcf_valid(rx_mcf_valid),
|
||||
.mcf_eth_dst(rx_mcf_eth_dst),
|
||||
.mcf_eth_src(rx_mcf_eth_src),
|
||||
.mcf_eth_type(rx_mcf_eth_type),
|
||||
.mcf_opcode(rx_mcf_opcode),
|
||||
.mcf_params(rx_mcf_params),
|
||||
|
||||
/*
|
||||
* Pause (IEEE 802.3 annex 31B)
|
||||
*/
|
||||
.rx_lfc_en(rx_lfc_en),
|
||||
.rx_lfc_req(rx_lfc_req),
|
||||
.rx_lfc_ack(rx_lfc_ack),
|
||||
|
||||
/*
|
||||
* Priority Flow Control (PFC) (IEEE 802.3 annex 31D)
|
||||
*/
|
||||
.rx_pfc_en(rx_pfc_en),
|
||||
.rx_pfc_req(rx_pfc_req),
|
||||
.rx_pfc_ack(rx_pfc_ack),
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
.cfg_rx_lfc_opcode(16'h0001),
|
||||
.cfg_rx_lfc_en(rx_lfc_en),
|
||||
.cfg_rx_pfc_opcode(16'h0101),
|
||||
.cfg_rx_pfc_en(rx_pfc_en),
|
||||
.cfg_quanta_step(rx_fc_quanta_step),
|
||||
.cfg_quanta_clk_en(rx_fc_quanta_clk_en),
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
.stat_rx_lfc_pkt(),
|
||||
.stat_rx_lfc_xon(),
|
||||
.stat_rx_lfc_xoff(),
|
||||
.stat_rx_lfc_paused(),
|
||||
.stat_rx_pfc_pkt(),
|
||||
.stat_rx_pfc_xon(),
|
||||
.stat_rx_pfc_xoff(),
|
||||
.stat_rx_pfc_paused()
|
||||
);
|
||||
|
||||
end else begin
|
||||
|
||||
assign m_axis_tdata = s_axis_tdata;
|
||||
assign m_axis_tkeep = s_axis_tkeep;
|
||||
assign m_axis_tvalid = s_axis_tvalid;
|
||||
assign s_axis_tready = m_axis_tready;
|
||||
assign m_axis_tlast = s_axis_tlast;
|
||||
assign m_axis_tuser = s_axis_tuser;
|
||||
|
||||
assign rx_lfc_req = 1'b0;
|
||||
assign rx_pfc_req = 8'd0;
|
||||
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
|
@ -22,6 +22,9 @@ module mqnic_port #
|
||||
parameter TX_CPL_ENABLE = 1,
|
||||
parameter TX_CPL_FIFO_DEPTH = 32,
|
||||
parameter TX_TAG_WIDTH = 16,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter MAC_CTRL_ENABLE = 0,
|
||||
parameter MAX_TX_SIZE = 9214,
|
||||
parameter MAX_RX_SIZE = 9214,
|
||||
|
||||
@ -196,7 +199,13 @@ module mqnic_port #
|
||||
input wire s_axis_tx_cpl_valid,
|
||||
output wire s_axis_tx_cpl_ready,
|
||||
|
||||
output wire tx_enable,
|
||||
input wire tx_status,
|
||||
output wire tx_lfc_en,
|
||||
output wire tx_lfc_req,
|
||||
output wire [7:0] tx_pfc_en,
|
||||
output wire [7:0] tx_pfc_req,
|
||||
input wire tx_fc_quanta_clk_en,
|
||||
|
||||
/*
|
||||
* Receive data input
|
||||
@ -211,7 +220,15 @@ module mqnic_port #
|
||||
input wire s_axis_rx_tlast,
|
||||
input wire [AXIS_RX_USER_WIDTH-1:0] s_axis_rx_tuser,
|
||||
|
||||
input wire rx_status
|
||||
output wire rx_enable,
|
||||
input wire rx_status,
|
||||
output wire rx_lfc_en,
|
||||
input wire rx_lfc_req,
|
||||
output wire rx_lfc_ack,
|
||||
output wire [7:0] rx_pfc_en,
|
||||
input wire [7:0] rx_pfc_req,
|
||||
output wire [7:0] rx_pfc_ack,
|
||||
input wire rx_fc_quanta_clk_en
|
||||
);
|
||||
|
||||
localparam RBB = RB_BASE_ADDR & {REG_ADDR_WIDTH{1'b1}};
|
||||
@ -239,6 +256,52 @@ initial begin
|
||||
end
|
||||
end
|
||||
|
||||
wire rx_lfc_req_int;
|
||||
wire [7:0] rx_pfc_req_int;
|
||||
|
||||
// TX control
|
||||
reg tx_enable_reg = 1'b0;
|
||||
reg tx_pause_reg = 1'b0;
|
||||
reg tx_lfc_en_reg = 1'b0;
|
||||
reg tx_lfc_req_reg = 1'b0;
|
||||
reg [7:0] tx_pfc_en_reg = 8'd0;
|
||||
reg [7:0] tx_pfc_req_reg = 8'd0;
|
||||
reg [9:0] tx_fc_quanta_step_reg = (AXIS_DATA_WIDTH*256)/512;
|
||||
|
||||
reg tx_enable_sync_1_reg = 1'b0;
|
||||
reg tx_enable_sync_2_reg = 1'b0;
|
||||
reg tx_lfc_en_sync_1_reg = 1'b0;
|
||||
reg tx_lfc_en_sync_2_reg = 1'b0;
|
||||
reg tx_lfc_req_sync_1_reg = 1'b0;
|
||||
reg tx_lfc_req_sync_2_reg = 1'b0;
|
||||
reg [7:0] tx_pfc_en_sync_1_reg = 8'd0;
|
||||
reg [7:0] tx_pfc_en_sync_2_reg = 8'd0;
|
||||
reg [7:0] tx_pfc_req_sync_1_reg = 8'd0;
|
||||
reg [7:0] tx_pfc_req_sync_2_reg = 8'd0;
|
||||
reg [9:0] tx_fc_quanta_step_sync_1_reg = 10'd0;
|
||||
reg [9:0] tx_fc_quanta_step_sync_2_reg = 10'd0;
|
||||
|
||||
assign tx_enable = tx_enable_sync_2_reg;
|
||||
assign tx_lfc_en = LFC_ENABLE ? tx_lfc_en_sync_2_reg : 1'b0;
|
||||
assign tx_lfc_req = LFC_ENABLE ? tx_lfc_req_sync_2_reg : 1'b0;
|
||||
assign tx_pfc_en = PFC_ENABLE ? tx_pfc_en_sync_2_reg : 8'd0;
|
||||
assign tx_pfc_req = PFC_ENABLE ? tx_pfc_req_sync_2_reg : 8'd0;
|
||||
|
||||
always @(posedge tx_clk) begin
|
||||
tx_enable_sync_1_reg <= tx_enable_reg;
|
||||
tx_enable_sync_2_reg <= tx_enable_sync_1_reg;
|
||||
tx_lfc_en_sync_1_reg <= tx_lfc_en_reg;
|
||||
tx_lfc_en_sync_2_reg <= tx_lfc_en_sync_1_reg;
|
||||
tx_lfc_req_sync_1_reg <= tx_lfc_req_reg;
|
||||
tx_lfc_req_sync_2_reg <= tx_lfc_req_sync_1_reg;
|
||||
tx_pfc_en_sync_1_reg <= tx_pfc_en_reg;
|
||||
tx_pfc_en_sync_2_reg <= tx_pfc_en_sync_1_reg;
|
||||
tx_pfc_req_sync_1_reg <= tx_pfc_req_reg;
|
||||
tx_pfc_req_sync_2_reg <= tx_pfc_req_sync_1_reg;
|
||||
tx_fc_quanta_step_sync_1_reg <= tx_fc_quanta_step_reg;
|
||||
tx_fc_quanta_step_sync_2_reg <= tx_fc_quanta_step_sync_1_reg;
|
||||
end
|
||||
|
||||
// TX status
|
||||
reg tx_rst_sync_1_reg = 1'b0;
|
||||
reg tx_rst_sync_2_reg = 1'b0;
|
||||
@ -264,6 +327,49 @@ always @(posedge clk) begin
|
||||
tx_status_sync_3_reg <= tx_status_sync_2_reg;
|
||||
end
|
||||
|
||||
// RX control
|
||||
reg rx_enable_reg = 1'b0;
|
||||
reg rx_pause_reg = 1'b0;
|
||||
reg rx_lfc_en_reg = 1'b0;
|
||||
reg rx_lfc_ack_reg = 1'b0;
|
||||
reg [7:0] rx_pfc_en_reg = 8'd0;
|
||||
reg [7:0] rx_pfc_ack_reg = 8'd0;
|
||||
reg [9:0] rx_fc_quanta_step_reg = (AXIS_DATA_WIDTH*256)/512;
|
||||
|
||||
reg rx_enable_sync_1_reg = 1'b0;
|
||||
reg rx_enable_sync_2_reg = 1'b0;
|
||||
reg rx_lfc_en_sync_1_reg = 1'b0;
|
||||
reg rx_lfc_en_sync_2_reg = 1'b0;
|
||||
reg rx_lfc_ack_sync_1_reg = 1'b0;
|
||||
reg rx_lfc_ack_sync_2_reg = 1'b0;
|
||||
reg [7:0] rx_pfc_en_sync_1_reg = 8'd0;
|
||||
reg [7:0] rx_pfc_en_sync_2_reg = 8'd0;
|
||||
reg [7:0] rx_pfc_ack_sync_1_reg = 8'd0;
|
||||
reg [7:0] rx_pfc_ack_sync_2_reg = 8'd0;
|
||||
reg [9:0] rx_fc_quanta_step_sync_1_reg = 10'd0;
|
||||
reg [9:0] rx_fc_quanta_step_sync_2_reg = 10'd0;
|
||||
|
||||
assign rx_enable = rx_enable_sync_2_reg;
|
||||
assign rx_lfc_en = LFC_ENABLE ? rx_lfc_en_sync_2_reg : 1'b0;
|
||||
assign rx_lfc_ack = LFC_ENABLE ? rx_lfc_ack_sync_2_reg : 1'b0;
|
||||
assign rx_pfc_en = PFC_ENABLE ? rx_pfc_en_sync_2_reg : 8'd0;
|
||||
assign rx_pfc_ack = PFC_ENABLE ? rx_pfc_ack_sync_2_reg : 8'd0;
|
||||
|
||||
always @(posedge rx_clk) begin
|
||||
rx_enable_sync_1_reg <= rx_enable_reg;
|
||||
rx_enable_sync_2_reg <= rx_enable_sync_1_reg;
|
||||
rx_lfc_en_sync_1_reg <= rx_lfc_en_reg;
|
||||
rx_lfc_en_sync_2_reg <= rx_lfc_en_sync_1_reg;
|
||||
rx_lfc_ack_sync_1_reg <= rx_lfc_ack_reg;
|
||||
rx_lfc_ack_sync_2_reg <= rx_lfc_ack_sync_1_reg;
|
||||
rx_pfc_en_sync_1_reg <= rx_pfc_en_reg;
|
||||
rx_pfc_en_sync_2_reg <= rx_pfc_en_sync_1_reg;
|
||||
rx_pfc_ack_sync_1_reg <= rx_pfc_ack_reg;
|
||||
rx_pfc_ack_sync_2_reg <= rx_pfc_ack_sync_1_reg;
|
||||
rx_fc_quanta_step_sync_1_reg <= rx_fc_quanta_step_reg;
|
||||
rx_fc_quanta_step_sync_2_reg <= rx_fc_quanta_step_sync_1_reg;
|
||||
end
|
||||
|
||||
// RX status
|
||||
reg rx_rst_sync_1_reg = 1'b0;
|
||||
reg rx_rst_sync_2_reg = 1'b0;
|
||||
@ -271,14 +377,24 @@ reg rx_rst_sync_3_reg = 1'b0;
|
||||
reg rx_status_sync_1_reg = 1'b0;
|
||||
reg rx_status_sync_2_reg = 1'b0;
|
||||
reg rx_status_sync_3_reg = 1'b0;
|
||||
reg rx_lfc_req_sync_1_reg = 1'b0;
|
||||
reg rx_lfc_req_sync_2_reg = 1'b0;
|
||||
reg rx_lfc_req_sync_3_reg = 1'b0;
|
||||
reg [7:0] rx_pfc_req_sync_1_reg = 8'd0;
|
||||
reg [7:0] rx_pfc_req_sync_2_reg = 8'd0;
|
||||
reg [7:0] rx_pfc_req_sync_3_reg = 8'd0;
|
||||
|
||||
always @(posedge rx_clk or posedge rx_rst) begin
|
||||
if (rx_rst) begin
|
||||
rx_rst_sync_1_reg <= 1'b1;
|
||||
rx_status_sync_1_reg <= 1'b0;
|
||||
rx_lfc_req_sync_1_reg <= 1'b0;
|
||||
rx_pfc_req_sync_1_reg <= 8'd0;
|
||||
end else begin
|
||||
rx_rst_sync_1_reg <= 1'b0;
|
||||
rx_status_sync_1_reg <= rx_status;
|
||||
rx_lfc_req_sync_1_reg <= MAC_CTRL_ENABLE ? rx_lfc_req_int : rx_lfc_req;
|
||||
rx_pfc_req_sync_1_reg <= MAC_CTRL_ENABLE ? rx_pfc_req_int : rx_pfc_req;
|
||||
end
|
||||
end
|
||||
|
||||
@ -287,6 +403,10 @@ always @(posedge clk) begin
|
||||
rx_rst_sync_3_reg <= rx_rst_sync_2_reg;
|
||||
rx_status_sync_2_reg <= rx_status_sync_1_reg;
|
||||
rx_status_sync_3_reg <= rx_status_sync_2_reg;
|
||||
rx_lfc_req_sync_2_reg <= rx_lfc_req_sync_1_reg;
|
||||
rx_lfc_req_sync_3_reg <= rx_lfc_req_sync_2_reg;
|
||||
rx_pfc_req_sync_2_reg <= rx_pfc_req_sync_1_reg;
|
||||
rx_pfc_req_sync_3_reg <= rx_pfc_req_sync_2_reg;
|
||||
end
|
||||
|
||||
// control registers
|
||||
@ -294,24 +414,76 @@ reg ctrl_reg_wr_ack_reg = 1'b0;
|
||||
reg [REG_DATA_WIDTH-1:0] ctrl_reg_rd_data_reg = {REG_DATA_WIDTH{1'b0}};
|
||||
reg ctrl_reg_rd_ack_reg = 1'b0;
|
||||
|
||||
wire tx_pause_status;
|
||||
wire rx_pause_status;
|
||||
|
||||
wire tx_fifo_pause_req = !tx_enable_reg || tx_pause_reg || (LFC_ENABLE && rx_lfc_en_reg && rx_lfc_req_sync_3_reg);
|
||||
wire tx_fifo_pause_ack;
|
||||
wire rx_fifo_pause_req = !rx_enable_reg || rx_pause_reg;
|
||||
wire rx_fifo_pause_ack;
|
||||
|
||||
assign ctrl_reg_wr_wait = 1'b0;
|
||||
assign ctrl_reg_wr_ack = ctrl_reg_wr_ack_reg;
|
||||
assign ctrl_reg_rd_data = ctrl_reg_rd_data_reg;
|
||||
assign ctrl_reg_rd_wait = 1'b0;
|
||||
assign ctrl_reg_rd_ack = ctrl_reg_rd_ack_reg;
|
||||
|
||||
integer i;
|
||||
|
||||
always @(posedge clk) begin
|
||||
ctrl_reg_wr_ack_reg <= 1'b0;
|
||||
ctrl_reg_rd_data_reg <= {REG_DATA_WIDTH{1'b0}};
|
||||
ctrl_reg_rd_ack_reg <= 1'b0;
|
||||
|
||||
tx_lfc_req_reg <= 1'b0;
|
||||
tx_pfc_req_reg <= 8'd0;
|
||||
|
||||
rx_lfc_ack_reg <= tx_fifo_pause_ack;
|
||||
rx_pfc_ack_reg <= 8'd0;
|
||||
|
||||
if (ctrl_reg_wr_en && !ctrl_reg_wr_ack_reg) begin
|
||||
// write operation
|
||||
ctrl_reg_wr_ack_reg <= 1'b1;
|
||||
case ({ctrl_reg_wr_addr >> 2, 2'b00})
|
||||
// Port control
|
||||
RBB+8'h20: begin
|
||||
// Port ctrl: TX control/status
|
||||
tx_enable_reg <= ctrl_reg_wr_data[0];
|
||||
tx_pause_reg <= ctrl_reg_wr_data[8];
|
||||
end
|
||||
RBB+8'h24: begin
|
||||
// Port ctrl: RX control/status
|
||||
rx_enable_reg <= ctrl_reg_wr_data[0];
|
||||
rx_pause_reg <= ctrl_reg_wr_data[8];
|
||||
end
|
||||
default: ctrl_reg_wr_ack_reg <= 1'b0;
|
||||
endcase
|
||||
if (MAC_CTRL_ENABLE) begin
|
||||
if ({ctrl_reg_wr_addr >> 2, 2'b00} == RBB+8'h28) begin
|
||||
// Port ctrl: FC control
|
||||
tx_fc_quanta_step_reg <= ctrl_reg_wr_data[15:0];
|
||||
rx_fc_quanta_step_reg <= ctrl_reg_wr_data[31:16];
|
||||
ctrl_reg_wr_ack_reg <= 1'b1;
|
||||
end
|
||||
end
|
||||
if (LFC_ENABLE) begin
|
||||
if ({ctrl_reg_wr_addr >> 2, 2'b00} == RBB+8'h2C) begin
|
||||
// Port ctrl: LFC control
|
||||
tx_lfc_en_reg <= ctrl_reg_wr_data[24];
|
||||
rx_lfc_en_reg <= ctrl_reg_wr_data[25];
|
||||
ctrl_reg_wr_ack_reg <= 1'b1;
|
||||
end
|
||||
end
|
||||
if (PFC_ENABLE) begin
|
||||
for (i = 0; i < 8; i = i + 1) begin
|
||||
if ({ctrl_reg_wr_addr >> 2, 2'b00} == RBB+8'h30+i*4) begin
|
||||
// Port ctrl: PFC control N
|
||||
tx_pfc_en_reg[i] <= ctrl_reg_wr_data[24];
|
||||
rx_pfc_en_reg[i] <= ctrl_reg_wr_data[25];
|
||||
ctrl_reg_wr_ack_reg <= 1'b1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if (ctrl_reg_rd_en && !ctrl_reg_rd_ack_reg) begin
|
||||
@ -325,28 +497,85 @@ always @(posedge clk) begin
|
||||
RBB+8'h0C: ctrl_reg_rd_data_reg <= RB_BASE_ADDR+8'h10; // Port: Offset
|
||||
// Port control
|
||||
RBB+8'h10: ctrl_reg_rd_data_reg <= 32'h0000C003; // Port ctrl: Type
|
||||
RBB+8'h14: ctrl_reg_rd_data_reg <= 32'h00000200; // Port ctrl: Version
|
||||
RBB+8'h14: ctrl_reg_rd_data_reg <= 32'h00000300; // Port ctrl: Version
|
||||
RBB+8'h18: ctrl_reg_rd_data_reg <= 0; // Port ctrl: Next header
|
||||
RBB+8'h1C: begin
|
||||
// Port ctrl: features
|
||||
ctrl_reg_rd_data_reg[0] <= LFC_ENABLE;
|
||||
ctrl_reg_rd_data_reg[1] <= PFC_ENABLE;
|
||||
ctrl_reg_rd_data_reg[2] <= MAC_CTRL_ENABLE;
|
||||
end
|
||||
RBB+8'h20: begin
|
||||
// Port ctrl: TX status
|
||||
ctrl_reg_rd_data_reg[0] <= tx_status_sync_3_reg;
|
||||
ctrl_reg_rd_data_reg[1] <= tx_rst_sync_3_reg;
|
||||
// Port ctrl: TX control/status
|
||||
ctrl_reg_rd_data_reg[0] <= tx_enable_reg;
|
||||
ctrl_reg_rd_data_reg[8] <= tx_pause_reg;
|
||||
ctrl_reg_rd_data_reg[16] <= tx_status_sync_3_reg;
|
||||
ctrl_reg_rd_data_reg[17] <= tx_rst_sync_3_reg;
|
||||
ctrl_reg_rd_data_reg[24] <= tx_fifo_pause_req;
|
||||
ctrl_reg_rd_data_reg[25] <= tx_fifo_pause_ack;
|
||||
end
|
||||
RBB+8'h24: begin
|
||||
// Port ctrl: RX status
|
||||
ctrl_reg_rd_data_reg[0] <= rx_status_sync_3_reg;
|
||||
ctrl_reg_rd_data_reg[1] <= rx_rst_sync_3_reg;
|
||||
// Port ctrl: RX control/status
|
||||
ctrl_reg_rd_data_reg[0] <= rx_enable_reg;
|
||||
ctrl_reg_rd_data_reg[8] <= rx_pause_reg;
|
||||
ctrl_reg_rd_data_reg[16] <= rx_status_sync_3_reg;
|
||||
ctrl_reg_rd_data_reg[17] <= rx_rst_sync_3_reg;
|
||||
ctrl_reg_rd_data_reg[24] <= rx_fifo_pause_req;
|
||||
ctrl_reg_rd_data_reg[25] <= rx_fifo_pause_ack;
|
||||
end
|
||||
default: ctrl_reg_rd_ack_reg <= 1'b0;
|
||||
endcase
|
||||
if (MAC_CTRL_ENABLE) begin
|
||||
if ({ctrl_reg_rd_addr >> 2, 2'b00} == RBB+8'h28) begin
|
||||
// Port ctrl: FC control
|
||||
ctrl_reg_rd_data_reg[15:0] <= tx_fc_quanta_step_reg;
|
||||
ctrl_reg_rd_data_reg[31:16] <= rx_fc_quanta_step_reg;
|
||||
ctrl_reg_rd_ack_reg <= 1'b1;
|
||||
end
|
||||
end
|
||||
if (LFC_ENABLE) begin
|
||||
if ({ctrl_reg_rd_addr >> 2, 2'b00} == RBB+8'h2C) begin
|
||||
// Port ctrl: LFC control
|
||||
ctrl_reg_rd_data_reg[24] <= tx_lfc_en_reg;
|
||||
ctrl_reg_rd_data_reg[25] <= rx_lfc_en_reg;
|
||||
ctrl_reg_rd_data_reg[28] <= tx_lfc_req_reg;
|
||||
ctrl_reg_rd_data_reg[29] <= rx_lfc_req_sync_3_reg;
|
||||
ctrl_reg_rd_ack_reg <= 1'b1;
|
||||
end
|
||||
end
|
||||
if (PFC_ENABLE) begin
|
||||
for (i = 0; i < 8; i = i + 1) begin
|
||||
if ({ctrl_reg_rd_addr >> 2, 2'b00} == RBB+8'h30+i*4) begin
|
||||
// Port ctrl: PFC control N
|
||||
ctrl_reg_rd_data_reg[24] <= tx_pfc_en_reg[i];
|
||||
ctrl_reg_rd_data_reg[25] <= rx_pfc_en_reg[i];
|
||||
ctrl_reg_rd_data_reg[28] <= tx_pfc_req_reg[i];
|
||||
ctrl_reg_rd_data_reg[29] <= rx_pfc_req_sync_3_reg[i];
|
||||
ctrl_reg_rd_ack_reg <= 1'b1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if (rst) begin
|
||||
ctrl_reg_wr_ack_reg <= 1'b0;
|
||||
ctrl_reg_rd_ack_reg <= 1'b0;
|
||||
|
||||
tx_enable_reg <= 1'b0;
|
||||
tx_pause_reg <= 1'b0;
|
||||
tx_lfc_en_reg <= 1'b0;
|
||||
tx_lfc_req_reg <= 1'b0;
|
||||
tx_pfc_en_reg <= 8'd0;
|
||||
tx_pfc_req_reg <= 8'd0;
|
||||
tx_fc_quanta_step_reg <= (AXIS_DATA_WIDTH*256)/512;
|
||||
|
||||
rx_enable_reg <= 1'b0;
|
||||
rx_pause_reg <= 1'b0;
|
||||
rx_lfc_en_reg <= 1'b0;
|
||||
rx_lfc_ack_reg <= 1'b0;
|
||||
rx_pfc_en_reg <= 8'd0;
|
||||
rx_pfc_ack_reg <= 8'd0;
|
||||
rx_fc_quanta_step_reg <= (AXIS_DATA_WIDTH*256)/512;
|
||||
end
|
||||
end
|
||||
|
||||
@ -359,6 +588,9 @@ mqnic_port_tx #(
|
||||
.TX_CPL_ENABLE(TX_CPL_ENABLE),
|
||||
.TX_CPL_FIFO_DEPTH(TX_CPL_FIFO_DEPTH),
|
||||
.TX_TAG_WIDTH(TX_TAG_WIDTH),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.MAC_CTRL_ENABLE(MAC_CTRL_ENABLE),
|
||||
.MAX_TX_SIZE(MAX_TX_SIZE),
|
||||
|
||||
// Application block configuration
|
||||
@ -465,7 +697,21 @@ port_tx_inst (
|
||||
.s_axis_tx_cpl_ts(s_axis_tx_cpl_ts),
|
||||
.s_axis_tx_cpl_tag(s_axis_tx_cpl_tag),
|
||||
.s_axis_tx_cpl_valid(s_axis_tx_cpl_valid),
|
||||
.s_axis_tx_cpl_ready(s_axis_tx_cpl_ready)
|
||||
.s_axis_tx_cpl_ready(s_axis_tx_cpl_ready),
|
||||
|
||||
/*
|
||||
* Flow control
|
||||
*/
|
||||
.tx_lfc_en(tx_lfc_en),
|
||||
.tx_lfc_req(tx_lfc_req),
|
||||
.tx_pfc_en(tx_pfc_en),
|
||||
.tx_pfc_req(tx_pfc_req),
|
||||
.tx_pause_req(1'b0),
|
||||
.tx_pause_ack(),
|
||||
.tx_fc_quanta_step(tx_fc_quanta_step_reg),
|
||||
.tx_fc_quanta_clk_en(tx_fc_quanta_clk_en),
|
||||
.fifo_pause_req(tx_fifo_pause_req),
|
||||
.fifo_pause_ack(tx_fifo_pause_ack)
|
||||
);
|
||||
|
||||
mqnic_port_rx #(
|
||||
@ -474,6 +720,9 @@ mqnic_port_rx #(
|
||||
|
||||
// Interface configuration
|
||||
.PTP_TS_ENABLE(PTP_TS_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.MAC_CTRL_ENABLE(MAC_CTRL_ENABLE),
|
||||
.MAX_RX_SIZE(MAX_RX_SIZE),
|
||||
|
||||
// Application block configuration
|
||||
@ -550,7 +799,21 @@ port_rx_inst (
|
||||
.s_axis_rx_tvalid(s_axis_rx_tvalid),
|
||||
.s_axis_rx_tready(s_axis_rx_tready),
|
||||
.s_axis_rx_tlast(s_axis_rx_tlast),
|
||||
.s_axis_rx_tuser(s_axis_rx_tuser)
|
||||
.s_axis_rx_tuser(s_axis_rx_tuser),
|
||||
|
||||
/*
|
||||
* Flow control
|
||||
*/
|
||||
.rx_lfc_en(rx_lfc_en),
|
||||
.rx_lfc_req(rx_lfc_req_int),
|
||||
.rx_lfc_ack(rx_lfc_ack),
|
||||
.rx_pfc_en(rx_pfc_en),
|
||||
.rx_pfc_req(rx_pfc_req_int),
|
||||
.rx_pfc_ack(rx_pfc_ack),
|
||||
.rx_fc_quanta_step(rx_fc_quanta_step_reg),
|
||||
.rx_fc_quanta_clk_en(rx_fc_quanta_clk_en),
|
||||
.fifo_pause_req(rx_fifo_pause_req),
|
||||
.fifo_pause_ack(rx_fifo_pause_ack)
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
@ -52,7 +52,12 @@ module mqnic_port_map_mac_axis #
|
||||
input wire [MAC_COUNT-1:0] s_axis_mac_tx_ptp_ts_valid,
|
||||
output wire [MAC_COUNT-1:0] s_axis_mac_tx_ptp_ts_ready,
|
||||
|
||||
output wire [MAC_COUNT-1:0] mac_tx_enable,
|
||||
input wire [MAC_COUNT-1:0] mac_tx_status,
|
||||
output wire [MAC_COUNT-1:0] mac_tx_lfc_en,
|
||||
output wire [MAC_COUNT-1:0] mac_tx_lfc_req,
|
||||
output wire [MAC_COUNT*8-1:0] mac_tx_pfc_en,
|
||||
output wire [MAC_COUNT*8-1:0] mac_tx_pfc_req,
|
||||
|
||||
input wire [MAC_COUNT-1:0] mac_rx_clk,
|
||||
input wire [MAC_COUNT-1:0] mac_rx_rst,
|
||||
@ -69,7 +74,14 @@ module mqnic_port_map_mac_axis #
|
||||
input wire [MAC_COUNT-1:0] s_axis_mac_rx_tlast,
|
||||
input wire [MAC_COUNT*AXIS_RX_USER_WIDTH-1:0] s_axis_mac_rx_tuser,
|
||||
|
||||
output wire [MAC_COUNT-1:0] mac_rx_enable,
|
||||
input wire [MAC_COUNT-1:0] mac_rx_status,
|
||||
output wire [MAC_COUNT-1:0] mac_rx_lfc_en,
|
||||
input wire [MAC_COUNT-1:0] mac_rx_lfc_req,
|
||||
output wire [MAC_COUNT-1:0] mac_rx_lfc_ack,
|
||||
output wire [MAC_COUNT*8-1:0] mac_rx_pfc_en,
|
||||
input wire [MAC_COUNT*8-1:0] mac_rx_pfc_req,
|
||||
output wire [MAC_COUNT*8-1:0] mac_rx_pfc_ack,
|
||||
|
||||
// towards datapath
|
||||
output wire [PORT_COUNT-1:0] tx_clk,
|
||||
@ -92,7 +104,12 @@ module mqnic_port_map_mac_axis #
|
||||
output wire [PORT_COUNT-1:0] m_axis_tx_ptp_ts_valid,
|
||||
input wire [PORT_COUNT-1:0] m_axis_tx_ptp_ts_ready,
|
||||
|
||||
input wire [PORT_COUNT-1:0] tx_enable,
|
||||
output wire [PORT_COUNT-1:0] tx_status,
|
||||
input wire [PORT_COUNT-1:0] tx_lfc_en,
|
||||
input wire [PORT_COUNT-1:0] tx_lfc_req,
|
||||
input wire [PORT_COUNT*8-1:0] tx_pfc_en,
|
||||
input wire [PORT_COUNT*8-1:0] tx_pfc_req,
|
||||
|
||||
output wire [PORT_COUNT-1:0] rx_clk,
|
||||
output wire [PORT_COUNT-1:0] rx_rst,
|
||||
@ -109,7 +126,14 @@ module mqnic_port_map_mac_axis #
|
||||
output wire [PORT_COUNT-1:0] m_axis_rx_tlast,
|
||||
output wire [PORT_COUNT*AXIS_RX_USER_WIDTH-1:0] m_axis_rx_tuser,
|
||||
|
||||
output wire [PORT_COUNT-1:0] rx_status
|
||||
input wire [PORT_COUNT-1:0] rx_enable,
|
||||
output wire [PORT_COUNT-1:0] rx_status,
|
||||
input wire [PORT_COUNT-1:0] rx_lfc_en,
|
||||
output wire [PORT_COUNT-1:0] rx_lfc_req,
|
||||
input wire [PORT_COUNT-1:0] rx_lfc_ack,
|
||||
input wire [PORT_COUNT*8-1:0] rx_pfc_en,
|
||||
output wire [PORT_COUNT*8-1:0] rx_pfc_req,
|
||||
input wire [PORT_COUNT*8-1:0] rx_pfc_ack
|
||||
);
|
||||
|
||||
initial begin
|
||||
@ -205,7 +229,12 @@ generate
|
||||
assign mac_tx_ptp_ts_96[n*PTP_TS_WIDTH +: PTP_TS_WIDTH] = tx_ptp_ts_96[IND[n*8 +: 8]*PTP_TS_WIDTH +: PTP_TS_WIDTH];
|
||||
assign mac_tx_ptp_ts_step[n] = tx_ptp_ts_step[IND[n*8 +: 8]];
|
||||
|
||||
assign mac_tx_enable[n] = tx_enable[IND[n*8 +: 8]];
|
||||
assign tx_status[IND[n*8 +: 8]] = mac_tx_status[n];
|
||||
assign mac_tx_lfc_en[n] = tx_lfc_en[IND[n*8 +: 8]];
|
||||
assign mac_tx_lfc_req[n] = tx_lfc_req[IND[n*8 +: 8]];
|
||||
assign mac_tx_pfc_en[n*8 +: 8] = tx_pfc_en[IND[n*8 +: 8]*8 +: 8];
|
||||
assign mac_tx_pfc_req[n*8 +: 8] = tx_pfc_req[IND[n*8 +: 8]*8 +: 8];
|
||||
|
||||
assign rx_clk[IND[n*8 +: 8]] = mac_rx_clk[n];
|
||||
assign rx_rst[IND[n*8 +: 8]] = mac_rx_rst[n];
|
||||
@ -223,7 +252,14 @@ generate
|
||||
assign mac_rx_ptp_ts_96[n*PTP_TS_WIDTH +: PTP_TS_WIDTH] = rx_ptp_ts_96[IND[n*8 +: 8]*PTP_TS_WIDTH +: PTP_TS_WIDTH];
|
||||
assign mac_rx_ptp_ts_step[n] = rx_ptp_ts_step[IND[n*8 +: 8]];
|
||||
|
||||
assign mac_rx_enable[n] = rx_enable[IND[n*8 +: 8]];
|
||||
assign rx_status[IND[n*8 +: 8]] = mac_rx_status[n];
|
||||
assign mac_rx_lfc_en[n] = rx_lfc_en[IND[n*8 +: 8]];
|
||||
assign rx_lfc_req[IND[n*8 +: 8]] = mac_rx_lfc_req[n];
|
||||
assign mac_rx_lfc_ack[n] = rx_lfc_ack[IND[n*8 +: 8]];
|
||||
assign mac_rx_pfc_en[n*8 +: 8] = rx_pfc_en[IND[n*8 +: 8]*8 +: 8];
|
||||
assign rx_pfc_req[IND[n*8 +: 8]*8 +: 8] = mac_rx_pfc_req[n*8 +: 8];
|
||||
assign mac_rx_pfc_ack[n*8 +: 8] = rx_pfc_ack[IND[n*8 +: 8]*8 +: 8];
|
||||
end else begin
|
||||
assign m_axis_mac_tx_tdata[n*AXIS_DATA_WIDTH +: AXIS_DATA_WIDTH] = {AXIS_DATA_WIDTH{1'b0}};
|
||||
assign m_axis_mac_tx_tkeep[n*AXIS_KEEP_WIDTH +: AXIS_KEEP_WIDTH] = {AXIS_KEEP_WIDTH{1'b0}};
|
||||
@ -234,8 +270,20 @@ generate
|
||||
assign mac_tx_ptp_ts_96[n*PTP_TS_WIDTH +: PTP_TS_WIDTH] = {PTP_TS_WIDTH{1'b0}};
|
||||
assign mac_tx_ptp_ts_step[n] = 1'b0;
|
||||
|
||||
assign mac_tx_enable[n] = 1'b0;
|
||||
assign mac_tx_lfc_en[n] = 1'b0;
|
||||
assign mac_tx_lfc_req[n] = 1'b0;
|
||||
assign mac_tx_pfc_en[n*8 +: 8] = 8'd0;
|
||||
assign mac_tx_pfc_req[n*8 +: 8] = 8'd0;
|
||||
|
||||
assign mac_rx_ptp_ts_96[n*PTP_TS_WIDTH +: PTP_TS_WIDTH] = {PTP_TS_WIDTH{1'b0}};
|
||||
assign mac_rx_ptp_ts_step[n] = 1'b0;
|
||||
|
||||
assign mac_rx_enable[n] = 1'b0;
|
||||
assign mac_rx_lfc_en[n] = 1'b0;
|
||||
assign mac_rx_lfc_ack[n] = 1'b0;
|
||||
assign mac_rx_pfc_en[n*8 +: 8] = 8'd0;
|
||||
assign mac_rx_pfc_ack[n*8 +: 8] = 8'd0;
|
||||
end
|
||||
end
|
||||
endgenerate
|
||||
|
@ -19,6 +19,9 @@ module mqnic_port_rx #
|
||||
|
||||
// Interface configuration
|
||||
parameter PTP_TS_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 0,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter MAC_CTRL_ENABLE = 0,
|
||||
parameter MAX_RX_SIZE = 9214,
|
||||
|
||||
// Application block configuration
|
||||
@ -95,7 +98,21 @@ module mqnic_port_rx #
|
||||
input wire s_axis_rx_tvalid,
|
||||
output wire s_axis_rx_tready,
|
||||
input wire s_axis_rx_tlast,
|
||||
input wire [AXIS_RX_USER_WIDTH-1:0] s_axis_rx_tuser
|
||||
input wire [AXIS_RX_USER_WIDTH-1:0] s_axis_rx_tuser,
|
||||
|
||||
/*
|
||||
* Flow control
|
||||
*/
|
||||
input wire rx_lfc_en,
|
||||
output wire rx_lfc_req,
|
||||
input wire rx_lfc_ack,
|
||||
input wire [7:0] rx_pfc_en,
|
||||
output wire [7:0] rx_pfc_req,
|
||||
input wire [7:0] rx_pfc_ack,
|
||||
input wire [9:0] rx_fc_quanta_step,
|
||||
input wire rx_fc_quanta_clk_en,
|
||||
input wire fifo_pause_req,
|
||||
output wire fifo_pause_ack
|
||||
);
|
||||
|
||||
generate
|
||||
@ -137,6 +154,12 @@ wire axis_if_rx_tlast;
|
||||
wire [AXIS_RX_USER_WIDTH-1:0] axis_if_rx_tuser;
|
||||
|
||||
mqnic_l2_ingress #(
|
||||
// Interface configuration
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.MAC_CTRL_ENABLE(MAC_CTRL_ENABLE),
|
||||
|
||||
// Streaming interface configuration
|
||||
.AXIS_DATA_WIDTH(AXIS_DATA_WIDTH),
|
||||
.AXIS_KEEP_WIDTH(AXIS_KEEP_WIDTH),
|
||||
.AXIS_USER_WIDTH(AXIS_RX_USER_WIDTH),
|
||||
@ -164,7 +187,19 @@ mqnic_l2_ingress_inst (
|
||||
.m_axis_tvalid(axis_rx_l2_tvalid),
|
||||
.m_axis_tready(axis_rx_l2_tready),
|
||||
.m_axis_tlast(axis_rx_l2_tlast),
|
||||
.m_axis_tuser(axis_rx_l2_tuser)
|
||||
.m_axis_tuser(axis_rx_l2_tuser),
|
||||
|
||||
/*
|
||||
* Flow control
|
||||
*/
|
||||
.rx_lfc_en(rx_lfc_en),
|
||||
.rx_lfc_req(rx_lfc_req),
|
||||
.rx_lfc_ack(rx_lfc_ack),
|
||||
.rx_pfc_en(rx_pfc_en),
|
||||
.rx_pfc_req(rx_pfc_req),
|
||||
.rx_pfc_ack(rx_pfc_ack),
|
||||
.rx_fc_quanta_step(rx_fc_quanta_step),
|
||||
.rx_fc_quanta_clk_en(rx_fc_quanta_clk_en)
|
||||
);
|
||||
|
||||
if (APP_AXIS_DIRECT_ENABLE) begin
|
||||
@ -253,8 +288,8 @@ rx_async_fifo_inst (
|
||||
// Pause
|
||||
.s_pause_req(1'b0),
|
||||
.s_pause_ack(),
|
||||
.m_pause_req(1'b0),
|
||||
.m_pause_ack(),
|
||||
.m_pause_req(fifo_pause_req),
|
||||
.m_pause_ack(fifo_pause_ack),
|
||||
|
||||
// Status
|
||||
.s_status_depth(),
|
||||
|
@ -22,6 +22,9 @@ module mqnic_port_tx #
|
||||
parameter TX_CPL_ENABLE = 1,
|
||||
parameter TX_CPL_FIFO_DEPTH = 32,
|
||||
parameter TX_TAG_WIDTH = 16,
|
||||
parameter PFC_ENABLE = 0,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter MAC_CTRL_ENABLE = 0,
|
||||
parameter MAX_TX_SIZE = 9214,
|
||||
|
||||
// Application block configuration
|
||||
@ -128,7 +131,21 @@ module mqnic_port_tx #
|
||||
input wire [PTP_TS_WIDTH-1:0] s_axis_tx_cpl_ts,
|
||||
input wire [TX_TAG_WIDTH-1:0] s_axis_tx_cpl_tag,
|
||||
input wire s_axis_tx_cpl_valid,
|
||||
output wire s_axis_tx_cpl_ready
|
||||
output wire s_axis_tx_cpl_ready,
|
||||
|
||||
/*
|
||||
* Flow control
|
||||
*/
|
||||
input wire tx_lfc_en,
|
||||
input wire tx_lfc_req,
|
||||
input wire [7:0] tx_pfc_en,
|
||||
input wire [7:0] tx_pfc_req,
|
||||
input wire tx_pause_req,
|
||||
output wire tx_pause_ack,
|
||||
input wire [9:0] tx_fc_quanta_step,
|
||||
input wire tx_fc_quanta_clk_en,
|
||||
input wire fifo_pause_req,
|
||||
output wire fifo_pause_ack
|
||||
);
|
||||
|
||||
initial begin
|
||||
@ -463,8 +480,8 @@ tx_async_fifo_inst (
|
||||
.m_axis_tuser(axis_tx_out_tuser),
|
||||
|
||||
// Pause
|
||||
.s_pause_req(1'b0),
|
||||
.s_pause_ack(),
|
||||
.s_pause_req(fifo_pause_req),
|
||||
.s_pause_ack(fifo_pause_ack),
|
||||
.m_pause_req(1'b0),
|
||||
.m_pause_ack(),
|
||||
|
||||
@ -517,6 +534,12 @@ end else begin
|
||||
end
|
||||
|
||||
mqnic_l2_egress #(
|
||||
// Interface configuration
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.MAC_CTRL_ENABLE(MAC_CTRL_ENABLE),
|
||||
|
||||
// Streaming interface configuration
|
||||
.AXIS_DATA_WIDTH(AXIS_DATA_WIDTH),
|
||||
.AXIS_KEEP_WIDTH(AXIS_KEEP_WIDTH),
|
||||
.AXIS_USER_WIDTH(AXIS_TX_USER_WIDTH)
|
||||
@ -543,7 +566,19 @@ mqnic_l2_egress_inst (
|
||||
.m_axis_tvalid(m_axis_tx_tvalid),
|
||||
.m_axis_tready(m_axis_tx_tready),
|
||||
.m_axis_tlast(m_axis_tx_tlast),
|
||||
.m_axis_tuser(m_axis_tx_tuser)
|
||||
.m_axis_tuser(m_axis_tx_tuser),
|
||||
|
||||
/*
|
||||
* Flow control
|
||||
*/
|
||||
.tx_lfc_en(tx_lfc_en),
|
||||
.tx_lfc_req(tx_lfc_req),
|
||||
.tx_pfc_en(tx_pfc_en),
|
||||
.tx_pfc_req(tx_pfc_req),
|
||||
.tx_pause_req(tx_pause_req),
|
||||
.tx_pause_ack(tx_pause_ack),
|
||||
.tx_fc_quanta_step(tx_fc_quanta_step),
|
||||
.tx_fc_quanta_clk_en(tx_fc_quanta_clk_en)
|
||||
);
|
||||
|
||||
endgenerate
|
||||
|
@ -6,18 +6,35 @@
|
||||
foreach inst [get_cells -hier -filter {(ORIG_REF_NAME == mqnic_port || REF_NAME == mqnic_port)}] {
|
||||
puts "Inserting timing constraints for mqnic_port instance $inst"
|
||||
|
||||
proc constrain_slow_sync {inst driver args} {
|
||||
set sync_ffs [get_cells -hier $args -filter "PARENT == $inst"]
|
||||
proc constrain_sync_chain_async {inst driver args} {
|
||||
set sync_ffs [get_cells -hier [concat $driver $args] -filter "PARENT == $inst"]
|
||||
|
||||
if {[llength $sync_ffs]} {
|
||||
set_property ASYNC_REG TRUE $sync_ffs
|
||||
|
||||
set_false_path -from [get_cells "$inst/$driver"] -to [get_cells "$inst/[lindex $args 0]"]
|
||||
set_false_path -to [get_pins "$inst/$driver/D"]
|
||||
}
|
||||
}
|
||||
|
||||
constrain_slow_sync $inst "rx_rst_sync_1_reg_reg" "rx_rst_sync_2_reg_reg" "rx_rst_sync_3_reg_reg"
|
||||
constrain_slow_sync $inst "rx_status_sync_1_reg_reg" "rx_status_sync_2_reg_reg" "rx_status_sync_3_reg_reg"
|
||||
constrain_slow_sync $inst "tx_rst_sync_1_reg_reg" "tx_rst_sync_2_reg_reg" "tx_rst_sync_3_reg_reg"
|
||||
constrain_slow_sync $inst "tx_status_sync_1_reg_reg" "tx_status_sync_2_reg_reg" "tx_status_sync_3_reg_reg"
|
||||
constrain_sync_chain_async $inst "tx_enable_sync_1_reg_reg" "tx_enable_sync_2_reg_reg"
|
||||
constrain_sync_chain_async $inst "tx_lfc_en_sync_1_reg_reg" "tx_lfc_en_sync_2_reg_reg"
|
||||
constrain_sync_chain_async $inst "tx_lfc_req_sync_1_reg_reg" "tx_lfc_req_sync_2_reg_reg"
|
||||
constrain_sync_chain_async $inst "tx_pfc_en_sync_1_reg_reg[*]" "tx_pfc_en_sync_2_reg_reg[*]"
|
||||
constrain_sync_chain_async $inst "tx_pfc_req_sync_1_reg_reg[*]" "tx_pfc_req_sync_2_reg_reg[*]"
|
||||
constrain_sync_chain_async $inst "tx_fc_quanta_step_sync_1_reg_reg[*]" "tx_fc_quanta_step_sync_2_reg_reg[*]"
|
||||
|
||||
constrain_sync_chain_async $inst "tx_rst_sync_2_reg_reg" "tx_rst_sync_3_reg_reg"
|
||||
constrain_sync_chain_async $inst "tx_status_sync_2_reg_reg" "tx_status_sync_3_reg_reg"
|
||||
|
||||
constrain_sync_chain_async $inst "rx_enable_sync_1_reg_reg" "rx_enable_sync_2_reg_reg"
|
||||
constrain_sync_chain_async $inst "rx_lfc_en_sync_1_reg_reg" "rx_lfc_en_sync_2_reg_reg"
|
||||
constrain_sync_chain_async $inst "rx_lfc_ack_sync_1_reg_reg" "rx_lfc_ack_sync_2_reg_reg"
|
||||
constrain_sync_chain_async $inst "rx_pfc_en_sync_1_reg_reg[*]" "rx_pfc_en_sync_2_reg_reg[*]"
|
||||
constrain_sync_chain_async $inst "rx_pfc_ack_sync_1_reg_reg[*]" "rx_pfc_ack_sync_2_reg_reg[*]"
|
||||
|
||||
constrain_sync_chain_async $inst "rx_rst_sync_2_reg_reg" "rx_rst_sync_3_reg_reg"
|
||||
constrain_sync_chain_async $inst "rx_status_sync_2_reg_reg" "rx_status_sync_3_reg_reg"
|
||||
constrain_sync_chain_async $inst "rx_lfc_req_sync_2_reg_reg" "rx_lfc_req_sync_3_reg_reg"
|
||||
constrain_sync_chain_async $inst "rx_pfc_req_sync_2_reg_reg[*]" "rx_pfc_req_sync_3_reg_reg[*]"
|
||||
constrain_sync_chain_async $inst "rx_fc_quanta_step_sync_1_reg_reg[*]" "rx_fc_quanta_step_sync_2_reg_reg[*]"
|
||||
}
|
||||
|
@ -147,6 +147,8 @@ MQNIC_IF_FEATURE_PTP_TS = (1 << 4)
|
||||
MQNIC_IF_FEATURE_TX_CSUM = (1 << 8)
|
||||
MQNIC_IF_FEATURE_RX_CSUM = (1 << 9)
|
||||
MQNIC_IF_FEATURE_RX_HASH = (1 << 10)
|
||||
MQNIC_IF_FEATURE_LFC = (1 << 11)
|
||||
MQNIC_IF_FEATURE_PFC = (1 << 12)
|
||||
|
||||
MQNIC_RB_RX_QUEUE_MAP_TYPE = 0x0000C090
|
||||
MQNIC_RB_RX_QUEUE_MAP_VER = 0x00000200
|
||||
@ -186,10 +188,47 @@ MQNIC_RB_PORT_VER = 0x00000200
|
||||
MQNIC_RB_PORT_REG_OFFSET = 0x0C
|
||||
|
||||
MQNIC_RB_PORT_CTRL_TYPE = 0x0000C003
|
||||
MQNIC_RB_PORT_CTRL_VER = 0x00000200
|
||||
MQNIC_RB_PORT_CTRL_VER = 0x00000300
|
||||
MQNIC_RB_PORT_CTRL_REG_FEATURES = 0x0C
|
||||
MQNIC_RB_PORT_CTRL_REG_TX_STATUS = 0x10
|
||||
MQNIC_RB_PORT_CTRL_REG_RX_STATUS = 0x14
|
||||
MQNIC_RB_PORT_CTRL_REG_TX_CTRL = 0x10
|
||||
MQNIC_RB_PORT_CTRL_REG_RX_CTRL = 0x14
|
||||
MQNIC_RB_PORT_CTRL_REG_LFC_CTRL = 0x1C
|
||||
MQNIC_RB_PORT_CTRL_REG_PFC_CTRL0 = 0x20
|
||||
MQNIC_RB_PORT_CTRL_REG_PFC_CTRL1 = 0x24
|
||||
MQNIC_RB_PORT_CTRL_REG_PFC_CTRL2 = 0x28
|
||||
MQNIC_RB_PORT_CTRL_REG_PFC_CTRL3 = 0x2C
|
||||
MQNIC_RB_PORT_CTRL_REG_PFC_CTRL4 = 0x30
|
||||
MQNIC_RB_PORT_CTRL_REG_PFC_CTRL5 = 0x34
|
||||
MQNIC_RB_PORT_CTRL_REG_PFC_CTRL6 = 0x38
|
||||
MQNIC_RB_PORT_CTRL_REG_PFC_CTRL7 = 0x3C
|
||||
|
||||
MQNIC_PORT_FEATURE_LFC = (1 << 0)
|
||||
MQNIC_PORT_FEATURE_PFC = (1 << 1)
|
||||
MQNIC_PORT_FEATURE_INT_MAC_CTRL = (1 << 2)
|
||||
|
||||
MQNIC_PORT_TX_CTRL_EN = (1 << 0)
|
||||
MQNIC_PORT_TX_CTRL_PAUSE = (1 << 8)
|
||||
MQNIC_PORT_TX_CTRL_STATUS = (1 << 16)
|
||||
MQNIC_PORT_TX_CTRL_RESET = (1 << 17)
|
||||
MQNIC_PORT_TX_CTRL_PAUSE_REQ = (1 << 24)
|
||||
MQNIC_PORT_TX_CTRL_PAUSE_ACK = (1 << 25)
|
||||
|
||||
MQNIC_PORT_RX_CTRL_EN = (1 << 0)
|
||||
MQNIC_PORT_RX_CTRL_PAUSE = (1 << 8)
|
||||
MQNIC_PORT_RX_CTRL_STATUS = (1 << 16)
|
||||
MQNIC_PORT_RX_CTRL_RESET = (1 << 17)
|
||||
MQNIC_PORT_RX_CTRL_PAUSE_REQ = (1 << 24)
|
||||
MQNIC_PORT_RX_CTRL_PAUSE_ACK = (1 << 25)
|
||||
|
||||
MQNIC_PORT_LFC_CTRL_TX_LFC_EN = (1 << 24)
|
||||
MQNIC_PORT_LFC_CTRL_RX_LFC_EN = (1 << 25)
|
||||
MQNIC_PORT_LFC_CTRL_TX_LFC_REQ = (1 << 28)
|
||||
MQNIC_PORT_LFC_CTRL_RX_LFC_REQ = (1 << 29)
|
||||
|
||||
MQNIC_PORT_PFC_CTRL_TX_PFC_EN = (1 << 24)
|
||||
MQNIC_PORT_PFC_CTRL_RX_PFC_EN = (1 << 25)
|
||||
MQNIC_PORT_PFC_CTRL_TX_PFC_REQ = (1 << 28)
|
||||
MQNIC_PORT_PFC_CTRL_RX_PFC_REQ = (1 << 29)
|
||||
|
||||
MQNIC_RB_SCHED_BLOCK_TYPE = 0x0000C004
|
||||
MQNIC_RB_SCHED_BLOCK_VER = 0x00000300
|
||||
@ -1119,6 +1158,9 @@ class Port:
|
||||
self.port_ctrl_rb = None
|
||||
|
||||
self.port_features = None
|
||||
self.port_feature_lfc = None
|
||||
self.port_feature_pfc = None
|
||||
self.port_feature_int_mac_ctrl = None
|
||||
|
||||
async def init(self):
|
||||
# Read ID registers
|
||||
@ -1129,14 +1171,42 @@ class Port:
|
||||
self.port_ctrl_rb = self.reg_blocks.find(MQNIC_RB_PORT_CTRL_TYPE, MQNIC_RB_PORT_CTRL_VER)
|
||||
|
||||
self.port_features = await self.port_ctrl_rb.read_dword(MQNIC_RB_PORT_CTRL_REG_FEATURES)
|
||||
self.port_feature_lfc = bool(self.port_features & MQNIC_PORT_FEATURE_LFC)
|
||||
self.port_feature_pfc = bool(self.port_features & MQNIC_PORT_FEATURE_PFC)
|
||||
self.port_feature_int_mac_ctrl = bool(self.port_features & MQNIC_PORT_FEATURE_INT_MAC_CTRL)
|
||||
|
||||
self.log.info("Port features: 0x%08x", self.port_features)
|
||||
|
||||
async def get_tx_status(self, port):
|
||||
return await self.port_ctrl_rb.read_dword(MQNIC_RB_PORT_CTRL_REG_TX_STATUS)
|
||||
await self.set_tx_ctrl(0)
|
||||
await self.set_rx_ctrl(0)
|
||||
await self.set_lfc_ctrl(0)
|
||||
|
||||
async def get_rx_status(self, port):
|
||||
return await self.port_ctrl_rb.read_dword(MQNIC_RB_PORT_CTRL_REG_RX_STATUS)
|
||||
for k in range(8):
|
||||
await self.set_pfc_ctrl(k, 0)
|
||||
|
||||
async def get_tx_ctrl(self):
|
||||
return await self.port_ctrl_rb.read_dword(MQNIC_RB_PORT_CTRL_REG_TX_CTRL)
|
||||
|
||||
async def set_tx_ctrl(self, val):
|
||||
await self.port_ctrl_rb.write_dword(MQNIC_RB_PORT_CTRL_REG_TX_CTRL, val)
|
||||
|
||||
async def get_rx_ctrl(self):
|
||||
return await self.port_ctrl_rb.read_dword(MQNIC_RB_PORT_CTRL_REG_RX_CTRL)
|
||||
|
||||
async def set_rx_ctrl(self, val):
|
||||
await self.port_ctrl_rb.write_dword(MQNIC_RB_PORT_CTRL_REG_RX_CTRL, val)
|
||||
|
||||
async def get_lfc_ctrl(self):
|
||||
return await self.port_ctrl_rb.read_dword(MQNIC_RB_PORT_CTRL_REG_LFC_CTRL)
|
||||
|
||||
async def set_lfc_ctrl(self, val):
|
||||
await self.port_ctrl_rb.write_dword(MQNIC_RB_PORT_CTRL_REG_LFC_CTRL, val)
|
||||
|
||||
async def get_pfc_ctrl(self, index):
|
||||
return await self.port_ctrl_rb.read_dword(MQNIC_RB_PORT_CTRL_REG_PFC_CTRL0 + 4*index)
|
||||
|
||||
async def set_pfc_ctrl(self, index, val):
|
||||
await self.port_ctrl_rb.write_dword(MQNIC_RB_PORT_CTRL_REG_PFC_CTRL0 + 4*index, val)
|
||||
|
||||
|
||||
class Interface:
|
||||
@ -1209,6 +1279,8 @@ class Interface:
|
||||
self.if_feature_tx_csum = bool(self.if_features & MQNIC_IF_FEATURE_TX_CSUM)
|
||||
self.if_feature_rx_csum = bool(self.if_features & MQNIC_IF_FEATURE_RX_CSUM)
|
||||
self.if_feature_rx_hash = bool(self.if_features & MQNIC_IF_FEATURE_RX_HASH)
|
||||
self.if_feature_lfc = bool(self.if_features & MQNIC_IF_FEATURE_LFC)
|
||||
self.if_feature_pfc = bool(self.if_features & MQNIC_IF_FEATURE_PFC)
|
||||
|
||||
self.log.info("IF features: 0x%08x", self.if_features)
|
||||
self.log.info("Port count: %d", self.port_count)
|
||||
@ -1357,11 +1429,16 @@ class Interface:
|
||||
# wait for all writes to complete
|
||||
await self.hw_regs.read_dword(0)
|
||||
|
||||
await self.ports[0].set_tx_ctrl(MQNIC_PORT_TX_CTRL_EN)
|
||||
await self.ports[0].set_rx_ctrl(MQNIC_PORT_RX_CTRL_EN)
|
||||
|
||||
self.port_up = True
|
||||
|
||||
async def close(self):
|
||||
self.port_up = False
|
||||
|
||||
await self.ports[0].set_rx_ctrl(0)
|
||||
|
||||
for q in self.txq:
|
||||
q.disable()
|
||||
|
||||
@ -1386,6 +1463,8 @@ class Interface:
|
||||
self.txq = []
|
||||
self.rxq = []
|
||||
|
||||
await self.ports[0].set_tx_ctrl(0)
|
||||
|
||||
async def start_xmit(self, skb, tx_ring=None, csum_start=None, csum_offset=None):
|
||||
if not self.port_up:
|
||||
return
|
||||
|
@ -52,6 +52,10 @@ VERILOG_SOURCES += ../../rtl/stats_dma_if_axi.v
|
||||
VERILOG_SOURCES += ../../rtl/stats_dma_latency.v
|
||||
VERILOG_SOURCES += ../../rtl/mqnic_tx_scheduler_block_rr.v
|
||||
VERILOG_SOURCES += ../../rtl/tx_scheduler_rr.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock_cdc.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_perout.v
|
||||
@ -145,6 +149,9 @@ export PARAM_TX_TAG_WIDTH := 16
|
||||
export PARAM_TX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_RX_HASH_ENABLE := 1
|
||||
export PARAM_RX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_LFC_ENABLE := 1
|
||||
export PARAM_PFC_ENABLE := $(PARAM_LFC_ENABLE)
|
||||
export PARAM_MAC_CTRL_ENABLE := 1
|
||||
export PARAM_TX_FIFO_DEPTH := 32768
|
||||
export PARAM_RX_FIFO_DEPTH := 131072
|
||||
export PARAM_MAX_TX_SIZE := 9214
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
import logging
|
||||
import os
|
||||
import struct
|
||||
import sys
|
||||
|
||||
import scapy.utils
|
||||
@ -103,7 +104,11 @@ class TB(object):
|
||||
self.port_mac.append(mac)
|
||||
|
||||
dut.tx_status.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
dut.tx_fc_quanta_clk_en.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
dut.rx_status.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
dut.rx_lfc_req.setimmediatevalue(0)
|
||||
dut.rx_pfc_req.setimmediatevalue(0)
|
||||
dut.rx_fc_quanta_clk_en.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
|
||||
# DDR
|
||||
self.ddr_group_size = core_inst.DDR_GROUP_SIZE.value
|
||||
@ -445,13 +450,16 @@ async def run_test_nic(dut):
|
||||
|
||||
for block in tb.driver.interfaces[0].sched_blocks:
|
||||
await block.schedulers[0].rb.write_dword(mqnic.MQNIC_RB_SCHED_RR_REG_CTRL, 0x00000001)
|
||||
await tb.driver.interfaces[0].set_rx_queue_map_indir_table(block.index, 0, block.index)
|
||||
await block.interface.set_rx_queue_map_indir_table(block.index, 0, block.index)
|
||||
for k in range(len(block.interface.txq)):
|
||||
if k % len(tb.driver.interfaces[0].sched_blocks) == block.index:
|
||||
if k % len(block.interface.sched_blocks) == block.index:
|
||||
await block.schedulers[0].hw_regs.write_dword(4*k, 0x00000003)
|
||||
else:
|
||||
await block.schedulers[0].hw_regs.write_dword(4*k, 0x00000000)
|
||||
|
||||
await block.interface.ports[block.index].set_tx_ctrl(mqnic.MQNIC_PORT_TX_CTRL_EN)
|
||||
await block.interface.ports[block.index].set_rx_ctrl(mqnic.MQNIC_PORT_RX_CTRL_EN)
|
||||
|
||||
count = 64
|
||||
|
||||
pkts = [bytearray([(x+k) % 256 for x in range(1514)]) for k in range(count)]
|
||||
@ -481,6 +489,35 @@ async def run_test_nic(dut):
|
||||
await block.schedulers[0].rb.write_dword(mqnic.MQNIC_RB_SCHED_RR_REG_CTRL, 0x00000000)
|
||||
await tb.driver.interfaces[0].set_rx_queue_map_indir_table(block.index, 0, 0)
|
||||
|
||||
if tb.driver.interfaces[0].if_feature_lfc:
|
||||
tb.log.info("Test LFC pause frame RX")
|
||||
|
||||
await tb.driver.interfaces[0].ports[0].set_lfc_ctrl(mqnic.MQNIC_PORT_LFC_CTRL_TX_LFC_EN | mqnic.MQNIC_PORT_LFC_CTRL_RX_LFC_EN)
|
||||
await tb.driver.hw_regs.read_dword(0)
|
||||
|
||||
lfc_xoff = Ether(src='DA:D1:D2:D3:D4:D5', dst='01:80:C2:00:00:01', type=0x8808) / struct.pack('!HH', 0x0001, 2000)
|
||||
|
||||
await tb.port_mac[0].rx.send(bytes(lfc_xoff))
|
||||
|
||||
count = 16
|
||||
|
||||
pkts = [bytearray([(x+k) % 256 for x in range(1514)]) for k in range(count)]
|
||||
|
||||
tb.loopback_enable = True
|
||||
|
||||
for p in pkts:
|
||||
await tb.driver.interfaces[0].start_xmit(p, 0)
|
||||
|
||||
for k in range(count):
|
||||
pkt = await tb.driver.interfaces[0].recv()
|
||||
|
||||
tb.log.info("Packet: %s", pkt)
|
||||
assert pkt.data == pkts[k]
|
||||
if tb.driver.interfaces[0].if_feature_rx_csum:
|
||||
assert pkt.rx_checksum == ~scapy.utils.checksum(bytes(pkt.data[14:])) & 0xffff
|
||||
|
||||
tb.loopback_enable = False
|
||||
|
||||
tb.log.info("Read statistics counters")
|
||||
|
||||
await Timer(2000, 'ns')
|
||||
@ -562,6 +599,10 @@ def test_mqnic_core_axi(request, if_count, ports_per_if, axi_data_width,
|
||||
os.path.join(rtl_dir, "stats_dma_latency.v"),
|
||||
os.path.join(rtl_dir, "mqnic_tx_scheduler_block_rr.v"),
|
||||
os.path.join(rtl_dir, "tx_scheduler_rr.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock_cdc.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_perout.v"),
|
||||
@ -656,6 +697,9 @@ def test_mqnic_core_axi(request, if_count, ports_per_if, axi_data_width,
|
||||
parameters['TX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['RX_HASH_ENABLE'] = 1
|
||||
parameters['RX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['LFC_ENABLE'] = 1
|
||||
parameters['PFC_ENABLE'] = parameters['LFC_ENABLE']
|
||||
parameters['MAC_CTRL_ENABLE'] = 1
|
||||
parameters['TX_FIFO_DEPTH'] = 32768
|
||||
parameters['RX_FIFO_DEPTH'] = 131072
|
||||
parameters['MAX_TX_SIZE'] = 9214
|
||||
|
@ -53,6 +53,10 @@ VERILOG_SOURCES += ../../rtl/stats_dma_if_pcie.v
|
||||
VERILOG_SOURCES += ../../rtl/stats_dma_latency.v
|
||||
VERILOG_SOURCES += ../../rtl/mqnic_tx_scheduler_block_rr.v
|
||||
VERILOG_SOURCES += ../../rtl/tx_scheduler_rr.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock_cdc.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_perout.v
|
||||
@ -160,6 +164,9 @@ export PARAM_TX_TAG_WIDTH := 16
|
||||
export PARAM_TX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_RX_HASH_ENABLE := 1
|
||||
export PARAM_RX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_LFC_ENABLE := 1
|
||||
export PARAM_PFC_ENABLE := $(PARAM_LFC_ENABLE)
|
||||
export PARAM_MAC_CTRL_ENABLE := 1
|
||||
export PARAM_TX_FIFO_DEPTH := 32768
|
||||
export PARAM_RX_FIFO_DEPTH := 131072
|
||||
export PARAM_MAX_TX_SIZE := 9214
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
import logging
|
||||
import os
|
||||
import struct
|
||||
import sys
|
||||
|
||||
import scapy.utils
|
||||
@ -299,7 +300,11 @@ class TB(object):
|
||||
self.port_mac.append(mac)
|
||||
|
||||
dut.eth_tx_status.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
dut.eth_tx_fc_quanta_clk_en.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
dut.eth_rx_status.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
dut.eth_rx_lfc_req.setimmediatevalue(0)
|
||||
dut.eth_rx_pfc_req.setimmediatevalue(0)
|
||||
dut.eth_rx_fc_quanta_clk_en.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
|
||||
# DDR
|
||||
self.ddr_group_size = core_inst.DDR_GROUP_SIZE.value
|
||||
@ -643,13 +648,16 @@ async def run_test_nic(dut):
|
||||
|
||||
for block in tb.driver.interfaces[0].sched_blocks:
|
||||
await block.schedulers[0].rb.write_dword(mqnic.MQNIC_RB_SCHED_RR_REG_CTRL, 0x00000001)
|
||||
await tb.driver.interfaces[0].set_rx_queue_map_indir_table(block.index, 0, block.index)
|
||||
await block.interface.set_rx_queue_map_indir_table(block.index, 0, block.index)
|
||||
for k in range(len(block.interface.txq)):
|
||||
if k % len(tb.driver.interfaces[0].sched_blocks) == block.index:
|
||||
if k % len(block.interface.sched_blocks) == block.index:
|
||||
await block.schedulers[0].hw_regs.write_dword(4*k, 0x00000003)
|
||||
else:
|
||||
await block.schedulers[0].hw_regs.write_dword(4*k, 0x00000000)
|
||||
|
||||
await block.interface.ports[block.index].set_tx_ctrl(mqnic.MQNIC_PORT_TX_CTRL_EN)
|
||||
await block.interface.ports[block.index].set_rx_ctrl(mqnic.MQNIC_PORT_RX_CTRL_EN)
|
||||
|
||||
count = 64
|
||||
|
||||
pkts = [bytearray([(x+k) % 256 for x in range(1514)]) for k in range(count)]
|
||||
@ -679,6 +687,35 @@ async def run_test_nic(dut):
|
||||
await block.schedulers[0].rb.write_dword(mqnic.MQNIC_RB_SCHED_RR_REG_CTRL, 0x00000000)
|
||||
await tb.driver.interfaces[0].set_rx_queue_map_indir_table(block.index, 0, 0)
|
||||
|
||||
if tb.driver.interfaces[0].if_feature_lfc:
|
||||
tb.log.info("Test LFC pause frame RX")
|
||||
|
||||
await tb.driver.interfaces[0].ports[0].set_lfc_ctrl(mqnic.MQNIC_PORT_LFC_CTRL_TX_LFC_EN | mqnic.MQNIC_PORT_LFC_CTRL_RX_LFC_EN)
|
||||
await tb.driver.hw_regs.read_dword(0)
|
||||
|
||||
lfc_xoff = Ether(src='DA:D1:D2:D3:D4:D5', dst='01:80:C2:00:00:01', type=0x8808) / struct.pack('!HH', 0x0001, 2000)
|
||||
|
||||
await tb.port_mac[0].rx.send(bytes(lfc_xoff))
|
||||
|
||||
count = 16
|
||||
|
||||
pkts = [bytearray([(x+k) % 256 for x in range(1514)]) for k in range(count)]
|
||||
|
||||
tb.loopback_enable = True
|
||||
|
||||
for p in pkts:
|
||||
await tb.driver.interfaces[0].start_xmit(p, 0)
|
||||
|
||||
for k in range(count):
|
||||
pkt = await tb.driver.interfaces[0].recv()
|
||||
|
||||
tb.log.info("Packet: %s", pkt)
|
||||
assert pkt.data == pkts[k]
|
||||
if tb.driver.interfaces[0].if_feature_rx_csum:
|
||||
assert pkt.rx_checksum == ~scapy.utils.checksum(bytes(pkt.data[14:])) & 0xffff
|
||||
|
||||
tb.loopback_enable = False
|
||||
|
||||
tb.log.info("Read statistics counters")
|
||||
|
||||
await Timer(2000, 'ns')
|
||||
@ -764,6 +801,10 @@ def test_mqnic_core_pcie_ptile(request, if_count, ports_per_if, pcie_data_width,
|
||||
os.path.join(rtl_dir, "stats_dma_latency.v"),
|
||||
os.path.join(rtl_dir, "mqnic_tx_scheduler_block_rr.v"),
|
||||
os.path.join(rtl_dir, "tx_scheduler_rr.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock_cdc.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_perout.v"),
|
||||
@ -872,6 +913,9 @@ def test_mqnic_core_pcie_ptile(request, if_count, ports_per_if, pcie_data_width,
|
||||
parameters['TX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['RX_HASH_ENABLE'] = 1
|
||||
parameters['RX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['LFC_ENABLE'] = 1
|
||||
parameters['PFC_ENABLE'] = parameters['LFC_ENABLE']
|
||||
parameters['MAC_CTRL_ENABLE'] = 1
|
||||
parameters['TX_FIFO_DEPTH'] = 32768
|
||||
parameters['RX_FIFO_DEPTH'] = 131072
|
||||
parameters['MAX_TX_SIZE'] = 9214
|
||||
|
@ -53,6 +53,10 @@ VERILOG_SOURCES += ../../rtl/stats_dma_if_pcie.v
|
||||
VERILOG_SOURCES += ../../rtl/stats_dma_latency.v
|
||||
VERILOG_SOURCES += ../../rtl/mqnic_tx_scheduler_block_rr.v
|
||||
VERILOG_SOURCES += ../../rtl/tx_scheduler_rr.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock_cdc.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_perout.v
|
||||
@ -159,6 +163,9 @@ export PARAM_TX_TAG_WIDTH := 16
|
||||
export PARAM_TX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_RX_HASH_ENABLE := 1
|
||||
export PARAM_RX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_LFC_ENABLE := 1
|
||||
export PARAM_PFC_ENABLE := $(PARAM_LFC_ENABLE)
|
||||
export PARAM_MAC_CTRL_ENABLE := 1
|
||||
export PARAM_TX_FIFO_DEPTH := 32768
|
||||
export PARAM_RX_FIFO_DEPTH := 131072
|
||||
export PARAM_MAX_TX_SIZE := 9214
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
import logging
|
||||
import os
|
||||
import struct
|
||||
import sys
|
||||
|
||||
import scapy.utils
|
||||
@ -247,7 +248,11 @@ class TB(object):
|
||||
self.port_mac.append(mac)
|
||||
|
||||
dut.eth_tx_status.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
dut.eth_tx_fc_quanta_clk_en.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
dut.eth_rx_status.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
dut.eth_rx_lfc_req.setimmediatevalue(0)
|
||||
dut.eth_rx_pfc_req.setimmediatevalue(0)
|
||||
dut.eth_rx_fc_quanta_clk_en.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
|
||||
# DDR
|
||||
self.ddr_group_size = core_inst.DDR_GROUP_SIZE.value
|
||||
@ -591,13 +596,16 @@ async def run_test_nic(dut):
|
||||
|
||||
for block in tb.driver.interfaces[0].sched_blocks:
|
||||
await block.schedulers[0].rb.write_dword(mqnic.MQNIC_RB_SCHED_RR_REG_CTRL, 0x00000001)
|
||||
await tb.driver.interfaces[0].set_rx_queue_map_indir_table(block.index, 0, block.index)
|
||||
await block.interface.set_rx_queue_map_indir_table(block.index, 0, block.index)
|
||||
for k in range(len(block.interface.txq)):
|
||||
if k % len(tb.driver.interfaces[0].sched_blocks) == block.index:
|
||||
if k % len(block.interface.sched_blocks) == block.index:
|
||||
await block.schedulers[0].hw_regs.write_dword(4*k, 0x00000003)
|
||||
else:
|
||||
await block.schedulers[0].hw_regs.write_dword(4*k, 0x00000000)
|
||||
|
||||
await block.interface.ports[block.index].set_tx_ctrl(mqnic.MQNIC_PORT_TX_CTRL_EN)
|
||||
await block.interface.ports[block.index].set_rx_ctrl(mqnic.MQNIC_PORT_RX_CTRL_EN)
|
||||
|
||||
count = 64
|
||||
|
||||
pkts = [bytearray([(x+k) % 256 for x in range(1514)]) for k in range(count)]
|
||||
@ -627,6 +635,35 @@ async def run_test_nic(dut):
|
||||
await block.schedulers[0].rb.write_dword(mqnic.MQNIC_RB_SCHED_RR_REG_CTRL, 0x00000000)
|
||||
await tb.driver.interfaces[0].set_rx_queue_map_indir_table(block.index, 0, 0)
|
||||
|
||||
if tb.driver.interfaces[0].if_feature_lfc:
|
||||
tb.log.info("Test LFC pause frame RX")
|
||||
|
||||
await tb.driver.interfaces[0].ports[0].set_lfc_ctrl(mqnic.MQNIC_PORT_LFC_CTRL_TX_LFC_EN | mqnic.MQNIC_PORT_LFC_CTRL_RX_LFC_EN)
|
||||
await tb.driver.hw_regs.read_dword(0)
|
||||
|
||||
lfc_xoff = Ether(src='DA:D1:D2:D3:D4:D5', dst='01:80:C2:00:00:01', type=0x8808) / struct.pack('!HH', 0x0001, 2000)
|
||||
|
||||
await tb.port_mac[0].rx.send(bytes(lfc_xoff))
|
||||
|
||||
count = 16
|
||||
|
||||
pkts = [bytearray([(x+k) % 256 for x in range(1514)]) for k in range(count)]
|
||||
|
||||
tb.loopback_enable = True
|
||||
|
||||
for p in pkts:
|
||||
await tb.driver.interfaces[0].start_xmit(p, 0)
|
||||
|
||||
for k in range(count):
|
||||
pkt = await tb.driver.interfaces[0].recv()
|
||||
|
||||
tb.log.info("Packet: %s", pkt)
|
||||
assert pkt.data == pkts[k]
|
||||
if tb.driver.interfaces[0].if_feature_rx_csum:
|
||||
assert pkt.rx_checksum == ~scapy.utils.checksum(bytes(pkt.data[14:])) & 0xffff
|
||||
|
||||
tb.loopback_enable = False
|
||||
|
||||
tb.log.info("Read statistics counters")
|
||||
|
||||
await Timer(2000, 'ns')
|
||||
@ -712,6 +749,10 @@ def test_mqnic_core_pcie_s10(request, if_count, ports_per_if, pcie_data_width,
|
||||
os.path.join(rtl_dir, "stats_dma_latency.v"),
|
||||
os.path.join(rtl_dir, "mqnic_tx_scheduler_block_rr.v"),
|
||||
os.path.join(rtl_dir, "tx_scheduler_rr.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock_cdc.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_perout.v"),
|
||||
@ -819,6 +860,9 @@ def test_mqnic_core_pcie_s10(request, if_count, ports_per_if, pcie_data_width,
|
||||
parameters['TX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['RX_HASH_ENABLE'] = 1
|
||||
parameters['RX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['LFC_ENABLE'] = 1
|
||||
parameters['PFC_ENABLE'] = parameters['LFC_ENABLE']
|
||||
parameters['MAC_CTRL_ENABLE'] = 1
|
||||
parameters['TX_FIFO_DEPTH'] = 32768
|
||||
parameters['RX_FIFO_DEPTH'] = 131072
|
||||
parameters['MAX_TX_SIZE'] = 9214
|
||||
|
@ -53,6 +53,10 @@ VERILOG_SOURCES += ../../rtl/stats_dma_if_pcie.v
|
||||
VERILOG_SOURCES += ../../rtl/stats_dma_latency.v
|
||||
VERILOG_SOURCES += ../../rtl/mqnic_tx_scheduler_block_rr.v
|
||||
VERILOG_SOURCES += ../../rtl/tx_scheduler_rr.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock_cdc.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_perout.v
|
||||
@ -159,6 +163,9 @@ export PARAM_TX_TAG_WIDTH := 16
|
||||
export PARAM_TX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_RX_HASH_ENABLE := 1
|
||||
export PARAM_RX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_LFC_ENABLE := 1
|
||||
export PARAM_PFC_ENABLE := $(PARAM_LFC_ENABLE)
|
||||
export PARAM_MAC_CTRL_ENABLE := 1
|
||||
export PARAM_TX_FIFO_DEPTH := 32768
|
||||
export PARAM_RX_FIFO_DEPTH := 131072
|
||||
export PARAM_MAX_TX_SIZE := 9214
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
import logging
|
||||
import os
|
||||
import struct
|
||||
import sys
|
||||
|
||||
import scapy.utils
|
||||
@ -321,7 +322,11 @@ class TB(object):
|
||||
self.port_mac.append(mac)
|
||||
|
||||
dut.eth_tx_status.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
dut.eth_tx_fc_quanta_clk_en.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
dut.eth_rx_status.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
dut.eth_rx_lfc_req.setimmediatevalue(0)
|
||||
dut.eth_rx_pfc_req.setimmediatevalue(0)
|
||||
dut.eth_rx_fc_quanta_clk_en.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
|
||||
# DDR
|
||||
self.ddr_group_size = core_inst.DDR_GROUP_SIZE.value
|
||||
@ -665,13 +670,16 @@ async def run_test_nic(dut):
|
||||
|
||||
for block in tb.driver.interfaces[0].sched_blocks:
|
||||
await block.schedulers[0].rb.write_dword(mqnic.MQNIC_RB_SCHED_RR_REG_CTRL, 0x00000001)
|
||||
await tb.driver.interfaces[0].set_rx_queue_map_indir_table(block.index, 0, block.index)
|
||||
await block.interface.set_rx_queue_map_indir_table(block.index, 0, block.index)
|
||||
for k in range(len(block.interface.txq)):
|
||||
if k % len(tb.driver.interfaces[0].sched_blocks) == block.index:
|
||||
if k % len(block.interface.sched_blocks) == block.index:
|
||||
await block.schedulers[0].hw_regs.write_dword(4*k, 0x00000003)
|
||||
else:
|
||||
await block.schedulers[0].hw_regs.write_dword(4*k, 0x00000000)
|
||||
|
||||
await block.interface.ports[block.index].set_tx_ctrl(mqnic.MQNIC_PORT_TX_CTRL_EN)
|
||||
await block.interface.ports[block.index].set_rx_ctrl(mqnic.MQNIC_PORT_RX_CTRL_EN)
|
||||
|
||||
count = 64
|
||||
|
||||
pkts = [bytearray([(x+k) % 256 for x in range(1514)]) for k in range(count)]
|
||||
@ -701,6 +709,35 @@ async def run_test_nic(dut):
|
||||
await block.schedulers[0].rb.write_dword(mqnic.MQNIC_RB_SCHED_RR_REG_CTRL, 0x00000000)
|
||||
await tb.driver.interfaces[0].set_rx_queue_map_indir_table(block.index, 0, 0)
|
||||
|
||||
if tb.driver.interfaces[0].if_feature_lfc:
|
||||
tb.log.info("Test LFC pause frame RX")
|
||||
|
||||
await tb.driver.interfaces[0].ports[0].set_lfc_ctrl(mqnic.MQNIC_PORT_LFC_CTRL_TX_LFC_EN | mqnic.MQNIC_PORT_LFC_CTRL_RX_LFC_EN)
|
||||
await tb.driver.hw_regs.read_dword(0)
|
||||
|
||||
lfc_xoff = Ether(src='DA:D1:D2:D3:D4:D5', dst='01:80:C2:00:00:01', type=0x8808) / struct.pack('!HH', 0x0001, 2000)
|
||||
|
||||
await tb.port_mac[0].rx.send(bytes(lfc_xoff))
|
||||
|
||||
count = 16
|
||||
|
||||
pkts = [bytearray([(x+k) % 256 for x in range(1514)]) for k in range(count)]
|
||||
|
||||
tb.loopback_enable = True
|
||||
|
||||
for p in pkts:
|
||||
await tb.driver.interfaces[0].start_xmit(p, 0)
|
||||
|
||||
for k in range(count):
|
||||
pkt = await tb.driver.interfaces[0].recv()
|
||||
|
||||
tb.log.info("Packet: %s", pkt)
|
||||
assert pkt.data == pkts[k]
|
||||
if tb.driver.interfaces[0].if_feature_rx_csum:
|
||||
assert pkt.rx_checksum == ~scapy.utils.checksum(bytes(pkt.data[14:])) & 0xffff
|
||||
|
||||
tb.loopback_enable = False
|
||||
|
||||
tb.log.info("Read statistics counters")
|
||||
|
||||
await Timer(2000, 'ns')
|
||||
@ -786,6 +823,10 @@ def test_mqnic_core_pcie_us(request, if_count, ports_per_if, axis_pcie_data_widt
|
||||
os.path.join(rtl_dir, "stats_dma_latency.v"),
|
||||
os.path.join(rtl_dir, "mqnic_tx_scheduler_block_rr.v"),
|
||||
os.path.join(rtl_dir, "tx_scheduler_rr.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock_cdc.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_perout.v"),
|
||||
@ -893,6 +934,9 @@ def test_mqnic_core_pcie_us(request, if_count, ports_per_if, axis_pcie_data_widt
|
||||
parameters['TX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['RX_HASH_ENABLE'] = 1
|
||||
parameters['RX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['LFC_ENABLE'] = 1
|
||||
parameters['PFC_ENABLE'] = parameters['LFC_ENABLE']
|
||||
parameters['MAC_CTRL_ENABLE'] = 1
|
||||
parameters['TX_FIFO_DEPTH'] = 32768
|
||||
parameters['RX_FIFO_DEPTH'] = 131072
|
||||
parameters['MAX_TX_SIZE'] = 9214
|
||||
|
@ -55,6 +55,10 @@ VERILOG_SOURCES += ../../rtl/mqnic_tx_scheduler_block_rr_tdma.v
|
||||
VERILOG_SOURCES += ../../rtl/tx_scheduler_rr.v
|
||||
VERILOG_SOURCES += ../../rtl/tx_scheduler_ctrl_tdma.v
|
||||
VERILOG_SOURCES += ../../rtl/tdma_scheduler.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock_cdc.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_perout.v
|
||||
@ -161,6 +165,9 @@ export PARAM_TX_TAG_WIDTH := 16
|
||||
export PARAM_TX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_RX_HASH_ENABLE := 1
|
||||
export PARAM_RX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_LFC_ENABLE := 1
|
||||
export PARAM_PFC_ENABLE := $(PARAM_LFC_ENABLE)
|
||||
export PARAM_MAC_CTRL_ENABLE := 1
|
||||
export PARAM_TX_FIFO_DEPTH := 32768
|
||||
export PARAM_RX_FIFO_DEPTH := 131072
|
||||
export PARAM_MAX_TX_SIZE := 9214
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
import logging
|
||||
import os
|
||||
import struct
|
||||
import sys
|
||||
|
||||
import scapy.utils
|
||||
@ -321,7 +322,11 @@ class TB(object):
|
||||
self.port_mac.append(mac)
|
||||
|
||||
dut.eth_tx_status.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
dut.eth_tx_fc_quanta_clk_en.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
dut.eth_rx_status.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
dut.eth_rx_lfc_req.setimmediatevalue(0)
|
||||
dut.eth_rx_pfc_req.setimmediatevalue(0)
|
||||
dut.eth_rx_fc_quanta_clk_en.setimmediatevalue(2**len(core_inst.m_axis_tx_tvalid)-1)
|
||||
|
||||
# DDR
|
||||
self.ddr_group_size = core_inst.DDR_GROUP_SIZE.value
|
||||
@ -665,13 +670,16 @@ async def run_test_nic(dut):
|
||||
|
||||
for block in tb.driver.interfaces[0].sched_blocks:
|
||||
await block.schedulers[0].rb.write_dword(mqnic.MQNIC_RB_SCHED_RR_REG_CTRL, 0x00000001)
|
||||
await tb.driver.interfaces[0].set_rx_queue_map_indir_table(block.index, 0, block.index)
|
||||
await block.interface.set_rx_queue_map_indir_table(block.index, 0, block.index)
|
||||
for k in range(len(block.interface.txq)):
|
||||
if k % len(tb.driver.interfaces[0].sched_blocks) == block.index:
|
||||
if k % len(block.interface.sched_blocks) == block.index:
|
||||
await block.schedulers[0].hw_regs.write_dword(4*k, 0x00000003)
|
||||
else:
|
||||
await block.schedulers[0].hw_regs.write_dword(4*k, 0x00000000)
|
||||
|
||||
await block.interface.ports[block.index].set_tx_ctrl(mqnic.MQNIC_PORT_TX_CTRL_EN)
|
||||
await block.interface.ports[block.index].set_rx_ctrl(mqnic.MQNIC_PORT_RX_CTRL_EN)
|
||||
|
||||
count = 64
|
||||
|
||||
pkts = [bytearray([(x+k) % 256 for x in range(1514)]) for k in range(count)]
|
||||
@ -701,6 +709,35 @@ async def run_test_nic(dut):
|
||||
await block.schedulers[0].rb.write_dword(mqnic.MQNIC_RB_SCHED_RR_REG_CTRL, 0x00000000)
|
||||
await tb.driver.interfaces[0].set_rx_queue_map_indir_table(block.index, 0, 0)
|
||||
|
||||
if tb.driver.interfaces[0].if_feature_lfc:
|
||||
tb.log.info("Test LFC pause frame RX")
|
||||
|
||||
await tb.driver.interfaces[0].ports[0].set_lfc_ctrl(mqnic.MQNIC_PORT_LFC_CTRL_TX_LFC_EN | mqnic.MQNIC_PORT_LFC_CTRL_RX_LFC_EN)
|
||||
await tb.driver.hw_regs.read_dword(0)
|
||||
|
||||
lfc_xoff = Ether(src='DA:D1:D2:D3:D4:D5', dst='01:80:C2:00:00:01', type=0x8808) / struct.pack('!HH', 0x0001, 2000)
|
||||
|
||||
await tb.port_mac[0].rx.send(bytes(lfc_xoff))
|
||||
|
||||
count = 16
|
||||
|
||||
pkts = [bytearray([(x+k) % 256 for x in range(1514)]) for k in range(count)]
|
||||
|
||||
tb.loopback_enable = True
|
||||
|
||||
for p in pkts:
|
||||
await tb.driver.interfaces[0].start_xmit(p, 0)
|
||||
|
||||
for k in range(count):
|
||||
pkt = await tb.driver.interfaces[0].recv()
|
||||
|
||||
tb.log.info("Packet: %s", pkt)
|
||||
assert pkt.data == pkts[k]
|
||||
if tb.driver.interfaces[0].if_feature_rx_csum:
|
||||
assert pkt.rx_checksum == ~scapy.utils.checksum(bytes(pkt.data[14:])) & 0xffff
|
||||
|
||||
tb.loopback_enable = False
|
||||
|
||||
await Timer(1000, 'ns')
|
||||
|
||||
tb.log.info("TDMA")
|
||||
@ -841,6 +878,10 @@ def test_mqnic_core_pcie_us(request, if_count, ports_per_if, axis_pcie_data_widt
|
||||
os.path.join(rtl_dir, "tx_scheduler_rr.v"),
|
||||
os.path.join(rtl_dir, "tx_scheduler_ctrl_tdma.v"),
|
||||
os.path.join(rtl_dir, "tdma_scheduler.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock_cdc.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_perout.v"),
|
||||
@ -948,6 +989,9 @@ def test_mqnic_core_pcie_us(request, if_count, ports_per_if, axis_pcie_data_widt
|
||||
parameters['TX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['RX_HASH_ENABLE'] = 1
|
||||
parameters['RX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['LFC_ENABLE'] = 1
|
||||
parameters['PFC_ENABLE'] = parameters['LFC_ENABLE']
|
||||
parameters['MAC_CTRL_ENABLE'] = 1
|
||||
parameters['TX_FIFO_DEPTH'] = 32768
|
||||
parameters['RX_FIFO_DEPTH'] = 131072
|
||||
parameters['MAX_TX_SIZE'] = 9214
|
||||
|
@ -101,6 +101,8 @@ dict set params TX_CPL_FIFO_DEPTH "32"
|
||||
dict set params TX_CHECKSUM_ENABLE "1"
|
||||
dict set params RX_HASH_ENABLE "1"
|
||||
dict set params RX_CHECKSUM_ENABLE "1"
|
||||
dict set params PFC_ENABLE "1"
|
||||
dict set params LFC_ENABLE [dict get $params PFC_ENABLE]
|
||||
dict set params TX_FIFO_DEPTH "32768"
|
||||
dict set params RX_FIFO_DEPTH "131072"
|
||||
dict set params MAX_TX_SIZE "9214"
|
||||
|
@ -101,6 +101,8 @@ dict set params TX_CPL_FIFO_DEPTH "32"
|
||||
dict set params TX_CHECKSUM_ENABLE "1"
|
||||
dict set params RX_HASH_ENABLE "1"
|
||||
dict set params RX_CHECKSUM_ENABLE "1"
|
||||
dict set params PFC_ENABLE "1"
|
||||
dict set params LFC_ENABLE [dict get $params PFC_ENABLE]
|
||||
dict set params TX_FIFO_DEPTH "32768"
|
||||
dict set params RX_FIFO_DEPTH "131072"
|
||||
dict set params MAX_TX_SIZE "9214"
|
||||
|
@ -7,8 +7,10 @@ set_property -dict [list \
|
||||
CONFIG.USER_INTERFACE {AXIS} \
|
||||
CONFIG.GT_DRP_CLK {125} \
|
||||
CONFIG.GT_LOCATION {0} \
|
||||
CONFIG.TX_FLOW_CONTROL {0} \
|
||||
CONFIG.RX_FLOW_CONTROL {0} \
|
||||
CONFIG.TX_FLOW_CONTROL {1} \
|
||||
CONFIG.RX_FLOW_CONTROL {1} \
|
||||
CONFIG.RX_FORWARD_CONTROL_FRAMES {0} \
|
||||
CONFIG.RX_CHECK_ACK {1} \
|
||||
CONFIG.INCLUDE_RS_FEC {1} \
|
||||
CONFIG.ENABLE_TIME_STAMPING {1}
|
||||
] [get_ips cmac_usplus]
|
||||
|
@ -71,6 +71,8 @@ module fpga #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter TX_FIFO_DEPTH = 32768,
|
||||
parameter RX_FIFO_DEPTH = 131072,
|
||||
parameter MAX_TX_SIZE = 9214,
|
||||
@ -720,7 +722,20 @@ wire qsfp0_drp_we;
|
||||
wire [15:0] qsfp0_drp_do;
|
||||
wire qsfp0_drp_rdy;
|
||||
|
||||
wire qsfp0_rx_status;
|
||||
wire qsfp0_tx_enable;
|
||||
wire qsfp0_tx_lfc_en;
|
||||
wire qsfp0_tx_lfc_req;
|
||||
wire [7:0] qsfp0_tx_pfc_en;
|
||||
wire [7:0] qsfp0_tx_pfc_req;
|
||||
|
||||
wire qsfp0_rx_enable;
|
||||
wire qsfp0_rx_status;
|
||||
wire qsfp0_rx_lfc_en;
|
||||
wire qsfp0_rx_lfc_req;
|
||||
wire qsfp0_rx_lfc_ack;
|
||||
wire [7:0] qsfp0_rx_pfc_en;
|
||||
wire [7:0] qsfp0_rx_pfc_req;
|
||||
wire [7:0] qsfp0_rx_pfc_ack;
|
||||
|
||||
wire qsfp0_gtpowergood;
|
||||
|
||||
@ -813,6 +828,12 @@ qsfp0_cmac_inst (
|
||||
.tx_ptp_ts_tag(qsfp0_tx_ptp_ts_tag_int),
|
||||
.tx_ptp_ts_valid(qsfp0_tx_ptp_ts_valid_int),
|
||||
|
||||
.tx_enable(qsfp0_tx_enable),
|
||||
.tx_lfc_en(qsfp0_tx_lfc_en),
|
||||
.tx_lfc_req(qsfp0_tx_lfc_req),
|
||||
.tx_pfc_en(qsfp0_tx_pfc_en),
|
||||
.tx_pfc_req(qsfp0_tx_pfc_req),
|
||||
|
||||
.rx_clk(qsfp0_rx_clk_int),
|
||||
.rx_rst(qsfp0_rx_rst_int),
|
||||
|
||||
@ -826,7 +847,14 @@ qsfp0_cmac_inst (
|
||||
.rx_ptp_rst(qsfp0_rx_ptp_rst_int),
|
||||
.rx_ptp_time(qsfp0_rx_ptp_time_int),
|
||||
|
||||
.rx_status(qsfp0_rx_status)
|
||||
.rx_enable(qsfp0_rx_enable),
|
||||
.rx_status(qsfp0_rx_status),
|
||||
.rx_lfc_en(qsfp0_rx_lfc_en),
|
||||
.rx_lfc_req(qsfp0_rx_lfc_req),
|
||||
.rx_lfc_ack(qsfp0_rx_lfc_ack),
|
||||
.rx_pfc_en(qsfp0_rx_pfc_en),
|
||||
.rx_pfc_req(qsfp0_rx_pfc_req),
|
||||
.rx_pfc_ack(qsfp0_rx_pfc_ack)
|
||||
);
|
||||
|
||||
// QSFP1 CMAC
|
||||
@ -867,7 +895,20 @@ wire qsfp1_drp_we;
|
||||
wire [15:0] qsfp1_drp_do;
|
||||
wire qsfp1_drp_rdy;
|
||||
|
||||
wire qsfp1_rx_status;
|
||||
wire qsfp1_tx_enable;
|
||||
wire qsfp1_tx_lfc_en;
|
||||
wire qsfp1_tx_lfc_req;
|
||||
wire [7:0] qsfp1_tx_pfc_en;
|
||||
wire [7:0] qsfp1_tx_pfc_req;
|
||||
|
||||
wire qsfp1_rx_enable;
|
||||
wire qsfp1_rx_status;
|
||||
wire qsfp1_rx_lfc_en;
|
||||
wire qsfp1_rx_lfc_req;
|
||||
wire qsfp1_rx_lfc_ack;
|
||||
wire [7:0] qsfp1_rx_pfc_en;
|
||||
wire [7:0] qsfp1_rx_pfc_req;
|
||||
wire [7:0] qsfp1_rx_pfc_ack;
|
||||
|
||||
wire qsfp1_gtpowergood;
|
||||
|
||||
@ -960,6 +1001,12 @@ qsfp1_cmac_inst (
|
||||
.tx_ptp_ts_tag(qsfp1_tx_ptp_ts_tag_int),
|
||||
.tx_ptp_ts_valid(qsfp1_tx_ptp_ts_valid_int),
|
||||
|
||||
.tx_enable(qsfp1_tx_enable),
|
||||
.tx_lfc_en(qsfp1_tx_lfc_en),
|
||||
.tx_lfc_req(qsfp1_tx_lfc_req),
|
||||
.tx_pfc_en(qsfp1_tx_pfc_en),
|
||||
.tx_pfc_req(qsfp1_tx_pfc_req),
|
||||
|
||||
.rx_clk(qsfp1_rx_clk_int),
|
||||
.rx_rst(qsfp1_rx_rst_int),
|
||||
|
||||
@ -973,7 +1020,14 @@ qsfp1_cmac_inst (
|
||||
.rx_ptp_rst(qsfp1_rx_ptp_rst_int),
|
||||
.rx_ptp_time(qsfp1_rx_ptp_time_int),
|
||||
|
||||
.rx_status(qsfp1_rx_status)
|
||||
.rx_enable(qsfp1_rx_enable),
|
||||
.rx_status(qsfp1_rx_status),
|
||||
.rx_lfc_en(qsfp1_rx_lfc_en),
|
||||
.rx_lfc_req(qsfp1_rx_lfc_req),
|
||||
.rx_lfc_ack(qsfp1_rx_lfc_ack),
|
||||
.rx_pfc_en(qsfp1_rx_pfc_en),
|
||||
.rx_pfc_req(qsfp1_rx_pfc_req),
|
||||
.rx_pfc_ack(qsfp1_rx_pfc_ack)
|
||||
);
|
||||
|
||||
wire ptp_clk;
|
||||
@ -1241,6 +1295,8 @@ fpga_core #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.TX_FIFO_DEPTH(TX_FIFO_DEPTH),
|
||||
.RX_FIFO_DEPTH(RX_FIFO_DEPTH),
|
||||
.MAX_TX_SIZE(MAX_TX_SIZE),
|
||||
@ -1458,6 +1514,12 @@ core_inst (
|
||||
.qsfp0_tx_ptp_ts_tag(qsfp0_tx_ptp_ts_tag_int),
|
||||
.qsfp0_tx_ptp_ts_valid(qsfp0_tx_ptp_ts_valid_int),
|
||||
|
||||
.qsfp0_tx_enable(qsfp0_tx_enable),
|
||||
.qsfp0_tx_lfc_en(qsfp0_tx_lfc_en),
|
||||
.qsfp0_tx_lfc_req(qsfp0_tx_lfc_req),
|
||||
.qsfp0_tx_pfc_en(qsfp0_tx_pfc_en),
|
||||
.qsfp0_tx_pfc_req(qsfp0_tx_pfc_req),
|
||||
|
||||
.qsfp0_rx_clk(qsfp0_rx_clk_int),
|
||||
.qsfp0_rx_rst(qsfp0_rx_rst_int),
|
||||
.qsfp0_rx_axis_tdata(qsfp0_rx_axis_tdata_int),
|
||||
@ -1469,7 +1531,14 @@ core_inst (
|
||||
.qsfp0_rx_ptp_rst(qsfp0_rx_ptp_rst_int),
|
||||
.qsfp0_rx_ptp_time(qsfp0_rx_ptp_time_int),
|
||||
|
||||
.qsfp0_rx_enable(qsfp0_rx_enable),
|
||||
.qsfp0_rx_status(qsfp0_rx_status),
|
||||
.qsfp0_rx_lfc_en(qsfp0_rx_lfc_en),
|
||||
.qsfp0_rx_lfc_req(qsfp0_rx_lfc_req),
|
||||
.qsfp0_rx_lfc_ack(qsfp0_rx_lfc_ack),
|
||||
.qsfp0_rx_pfc_en(qsfp0_rx_pfc_en),
|
||||
.qsfp0_rx_pfc_req(qsfp0_rx_pfc_req),
|
||||
.qsfp0_rx_pfc_ack(qsfp0_rx_pfc_ack),
|
||||
|
||||
.qsfp0_drp_clk(qsfp0_drp_clk),
|
||||
.qsfp0_drp_rst(qsfp0_drp_rst),
|
||||
@ -1498,6 +1567,12 @@ core_inst (
|
||||
.qsfp1_tx_ptp_ts_tag(qsfp1_tx_ptp_ts_tag_int),
|
||||
.qsfp1_tx_ptp_ts_valid(qsfp1_tx_ptp_ts_valid_int),
|
||||
|
||||
.qsfp1_tx_enable(qsfp1_tx_enable),
|
||||
.qsfp1_tx_lfc_en(qsfp1_tx_lfc_en),
|
||||
.qsfp1_tx_lfc_req(qsfp1_tx_lfc_req),
|
||||
.qsfp1_tx_pfc_en(qsfp1_tx_pfc_en),
|
||||
.qsfp1_tx_pfc_req(qsfp1_tx_pfc_req),
|
||||
|
||||
.qsfp1_rx_clk(qsfp1_rx_clk_int),
|
||||
.qsfp1_rx_rst(qsfp1_rx_rst_int),
|
||||
.qsfp1_rx_axis_tdata(qsfp1_rx_axis_tdata_int),
|
||||
@ -1509,7 +1584,14 @@ core_inst (
|
||||
.qsfp1_rx_ptp_rst(qsfp1_rx_ptp_rst_int),
|
||||
.qsfp1_rx_ptp_time(qsfp1_rx_ptp_time_int),
|
||||
|
||||
.qsfp1_rx_enable(qsfp1_rx_enable),
|
||||
.qsfp1_rx_status(qsfp1_rx_status),
|
||||
.qsfp1_rx_lfc_en(qsfp1_rx_lfc_en),
|
||||
.qsfp1_rx_lfc_req(qsfp1_rx_lfc_req),
|
||||
.qsfp1_rx_lfc_ack(qsfp1_rx_lfc_ack),
|
||||
.qsfp1_rx_pfc_en(qsfp1_rx_pfc_en),
|
||||
.qsfp1_rx_pfc_req(qsfp1_rx_pfc_req),
|
||||
.qsfp1_rx_pfc_ack(qsfp1_rx_pfc_ack),
|
||||
|
||||
.qsfp1_drp_clk(qsfp1_drp_clk),
|
||||
.qsfp1_drp_rst(qsfp1_drp_rst),
|
||||
|
@ -77,6 +77,8 @@ module fpga_core #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter TX_FIFO_DEPTH = 32768,
|
||||
parameter RX_FIFO_DEPTH = 131072,
|
||||
parameter MAX_TX_SIZE = 9214,
|
||||
@ -296,6 +298,12 @@ module fpga_core #
|
||||
input wire [15:0] qsfp0_tx_ptp_ts_tag,
|
||||
input wire qsfp0_tx_ptp_ts_valid,
|
||||
|
||||
output wire qsfp0_tx_enable,
|
||||
output wire qsfp0_tx_lfc_en,
|
||||
output wire qsfp0_tx_lfc_req,
|
||||
output wire [7:0] qsfp0_tx_pfc_en,
|
||||
output wire [7:0] qsfp0_tx_pfc_req,
|
||||
|
||||
input wire qsfp0_rx_clk,
|
||||
input wire qsfp0_rx_rst,
|
||||
|
||||
@ -309,7 +317,14 @@ module fpga_core #
|
||||
input wire qsfp0_rx_ptp_rst,
|
||||
output wire [79:0] qsfp0_rx_ptp_time,
|
||||
|
||||
output wire qsfp0_rx_enable,
|
||||
input wire qsfp0_rx_status,
|
||||
output wire qsfp0_rx_lfc_en,
|
||||
input wire qsfp0_rx_lfc_req,
|
||||
output wire qsfp0_rx_lfc_ack,
|
||||
output wire [7:0] qsfp0_rx_pfc_en,
|
||||
input wire [7:0] qsfp0_rx_pfc_req,
|
||||
output wire [7:0] qsfp0_rx_pfc_ack,
|
||||
|
||||
input wire qsfp0_drp_clk,
|
||||
input wire qsfp0_drp_rst,
|
||||
@ -340,6 +355,12 @@ module fpga_core #
|
||||
input wire [15:0] qsfp1_tx_ptp_ts_tag,
|
||||
input wire qsfp1_tx_ptp_ts_valid,
|
||||
|
||||
output wire qsfp1_tx_enable,
|
||||
output wire qsfp1_tx_lfc_en,
|
||||
output wire qsfp1_tx_lfc_req,
|
||||
output wire [7:0] qsfp1_tx_pfc_en,
|
||||
output wire [7:0] qsfp1_tx_pfc_req,
|
||||
|
||||
input wire qsfp1_rx_clk,
|
||||
input wire qsfp1_rx_rst,
|
||||
|
||||
@ -353,7 +374,14 @@ module fpga_core #
|
||||
input wire qsfp1_rx_ptp_rst,
|
||||
output wire [79:0] qsfp1_rx_ptp_time,
|
||||
|
||||
output wire qsfp1_rx_enable,
|
||||
input wire qsfp1_rx_status,
|
||||
output wire qsfp1_rx_lfc_en,
|
||||
input wire qsfp1_rx_lfc_req,
|
||||
output wire qsfp1_rx_lfc_ack,
|
||||
output wire [7:0] qsfp1_rx_pfc_en,
|
||||
input wire [7:0] qsfp1_rx_pfc_req,
|
||||
output wire [7:0] qsfp1_rx_pfc_ack,
|
||||
|
||||
input wire qsfp1_drp_clk,
|
||||
input wire qsfp1_drp_rst,
|
||||
@ -760,7 +788,12 @@ wire [PORT_COUNT*TX_TAG_WIDTH-1:0] axis_eth_tx_ptp_ts_tag;
|
||||
wire [PORT_COUNT-1:0] axis_eth_tx_ptp_ts_valid;
|
||||
wire [PORT_COUNT-1:0] axis_eth_tx_ptp_ts_ready;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_tx_enable;
|
||||
wire [PORT_COUNT-1:0] eth_tx_status;
|
||||
wire [PORT_COUNT-1:0] eth_tx_lfc_en;
|
||||
wire [PORT_COUNT-1:0] eth_tx_lfc_req;
|
||||
wire [PORT_COUNT*8-1:0] eth_tx_pfc_en;
|
||||
wire [PORT_COUNT*8-1:0] eth_tx_pfc_req;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_rx_clk;
|
||||
wire [PORT_COUNT-1:0] eth_rx_rst;
|
||||
@ -777,7 +810,14 @@ wire [PORT_COUNT-1:0] axis_eth_rx_tready;
|
||||
wire [PORT_COUNT-1:0] axis_eth_rx_tlast;
|
||||
wire [PORT_COUNT*AXIS_ETH_RX_USER_WIDTH-1:0] axis_eth_rx_tuser;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_rx_enable;
|
||||
wire [PORT_COUNT-1:0] eth_rx_status;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_en;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_req;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_ack;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_en;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_req;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_ack;
|
||||
|
||||
wire [PTP_TS_WIDTH-1:0] qsfp0_tx_ptp_time_int;
|
||||
wire [PTP_TS_WIDTH-1:0] qsfp1_tx_ptp_time_int;
|
||||
@ -828,7 +868,12 @@ mqnic_port_map_mac_axis_inst (
|
||||
.s_axis_mac_tx_ptp_ts_valid({qsfp1_tx_ptp_ts_valid, qsfp0_tx_ptp_ts_valid}),
|
||||
.s_axis_mac_tx_ptp_ts_ready(),
|
||||
|
||||
.mac_tx_enable({qsfp1_tx_enable, qsfp0_tx_enable}),
|
||||
.mac_tx_status(2'b11),
|
||||
.mac_tx_lfc_en({qsfp1_tx_lfc_en, qsfp0_tx_lfc_en}),
|
||||
.mac_tx_lfc_req({qsfp1_tx_lfc_req, qsfp0_tx_lfc_req}),
|
||||
.mac_tx_pfc_en({qsfp1_tx_pfc_en, qsfp0_tx_pfc_en}),
|
||||
.mac_tx_pfc_req({qsfp1_tx_pfc_req, qsfp0_tx_pfc_req}),
|
||||
|
||||
.mac_rx_clk({qsfp1_rx_clk, qsfp0_rx_clk}),
|
||||
.mac_rx_rst({qsfp1_rx_rst, qsfp0_rx_rst}),
|
||||
@ -845,7 +890,14 @@ mqnic_port_map_mac_axis_inst (
|
||||
.s_axis_mac_rx_tlast({qsfp1_rx_axis_tlast, qsfp0_rx_axis_tlast}),
|
||||
.s_axis_mac_rx_tuser({{qsfp1_rx_axis_tuser[80:1], 16'd0, qsfp1_rx_axis_tuser[0]}, {qsfp0_rx_axis_tuser[80:1], 16'd0, qsfp0_rx_axis_tuser[0]}}),
|
||||
|
||||
.mac_rx_enable({qsfp1_rx_enable, qsfp0_rx_enable}),
|
||||
.mac_rx_status({qsfp1_rx_status, qsfp0_rx_status}),
|
||||
.mac_rx_lfc_en({qsfp1_rx_lfc_en, qsfp0_rx_lfc_en}),
|
||||
.mac_rx_lfc_req({qsfp1_rx_lfc_req, qsfp0_rx_lfc_req}),
|
||||
.mac_rx_lfc_ack({qsfp1_rx_lfc_ack, qsfp0_rx_lfc_ack}),
|
||||
.mac_rx_pfc_en({qsfp1_rx_pfc_en, qsfp0_rx_pfc_en}),
|
||||
.mac_rx_pfc_req({qsfp1_rx_pfc_req, qsfp0_rx_pfc_req}),
|
||||
.mac_rx_pfc_ack({qsfp1_rx_pfc_ack, qsfp0_rx_pfc_ack}),
|
||||
|
||||
// towards datapath
|
||||
.tx_clk(eth_tx_clk),
|
||||
@ -868,7 +920,12 @@ mqnic_port_map_mac_axis_inst (
|
||||
.m_axis_tx_ptp_ts_valid(axis_eth_tx_ptp_ts_valid),
|
||||
.m_axis_tx_ptp_ts_ready(axis_eth_tx_ptp_ts_ready),
|
||||
|
||||
.tx_enable(eth_tx_enable),
|
||||
.tx_status(eth_tx_status),
|
||||
.tx_lfc_en(eth_tx_lfc_en),
|
||||
.tx_lfc_req(eth_tx_lfc_req),
|
||||
.tx_pfc_en(eth_tx_pfc_en),
|
||||
.tx_pfc_req(eth_tx_pfc_req),
|
||||
|
||||
.rx_clk(eth_rx_clk),
|
||||
.rx_rst(eth_rx_rst),
|
||||
@ -885,7 +942,14 @@ mqnic_port_map_mac_axis_inst (
|
||||
.m_axis_rx_tlast(axis_eth_rx_tlast),
|
||||
.m_axis_rx_tuser(axis_eth_rx_tuser),
|
||||
|
||||
.rx_status(eth_rx_status)
|
||||
.rx_enable(eth_rx_enable),
|
||||
.rx_status(eth_rx_status),
|
||||
.rx_lfc_en(eth_rx_lfc_en),
|
||||
.rx_lfc_req(eth_rx_lfc_req),
|
||||
.rx_lfc_ack(eth_rx_lfc_ack),
|
||||
.rx_pfc_en(eth_rx_pfc_en),
|
||||
.rx_pfc_req(eth_rx_pfc_req),
|
||||
.rx_pfc_ack(eth_rx_pfc_ack)
|
||||
);
|
||||
|
||||
mqnic_core_pcie_us #(
|
||||
@ -955,6 +1019,9 @@ mqnic_core_pcie_us #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.MAC_CTRL_ENABLE(0),
|
||||
.TX_FIFO_DEPTH(TX_FIFO_DEPTH),
|
||||
.RX_FIFO_DEPTH(RX_FIFO_DEPTH),
|
||||
.MAX_TX_SIZE(MAX_TX_SIZE),
|
||||
@ -1236,7 +1303,13 @@ core_inst (
|
||||
.s_axis_eth_tx_cpl_valid(axis_eth_tx_ptp_ts_valid),
|
||||
.s_axis_eth_tx_cpl_ready(axis_eth_tx_ptp_ts_ready),
|
||||
|
||||
.eth_tx_enable(eth_tx_enable),
|
||||
.eth_tx_status(eth_tx_status),
|
||||
.eth_tx_lfc_en(eth_tx_lfc_en),
|
||||
.eth_tx_lfc_req(eth_tx_lfc_req),
|
||||
.eth_tx_pfc_en(eth_tx_pfc_en),
|
||||
.eth_tx_pfc_req(eth_tx_pfc_req),
|
||||
.eth_tx_fc_quanta_clk_en(0),
|
||||
|
||||
.eth_rx_clk(eth_rx_clk),
|
||||
.eth_rx_rst(eth_rx_rst),
|
||||
@ -1253,7 +1326,15 @@ core_inst (
|
||||
.s_axis_eth_rx_tlast(axis_eth_rx_tlast),
|
||||
.s_axis_eth_rx_tuser(axis_eth_rx_tuser),
|
||||
|
||||
.eth_rx_enable(eth_rx_enable),
|
||||
.eth_rx_status(eth_rx_status),
|
||||
.eth_rx_lfc_en(eth_rx_lfc_en),
|
||||
.eth_rx_lfc_req(eth_rx_lfc_req),
|
||||
.eth_rx_lfc_ack(eth_rx_lfc_ack),
|
||||
.eth_rx_pfc_en(eth_rx_pfc_en),
|
||||
.eth_rx_pfc_req(eth_rx_pfc_req),
|
||||
.eth_rx_pfc_ack(eth_rx_pfc_ack),
|
||||
.eth_rx_fc_quanta_clk_en(0),
|
||||
|
||||
/*
|
||||
* DDR
|
||||
|
@ -161,6 +161,8 @@ export PARAM_TX_CPL_FIFO_DEPTH := 32
|
||||
export PARAM_TX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_RX_HASH_ENABLE := 1
|
||||
export PARAM_RX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_LFC_ENABLE := 1
|
||||
export PARAM_PFC_ENABLE := $(PARAM_LFC_ENABLE)
|
||||
export PARAM_TX_FIFO_DEPTH := 32768
|
||||
export PARAM_RX_FIFO_DEPTH := 131072
|
||||
export PARAM_MAX_TX_SIZE := 9214
|
||||
|
@ -300,6 +300,8 @@ class TB(object):
|
||||
self.qsfp_mac.append(mac)
|
||||
|
||||
getattr(dut, f"qsfp{k}_rx_status").setimmediatevalue(1)
|
||||
getattr(dut, f"qsfp{k}_rx_lfc_req").setimmediatevalue(0)
|
||||
getattr(dut, f"qsfp{k}_rx_pfc_req").setimmediatevalue(0)
|
||||
|
||||
cocotb.start_soon(Clock(getattr(dut, f"qsfp{k}_drp_clk"), 8, units="ns").start())
|
||||
getattr(dut, f"qsfp{k}_drp_rst").setimmediatevalue(0)
|
||||
@ -723,6 +725,8 @@ def test_fpga_core(request):
|
||||
parameters['TX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['RX_HASH_ENABLE'] = 1
|
||||
parameters['RX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['LFC_ENABLE'] = 1
|
||||
parameters['PFC_ENABLE'] = parameters['LFC_ENABLE']
|
||||
parameters['TX_FIFO_DEPTH'] = 32768
|
||||
parameters['RX_FIFO_DEPTH'] = 131072
|
||||
parameters['MAX_TX_SIZE'] = 9214
|
||||
|
@ -61,6 +61,10 @@ SYN_FILES += rtl/common/tdma_ber_ch.v
|
||||
SYN_FILES += lib/eth/rtl/eth_mac_10g.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_rx_64.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_tx_64.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx_if.v
|
||||
|
@ -113,6 +113,8 @@ dict set params TX_CPL_FIFO_DEPTH "32"
|
||||
dict set params TX_CHECKSUM_ENABLE "1"
|
||||
dict set params RX_HASH_ENABLE "1"
|
||||
dict set params RX_CHECKSUM_ENABLE "1"
|
||||
dict set params PFC_ENABLE "1"
|
||||
dict set params LFC_ENABLE [dict get $params PFC_ENABLE]
|
||||
dict set params ENABLE_PADDING "1"
|
||||
dict set params ENABLE_DIC "1"
|
||||
dict set params MIN_FRAME_LENGTH "64"
|
||||
|
@ -61,6 +61,10 @@ SYN_FILES += rtl/common/tdma_ber_ch.v
|
||||
SYN_FILES += lib/eth/rtl/eth_mac_10g.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_rx_64.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_tx_64.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx_if.v
|
||||
|
@ -113,6 +113,8 @@ dict set params TX_CPL_FIFO_DEPTH "32"
|
||||
dict set params TX_CHECKSUM_ENABLE "1"
|
||||
dict set params RX_HASH_ENABLE "1"
|
||||
dict set params RX_CHECKSUM_ENABLE "1"
|
||||
dict set params PFC_ENABLE "1"
|
||||
dict set params LFC_ENABLE [dict get $params PFC_ENABLE]
|
||||
dict set params ENABLE_PADDING "1"
|
||||
dict set params ENABLE_DIC "1"
|
||||
dict set params MIN_FRAME_LENGTH "64"
|
||||
|
@ -74,6 +74,8 @@ module fpga #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter ENABLE_PADDING = 1,
|
||||
parameter ENABLE_DIC = 1,
|
||||
parameter MIN_FRAME_LENGTH = 64,
|
||||
@ -1376,6 +1378,8 @@ fpga_core #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.ENABLE_PADDING(ENABLE_PADDING),
|
||||
.ENABLE_DIC(ENABLE_DIC),
|
||||
.MIN_FRAME_LENGTH(MIN_FRAME_LENGTH),
|
||||
|
@ -81,6 +81,8 @@ module fpga_core #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter ENABLE_PADDING = 1,
|
||||
parameter ENABLE_DIC = 1,
|
||||
parameter MIN_FRAME_LENGTH = 64,
|
||||
@ -902,7 +904,12 @@ wire [PORT_COUNT*TX_TAG_WIDTH-1:0] axis_eth_tx_ptp_ts_tag;
|
||||
wire [PORT_COUNT-1:0] axis_eth_tx_ptp_ts_valid;
|
||||
wire [PORT_COUNT-1:0] axis_eth_tx_ptp_ts_ready;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_tx_enable;
|
||||
wire [PORT_COUNT-1:0] eth_tx_status;
|
||||
wire [PORT_COUNT-1:0] eth_tx_lfc_en;
|
||||
wire [PORT_COUNT-1:0] eth_tx_lfc_req;
|
||||
wire [PORT_COUNT*8-1:0] eth_tx_pfc_en;
|
||||
wire [PORT_COUNT*8-1:0] eth_tx_pfc_req;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_rx_clk;
|
||||
wire [PORT_COUNT-1:0] eth_rx_rst;
|
||||
@ -917,7 +924,14 @@ wire [PORT_COUNT-1:0] axis_eth_rx_tready;
|
||||
wire [PORT_COUNT-1:0] axis_eth_rx_tlast;
|
||||
wire [PORT_COUNT*AXIS_ETH_RX_USER_WIDTH-1:0] axis_eth_rx_tuser;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_rx_enable;
|
||||
wire [PORT_COUNT-1:0] eth_rx_status;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_en;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_req;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_ack;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_en;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_req;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_ack;
|
||||
|
||||
wire [PORT_COUNT-1:0] port_xgmii_tx_clk;
|
||||
wire [PORT_COUNT-1:0] port_xgmii_tx_rst;
|
||||
@ -990,12 +1004,15 @@ generate
|
||||
.PTP_PERIOD_FNS(IF_PTP_PERIOD_FNS),
|
||||
.TX_PTP_TS_ENABLE(PTP_TS_ENABLE),
|
||||
.TX_PTP_TS_WIDTH(PTP_TS_WIDTH),
|
||||
.TX_PTP_TS_CTRL_IN_TUSER(0),
|
||||
.TX_PTP_TAG_ENABLE(PTP_TS_ENABLE),
|
||||
.TX_PTP_TAG_WIDTH(TX_TAG_WIDTH),
|
||||
.RX_PTP_TS_ENABLE(PTP_TS_ENABLE),
|
||||
.RX_PTP_TS_WIDTH(PTP_TS_WIDTH),
|
||||
.TX_USER_WIDTH(AXIS_ETH_TX_USER_WIDTH),
|
||||
.RX_USER_WIDTH(AXIS_ETH_RX_USER_WIDTH)
|
||||
.RX_USER_WIDTH(AXIS_ETH_RX_USER_WIDTH),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.PAUSE_ENABLE(LFC_ENABLE)
|
||||
)
|
||||
eth_mac_inst (
|
||||
.tx_clk(port_xgmii_tx_clk[n]),
|
||||
@ -1003,6 +1020,9 @@ generate
|
||||
.rx_clk(port_xgmii_rx_clk[n]),
|
||||
.rx_rst(port_xgmii_rx_rst[n]),
|
||||
|
||||
/*
|
||||
* AXI input
|
||||
*/
|
||||
.tx_axis_tdata(axis_eth_tx_tdata[n*AXIS_ETH_DATA_WIDTH +: AXIS_ETH_DATA_WIDTH]),
|
||||
.tx_axis_tkeep(axis_eth_tx_tkeep[n*AXIS_ETH_KEEP_WIDTH +: AXIS_ETH_KEEP_WIDTH]),
|
||||
.tx_axis_tvalid(axis_eth_tx_tvalid[n +: 1]),
|
||||
@ -1010,30 +1030,121 @@ generate
|
||||
.tx_axis_tlast(axis_eth_tx_tlast[n +: 1]),
|
||||
.tx_axis_tuser(axis_eth_tx_tuser[n*AXIS_ETH_TX_USER_WIDTH +: AXIS_ETH_TX_USER_WIDTH]),
|
||||
|
||||
/*
|
||||
* AXI output
|
||||
*/
|
||||
.rx_axis_tdata(axis_eth_rx_tdata[n*AXIS_ETH_DATA_WIDTH +: AXIS_ETH_DATA_WIDTH]),
|
||||
.rx_axis_tkeep(axis_eth_rx_tkeep[n*AXIS_ETH_KEEP_WIDTH +: AXIS_ETH_KEEP_WIDTH]),
|
||||
.rx_axis_tvalid(axis_eth_rx_tvalid[n +: 1]),
|
||||
.rx_axis_tlast(axis_eth_rx_tlast[n +: 1]),
|
||||
.rx_axis_tuser(axis_eth_rx_tuser[n*AXIS_ETH_RX_USER_WIDTH +: AXIS_ETH_RX_USER_WIDTH]),
|
||||
|
||||
/*
|
||||
* XGMII interface
|
||||
*/
|
||||
.xgmii_rxd(port_xgmii_rxd[n*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH]),
|
||||
.xgmii_rxc(port_xgmii_rxc[n*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH]),
|
||||
.xgmii_txd(port_xgmii_txd[n*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH]),
|
||||
.xgmii_txc(port_xgmii_txc[n*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH]),
|
||||
|
||||
/*
|
||||
* PTP
|
||||
*/
|
||||
.tx_ptp_ts(eth_tx_ptp_ts_96[n*PTP_TS_WIDTH +: PTP_TS_WIDTH]),
|
||||
.rx_ptp_ts(eth_rx_ptp_ts_96[n*PTP_TS_WIDTH +: PTP_TS_WIDTH]),
|
||||
.tx_axis_ptp_ts(axis_eth_tx_ptp_ts[n*PTP_TS_WIDTH +: PTP_TS_WIDTH]),
|
||||
.tx_axis_ptp_ts_tag(axis_eth_tx_ptp_ts_tag[n*TX_TAG_WIDTH +: TX_TAG_WIDTH]),
|
||||
.tx_axis_ptp_ts_valid(axis_eth_tx_ptp_ts_valid[n +: 1]),
|
||||
|
||||
/*
|
||||
* Link-level Flow Control (LFC) (IEEE 802.3 annex 31B PAUSE)
|
||||
*/
|
||||
.tx_lfc_req(eth_tx_lfc_req[n +: 1]),
|
||||
.tx_lfc_resend(1'b0),
|
||||
.rx_lfc_en(eth_rx_lfc_en[n +: 1]),
|
||||
.rx_lfc_req(eth_rx_lfc_req[n +: 1]),
|
||||
.rx_lfc_ack(eth_rx_lfc_ack[n +: 1]),
|
||||
|
||||
/*
|
||||
* Priority Flow Control (PFC) (IEEE 802.3 annex 31D PFC)
|
||||
*/
|
||||
.tx_pfc_req(eth_tx_pfc_req[n*8 +: 8]),
|
||||
.tx_pfc_resend(1'b0),
|
||||
.rx_pfc_en(eth_rx_pfc_en[n*8 +: 8]),
|
||||
.rx_pfc_req(eth_rx_pfc_req[n*8 +: 8]),
|
||||
.rx_pfc_ack(eth_rx_pfc_ack[n*8 +: 8]),
|
||||
|
||||
/*
|
||||
* Pause interface
|
||||
*/
|
||||
.tx_lfc_pause_en(1'b1),
|
||||
.tx_pause_req(1'b0),
|
||||
.tx_pause_ack(),
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
.tx_start_packet(),
|
||||
.tx_error_underflow(),
|
||||
.rx_start_packet(),
|
||||
.rx_error_bad_frame(),
|
||||
.rx_error_bad_fcs(),
|
||||
.stat_tx_mcf(),
|
||||
.stat_rx_mcf(),
|
||||
.stat_tx_lfc_pkt(),
|
||||
.stat_tx_lfc_xon(),
|
||||
.stat_tx_lfc_xoff(),
|
||||
.stat_tx_lfc_paused(),
|
||||
.stat_tx_pfc_pkt(),
|
||||
.stat_tx_pfc_xon(),
|
||||
.stat_tx_pfc_xoff(),
|
||||
.stat_tx_pfc_paused(),
|
||||
.stat_rx_lfc_pkt(),
|
||||
.stat_rx_lfc_xon(),
|
||||
.stat_rx_lfc_xoff(),
|
||||
.stat_rx_lfc_paused(),
|
||||
.stat_rx_pfc_pkt(),
|
||||
.stat_rx_pfc_xon(),
|
||||
.stat_rx_pfc_xoff(),
|
||||
.stat_rx_pfc_paused(),
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
.cfg_ifg(8'd12),
|
||||
.cfg_tx_enable(1'b1),
|
||||
.cfg_rx_enable(1'b1)
|
||||
.cfg_tx_enable(eth_tx_enable[n +: 1]),
|
||||
.cfg_rx_enable(eth_rx_enable[n +: 1]),
|
||||
.cfg_mcf_rx_eth_dst_mcast(48'h01_80_C2_00_00_01),
|
||||
.cfg_mcf_rx_check_eth_dst_mcast(1'b1),
|
||||
.cfg_mcf_rx_eth_dst_ucast(48'd0),
|
||||
.cfg_mcf_rx_check_eth_dst_ucast(1'b0),
|
||||
.cfg_mcf_rx_eth_src(48'd0),
|
||||
.cfg_mcf_rx_check_eth_src(1'b0),
|
||||
.cfg_mcf_rx_eth_type(16'h8808),
|
||||
.cfg_mcf_rx_opcode_lfc(16'h0001),
|
||||
.cfg_mcf_rx_check_opcode_lfc(eth_rx_lfc_en[n +: 1]),
|
||||
.cfg_mcf_rx_opcode_pfc(16'h0101),
|
||||
.cfg_mcf_rx_check_opcode_pfc(eth_rx_pfc_en[n*8 +: 8] != 0),
|
||||
.cfg_mcf_rx_forward(1'b0),
|
||||
.cfg_mcf_rx_enable(eth_rx_lfc_en[n +: 1] || eth_rx_pfc_en[n*8 +: 8]),
|
||||
.cfg_tx_lfc_eth_dst(48'h01_80_C2_00_00_01),
|
||||
.cfg_tx_lfc_eth_src(48'h80_23_31_43_54_4C),
|
||||
.cfg_tx_lfc_eth_type(16'h8808),
|
||||
.cfg_tx_lfc_opcode(16'h0001),
|
||||
.cfg_tx_lfc_en(eth_tx_lfc_en[n +: 1]),
|
||||
.cfg_tx_lfc_quanta(16'hffff),
|
||||
.cfg_tx_lfc_refresh(16'h7fff),
|
||||
.cfg_tx_pfc_eth_dst(48'h01_80_C2_00_00_01),
|
||||
.cfg_tx_pfc_eth_src(48'h80_23_31_43_54_4C),
|
||||
.cfg_tx_pfc_eth_type(16'h8808),
|
||||
.cfg_tx_pfc_opcode(16'h0101),
|
||||
.cfg_tx_pfc_en(eth_tx_pfc_en[n*8 +: 8] != 0),
|
||||
.cfg_tx_pfc_quanta({8{16'hffff}}),
|
||||
.cfg_tx_pfc_refresh({8{16'h7fff}}),
|
||||
.cfg_rx_lfc_opcode(16'h0001),
|
||||
.cfg_rx_lfc_en(eth_rx_lfc_en[n +: 1]),
|
||||
.cfg_rx_pfc_opcode(16'h0101),
|
||||
.cfg_rx_pfc_en(eth_rx_pfc_en[n*8 +: 8] != 0)
|
||||
);
|
||||
|
||||
end
|
||||
@ -1107,6 +1218,9 @@ mqnic_core_pcie_us #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.MAC_CTRL_ENABLE(0),
|
||||
.TX_FIFO_DEPTH(TX_FIFO_DEPTH),
|
||||
.RX_FIFO_DEPTH(RX_FIFO_DEPTH),
|
||||
.MAX_TX_SIZE(MAX_TX_SIZE),
|
||||
@ -1388,7 +1502,13 @@ core_inst (
|
||||
.s_axis_eth_tx_cpl_valid(axis_eth_tx_ptp_ts_valid),
|
||||
.s_axis_eth_tx_cpl_ready(axis_eth_tx_ptp_ts_ready),
|
||||
|
||||
.eth_tx_enable(eth_tx_enable),
|
||||
.eth_tx_status(eth_tx_status),
|
||||
.eth_tx_lfc_en(eth_tx_lfc_en),
|
||||
.eth_tx_lfc_req(eth_tx_lfc_req),
|
||||
.eth_tx_pfc_en(eth_tx_pfc_en),
|
||||
.eth_tx_pfc_req(eth_tx_pfc_req),
|
||||
.eth_tx_fc_quanta_clk_en(0),
|
||||
|
||||
.eth_rx_clk(eth_rx_clk),
|
||||
.eth_rx_rst(eth_rx_rst),
|
||||
@ -1405,7 +1525,15 @@ core_inst (
|
||||
.s_axis_eth_rx_tlast(axis_eth_rx_tlast),
|
||||
.s_axis_eth_rx_tuser(axis_eth_rx_tuser),
|
||||
|
||||
.eth_rx_enable(eth_rx_enable),
|
||||
.eth_rx_status(eth_rx_status),
|
||||
.eth_rx_lfc_en(eth_rx_lfc_en),
|
||||
.eth_rx_lfc_req(eth_rx_lfc_req),
|
||||
.eth_rx_lfc_ack(eth_rx_lfc_ack),
|
||||
.eth_rx_pfc_en(eth_rx_pfc_en),
|
||||
.eth_rx_pfc_req(eth_rx_pfc_req),
|
||||
.eth_rx_pfc_ack(eth_rx_pfc_ack),
|
||||
.eth_rx_fc_quanta_clk_en(0),
|
||||
|
||||
/*
|
||||
* DDR
|
||||
|
@ -62,6 +62,10 @@ VERILOG_SOURCES += ../../rtl/common/tdma_ber_ch.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/eth_mac_10g.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/axis_xgmii_rx_64.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/axis_xgmii_tx_64.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/lfsr.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock_cdc.v
|
||||
@ -167,6 +171,8 @@ export PARAM_TX_CPL_FIFO_DEPTH := 32
|
||||
export PARAM_TX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_RX_HASH_ENABLE := 1
|
||||
export PARAM_RX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_LFC_ENABLE := 1
|
||||
export PARAM_PFC_ENABLE := $(PARAM_LFC_ENABLE)
|
||||
export PARAM_TX_FIFO_DEPTH := 32768
|
||||
export PARAM_RX_FIFO_DEPTH := 32768
|
||||
export PARAM_MAX_TX_SIZE := 9214
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
import logging
|
||||
import os
|
||||
import struct
|
||||
import sys
|
||||
|
||||
import scapy.utils
|
||||
@ -17,7 +18,7 @@ from cocotb.clock import Clock
|
||||
from cocotb.triggers import RisingEdge, FallingEdge, Timer
|
||||
|
||||
from cocotbext.axi import AxiStreamBus
|
||||
from cocotbext.eth import XgmiiSource, XgmiiSink
|
||||
from cocotbext.eth import XgmiiSource, XgmiiSink, XgmiiFrame
|
||||
from cocotbext.pcie.core import RootComplex
|
||||
from cocotbext.pcie.xilinx.us import UltraScalePlusPcieDevice
|
||||
|
||||
@ -396,7 +397,7 @@ async def run_test_nic(dut):
|
||||
|
||||
# await tb.driver.interfaces[1].start_xmit(data, 0)
|
||||
|
||||
# pkt = await tb.qsfp_sink.r[1][0]ecv()
|
||||
# pkt = await tb.qsfp_sink[1][0].recv()
|
||||
# tb.log.info("Packet: %s", pkt)
|
||||
|
||||
# await tb.qsfp_source[1][0].send(pkt)
|
||||
@ -528,6 +529,35 @@ async def run_test_nic(dut):
|
||||
|
||||
tb.loopback_enable = False
|
||||
|
||||
if tb.driver.interfaces[0].if_feature_lfc:
|
||||
tb.log.info("Test LFC pause frame RX")
|
||||
|
||||
await tb.driver.interfaces[0].ports[0].set_lfc_ctrl(mqnic.MQNIC_PORT_LFC_CTRL_TX_LFC_EN | mqnic.MQNIC_PORT_LFC_CTRL_RX_LFC_EN)
|
||||
await tb.driver.hw_regs.read_dword(0)
|
||||
|
||||
lfc_xoff = Ether(src='DA:D1:D2:D3:D4:D5', dst='01:80:C2:00:00:01', type=0x8808) / struct.pack('!HH', 0x0001, 2000)
|
||||
|
||||
await tb.qsfp_source[0][0].send(XgmiiFrame.from_payload(bytes(lfc_xoff)))
|
||||
|
||||
count = 16
|
||||
|
||||
pkts = [bytearray([(x+k) % 256 for x in range(1514)]) for k in range(count)]
|
||||
|
||||
tb.loopback_enable = True
|
||||
|
||||
for p in pkts:
|
||||
await tb.driver.interfaces[0].start_xmit(p, 0)
|
||||
|
||||
for k in range(count):
|
||||
pkt = await tb.driver.interfaces[0].recv()
|
||||
|
||||
tb.log.info("Packet: %s", pkt)
|
||||
assert pkt.data == pkts[k]
|
||||
if tb.driver.interfaces[0].if_feature_rx_csum:
|
||||
assert pkt.rx_checksum == ~scapy.utils.checksum(bytes(pkt.data[14:])) & 0xffff
|
||||
|
||||
tb.loopback_enable = False
|
||||
|
||||
await RisingEdge(dut.clk_250mhz)
|
||||
await RisingEdge(dut.clk_250mhz)
|
||||
|
||||
@ -600,6 +630,10 @@ def test_fpga_core(request):
|
||||
os.path.join(eth_rtl_dir, "eth_mac_10g.v"),
|
||||
os.path.join(eth_rtl_dir, "axis_xgmii_rx_64.v"),
|
||||
os.path.join(eth_rtl_dir, "axis_xgmii_tx_64.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "lfsr.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock_cdc.v"),
|
||||
@ -706,6 +740,8 @@ def test_fpga_core(request):
|
||||
parameters['TX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['RX_HASH_ENABLE'] = 1
|
||||
parameters['RX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['LFC_ENABLE'] = 1
|
||||
parameters['PFC_ENABLE'] = parameters['LFC_ENABLE']
|
||||
parameters['TX_FIFO_DEPTH'] = 32768
|
||||
parameters['RX_FIFO_DEPTH'] = 32768
|
||||
parameters['MAX_TX_SIZE'] = 9214
|
||||
|
@ -59,6 +59,10 @@ SYN_FILES += rtl/common/tdma_ber_ch.v
|
||||
SYN_FILES += lib/eth/rtl/eth_mac_10g.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_rx_64.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_tx_64.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx_if.v
|
||||
|
@ -104,6 +104,8 @@ dict set params TX_CPL_FIFO_DEPTH "32"
|
||||
dict set params TX_CHECKSUM_ENABLE "1"
|
||||
dict set params RX_HASH_ENABLE "1"
|
||||
dict set params RX_CHECKSUM_ENABLE "1"
|
||||
dict set params PFC_ENABLE "1"
|
||||
dict set params LFC_ENABLE [dict get $params PFC_ENABLE]
|
||||
dict set params ENABLE_PADDING "1"
|
||||
dict set params ENABLE_DIC "1"
|
||||
dict set params MIN_FRAME_LENGTH "64"
|
||||
|
@ -59,6 +59,10 @@ SYN_FILES += rtl/common/tdma_ber_ch.v
|
||||
SYN_FILES += lib/eth/rtl/eth_mac_10g.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_rx_64.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_tx_64.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx_if.v
|
||||
|
@ -104,6 +104,8 @@ dict set params TX_CPL_FIFO_DEPTH "32"
|
||||
dict set params TX_CHECKSUM_ENABLE "1"
|
||||
dict set params RX_HASH_ENABLE "1"
|
||||
dict set params RX_CHECKSUM_ENABLE "1"
|
||||
dict set params PFC_ENABLE "1"
|
||||
dict set params LFC_ENABLE [dict get $params PFC_ENABLE]
|
||||
dict set params ENABLE_PADDING "1"
|
||||
dict set params ENABLE_DIC "1"
|
||||
dict set params MIN_FRAME_LENGTH "64"
|
||||
|
@ -74,6 +74,8 @@ module fpga #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter ENABLE_PADDING = 1,
|
||||
parameter ENABLE_DIC = 1,
|
||||
parameter MIN_FRAME_LENGTH = 64,
|
||||
@ -1321,6 +1323,8 @@ fpga_core #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.ENABLE_PADDING(ENABLE_PADDING),
|
||||
.ENABLE_DIC(ENABLE_DIC),
|
||||
.MIN_FRAME_LENGTH(MIN_FRAME_LENGTH),
|
||||
|
@ -81,6 +81,8 @@ module fpga_core #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter ENABLE_PADDING = 1,
|
||||
parameter ENABLE_DIC = 1,
|
||||
parameter MIN_FRAME_LENGTH = 64,
|
||||
@ -676,7 +678,12 @@ wire [PORT_COUNT*TX_TAG_WIDTH-1:0] axis_eth_tx_ptp_ts_tag;
|
||||
wire [PORT_COUNT-1:0] axis_eth_tx_ptp_ts_valid;
|
||||
wire [PORT_COUNT-1:0] axis_eth_tx_ptp_ts_ready;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_tx_enable;
|
||||
wire [PORT_COUNT-1:0] eth_tx_status;
|
||||
wire [PORT_COUNT-1:0] eth_tx_lfc_en;
|
||||
wire [PORT_COUNT-1:0] eth_tx_lfc_req;
|
||||
wire [PORT_COUNT*8-1:0] eth_tx_pfc_en;
|
||||
wire [PORT_COUNT*8-1:0] eth_tx_pfc_req;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_rx_clk;
|
||||
wire [PORT_COUNT-1:0] eth_rx_rst;
|
||||
@ -691,7 +698,14 @@ wire [PORT_COUNT-1:0] axis_eth_rx_tready;
|
||||
wire [PORT_COUNT-1:0] axis_eth_rx_tlast;
|
||||
wire [PORT_COUNT*AXIS_ETH_RX_USER_WIDTH-1:0] axis_eth_rx_tuser;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_rx_enable;
|
||||
wire [PORT_COUNT-1:0] eth_rx_status;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_en;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_req;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_ack;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_en;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_req;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_ack;
|
||||
|
||||
wire [PORT_COUNT-1:0] port_xgmii_tx_clk;
|
||||
wire [PORT_COUNT-1:0] port_xgmii_tx_rst;
|
||||
@ -764,12 +778,15 @@ generate
|
||||
.PTP_PERIOD_FNS(IF_PTP_PERIOD_FNS),
|
||||
.TX_PTP_TS_ENABLE(PTP_TS_ENABLE),
|
||||
.TX_PTP_TS_WIDTH(PTP_TS_WIDTH),
|
||||
.TX_PTP_TS_CTRL_IN_TUSER(0),
|
||||
.TX_PTP_TAG_ENABLE(PTP_TS_ENABLE),
|
||||
.TX_PTP_TAG_WIDTH(TX_TAG_WIDTH),
|
||||
.RX_PTP_TS_ENABLE(PTP_TS_ENABLE),
|
||||
.RX_PTP_TS_WIDTH(PTP_TS_WIDTH),
|
||||
.TX_USER_WIDTH(AXIS_ETH_TX_USER_WIDTH),
|
||||
.RX_USER_WIDTH(AXIS_ETH_RX_USER_WIDTH)
|
||||
.RX_USER_WIDTH(AXIS_ETH_RX_USER_WIDTH),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.PAUSE_ENABLE(LFC_ENABLE)
|
||||
)
|
||||
eth_mac_inst (
|
||||
.tx_clk(port_xgmii_tx_clk[n]),
|
||||
@ -777,6 +794,9 @@ generate
|
||||
.rx_clk(port_xgmii_rx_clk[n]),
|
||||
.rx_rst(port_xgmii_rx_rst[n]),
|
||||
|
||||
/*
|
||||
* AXI input
|
||||
*/
|
||||
.tx_axis_tdata(axis_eth_tx_tdata[n*AXIS_ETH_DATA_WIDTH +: AXIS_ETH_DATA_WIDTH]),
|
||||
.tx_axis_tkeep(axis_eth_tx_tkeep[n*AXIS_ETH_KEEP_WIDTH +: AXIS_ETH_KEEP_WIDTH]),
|
||||
.tx_axis_tvalid(axis_eth_tx_tvalid[n +: 1]),
|
||||
@ -784,30 +804,121 @@ generate
|
||||
.tx_axis_tlast(axis_eth_tx_tlast[n +: 1]),
|
||||
.tx_axis_tuser(axis_eth_tx_tuser[n*AXIS_ETH_TX_USER_WIDTH +: AXIS_ETH_TX_USER_WIDTH]),
|
||||
|
||||
/*
|
||||
* AXI output
|
||||
*/
|
||||
.rx_axis_tdata(axis_eth_rx_tdata[n*AXIS_ETH_DATA_WIDTH +: AXIS_ETH_DATA_WIDTH]),
|
||||
.rx_axis_tkeep(axis_eth_rx_tkeep[n*AXIS_ETH_KEEP_WIDTH +: AXIS_ETH_KEEP_WIDTH]),
|
||||
.rx_axis_tvalid(axis_eth_rx_tvalid[n +: 1]),
|
||||
.rx_axis_tlast(axis_eth_rx_tlast[n +: 1]),
|
||||
.rx_axis_tuser(axis_eth_rx_tuser[n*AXIS_ETH_RX_USER_WIDTH +: AXIS_ETH_RX_USER_WIDTH]),
|
||||
|
||||
/*
|
||||
* XGMII interface
|
||||
*/
|
||||
.xgmii_rxd(port_xgmii_rxd[n*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH]),
|
||||
.xgmii_rxc(port_xgmii_rxc[n*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH]),
|
||||
.xgmii_txd(port_xgmii_txd[n*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH]),
|
||||
.xgmii_txc(port_xgmii_txc[n*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH]),
|
||||
|
||||
/*
|
||||
* PTP
|
||||
*/
|
||||
.tx_ptp_ts(eth_tx_ptp_ts_96[n*PTP_TS_WIDTH +: PTP_TS_WIDTH]),
|
||||
.rx_ptp_ts(eth_rx_ptp_ts_96[n*PTP_TS_WIDTH +: PTP_TS_WIDTH]),
|
||||
.tx_axis_ptp_ts(axis_eth_tx_ptp_ts[n*PTP_TS_WIDTH +: PTP_TS_WIDTH]),
|
||||
.tx_axis_ptp_ts_tag(axis_eth_tx_ptp_ts_tag[n*TX_TAG_WIDTH +: TX_TAG_WIDTH]),
|
||||
.tx_axis_ptp_ts_valid(axis_eth_tx_ptp_ts_valid[n +: 1]),
|
||||
|
||||
/*
|
||||
* Link-level Flow Control (LFC) (IEEE 802.3 annex 31B PAUSE)
|
||||
*/
|
||||
.tx_lfc_req(eth_tx_lfc_req[n +: 1]),
|
||||
.tx_lfc_resend(1'b0),
|
||||
.rx_lfc_en(eth_rx_lfc_en[n +: 1]),
|
||||
.rx_lfc_req(eth_rx_lfc_req[n +: 1]),
|
||||
.rx_lfc_ack(eth_rx_lfc_ack[n +: 1]),
|
||||
|
||||
/*
|
||||
* Priority Flow Control (PFC) (IEEE 802.3 annex 31D PFC)
|
||||
*/
|
||||
.tx_pfc_req(eth_tx_pfc_req[n*8 +: 8]),
|
||||
.tx_pfc_resend(1'b0),
|
||||
.rx_pfc_en(eth_rx_pfc_en[n*8 +: 8]),
|
||||
.rx_pfc_req(eth_rx_pfc_req[n*8 +: 8]),
|
||||
.rx_pfc_ack(eth_rx_pfc_ack[n*8 +: 8]),
|
||||
|
||||
/*
|
||||
* Pause interface
|
||||
*/
|
||||
.tx_lfc_pause_en(1'b1),
|
||||
.tx_pause_req(1'b0),
|
||||
.tx_pause_ack(),
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
.tx_start_packet(),
|
||||
.tx_error_underflow(),
|
||||
.rx_start_packet(),
|
||||
.rx_error_bad_frame(),
|
||||
.rx_error_bad_fcs(),
|
||||
.stat_tx_mcf(),
|
||||
.stat_rx_mcf(),
|
||||
.stat_tx_lfc_pkt(),
|
||||
.stat_tx_lfc_xon(),
|
||||
.stat_tx_lfc_xoff(),
|
||||
.stat_tx_lfc_paused(),
|
||||
.stat_tx_pfc_pkt(),
|
||||
.stat_tx_pfc_xon(),
|
||||
.stat_tx_pfc_xoff(),
|
||||
.stat_tx_pfc_paused(),
|
||||
.stat_rx_lfc_pkt(),
|
||||
.stat_rx_lfc_xon(),
|
||||
.stat_rx_lfc_xoff(),
|
||||
.stat_rx_lfc_paused(),
|
||||
.stat_rx_pfc_pkt(),
|
||||
.stat_rx_pfc_xon(),
|
||||
.stat_rx_pfc_xoff(),
|
||||
.stat_rx_pfc_paused(),
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
.cfg_ifg(8'd12),
|
||||
.cfg_tx_enable(1'b1),
|
||||
.cfg_rx_enable(1'b1)
|
||||
.cfg_tx_enable(eth_tx_enable[n +: 1]),
|
||||
.cfg_rx_enable(eth_rx_enable[n +: 1]),
|
||||
.cfg_mcf_rx_eth_dst_mcast(48'h01_80_C2_00_00_01),
|
||||
.cfg_mcf_rx_check_eth_dst_mcast(1'b1),
|
||||
.cfg_mcf_rx_eth_dst_ucast(48'd0),
|
||||
.cfg_mcf_rx_check_eth_dst_ucast(1'b0),
|
||||
.cfg_mcf_rx_eth_src(48'd0),
|
||||
.cfg_mcf_rx_check_eth_src(1'b0),
|
||||
.cfg_mcf_rx_eth_type(16'h8808),
|
||||
.cfg_mcf_rx_opcode_lfc(16'h0001),
|
||||
.cfg_mcf_rx_check_opcode_lfc(eth_rx_lfc_en[n +: 1]),
|
||||
.cfg_mcf_rx_opcode_pfc(16'h0101),
|
||||
.cfg_mcf_rx_check_opcode_pfc(eth_rx_pfc_en[n*8 +: 8] != 0),
|
||||
.cfg_mcf_rx_forward(1'b0),
|
||||
.cfg_mcf_rx_enable(eth_rx_lfc_en[n +: 1] || eth_rx_pfc_en[n*8 +: 8]),
|
||||
.cfg_tx_lfc_eth_dst(48'h01_80_C2_00_00_01),
|
||||
.cfg_tx_lfc_eth_src(48'h80_23_31_43_54_4C),
|
||||
.cfg_tx_lfc_eth_type(16'h8808),
|
||||
.cfg_tx_lfc_opcode(16'h0001),
|
||||
.cfg_tx_lfc_en(eth_tx_lfc_en[n +: 1]),
|
||||
.cfg_tx_lfc_quanta(16'hffff),
|
||||
.cfg_tx_lfc_refresh(16'h7fff),
|
||||
.cfg_tx_pfc_eth_dst(48'h01_80_C2_00_00_01),
|
||||
.cfg_tx_pfc_eth_src(48'h80_23_31_43_54_4C),
|
||||
.cfg_tx_pfc_eth_type(16'h8808),
|
||||
.cfg_tx_pfc_opcode(16'h0101),
|
||||
.cfg_tx_pfc_en(eth_tx_pfc_en[n*8 +: 8] != 0),
|
||||
.cfg_tx_pfc_quanta({8{16'hffff}}),
|
||||
.cfg_tx_pfc_refresh({8{16'h7fff}}),
|
||||
.cfg_rx_lfc_opcode(16'h0001),
|
||||
.cfg_rx_lfc_en(eth_rx_lfc_en[n +: 1]),
|
||||
.cfg_rx_pfc_opcode(16'h0101),
|
||||
.cfg_rx_pfc_en(eth_rx_pfc_en[n*8 +: 8] != 0)
|
||||
);
|
||||
|
||||
end
|
||||
@ -881,6 +992,9 @@ mqnic_core_pcie_s10 #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.MAC_CTRL_ENABLE(0),
|
||||
.TX_FIFO_DEPTH(TX_FIFO_DEPTH),
|
||||
.RX_FIFO_DEPTH(RX_FIFO_DEPTH),
|
||||
.MAX_TX_SIZE(MAX_TX_SIZE),
|
||||
@ -1087,7 +1201,13 @@ core_inst (
|
||||
.s_axis_eth_tx_cpl_valid(axis_eth_tx_ptp_ts_valid),
|
||||
.s_axis_eth_tx_cpl_ready(axis_eth_tx_ptp_ts_ready),
|
||||
|
||||
.eth_tx_enable(eth_tx_enable),
|
||||
.eth_tx_status(eth_tx_status),
|
||||
.eth_tx_lfc_en(eth_tx_lfc_en),
|
||||
.eth_tx_lfc_req(eth_tx_lfc_req),
|
||||
.eth_tx_pfc_en(eth_tx_pfc_en),
|
||||
.eth_tx_pfc_req(eth_tx_pfc_req),
|
||||
.eth_tx_fc_quanta_clk_en(0),
|
||||
|
||||
.eth_rx_clk(eth_rx_clk),
|
||||
.eth_rx_rst(eth_rx_rst),
|
||||
@ -1104,7 +1224,15 @@ core_inst (
|
||||
.s_axis_eth_rx_tlast(axis_eth_rx_tlast),
|
||||
.s_axis_eth_rx_tuser(axis_eth_rx_tuser),
|
||||
|
||||
.eth_rx_enable(eth_rx_enable),
|
||||
.eth_rx_status(eth_rx_status),
|
||||
.eth_rx_lfc_en(eth_rx_lfc_en),
|
||||
.eth_rx_lfc_req(eth_rx_lfc_req),
|
||||
.eth_rx_lfc_ack(eth_rx_lfc_ack),
|
||||
.eth_rx_pfc_en(eth_rx_pfc_en),
|
||||
.eth_rx_pfc_req(eth_rx_pfc_req),
|
||||
.eth_rx_pfc_ack(eth_rx_pfc_ack),
|
||||
.eth_rx_fc_quanta_clk_en(0),
|
||||
|
||||
/*
|
||||
* DDR
|
||||
|
@ -60,6 +60,10 @@ VERILOG_SOURCES += ../../rtl/common/tdma_ber_ch.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/eth_mac_10g.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/axis_xgmii_rx_64.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/axis_xgmii_tx_64.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/lfsr.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock_cdc.v
|
||||
@ -165,6 +169,8 @@ export PARAM_TX_CPL_FIFO_DEPTH := 32
|
||||
export PARAM_TX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_RX_HASH_ENABLE := 1
|
||||
export PARAM_RX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_LFC_ENABLE := 1
|
||||
export PARAM_PFC_ENABLE := $(PARAM_LFC_ENABLE)
|
||||
export PARAM_TX_FIFO_DEPTH := 32768
|
||||
export PARAM_RX_FIFO_DEPTH := 32768
|
||||
export PARAM_MAX_TX_SIZE := 9214
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
import logging
|
||||
import os
|
||||
import struct
|
||||
import sys
|
||||
|
||||
import scapy.utils
|
||||
@ -16,7 +17,7 @@ from cocotb.log import SimLog
|
||||
from cocotb.clock import Clock
|
||||
from cocotb.triggers import RisingEdge, FallingEdge, Timer
|
||||
|
||||
from cocotbext.eth import XgmiiSource, XgmiiSink
|
||||
from cocotbext.eth import XgmiiSource, XgmiiSink, XgmiiFrame
|
||||
from cocotbext.pcie.core import RootComplex
|
||||
from cocotbext.pcie.intel.s10 import S10PcieDevice, S10RxBus, S10TxBus
|
||||
|
||||
@ -438,6 +439,35 @@ async def run_test_nic(dut):
|
||||
|
||||
tb.loopback_enable = False
|
||||
|
||||
if tb.driver.interfaces[0].if_feature_lfc:
|
||||
tb.log.info("Test LFC pause frame RX")
|
||||
|
||||
await tb.driver.interfaces[0].ports[0].set_lfc_ctrl(mqnic.MQNIC_PORT_LFC_CTRL_TX_LFC_EN | mqnic.MQNIC_PORT_LFC_CTRL_RX_LFC_EN)
|
||||
await tb.driver.hw_regs.read_dword(0)
|
||||
|
||||
lfc_xoff = Ether(src='DA:D1:D2:D3:D4:D5', dst='01:80:C2:00:00:01', type=0x8808) / struct.pack('!HH', 0x0001, 2000)
|
||||
|
||||
await tb.qsfp_source[0][0].send(XgmiiFrame.from_payload(bytes(lfc_xoff)))
|
||||
|
||||
count = 16
|
||||
|
||||
pkts = [bytearray([(x+k) % 256 for x in range(1514)]) for k in range(count)]
|
||||
|
||||
tb.loopback_enable = True
|
||||
|
||||
for p in pkts:
|
||||
await tb.driver.interfaces[0].start_xmit(p, 0)
|
||||
|
||||
for k in range(count):
|
||||
pkt = await tb.driver.interfaces[0].recv()
|
||||
|
||||
tb.log.info("Packet: %s", pkt)
|
||||
assert pkt.data == pkts[k]
|
||||
if tb.driver.interfaces[0].if_feature_rx_csum:
|
||||
assert pkt.rx_checksum == ~scapy.utils.checksum(bytes(pkt.data[14:])) & 0xffff
|
||||
|
||||
tb.loopback_enable = False
|
||||
|
||||
await RisingEdge(dut.clk_250mhz)
|
||||
await RisingEdge(dut.clk_250mhz)
|
||||
|
||||
@ -508,6 +538,10 @@ def test_fpga_core(request):
|
||||
os.path.join(eth_rtl_dir, "eth_mac_10g.v"),
|
||||
os.path.join(eth_rtl_dir, "axis_xgmii_rx_64.v"),
|
||||
os.path.join(eth_rtl_dir, "axis_xgmii_tx_64.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "lfsr.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock_cdc.v"),
|
||||
@ -614,6 +648,8 @@ def test_fpga_core(request):
|
||||
parameters['TX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['RX_HASH_ENABLE'] = 1
|
||||
parameters['RX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['LFC_ENABLE'] = 1
|
||||
parameters['PFC_ENABLE'] = parameters['LFC_ENABLE']
|
||||
parameters['TX_FIFO_DEPTH'] = 32768
|
||||
parameters['RX_FIFO_DEPTH'] = 32768
|
||||
parameters['MAX_TX_SIZE'] = 9214
|
||||
|
@ -101,6 +101,8 @@ dict set params TX_CPL_FIFO_DEPTH "32"
|
||||
dict set params TX_CHECKSUM_ENABLE "1"
|
||||
dict set params RX_HASH_ENABLE "1"
|
||||
dict set params RX_CHECKSUM_ENABLE "1"
|
||||
dict set params PFC_ENABLE "1"
|
||||
dict set params LFC_ENABLE [dict get $params PFC_ENABLE]
|
||||
dict set params TX_FIFO_DEPTH "32768"
|
||||
dict set params RX_FIFO_DEPTH "131072"
|
||||
dict set params MAX_TX_SIZE "9214"
|
||||
|
@ -101,6 +101,8 @@ dict set params TX_CPL_FIFO_DEPTH "32"
|
||||
dict set params TX_CHECKSUM_ENABLE "1"
|
||||
dict set params RX_HASH_ENABLE "1"
|
||||
dict set params RX_CHECKSUM_ENABLE "1"
|
||||
dict set params PFC_ENABLE "1"
|
||||
dict set params LFC_ENABLE [dict get $params PFC_ENABLE]
|
||||
dict set params TX_FIFO_DEPTH "32768"
|
||||
dict set params RX_FIFO_DEPTH "131072"
|
||||
dict set params MAX_TX_SIZE "9214"
|
||||
|
@ -101,6 +101,8 @@ dict set params TX_CPL_FIFO_DEPTH "32"
|
||||
dict set params TX_CHECKSUM_ENABLE "1"
|
||||
dict set params RX_HASH_ENABLE "1"
|
||||
dict set params RX_CHECKSUM_ENABLE "1"
|
||||
dict set params PFC_ENABLE "1"
|
||||
dict set params LFC_ENABLE [dict get $params PFC_ENABLE]
|
||||
dict set params TX_FIFO_DEPTH "32768"
|
||||
dict set params RX_FIFO_DEPTH "131072"
|
||||
dict set params MAX_TX_SIZE "9214"
|
||||
|
@ -7,8 +7,10 @@ set_property -dict [list \
|
||||
CONFIG.USER_INTERFACE {AXIS} \
|
||||
CONFIG.GT_DRP_CLK {125} \
|
||||
CONFIG.GT_LOCATION {0} \
|
||||
CONFIG.TX_FLOW_CONTROL {0} \
|
||||
CONFIG.RX_FLOW_CONTROL {0} \
|
||||
CONFIG.TX_FLOW_CONTROL {1} \
|
||||
CONFIG.RX_FLOW_CONTROL {1} \
|
||||
CONFIG.RX_FORWARD_CONTROL_FRAMES {0} \
|
||||
CONFIG.RX_CHECK_ACK {1} \
|
||||
CONFIG.INCLUDE_RS_FEC {1} \
|
||||
CONFIG.ENABLE_TIME_STAMPING {1}
|
||||
] [get_ips cmac_usplus]
|
||||
|
@ -71,6 +71,8 @@ module fpga #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter TX_FIFO_DEPTH = 32768,
|
||||
parameter RX_FIFO_DEPTH = 131072,
|
||||
parameter MAX_TX_SIZE = 9214,
|
||||
@ -955,7 +957,20 @@ wire qsfp_0_drp_we;
|
||||
wire [15:0] qsfp_0_drp_do;
|
||||
wire qsfp_0_drp_rdy;
|
||||
|
||||
wire qsfp_0_rx_status;
|
||||
wire qsfp_0_tx_enable;
|
||||
wire qsfp_0_tx_lfc_en;
|
||||
wire qsfp_0_tx_lfc_req;
|
||||
wire [7:0] qsfp_0_tx_pfc_en;
|
||||
wire [7:0] qsfp_0_tx_pfc_req;
|
||||
|
||||
wire qsfp_0_rx_enable;
|
||||
wire qsfp_0_rx_status;
|
||||
wire qsfp_0_rx_lfc_en;
|
||||
wire qsfp_0_rx_lfc_req;
|
||||
wire qsfp_0_rx_lfc_ack;
|
||||
wire [7:0] qsfp_0_rx_pfc_en;
|
||||
wire [7:0] qsfp_0_rx_pfc_req;
|
||||
wire [7:0] qsfp_0_rx_pfc_ack;
|
||||
|
||||
wire qsfp_0_gtpowergood;
|
||||
|
||||
@ -1048,6 +1063,12 @@ qsfp_0_cmac_inst (
|
||||
.tx_ptp_ts_tag(qsfp_0_tx_ptp_ts_tag_int),
|
||||
.tx_ptp_ts_valid(qsfp_0_tx_ptp_ts_valid_int),
|
||||
|
||||
.tx_enable(qsfp_0_tx_enable),
|
||||
.tx_lfc_en(qsfp_0_tx_lfc_en),
|
||||
.tx_lfc_req(qsfp_0_tx_lfc_req),
|
||||
.tx_pfc_en(qsfp_0_tx_pfc_en),
|
||||
.tx_pfc_req(qsfp_0_tx_pfc_req),
|
||||
|
||||
.rx_clk(qsfp_0_rx_clk_int),
|
||||
.rx_rst(qsfp_0_rx_rst_int),
|
||||
|
||||
@ -1061,7 +1082,14 @@ qsfp_0_cmac_inst (
|
||||
.rx_ptp_rst(qsfp_0_rx_ptp_rst_int),
|
||||
.rx_ptp_time(qsfp_0_rx_ptp_time_int),
|
||||
|
||||
.rx_status(qsfp_0_rx_status)
|
||||
.rx_enable(qsfp_0_rx_enable),
|
||||
.rx_status(qsfp_0_rx_status),
|
||||
.rx_lfc_en(qsfp_0_rx_lfc_en),
|
||||
.rx_lfc_req(qsfp_0_rx_lfc_req),
|
||||
.rx_lfc_ack(qsfp_0_rx_lfc_ack),
|
||||
.rx_pfc_en(qsfp_0_rx_pfc_en),
|
||||
.rx_pfc_req(qsfp_0_rx_pfc_req),
|
||||
.rx_pfc_ack(qsfp_0_rx_pfc_ack)
|
||||
);
|
||||
|
||||
// QSFP1 CMAC
|
||||
@ -1102,7 +1130,20 @@ wire qsfp_1_drp_we;
|
||||
wire [15:0] qsfp_1_drp_do;
|
||||
wire qsfp_1_drp_rdy;
|
||||
|
||||
wire qsfp_1_rx_status;
|
||||
wire qsfp_1_tx_enable;
|
||||
wire qsfp_1_tx_lfc_en;
|
||||
wire qsfp_1_tx_lfc_req;
|
||||
wire [7:0] qsfp_1_tx_pfc_en;
|
||||
wire [7:0] qsfp_1_tx_pfc_req;
|
||||
|
||||
wire qsfp_1_rx_enable;
|
||||
wire qsfp_1_rx_status;
|
||||
wire qsfp_1_rx_lfc_en;
|
||||
wire qsfp_1_rx_lfc_req;
|
||||
wire qsfp_1_rx_lfc_ack;
|
||||
wire [7:0] qsfp_1_rx_pfc_en;
|
||||
wire [7:0] qsfp_1_rx_pfc_req;
|
||||
wire [7:0] qsfp_1_rx_pfc_ack;
|
||||
|
||||
wire qsfp_1_gtpowergood;
|
||||
|
||||
@ -1195,6 +1236,12 @@ qsfp_1_cmac_inst (
|
||||
.tx_ptp_ts_tag(qsfp_1_tx_ptp_ts_tag_int),
|
||||
.tx_ptp_ts_valid(qsfp_1_tx_ptp_ts_valid_int),
|
||||
|
||||
.tx_enable(qsfp_1_tx_enable),
|
||||
.tx_lfc_en(qsfp_1_tx_lfc_en),
|
||||
.tx_lfc_req(qsfp_1_tx_lfc_req),
|
||||
.tx_pfc_en(qsfp_1_tx_pfc_en),
|
||||
.tx_pfc_req(qsfp_1_tx_pfc_req),
|
||||
|
||||
.rx_clk(qsfp_1_rx_clk_int),
|
||||
.rx_rst(qsfp_1_rx_rst_int),
|
||||
|
||||
@ -1208,7 +1255,14 @@ qsfp_1_cmac_inst (
|
||||
.rx_ptp_rst(qsfp_1_rx_ptp_rst_int),
|
||||
.rx_ptp_time(qsfp_1_rx_ptp_time_int),
|
||||
|
||||
.rx_status(qsfp_1_rx_status)
|
||||
.rx_enable(qsfp_1_rx_enable),
|
||||
.rx_status(qsfp_1_rx_status),
|
||||
.rx_lfc_en(qsfp_1_rx_lfc_en),
|
||||
.rx_lfc_req(qsfp_1_rx_lfc_req),
|
||||
.rx_lfc_ack(qsfp_1_rx_lfc_ack),
|
||||
.rx_pfc_en(qsfp_1_rx_pfc_en),
|
||||
.rx_pfc_req(qsfp_1_rx_pfc_req),
|
||||
.rx_pfc_ack(qsfp_1_rx_pfc_ack)
|
||||
);
|
||||
|
||||
wire ptp_clk;
|
||||
@ -1601,6 +1655,8 @@ fpga_core #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.TX_FIFO_DEPTH(TX_FIFO_DEPTH),
|
||||
.RX_FIFO_DEPTH(RX_FIFO_DEPTH),
|
||||
.MAX_TX_SIZE(MAX_TX_SIZE),
|
||||
@ -1797,6 +1853,12 @@ core_inst (
|
||||
.qsfp_0_tx_ptp_ts_tag(qsfp_0_tx_ptp_ts_tag_int),
|
||||
.qsfp_0_tx_ptp_ts_valid(qsfp_0_tx_ptp_ts_valid_int),
|
||||
|
||||
.qsfp_0_tx_enable(qsfp_0_tx_enable),
|
||||
.qsfp_0_tx_lfc_en(qsfp_0_tx_lfc_en),
|
||||
.qsfp_0_tx_lfc_req(qsfp_0_tx_lfc_req),
|
||||
.qsfp_0_tx_pfc_en(qsfp_0_tx_pfc_en),
|
||||
.qsfp_0_tx_pfc_req(qsfp_0_tx_pfc_req),
|
||||
|
||||
.qsfp_0_rx_clk(qsfp_0_rx_clk_int),
|
||||
.qsfp_0_rx_rst(qsfp_0_rx_rst_int),
|
||||
.qsfp_0_rx_axis_tdata(qsfp_0_rx_axis_tdata_int),
|
||||
@ -1808,7 +1870,14 @@ core_inst (
|
||||
.qsfp_0_rx_ptp_rst(qsfp_0_rx_ptp_rst_int),
|
||||
.qsfp_0_rx_ptp_time(qsfp_0_rx_ptp_time_int),
|
||||
|
||||
.qsfp_0_rx_enable(qsfp_0_rx_enable),
|
||||
.qsfp_0_rx_status(qsfp_0_rx_status),
|
||||
.qsfp_0_rx_lfc_en(qsfp_0_rx_lfc_en),
|
||||
.qsfp_0_rx_lfc_req(qsfp_0_rx_lfc_req),
|
||||
.qsfp_0_rx_lfc_ack(qsfp_0_rx_lfc_ack),
|
||||
.qsfp_0_rx_pfc_en(qsfp_0_rx_pfc_en),
|
||||
.qsfp_0_rx_pfc_req(qsfp_0_rx_pfc_req),
|
||||
.qsfp_0_rx_pfc_ack(qsfp_0_rx_pfc_ack),
|
||||
|
||||
.qsfp_0_drp_clk(qsfp_0_drp_clk),
|
||||
.qsfp_0_drp_rst(qsfp_0_drp_rst),
|
||||
@ -1835,6 +1904,12 @@ core_inst (
|
||||
.qsfp_1_tx_ptp_ts_tag(qsfp_1_tx_ptp_ts_tag_int),
|
||||
.qsfp_1_tx_ptp_ts_valid(qsfp_1_tx_ptp_ts_valid_int),
|
||||
|
||||
.qsfp_1_tx_enable(qsfp_1_tx_enable),
|
||||
.qsfp_1_tx_lfc_en(qsfp_1_tx_lfc_en),
|
||||
.qsfp_1_tx_lfc_req(qsfp_1_tx_lfc_req),
|
||||
.qsfp_1_tx_pfc_en(qsfp_1_tx_pfc_en),
|
||||
.qsfp_1_tx_pfc_req(qsfp_1_tx_pfc_req),
|
||||
|
||||
.qsfp_1_rx_clk(qsfp_1_rx_clk_int),
|
||||
.qsfp_1_rx_rst(qsfp_1_rx_rst_int),
|
||||
.qsfp_1_rx_axis_tdata(qsfp_1_rx_axis_tdata_int),
|
||||
@ -1846,7 +1921,14 @@ core_inst (
|
||||
.qsfp_1_rx_ptp_rst(qsfp_1_rx_ptp_rst_int),
|
||||
.qsfp_1_rx_ptp_time(qsfp_1_rx_ptp_time_int),
|
||||
|
||||
.qsfp_1_rx_enable(qsfp_1_rx_enable),
|
||||
.qsfp_1_rx_status(qsfp_1_rx_status),
|
||||
.qsfp_1_rx_lfc_en(qsfp_1_rx_lfc_en),
|
||||
.qsfp_1_rx_lfc_req(qsfp_1_rx_lfc_req),
|
||||
.qsfp_1_rx_lfc_ack(qsfp_1_rx_lfc_ack),
|
||||
.qsfp_1_rx_pfc_en(qsfp_1_rx_pfc_en),
|
||||
.qsfp_1_rx_pfc_req(qsfp_1_rx_pfc_req),
|
||||
.qsfp_1_rx_pfc_ack(qsfp_1_rx_pfc_ack),
|
||||
|
||||
.qsfp_1_drp_clk(qsfp_1_drp_clk),
|
||||
.qsfp_1_drp_rst(qsfp_1_drp_rst),
|
||||
|
@ -77,6 +77,8 @@ module fpga_core #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter TX_FIFO_DEPTH = 32768,
|
||||
parameter RX_FIFO_DEPTH = 131072,
|
||||
parameter MAX_TX_SIZE = 9214,
|
||||
@ -275,6 +277,12 @@ module fpga_core #
|
||||
input wire [15:0] qsfp_0_tx_ptp_ts_tag,
|
||||
input wire qsfp_0_tx_ptp_ts_valid,
|
||||
|
||||
output wire qsfp_0_tx_enable,
|
||||
output wire qsfp_0_tx_lfc_en,
|
||||
output wire qsfp_0_tx_lfc_req,
|
||||
output wire [7:0] qsfp_0_tx_pfc_en,
|
||||
output wire [7:0] qsfp_0_tx_pfc_req,
|
||||
|
||||
input wire qsfp_0_rx_clk,
|
||||
input wire qsfp_0_rx_rst,
|
||||
|
||||
@ -288,7 +296,14 @@ module fpga_core #
|
||||
input wire qsfp_0_rx_ptp_rst,
|
||||
output wire [79:0] qsfp_0_rx_ptp_time,
|
||||
|
||||
output wire qsfp_0_rx_enable,
|
||||
input wire qsfp_0_rx_status,
|
||||
output wire qsfp_0_rx_lfc_en,
|
||||
input wire qsfp_0_rx_lfc_req,
|
||||
output wire qsfp_0_rx_lfc_ack,
|
||||
output wire [7:0] qsfp_0_rx_pfc_en,
|
||||
input wire [7:0] qsfp_0_rx_pfc_req,
|
||||
output wire [7:0] qsfp_0_rx_pfc_ack,
|
||||
|
||||
input wire qsfp_0_drp_clk,
|
||||
input wire qsfp_0_drp_rst,
|
||||
@ -317,8 +332,12 @@ module fpga_core #
|
||||
input wire [15:0] qsfp_1_tx_ptp_ts_tag,
|
||||
input wire qsfp_1_tx_ptp_ts_valid,
|
||||
|
||||
input wire qsfp_1_rx_ptp_clk,
|
||||
input wire qsfp_1_rx_ptp_rst,
|
||||
output wire qsfp_1_tx_enable,
|
||||
output wire qsfp_1_tx_lfc_en,
|
||||
output wire qsfp_1_tx_lfc_req,
|
||||
output wire [7:0] qsfp_1_tx_pfc_en,
|
||||
output wire [7:0] qsfp_1_tx_pfc_req,
|
||||
|
||||
input wire qsfp_1_rx_clk,
|
||||
input wire qsfp_1_rx_rst,
|
||||
|
||||
@ -328,9 +347,18 @@ module fpga_core #
|
||||
input wire qsfp_1_rx_axis_tlast,
|
||||
input wire [80+1-1:0] qsfp_1_rx_axis_tuser,
|
||||
|
||||
input wire qsfp_1_rx_ptp_clk,
|
||||
input wire qsfp_1_rx_ptp_rst,
|
||||
output wire [79:0] qsfp_1_rx_ptp_time,
|
||||
|
||||
output wire qsfp_1_rx_enable,
|
||||
input wire qsfp_1_rx_status,
|
||||
output wire qsfp_1_rx_lfc_en,
|
||||
input wire qsfp_1_rx_lfc_req,
|
||||
output wire qsfp_1_rx_lfc_ack,
|
||||
output wire [7:0] qsfp_1_rx_pfc_en,
|
||||
input wire [7:0] qsfp_1_rx_pfc_req,
|
||||
output wire [7:0] qsfp_1_rx_pfc_ack,
|
||||
|
||||
input wire qsfp_1_drp_clk,
|
||||
input wire qsfp_1_drp_rst,
|
||||
@ -850,7 +878,12 @@ wire [PORT_COUNT*TX_TAG_WIDTH-1:0] axis_eth_tx_ptp_ts_tag;
|
||||
wire [PORT_COUNT-1:0] axis_eth_tx_ptp_ts_valid;
|
||||
wire [PORT_COUNT-1:0] axis_eth_tx_ptp_ts_ready;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_tx_enable;
|
||||
wire [PORT_COUNT-1:0] eth_tx_status;
|
||||
wire [PORT_COUNT-1:0] eth_tx_lfc_en;
|
||||
wire [PORT_COUNT-1:0] eth_tx_lfc_req;
|
||||
wire [PORT_COUNT*8-1:0] eth_tx_pfc_en;
|
||||
wire [PORT_COUNT*8-1:0] eth_tx_pfc_req;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_rx_clk;
|
||||
wire [PORT_COUNT-1:0] eth_rx_rst;
|
||||
@ -867,7 +900,14 @@ wire [PORT_COUNT-1:0] axis_eth_rx_tready;
|
||||
wire [PORT_COUNT-1:0] axis_eth_rx_tlast;
|
||||
wire [PORT_COUNT*AXIS_ETH_RX_USER_WIDTH-1:0] axis_eth_rx_tuser;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_rx_enable;
|
||||
wire [PORT_COUNT-1:0] eth_rx_status;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_en;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_req;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_ack;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_en;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_req;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_ack;
|
||||
|
||||
wire [PTP_TS_WIDTH-1:0] qsfp_0_tx_ptp_time_int;
|
||||
wire [PTP_TS_WIDTH-1:0] qsfp_1_tx_ptp_time_int;
|
||||
@ -918,7 +958,12 @@ mqnic_port_map_mac_axis_inst (
|
||||
.s_axis_mac_tx_ptp_ts_valid({qsfp_1_tx_ptp_ts_valid, qsfp_0_tx_ptp_ts_valid}),
|
||||
.s_axis_mac_tx_ptp_ts_ready(),
|
||||
|
||||
.mac_tx_enable({qsfp_1_tx_enable, qsfp_0_tx_enable}),
|
||||
.mac_tx_status(2'b11),
|
||||
.mac_tx_lfc_en({qsfp_1_tx_lfc_en, qsfp_0_tx_lfc_en}),
|
||||
.mac_tx_lfc_req({qsfp_1_tx_lfc_req, qsfp_0_tx_lfc_req}),
|
||||
.mac_tx_pfc_en({qsfp_1_tx_pfc_en, qsfp_0_tx_pfc_en}),
|
||||
.mac_tx_pfc_req({qsfp_1_tx_pfc_req, qsfp_0_tx_pfc_req}),
|
||||
|
||||
.mac_rx_clk({qsfp_1_rx_clk, qsfp_0_rx_clk}),
|
||||
.mac_rx_rst({qsfp_1_rx_rst, qsfp_0_rx_rst}),
|
||||
@ -935,7 +980,14 @@ mqnic_port_map_mac_axis_inst (
|
||||
.s_axis_mac_rx_tlast({qsfp_1_rx_axis_tlast, qsfp_0_rx_axis_tlast}),
|
||||
.s_axis_mac_rx_tuser({{qsfp_1_rx_axis_tuser[80:1], 16'd0, qsfp_1_rx_axis_tuser[0]}, {qsfp_0_rx_axis_tuser[80:1], 16'd0, qsfp_0_rx_axis_tuser[0]}}),
|
||||
|
||||
.mac_rx_enable({qsfp_1_rx_enable, qsfp_0_rx_enable}),
|
||||
.mac_rx_status({qsfp_1_rx_status, qsfp_0_rx_status}),
|
||||
.mac_rx_lfc_en({qsfp_1_rx_lfc_en, qsfp_0_rx_lfc_en}),
|
||||
.mac_rx_lfc_req({qsfp_1_rx_lfc_req, qsfp_0_rx_lfc_req}),
|
||||
.mac_rx_lfc_ack({qsfp_1_rx_lfc_ack, qsfp_0_rx_lfc_ack}),
|
||||
.mac_rx_pfc_en({qsfp_1_rx_pfc_en, qsfp_0_rx_pfc_en}),
|
||||
.mac_rx_pfc_req({qsfp_1_rx_pfc_req, qsfp_0_rx_pfc_req}),
|
||||
.mac_rx_pfc_ack({qsfp_1_rx_pfc_ack, qsfp_0_rx_pfc_ack}),
|
||||
|
||||
// towards datapath
|
||||
.tx_clk(eth_tx_clk),
|
||||
@ -958,7 +1010,12 @@ mqnic_port_map_mac_axis_inst (
|
||||
.m_axis_tx_ptp_ts_valid(axis_eth_tx_ptp_ts_valid),
|
||||
.m_axis_tx_ptp_ts_ready(axis_eth_tx_ptp_ts_ready),
|
||||
|
||||
.tx_enable(eth_tx_enable),
|
||||
.tx_status(eth_tx_status),
|
||||
.tx_lfc_en(eth_tx_lfc_en),
|
||||
.tx_lfc_req(eth_tx_lfc_req),
|
||||
.tx_pfc_en(eth_tx_pfc_en),
|
||||
.tx_pfc_req(eth_tx_pfc_req),
|
||||
|
||||
.rx_clk(eth_rx_clk),
|
||||
.rx_rst(eth_rx_rst),
|
||||
@ -975,7 +1032,14 @@ mqnic_port_map_mac_axis_inst (
|
||||
.m_axis_rx_tlast(axis_eth_rx_tlast),
|
||||
.m_axis_rx_tuser(axis_eth_rx_tuser),
|
||||
|
||||
.rx_status(eth_rx_status)
|
||||
.rx_enable(eth_rx_enable),
|
||||
.rx_status(eth_rx_status),
|
||||
.rx_lfc_en(eth_rx_lfc_en),
|
||||
.rx_lfc_req(eth_rx_lfc_req),
|
||||
.rx_lfc_ack(eth_rx_lfc_ack),
|
||||
.rx_pfc_en(eth_rx_pfc_en),
|
||||
.rx_pfc_req(eth_rx_pfc_req),
|
||||
.rx_pfc_ack(eth_rx_pfc_ack)
|
||||
);
|
||||
|
||||
mqnic_core_pcie_us #(
|
||||
@ -1045,6 +1109,9 @@ mqnic_core_pcie_us #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.MAC_CTRL_ENABLE(0),
|
||||
.TX_FIFO_DEPTH(TX_FIFO_DEPTH),
|
||||
.RX_FIFO_DEPTH(RX_FIFO_DEPTH),
|
||||
.MAX_TX_SIZE(MAX_TX_SIZE),
|
||||
@ -1326,7 +1393,13 @@ core_inst (
|
||||
.s_axis_eth_tx_cpl_valid(axis_eth_tx_ptp_ts_valid),
|
||||
.s_axis_eth_tx_cpl_ready(axis_eth_tx_ptp_ts_ready),
|
||||
|
||||
.eth_tx_enable(eth_tx_enable),
|
||||
.eth_tx_status(eth_tx_status),
|
||||
.eth_tx_lfc_en(eth_tx_lfc_en),
|
||||
.eth_tx_lfc_req(eth_tx_lfc_req),
|
||||
.eth_tx_pfc_en(eth_tx_pfc_en),
|
||||
.eth_tx_pfc_req(eth_tx_pfc_req),
|
||||
.eth_tx_fc_quanta_clk_en(0),
|
||||
|
||||
.eth_rx_clk(eth_rx_clk),
|
||||
.eth_rx_rst(eth_rx_rst),
|
||||
@ -1343,7 +1416,15 @@ core_inst (
|
||||
.s_axis_eth_rx_tlast(axis_eth_rx_tlast),
|
||||
.s_axis_eth_rx_tuser(axis_eth_rx_tuser),
|
||||
|
||||
.eth_rx_enable(eth_rx_enable),
|
||||
.eth_rx_status(eth_rx_status),
|
||||
.eth_rx_lfc_en(eth_rx_lfc_en),
|
||||
.eth_rx_lfc_req(eth_rx_lfc_req),
|
||||
.eth_rx_lfc_ack(eth_rx_lfc_ack),
|
||||
.eth_rx_pfc_en(eth_rx_pfc_en),
|
||||
.eth_rx_pfc_req(eth_rx_pfc_req),
|
||||
.eth_rx_pfc_ack(eth_rx_pfc_ack),
|
||||
.eth_rx_fc_quanta_clk_en(0),
|
||||
|
||||
/*
|
||||
* DDR
|
||||
|
@ -162,6 +162,8 @@ export PARAM_TX_CPL_FIFO_DEPTH := 32
|
||||
export PARAM_TX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_RX_HASH_ENABLE := 1
|
||||
export PARAM_RX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_LFC_ENABLE := 1
|
||||
export PARAM_PFC_ENABLE := $(PARAM_LFC_ENABLE)
|
||||
export PARAM_TX_FIFO_DEPTH := 32768
|
||||
export PARAM_RX_FIFO_DEPTH := 131072
|
||||
export PARAM_MAX_TX_SIZE := 9214
|
||||
|
@ -300,6 +300,8 @@ class TB(object):
|
||||
self.qsfp_mac.append(mac)
|
||||
|
||||
getattr(dut, f"qsfp_{k}_rx_status").setimmediatevalue(1)
|
||||
getattr(dut, f"qsfp_{k}_rx_lfc_req").setimmediatevalue(0)
|
||||
getattr(dut, f"qsfp_{k}_rx_pfc_req").setimmediatevalue(0)
|
||||
|
||||
cocotb.start_soon(Clock(getattr(dut, f"qsfp_{k}_drp_clk"), 8, units="ns").start())
|
||||
getattr(dut, f"qsfp_{k}_drp_rst").setimmediatevalue(0)
|
||||
@ -726,6 +728,8 @@ def test_fpga_core(request):
|
||||
parameters['TX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['RX_HASH_ENABLE'] = 1
|
||||
parameters['RX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['LFC_ENABLE'] = 1
|
||||
parameters['PFC_ENABLE'] = parameters['LFC_ENABLE']
|
||||
parameters['TX_FIFO_DEPTH'] = 32768
|
||||
parameters['RX_FIFO_DEPTH'] = 131072
|
||||
parameters['MAX_TX_SIZE'] = 9214
|
||||
|
@ -63,6 +63,10 @@ SYN_FILES += rtl/common/i2c_single_reg.v
|
||||
SYN_FILES += lib/eth/rtl/eth_mac_10g.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_rx_64.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_tx_64.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx_if.v
|
||||
|
@ -113,6 +113,8 @@ dict set params TX_CPL_FIFO_DEPTH "32"
|
||||
dict set params TX_CHECKSUM_ENABLE "1"
|
||||
dict set params RX_HASH_ENABLE "1"
|
||||
dict set params RX_CHECKSUM_ENABLE "1"
|
||||
dict set params PFC_ENABLE "1"
|
||||
dict set params LFC_ENABLE [dict get $params PFC_ENABLE]
|
||||
dict set params ENABLE_PADDING "1"
|
||||
dict set params ENABLE_DIC "1"
|
||||
dict set params MIN_FRAME_LENGTH "64"
|
||||
|
@ -63,6 +63,10 @@ SYN_FILES += rtl/common/i2c_single_reg.v
|
||||
SYN_FILES += lib/eth/rtl/eth_mac_10g.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_rx_64.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_tx_64.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx_if.v
|
||||
|
@ -113,6 +113,8 @@ dict set params TX_CPL_FIFO_DEPTH "32"
|
||||
dict set params TX_CHECKSUM_ENABLE "1"
|
||||
dict set params RX_HASH_ENABLE "1"
|
||||
dict set params RX_CHECKSUM_ENABLE "1"
|
||||
dict set params PFC_ENABLE "1"
|
||||
dict set params LFC_ENABLE [dict get $params PFC_ENABLE]
|
||||
dict set params ENABLE_PADDING "1"
|
||||
dict set params ENABLE_DIC "1"
|
||||
dict set params MIN_FRAME_LENGTH "64"
|
||||
|
@ -60,10 +60,14 @@ SYN_FILES += rtl/common/tx_scheduler_ctrl_tdma.v
|
||||
SYN_FILES += rtl/common/tdma_scheduler.v
|
||||
SYN_FILES += rtl/common/tdma_ber.v
|
||||
SYN_FILES += rtl/common/tdma_ber_ch.v
|
||||
SYN_FILES += lib/eth/rtl/eth_mac_10g.v
|
||||
SYN_FILES += rtl/common/i2c_single_reg.v
|
||||
SYN_FILES += lib/eth/rtl/eth_mac_10g.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_rx_64.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_tx_64.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx_if.v
|
||||
|
@ -113,6 +113,8 @@ dict set params TX_CPL_FIFO_DEPTH "32"
|
||||
dict set params TX_CHECKSUM_ENABLE "1"
|
||||
dict set params RX_HASH_ENABLE "1"
|
||||
dict set params RX_CHECKSUM_ENABLE "1"
|
||||
dict set params PFC_ENABLE "1"
|
||||
dict set params LFC_ENABLE [dict get $params PFC_ENABLE]
|
||||
dict set params ENABLE_PADDING "1"
|
||||
dict set params ENABLE_DIC "1"
|
||||
dict set params MIN_FRAME_LENGTH "64"
|
||||
|
@ -74,6 +74,8 @@ module fpga #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter ENABLE_PADDING = 1,
|
||||
parameter ENABLE_DIC = 1,
|
||||
parameter MIN_FRAME_LENGTH = 64,
|
||||
@ -1740,6 +1742,8 @@ fpga_core #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.ENABLE_PADDING(ENABLE_PADDING),
|
||||
.ENABLE_DIC(ENABLE_DIC),
|
||||
.MIN_FRAME_LENGTH(MIN_FRAME_LENGTH),
|
||||
|
@ -81,6 +81,8 @@ module fpga_core #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter ENABLE_PADDING = 1,
|
||||
parameter ENABLE_DIC = 1,
|
||||
parameter MIN_FRAME_LENGTH = 64,
|
||||
@ -997,7 +999,12 @@ wire [PORT_COUNT*TX_TAG_WIDTH-1:0] axis_eth_tx_ptp_ts_tag;
|
||||
wire [PORT_COUNT-1:0] axis_eth_tx_ptp_ts_valid;
|
||||
wire [PORT_COUNT-1:0] axis_eth_tx_ptp_ts_ready;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_tx_enable;
|
||||
wire [PORT_COUNT-1:0] eth_tx_status;
|
||||
wire [PORT_COUNT-1:0] eth_tx_lfc_en;
|
||||
wire [PORT_COUNT-1:0] eth_tx_lfc_req;
|
||||
wire [PORT_COUNT*8-1:0] eth_tx_pfc_en;
|
||||
wire [PORT_COUNT*8-1:0] eth_tx_pfc_req;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_rx_clk;
|
||||
wire [PORT_COUNT-1:0] eth_rx_rst;
|
||||
@ -1012,7 +1019,14 @@ wire [PORT_COUNT-1:0] axis_eth_rx_tready;
|
||||
wire [PORT_COUNT-1:0] axis_eth_rx_tlast;
|
||||
wire [PORT_COUNT*AXIS_ETH_RX_USER_WIDTH-1:0] axis_eth_rx_tuser;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_rx_enable;
|
||||
wire [PORT_COUNT-1:0] eth_rx_status;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_en;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_req;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_ack;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_en;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_req;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_ack;
|
||||
|
||||
wire [PORT_COUNT-1:0] port_xgmii_tx_clk;
|
||||
wire [PORT_COUNT-1:0] port_xgmii_tx_rst;
|
||||
@ -1085,12 +1099,15 @@ generate
|
||||
.PTP_PERIOD_FNS(IF_PTP_PERIOD_FNS),
|
||||
.TX_PTP_TS_ENABLE(PTP_TS_ENABLE),
|
||||
.TX_PTP_TS_WIDTH(PTP_TS_WIDTH),
|
||||
.TX_PTP_TS_CTRL_IN_TUSER(0),
|
||||
.TX_PTP_TAG_ENABLE(PTP_TS_ENABLE),
|
||||
.TX_PTP_TAG_WIDTH(TX_TAG_WIDTH),
|
||||
.RX_PTP_TS_ENABLE(PTP_TS_ENABLE),
|
||||
.RX_PTP_TS_WIDTH(PTP_TS_WIDTH),
|
||||
.TX_USER_WIDTH(AXIS_ETH_TX_USER_WIDTH),
|
||||
.RX_USER_WIDTH(AXIS_ETH_RX_USER_WIDTH)
|
||||
.RX_USER_WIDTH(AXIS_ETH_RX_USER_WIDTH),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.PAUSE_ENABLE(LFC_ENABLE)
|
||||
)
|
||||
eth_mac_inst (
|
||||
.tx_clk(port_xgmii_tx_clk[n]),
|
||||
@ -1098,6 +1115,9 @@ generate
|
||||
.rx_clk(port_xgmii_rx_clk[n]),
|
||||
.rx_rst(port_xgmii_rx_rst[n]),
|
||||
|
||||
/*
|
||||
* AXI input
|
||||
*/
|
||||
.tx_axis_tdata(axis_eth_tx_tdata[n*AXIS_ETH_DATA_WIDTH +: AXIS_ETH_DATA_WIDTH]),
|
||||
.tx_axis_tkeep(axis_eth_tx_tkeep[n*AXIS_ETH_KEEP_WIDTH +: AXIS_ETH_KEEP_WIDTH]),
|
||||
.tx_axis_tvalid(axis_eth_tx_tvalid[n +: 1]),
|
||||
@ -1105,30 +1125,121 @@ generate
|
||||
.tx_axis_tlast(axis_eth_tx_tlast[n +: 1]),
|
||||
.tx_axis_tuser(axis_eth_tx_tuser[n*AXIS_ETH_TX_USER_WIDTH +: AXIS_ETH_TX_USER_WIDTH]),
|
||||
|
||||
/*
|
||||
* AXI output
|
||||
*/
|
||||
.rx_axis_tdata(axis_eth_rx_tdata[n*AXIS_ETH_DATA_WIDTH +: AXIS_ETH_DATA_WIDTH]),
|
||||
.rx_axis_tkeep(axis_eth_rx_tkeep[n*AXIS_ETH_KEEP_WIDTH +: AXIS_ETH_KEEP_WIDTH]),
|
||||
.rx_axis_tvalid(axis_eth_rx_tvalid[n +: 1]),
|
||||
.rx_axis_tlast(axis_eth_rx_tlast[n +: 1]),
|
||||
.rx_axis_tuser(axis_eth_rx_tuser[n*AXIS_ETH_RX_USER_WIDTH +: AXIS_ETH_RX_USER_WIDTH]),
|
||||
|
||||
/*
|
||||
* XGMII interface
|
||||
*/
|
||||
.xgmii_rxd(port_xgmii_rxd[n*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH]),
|
||||
.xgmii_rxc(port_xgmii_rxc[n*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH]),
|
||||
.xgmii_txd(port_xgmii_txd[n*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH]),
|
||||
.xgmii_txc(port_xgmii_txc[n*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH]),
|
||||
|
||||
/*
|
||||
* PTP
|
||||
*/
|
||||
.tx_ptp_ts(eth_tx_ptp_ts_96[n*PTP_TS_WIDTH +: PTP_TS_WIDTH]),
|
||||
.rx_ptp_ts(eth_rx_ptp_ts_96[n*PTP_TS_WIDTH +: PTP_TS_WIDTH]),
|
||||
.tx_axis_ptp_ts(axis_eth_tx_ptp_ts[n*PTP_TS_WIDTH +: PTP_TS_WIDTH]),
|
||||
.tx_axis_ptp_ts_tag(axis_eth_tx_ptp_ts_tag[n*TX_TAG_WIDTH +: TX_TAG_WIDTH]),
|
||||
.tx_axis_ptp_ts_valid(axis_eth_tx_ptp_ts_valid[n +: 1]),
|
||||
|
||||
/*
|
||||
* Link-level Flow Control (LFC) (IEEE 802.3 annex 31B PAUSE)
|
||||
*/
|
||||
.tx_lfc_req(eth_tx_lfc_req[n +: 1]),
|
||||
.tx_lfc_resend(1'b0),
|
||||
.rx_lfc_en(eth_rx_lfc_en[n +: 1]),
|
||||
.rx_lfc_req(eth_rx_lfc_req[n +: 1]),
|
||||
.rx_lfc_ack(eth_rx_lfc_ack[n +: 1]),
|
||||
|
||||
/*
|
||||
* Priority Flow Control (PFC) (IEEE 802.3 annex 31D PFC)
|
||||
*/
|
||||
.tx_pfc_req(eth_tx_pfc_req[n*8 +: 8]),
|
||||
.tx_pfc_resend(1'b0),
|
||||
.rx_pfc_en(eth_rx_pfc_en[n*8 +: 8]),
|
||||
.rx_pfc_req(eth_rx_pfc_req[n*8 +: 8]),
|
||||
.rx_pfc_ack(eth_rx_pfc_ack[n*8 +: 8]),
|
||||
|
||||
/*
|
||||
* Pause interface
|
||||
*/
|
||||
.tx_lfc_pause_en(1'b1),
|
||||
.tx_pause_req(1'b0),
|
||||
.tx_pause_ack(),
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
.tx_start_packet(),
|
||||
.tx_error_underflow(),
|
||||
.rx_start_packet(),
|
||||
.rx_error_bad_frame(),
|
||||
.rx_error_bad_fcs(),
|
||||
.stat_tx_mcf(),
|
||||
.stat_rx_mcf(),
|
||||
.stat_tx_lfc_pkt(),
|
||||
.stat_tx_lfc_xon(),
|
||||
.stat_tx_lfc_xoff(),
|
||||
.stat_tx_lfc_paused(),
|
||||
.stat_tx_pfc_pkt(),
|
||||
.stat_tx_pfc_xon(),
|
||||
.stat_tx_pfc_xoff(),
|
||||
.stat_tx_pfc_paused(),
|
||||
.stat_rx_lfc_pkt(),
|
||||
.stat_rx_lfc_xon(),
|
||||
.stat_rx_lfc_xoff(),
|
||||
.stat_rx_lfc_paused(),
|
||||
.stat_rx_pfc_pkt(),
|
||||
.stat_rx_pfc_xon(),
|
||||
.stat_rx_pfc_xoff(),
|
||||
.stat_rx_pfc_paused(),
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
.cfg_ifg(8'd12),
|
||||
.cfg_tx_enable(1'b1),
|
||||
.cfg_rx_enable(1'b1)
|
||||
.cfg_tx_enable(eth_tx_enable[n +: 1]),
|
||||
.cfg_rx_enable(eth_rx_enable[n +: 1]),
|
||||
.cfg_mcf_rx_eth_dst_mcast(48'h01_80_C2_00_00_01),
|
||||
.cfg_mcf_rx_check_eth_dst_mcast(1'b1),
|
||||
.cfg_mcf_rx_eth_dst_ucast(48'd0),
|
||||
.cfg_mcf_rx_check_eth_dst_ucast(1'b0),
|
||||
.cfg_mcf_rx_eth_src(48'd0),
|
||||
.cfg_mcf_rx_check_eth_src(1'b0),
|
||||
.cfg_mcf_rx_eth_type(16'h8808),
|
||||
.cfg_mcf_rx_opcode_lfc(16'h0001),
|
||||
.cfg_mcf_rx_check_opcode_lfc(eth_rx_lfc_en[n +: 1]),
|
||||
.cfg_mcf_rx_opcode_pfc(16'h0101),
|
||||
.cfg_mcf_rx_check_opcode_pfc(eth_rx_pfc_en[n*8 +: 8] != 0),
|
||||
.cfg_mcf_rx_forward(1'b0),
|
||||
.cfg_mcf_rx_enable(eth_rx_lfc_en[n +: 1] || eth_rx_pfc_en[n*8 +: 8]),
|
||||
.cfg_tx_lfc_eth_dst(48'h01_80_C2_00_00_01),
|
||||
.cfg_tx_lfc_eth_src(48'h80_23_31_43_54_4C),
|
||||
.cfg_tx_lfc_eth_type(16'h8808),
|
||||
.cfg_tx_lfc_opcode(16'h0001),
|
||||
.cfg_tx_lfc_en(eth_tx_lfc_en[n +: 1]),
|
||||
.cfg_tx_lfc_quanta(16'hffff),
|
||||
.cfg_tx_lfc_refresh(16'h7fff),
|
||||
.cfg_tx_pfc_eth_dst(48'h01_80_C2_00_00_01),
|
||||
.cfg_tx_pfc_eth_src(48'h80_23_31_43_54_4C),
|
||||
.cfg_tx_pfc_eth_type(16'h8808),
|
||||
.cfg_tx_pfc_opcode(16'h0101),
|
||||
.cfg_tx_pfc_en(eth_tx_pfc_en[n*8 +: 8] != 0),
|
||||
.cfg_tx_pfc_quanta({8{16'hffff}}),
|
||||
.cfg_tx_pfc_refresh({8{16'h7fff}}),
|
||||
.cfg_rx_lfc_opcode(16'h0001),
|
||||
.cfg_rx_lfc_en(eth_rx_lfc_en[n +: 1]),
|
||||
.cfg_rx_pfc_opcode(16'h0101),
|
||||
.cfg_rx_pfc_en(eth_rx_pfc_en[n*8 +: 8] != 0)
|
||||
);
|
||||
|
||||
end
|
||||
@ -1202,6 +1313,9 @@ mqnic_core_pcie_us #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.MAC_CTRL_ENABLE(0),
|
||||
.TX_FIFO_DEPTH(TX_FIFO_DEPTH),
|
||||
.RX_FIFO_DEPTH(RX_FIFO_DEPTH),
|
||||
.MAX_TX_SIZE(MAX_TX_SIZE),
|
||||
@ -1483,7 +1597,13 @@ core_inst (
|
||||
.s_axis_eth_tx_cpl_valid(axis_eth_tx_ptp_ts_valid),
|
||||
.s_axis_eth_tx_cpl_ready(axis_eth_tx_ptp_ts_ready),
|
||||
|
||||
.eth_tx_enable(eth_tx_enable),
|
||||
.eth_tx_status(eth_tx_status),
|
||||
.eth_tx_lfc_en(eth_tx_lfc_en),
|
||||
.eth_tx_lfc_req(eth_tx_lfc_req),
|
||||
.eth_tx_pfc_en(eth_tx_pfc_en),
|
||||
.eth_tx_pfc_req(eth_tx_pfc_req),
|
||||
.eth_tx_fc_quanta_clk_en(0),
|
||||
|
||||
.eth_rx_clk(eth_rx_clk),
|
||||
.eth_rx_rst(eth_rx_rst),
|
||||
@ -1500,7 +1620,15 @@ core_inst (
|
||||
.s_axis_eth_rx_tlast(axis_eth_rx_tlast),
|
||||
.s_axis_eth_rx_tuser(axis_eth_rx_tuser),
|
||||
|
||||
.eth_rx_enable(eth_rx_enable),
|
||||
.eth_rx_status(eth_rx_status),
|
||||
.eth_rx_lfc_en(eth_rx_lfc_en),
|
||||
.eth_rx_lfc_req(eth_rx_lfc_req),
|
||||
.eth_rx_lfc_ack(eth_rx_lfc_ack),
|
||||
.eth_rx_pfc_en(eth_rx_pfc_en),
|
||||
.eth_rx_pfc_req(eth_rx_pfc_req),
|
||||
.eth_rx_pfc_ack(eth_rx_pfc_ack),
|
||||
.eth_rx_fc_quanta_clk_en(0),
|
||||
|
||||
/*
|
||||
* DDR
|
||||
|
@ -63,6 +63,10 @@ VERILOG_SOURCES += ../../rtl/common/i2c_single_reg.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/eth_mac_10g.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/axis_xgmii_rx_64.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/axis_xgmii_tx_64.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/lfsr.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock_cdc.v
|
||||
@ -168,6 +172,8 @@ export PARAM_TX_CPL_FIFO_DEPTH := 32
|
||||
export PARAM_TX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_RX_HASH_ENABLE := 1
|
||||
export PARAM_RX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_LFC_ENABLE := 1
|
||||
export PARAM_PFC_ENABLE := $(PARAM_LFC_ENABLE)
|
||||
export PARAM_TX_FIFO_DEPTH := 32768
|
||||
export PARAM_RX_FIFO_DEPTH := 32768
|
||||
export PARAM_MAX_TX_SIZE := 9214
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
import logging
|
||||
import os
|
||||
import struct
|
||||
import sys
|
||||
|
||||
import scapy.utils
|
||||
@ -17,7 +18,7 @@ from cocotb.clock import Clock
|
||||
from cocotb.triggers import RisingEdge, FallingEdge, Timer
|
||||
|
||||
from cocotbext.axi import AxiStreamBus
|
||||
from cocotbext.eth import XgmiiSource, XgmiiSink
|
||||
from cocotbext.eth import XgmiiSource, XgmiiSink, XgmiiFrame
|
||||
from cocotbext.pcie.core import RootComplex
|
||||
from cocotbext.pcie.xilinx.us import UltraScalePlusPcieDevice
|
||||
|
||||
@ -530,6 +531,35 @@ async def run_test_nic(dut):
|
||||
|
||||
tb.loopback_enable = False
|
||||
|
||||
if tb.driver.interfaces[0].if_feature_lfc:
|
||||
tb.log.info("Test LFC pause frame RX")
|
||||
|
||||
await tb.driver.interfaces[0].ports[0].set_lfc_ctrl(mqnic.MQNIC_PORT_LFC_CTRL_TX_LFC_EN | mqnic.MQNIC_PORT_LFC_CTRL_RX_LFC_EN)
|
||||
await tb.driver.hw_regs.read_dword(0)
|
||||
|
||||
lfc_xoff = Ether(src='DA:D1:D2:D3:D4:D5', dst='01:80:C2:00:00:01', type=0x8808) / struct.pack('!HH', 0x0001, 2000)
|
||||
|
||||
await tb.qsfp_source[0][0].send(XgmiiFrame.from_payload(bytes(lfc_xoff)))
|
||||
|
||||
count = 16
|
||||
|
||||
pkts = [bytearray([(x+k) % 256 for x in range(1514)]) for k in range(count)]
|
||||
|
||||
tb.loopback_enable = True
|
||||
|
||||
for p in pkts:
|
||||
await tb.driver.interfaces[0].start_xmit(p, 0)
|
||||
|
||||
for k in range(count):
|
||||
pkt = await tb.driver.interfaces[0].recv()
|
||||
|
||||
tb.log.info("Packet: %s", pkt)
|
||||
assert pkt.data == pkts[k]
|
||||
if tb.driver.interfaces[0].if_feature_rx_csum:
|
||||
assert pkt.rx_checksum == ~scapy.utils.checksum(bytes(pkt.data[14:])) & 0xffff
|
||||
|
||||
tb.loopback_enable = False
|
||||
|
||||
await RisingEdge(dut.clk_250mhz)
|
||||
await RisingEdge(dut.clk_250mhz)
|
||||
|
||||
@ -603,6 +633,10 @@ def test_fpga_core(request):
|
||||
os.path.join(eth_rtl_dir, "eth_mac_10g.v"),
|
||||
os.path.join(eth_rtl_dir, "axis_xgmii_rx_64.v"),
|
||||
os.path.join(eth_rtl_dir, "axis_xgmii_tx_64.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "lfsr.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock_cdc.v"),
|
||||
@ -709,6 +743,8 @@ def test_fpga_core(request):
|
||||
parameters['TX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['RX_HASH_ENABLE'] = 1
|
||||
parameters['RX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['LFC_ENABLE'] = 1
|
||||
parameters['PFC_ENABLE'] = parameters['LFC_ENABLE']
|
||||
parameters['TX_FIFO_DEPTH'] = 32768
|
||||
parameters['RX_FIFO_DEPTH'] = 32768
|
||||
parameters['MAX_TX_SIZE'] = 9214
|
||||
|
@ -101,6 +101,8 @@ dict set params TX_CPL_FIFO_DEPTH "32"
|
||||
dict set params TX_CHECKSUM_ENABLE "1"
|
||||
dict set params RX_HASH_ENABLE "1"
|
||||
dict set params RX_CHECKSUM_ENABLE "1"
|
||||
dict set params PFC_ENABLE "1"
|
||||
dict set params LFC_ENABLE [dict get $params PFC_ENABLE]
|
||||
dict set params TX_FIFO_DEPTH "32768"
|
||||
dict set params RX_FIFO_DEPTH "131072"
|
||||
dict set params MAX_TX_SIZE "9214"
|
||||
|
@ -101,6 +101,8 @@ dict set params TX_CPL_FIFO_DEPTH "32"
|
||||
dict set params TX_CHECKSUM_ENABLE "1"
|
||||
dict set params RX_HASH_ENABLE "1"
|
||||
dict set params RX_CHECKSUM_ENABLE "1"
|
||||
dict set params PFC_ENABLE "1"
|
||||
dict set params LFC_ENABLE [dict get $params PFC_ENABLE]
|
||||
dict set params TX_FIFO_DEPTH "32768"
|
||||
dict set params RX_FIFO_DEPTH "131072"
|
||||
dict set params MAX_TX_SIZE "9214"
|
||||
|
@ -7,8 +7,10 @@ set_property -dict [list \
|
||||
CONFIG.USER_INTERFACE {AXIS} \
|
||||
CONFIG.GT_DRP_CLK {125} \
|
||||
CONFIG.GT_LOCATION {0} \
|
||||
CONFIG.TX_FLOW_CONTROL {0} \
|
||||
CONFIG.RX_FLOW_CONTROL {0} \
|
||||
CONFIG.TX_FLOW_CONTROL {1} \
|
||||
CONFIG.RX_FLOW_CONTROL {1} \
|
||||
CONFIG.RX_FORWARD_CONTROL_FRAMES {0} \
|
||||
CONFIG.RX_CHECK_ACK {1} \
|
||||
CONFIG.INCLUDE_RS_FEC {1} \
|
||||
CONFIG.ENABLE_TIME_STAMPING {1}
|
||||
] [get_ips cmac_usplus]
|
||||
|
@ -71,6 +71,8 @@ module fpga #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter TX_FIFO_DEPTH = 32768,
|
||||
parameter RX_FIFO_DEPTH = 131072,
|
||||
parameter MAX_TX_SIZE = 9214,
|
||||
@ -1109,7 +1111,20 @@ wire qsfp0_drp_we;
|
||||
wire [15:0] qsfp0_drp_do;
|
||||
wire qsfp0_drp_rdy;
|
||||
|
||||
wire qsfp0_rx_status;
|
||||
wire qsfp0_tx_enable;
|
||||
wire qsfp0_tx_lfc_en;
|
||||
wire qsfp0_tx_lfc_req;
|
||||
wire [7:0] qsfp0_tx_pfc_en;
|
||||
wire [7:0] qsfp0_tx_pfc_req;
|
||||
|
||||
wire qsfp0_rx_enable;
|
||||
wire qsfp0_rx_status;
|
||||
wire qsfp0_rx_lfc_en;
|
||||
wire qsfp0_rx_lfc_req;
|
||||
wire qsfp0_rx_lfc_ack;
|
||||
wire [7:0] qsfp0_rx_pfc_en;
|
||||
wire [7:0] qsfp0_rx_pfc_req;
|
||||
wire [7:0] qsfp0_rx_pfc_ack;
|
||||
|
||||
wire qsfp0_gtpowergood;
|
||||
|
||||
@ -1204,6 +1219,12 @@ qsfp0_cmac_inst (
|
||||
.tx_ptp_ts_tag(qsfp0_tx_ptp_ts_tag_int),
|
||||
.tx_ptp_ts_valid(qsfp0_tx_ptp_ts_valid_int),
|
||||
|
||||
.tx_enable(qsfp0_tx_enable),
|
||||
.tx_lfc_en(qsfp0_tx_lfc_en),
|
||||
.tx_lfc_req(qsfp0_tx_lfc_req),
|
||||
.tx_pfc_en(qsfp0_tx_pfc_en),
|
||||
.tx_pfc_req(qsfp0_tx_pfc_req),
|
||||
|
||||
.rx_clk(qsfp0_rx_clk_int),
|
||||
.rx_rst(qsfp0_rx_rst_int),
|
||||
|
||||
@ -1217,7 +1238,14 @@ qsfp0_cmac_inst (
|
||||
.rx_ptp_rst(qsfp0_rx_ptp_rst_int),
|
||||
.rx_ptp_time(qsfp0_rx_ptp_time_int),
|
||||
|
||||
.rx_status(qsfp0_rx_status)
|
||||
.rx_enable(qsfp0_rx_enable),
|
||||
.rx_status(qsfp0_rx_status),
|
||||
.rx_lfc_en(qsfp0_rx_lfc_en),
|
||||
.rx_lfc_req(qsfp0_rx_lfc_req),
|
||||
.rx_lfc_ack(qsfp0_rx_lfc_ack),
|
||||
.rx_pfc_en(qsfp0_rx_pfc_en),
|
||||
.rx_pfc_req(qsfp0_rx_pfc_req),
|
||||
.rx_pfc_ack(qsfp0_rx_pfc_ack)
|
||||
);
|
||||
|
||||
// QSFP1 CMAC
|
||||
@ -1261,7 +1289,20 @@ wire qsfp1_drp_we;
|
||||
wire [15:0] qsfp1_drp_do;
|
||||
wire qsfp1_drp_rdy;
|
||||
|
||||
wire qsfp1_rx_status;
|
||||
wire qsfp1_tx_enable;
|
||||
wire qsfp1_tx_lfc_en;
|
||||
wire qsfp1_tx_lfc_req;
|
||||
wire [7:0] qsfp1_tx_pfc_en;
|
||||
wire [7:0] qsfp1_tx_pfc_req;
|
||||
|
||||
wire qsfp1_rx_enable;
|
||||
wire qsfp1_rx_status;
|
||||
wire qsfp1_rx_lfc_en;
|
||||
wire qsfp1_rx_lfc_req;
|
||||
wire qsfp1_rx_lfc_ack;
|
||||
wire [7:0] qsfp1_rx_pfc_en;
|
||||
wire [7:0] qsfp1_rx_pfc_req;
|
||||
wire [7:0] qsfp1_rx_pfc_ack;
|
||||
|
||||
wire qsfp1_gtpowergood;
|
||||
|
||||
@ -1354,6 +1395,12 @@ qsfp1_cmac_inst (
|
||||
.tx_ptp_ts_tag(qsfp1_tx_ptp_ts_tag_int),
|
||||
.tx_ptp_ts_valid(qsfp1_tx_ptp_ts_valid_int),
|
||||
|
||||
.tx_enable(qsfp1_tx_enable),
|
||||
.tx_lfc_en(qsfp1_tx_lfc_en),
|
||||
.tx_lfc_req(qsfp1_tx_lfc_req),
|
||||
.tx_pfc_en(qsfp1_tx_pfc_en),
|
||||
.tx_pfc_req(qsfp1_tx_pfc_req),
|
||||
|
||||
.rx_clk(qsfp1_rx_clk_int),
|
||||
.rx_rst(qsfp1_rx_rst_int),
|
||||
|
||||
@ -1367,7 +1414,14 @@ qsfp1_cmac_inst (
|
||||
.rx_ptp_rst(qsfp1_rx_ptp_rst_int),
|
||||
.rx_ptp_time(qsfp1_rx_ptp_time_int),
|
||||
|
||||
.rx_status(qsfp1_rx_status)
|
||||
.rx_enable(qsfp1_rx_enable),
|
||||
.rx_status(qsfp1_rx_status),
|
||||
.rx_lfc_en(qsfp1_rx_lfc_en),
|
||||
.rx_lfc_req(qsfp1_rx_lfc_req),
|
||||
.rx_lfc_ack(qsfp1_rx_lfc_ack),
|
||||
.rx_pfc_en(qsfp1_rx_pfc_en),
|
||||
.rx_pfc_req(qsfp1_rx_pfc_req),
|
||||
.rx_pfc_ack(qsfp1_rx_pfc_ack)
|
||||
);
|
||||
|
||||
wire ptp_clk;
|
||||
@ -2001,6 +2055,8 @@ fpga_core #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.TX_FIFO_DEPTH(TX_FIFO_DEPTH),
|
||||
.RX_FIFO_DEPTH(RX_FIFO_DEPTH),
|
||||
.MAX_TX_SIZE(MAX_TX_SIZE),
|
||||
@ -2205,6 +2261,12 @@ core_inst (
|
||||
.qsfp0_tx_ptp_ts_tag(qsfp0_tx_ptp_ts_tag_int),
|
||||
.qsfp0_tx_ptp_ts_valid(qsfp0_tx_ptp_ts_valid_int),
|
||||
|
||||
.qsfp0_tx_enable(qsfp0_tx_enable),
|
||||
.qsfp0_tx_lfc_en(qsfp0_tx_lfc_en),
|
||||
.qsfp0_tx_lfc_req(qsfp0_tx_lfc_req),
|
||||
.qsfp0_tx_pfc_en(qsfp0_tx_pfc_en),
|
||||
.qsfp0_tx_pfc_req(qsfp0_tx_pfc_req),
|
||||
|
||||
.qsfp0_rx_clk(qsfp0_rx_clk_int),
|
||||
.qsfp0_rx_rst(qsfp0_rx_rst_int),
|
||||
.qsfp0_rx_axis_tdata(qsfp0_rx_axis_tdata_int),
|
||||
@ -2216,7 +2278,14 @@ core_inst (
|
||||
.qsfp0_rx_ptp_rst(qsfp0_rx_ptp_rst_int),
|
||||
.qsfp0_rx_ptp_time(qsfp0_rx_ptp_time_int),
|
||||
|
||||
.qsfp0_rx_enable(qsfp0_rx_enable),
|
||||
.qsfp0_rx_status(qsfp0_rx_status),
|
||||
.qsfp0_rx_lfc_en(qsfp0_rx_lfc_en),
|
||||
.qsfp0_rx_lfc_req(qsfp0_rx_lfc_req),
|
||||
.qsfp0_rx_lfc_ack(qsfp0_rx_lfc_ack),
|
||||
.qsfp0_rx_pfc_en(qsfp0_rx_pfc_en),
|
||||
.qsfp0_rx_pfc_req(qsfp0_rx_pfc_req),
|
||||
.qsfp0_rx_pfc_ack(qsfp0_rx_pfc_ack),
|
||||
|
||||
.qsfp0_drp_clk(qsfp0_drp_clk),
|
||||
.qsfp0_drp_rst(qsfp0_drp_rst),
|
||||
@ -2246,6 +2315,12 @@ core_inst (
|
||||
.qsfp1_tx_ptp_ts_tag(qsfp1_tx_ptp_ts_tag_int),
|
||||
.qsfp1_tx_ptp_ts_valid(qsfp1_tx_ptp_ts_valid_int),
|
||||
|
||||
.qsfp1_tx_enable(qsfp1_tx_enable),
|
||||
.qsfp1_tx_lfc_en(qsfp1_tx_lfc_en),
|
||||
.qsfp1_tx_lfc_req(qsfp1_tx_lfc_req),
|
||||
.qsfp1_tx_pfc_en(qsfp1_tx_pfc_en),
|
||||
.qsfp1_tx_pfc_req(qsfp1_tx_pfc_req),
|
||||
|
||||
.qsfp1_rx_clk(qsfp1_rx_clk_int),
|
||||
.qsfp1_rx_rst(qsfp1_rx_rst_int),
|
||||
.qsfp1_rx_axis_tdata(qsfp1_rx_axis_tdata_int),
|
||||
@ -2257,7 +2332,14 @@ core_inst (
|
||||
.qsfp1_rx_ptp_rst(qsfp1_rx_ptp_rst_int),
|
||||
.qsfp1_rx_ptp_time(qsfp1_rx_ptp_time_int),
|
||||
|
||||
.qsfp1_rx_enable(qsfp1_rx_enable),
|
||||
.qsfp1_rx_status(qsfp1_rx_status),
|
||||
.qsfp1_rx_lfc_en(qsfp1_rx_lfc_en),
|
||||
.qsfp1_rx_lfc_req(qsfp1_rx_lfc_req),
|
||||
.qsfp1_rx_lfc_ack(qsfp1_rx_lfc_ack),
|
||||
.qsfp1_rx_pfc_en(qsfp1_rx_pfc_en),
|
||||
.qsfp1_rx_pfc_req(qsfp1_rx_pfc_req),
|
||||
.qsfp1_rx_pfc_ack(qsfp1_rx_pfc_ack),
|
||||
|
||||
.qsfp1_drp_clk(qsfp1_drp_clk),
|
||||
.qsfp1_drp_rst(qsfp1_drp_rst),
|
||||
|
@ -77,6 +77,8 @@ module fpga_core #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter TX_FIFO_DEPTH = 32768,
|
||||
parameter RX_FIFO_DEPTH = 131072,
|
||||
parameter MAX_TX_SIZE = 9214,
|
||||
@ -283,6 +285,12 @@ module fpga_core #
|
||||
input wire [15:0] qsfp0_tx_ptp_ts_tag,
|
||||
input wire qsfp0_tx_ptp_ts_valid,
|
||||
|
||||
output wire qsfp0_tx_enable,
|
||||
output wire qsfp0_tx_lfc_en,
|
||||
output wire qsfp0_tx_lfc_req,
|
||||
output wire [7:0] qsfp0_tx_pfc_en,
|
||||
output wire [7:0] qsfp0_tx_pfc_req,
|
||||
|
||||
input wire qsfp0_rx_clk,
|
||||
input wire qsfp0_rx_rst,
|
||||
|
||||
@ -296,7 +304,14 @@ module fpga_core #
|
||||
input wire qsfp0_rx_ptp_rst,
|
||||
output wire [79:0] qsfp0_rx_ptp_time,
|
||||
|
||||
output wire qsfp0_rx_enable,
|
||||
input wire qsfp0_rx_status,
|
||||
output wire qsfp0_rx_lfc_en,
|
||||
input wire qsfp0_rx_lfc_req,
|
||||
output wire qsfp0_rx_lfc_ack,
|
||||
output wire [7:0] qsfp0_rx_pfc_en,
|
||||
input wire [7:0] qsfp0_rx_pfc_req,
|
||||
output wire [7:0] qsfp0_rx_pfc_ack,
|
||||
|
||||
input wire qsfp0_drp_clk,
|
||||
input wire qsfp0_drp_rst,
|
||||
@ -328,6 +343,12 @@ module fpga_core #
|
||||
input wire [15:0] qsfp1_tx_ptp_ts_tag,
|
||||
input wire qsfp1_tx_ptp_ts_valid,
|
||||
|
||||
output wire qsfp1_tx_enable,
|
||||
output wire qsfp1_tx_lfc_en,
|
||||
output wire qsfp1_tx_lfc_req,
|
||||
output wire [7:0] qsfp1_tx_pfc_en,
|
||||
output wire [7:0] qsfp1_tx_pfc_req,
|
||||
|
||||
input wire qsfp1_rx_clk,
|
||||
input wire qsfp1_rx_rst,
|
||||
|
||||
@ -341,7 +362,14 @@ module fpga_core #
|
||||
input wire qsfp1_rx_ptp_rst,
|
||||
output wire [79:0] qsfp1_rx_ptp_time,
|
||||
|
||||
output wire qsfp1_rx_enable,
|
||||
input wire qsfp1_rx_status,
|
||||
output wire qsfp1_rx_lfc_en,
|
||||
input wire qsfp1_rx_lfc_req,
|
||||
output wire qsfp1_rx_lfc_ack,
|
||||
output wire [7:0] qsfp1_rx_pfc_en,
|
||||
input wire [7:0] qsfp1_rx_pfc_req,
|
||||
output wire [7:0] qsfp1_rx_pfc_ack,
|
||||
|
||||
input wire qsfp1_drp_clk,
|
||||
input wire qsfp1_drp_rst,
|
||||
@ -837,7 +865,12 @@ wire [PORT_COUNT*TX_TAG_WIDTH-1:0] axis_eth_tx_ptp_ts_tag;
|
||||
wire [PORT_COUNT-1:0] axis_eth_tx_ptp_ts_valid;
|
||||
wire [PORT_COUNT-1:0] axis_eth_tx_ptp_ts_ready;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_tx_enable;
|
||||
wire [PORT_COUNT-1:0] eth_tx_status;
|
||||
wire [PORT_COUNT-1:0] eth_tx_lfc_en;
|
||||
wire [PORT_COUNT-1:0] eth_tx_lfc_req;
|
||||
wire [PORT_COUNT*8-1:0] eth_tx_pfc_en;
|
||||
wire [PORT_COUNT*8-1:0] eth_tx_pfc_req;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_rx_clk;
|
||||
wire [PORT_COUNT-1:0] eth_rx_rst;
|
||||
@ -854,7 +887,14 @@ wire [PORT_COUNT-1:0] axis_eth_rx_tready;
|
||||
wire [PORT_COUNT-1:0] axis_eth_rx_tlast;
|
||||
wire [PORT_COUNT*AXIS_ETH_RX_USER_WIDTH-1:0] axis_eth_rx_tuser;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_rx_enable;
|
||||
wire [PORT_COUNT-1:0] eth_rx_status;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_en;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_req;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_ack;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_en;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_req;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_ack;
|
||||
|
||||
wire [PTP_TS_WIDTH-1:0] qsfp0_tx_ptp_time_int;
|
||||
wire [PTP_TS_WIDTH-1:0] qsfp1_tx_ptp_time_int;
|
||||
@ -905,7 +945,12 @@ mqnic_port_map_mac_axis_inst (
|
||||
.s_axis_mac_tx_ptp_ts_valid({qsfp1_tx_ptp_ts_valid, qsfp0_tx_ptp_ts_valid}),
|
||||
.s_axis_mac_tx_ptp_ts_ready(),
|
||||
|
||||
.mac_tx_enable({qsfp1_tx_enable, qsfp0_tx_enable}),
|
||||
.mac_tx_status(2'b11),
|
||||
.mac_tx_lfc_en({qsfp1_tx_lfc_en, qsfp0_tx_lfc_en}),
|
||||
.mac_tx_lfc_req({qsfp1_tx_lfc_req, qsfp0_tx_lfc_req}),
|
||||
.mac_tx_pfc_en({qsfp1_tx_pfc_en, qsfp0_tx_pfc_en}),
|
||||
.mac_tx_pfc_req({qsfp1_tx_pfc_req, qsfp0_tx_pfc_req}),
|
||||
|
||||
.mac_rx_clk({qsfp1_rx_clk, qsfp0_rx_clk}),
|
||||
.mac_rx_rst({qsfp1_rx_rst, qsfp0_rx_rst}),
|
||||
@ -922,7 +967,14 @@ mqnic_port_map_mac_axis_inst (
|
||||
.s_axis_mac_rx_tlast({qsfp1_rx_axis_tlast, qsfp0_rx_axis_tlast}),
|
||||
.s_axis_mac_rx_tuser({{qsfp1_rx_axis_tuser[80:1], 16'd0, qsfp1_rx_axis_tuser[0]}, {qsfp0_rx_axis_tuser[80:1], 16'd0, qsfp0_rx_axis_tuser[0]}}),
|
||||
|
||||
.mac_rx_enable({qsfp1_rx_enable, qsfp0_rx_enable}),
|
||||
.mac_rx_status({qsfp1_rx_status, qsfp0_rx_status}),
|
||||
.mac_rx_lfc_en({qsfp1_rx_lfc_en, qsfp0_rx_lfc_en}),
|
||||
.mac_rx_lfc_req({qsfp1_rx_lfc_req, qsfp0_rx_lfc_req}),
|
||||
.mac_rx_lfc_ack({qsfp1_rx_lfc_ack, qsfp0_rx_lfc_ack}),
|
||||
.mac_rx_pfc_en({qsfp1_rx_pfc_en, qsfp0_rx_pfc_en}),
|
||||
.mac_rx_pfc_req({qsfp1_rx_pfc_req, qsfp0_rx_pfc_req}),
|
||||
.mac_rx_pfc_ack({qsfp1_rx_pfc_ack, qsfp0_rx_pfc_ack}),
|
||||
|
||||
// towards datapath
|
||||
.tx_clk(eth_tx_clk),
|
||||
@ -945,7 +997,12 @@ mqnic_port_map_mac_axis_inst (
|
||||
.m_axis_tx_ptp_ts_valid(axis_eth_tx_ptp_ts_valid),
|
||||
.m_axis_tx_ptp_ts_ready(axis_eth_tx_ptp_ts_ready),
|
||||
|
||||
.tx_enable(eth_tx_enable),
|
||||
.tx_status(eth_tx_status),
|
||||
.tx_lfc_en(eth_tx_lfc_en),
|
||||
.tx_lfc_req(eth_tx_lfc_req),
|
||||
.tx_pfc_en(eth_tx_pfc_en),
|
||||
.tx_pfc_req(eth_tx_pfc_req),
|
||||
|
||||
.rx_clk(eth_rx_clk),
|
||||
.rx_rst(eth_rx_rst),
|
||||
@ -962,7 +1019,14 @@ mqnic_port_map_mac_axis_inst (
|
||||
.m_axis_rx_tlast(axis_eth_rx_tlast),
|
||||
.m_axis_rx_tuser(axis_eth_rx_tuser),
|
||||
|
||||
.rx_status(eth_rx_status)
|
||||
.rx_enable(eth_rx_enable),
|
||||
.rx_status(eth_rx_status),
|
||||
.rx_lfc_en(eth_rx_lfc_en),
|
||||
.rx_lfc_req(eth_rx_lfc_req),
|
||||
.rx_lfc_ack(eth_rx_lfc_ack),
|
||||
.rx_pfc_en(eth_rx_pfc_en),
|
||||
.rx_pfc_req(eth_rx_pfc_req),
|
||||
.rx_pfc_ack(eth_rx_pfc_ack)
|
||||
);
|
||||
|
||||
mqnic_core_pcie_us #(
|
||||
@ -1032,6 +1096,9 @@ mqnic_core_pcie_us #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.MAC_CTRL_ENABLE(0),
|
||||
.TX_FIFO_DEPTH(TX_FIFO_DEPTH),
|
||||
.RX_FIFO_DEPTH(RX_FIFO_DEPTH),
|
||||
.MAX_TX_SIZE(MAX_TX_SIZE),
|
||||
@ -1313,7 +1380,13 @@ core_inst (
|
||||
.s_axis_eth_tx_cpl_valid(axis_eth_tx_ptp_ts_valid),
|
||||
.s_axis_eth_tx_cpl_ready(axis_eth_tx_ptp_ts_ready),
|
||||
|
||||
.eth_tx_enable(eth_tx_enable),
|
||||
.eth_tx_status(eth_tx_status),
|
||||
.eth_tx_lfc_en(eth_tx_lfc_en),
|
||||
.eth_tx_lfc_req(eth_tx_lfc_req),
|
||||
.eth_tx_pfc_en(eth_tx_pfc_en),
|
||||
.eth_tx_pfc_req(eth_tx_pfc_req),
|
||||
.eth_tx_fc_quanta_clk_en(0),
|
||||
|
||||
.eth_rx_clk(eth_rx_clk),
|
||||
.eth_rx_rst(eth_rx_rst),
|
||||
@ -1330,7 +1403,15 @@ core_inst (
|
||||
.s_axis_eth_rx_tlast(axis_eth_rx_tlast),
|
||||
.s_axis_eth_rx_tuser(axis_eth_rx_tuser),
|
||||
|
||||
.eth_rx_enable(eth_rx_enable),
|
||||
.eth_rx_status(eth_rx_status),
|
||||
.eth_rx_lfc_en(eth_rx_lfc_en),
|
||||
.eth_rx_lfc_req(eth_rx_lfc_req),
|
||||
.eth_rx_lfc_ack(eth_rx_lfc_ack),
|
||||
.eth_rx_pfc_en(eth_rx_pfc_en),
|
||||
.eth_rx_pfc_req(eth_rx_pfc_req),
|
||||
.eth_rx_pfc_ack(eth_rx_pfc_ack),
|
||||
.eth_rx_fc_quanta_clk_en(0),
|
||||
|
||||
/*
|
||||
* DDR
|
||||
|
@ -161,6 +161,8 @@ export PARAM_TX_CPL_FIFO_DEPTH := 32
|
||||
export PARAM_TX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_RX_HASH_ENABLE := 1
|
||||
export PARAM_RX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_LFC_ENABLE := 1
|
||||
export PARAM_PFC_ENABLE := $(PARAM_LFC_ENABLE)
|
||||
export PARAM_TX_FIFO_DEPTH := 32768
|
||||
export PARAM_RX_FIFO_DEPTH := 131072
|
||||
export PARAM_MAX_TX_SIZE := 9214
|
||||
|
@ -300,6 +300,8 @@ class TB(object):
|
||||
self.qsfp_mac.append(mac)
|
||||
|
||||
getattr(dut, f"qsfp{k}_rx_status").setimmediatevalue(1)
|
||||
getattr(dut, f"qsfp{k}_rx_lfc_req").setimmediatevalue(0)
|
||||
getattr(dut, f"qsfp{k}_rx_pfc_req").setimmediatevalue(0)
|
||||
|
||||
cocotb.start_soon(Clock(getattr(dut, f"qsfp{k}_drp_clk"), 8, units="ns").start())
|
||||
getattr(dut, f"qsfp{k}_drp_rst").setimmediatevalue(0)
|
||||
@ -307,7 +309,7 @@ class TB(object):
|
||||
getattr(dut, f"qsfp{k}_drp_rdy").setimmediatevalue(0)
|
||||
|
||||
getattr(dut, f"qsfp{k}_modprsl").setimmediatevalue(0)
|
||||
getattr(dut, f"qsfp{k}_intl").setimmediatevalue(0)
|
||||
getattr(dut, f"qsfp{k}_intl").setimmediatevalue(1)
|
||||
|
||||
dut.sw.setimmediatevalue(0)
|
||||
|
||||
@ -723,6 +725,8 @@ def test_fpga_core(request):
|
||||
parameters['TX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['RX_HASH_ENABLE'] = 1
|
||||
parameters['RX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['LFC_ENABLE'] = 1
|
||||
parameters['PFC_ENABLE'] = parameters['LFC_ENABLE']
|
||||
parameters['TX_FIFO_DEPTH'] = 32768
|
||||
parameters['RX_FIFO_DEPTH'] = 131072
|
||||
parameters['MAX_TX_SIZE'] = 9214
|
||||
|
@ -62,6 +62,10 @@ SYN_FILES += rtl/common/tdma_ber_ch.v
|
||||
SYN_FILES += lib/eth/rtl/eth_mac_10g.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_rx_64.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_tx_64.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx_if.v
|
||||
|
@ -113,6 +113,8 @@ dict set params TX_CPL_FIFO_DEPTH "32"
|
||||
dict set params TX_CHECKSUM_ENABLE "1"
|
||||
dict set params RX_HASH_ENABLE "1"
|
||||
dict set params RX_CHECKSUM_ENABLE "1"
|
||||
dict set params PFC_ENABLE "1"
|
||||
dict set params LFC_ENABLE [dict get $params PFC_ENABLE]
|
||||
dict set params ENABLE_PADDING "1"
|
||||
dict set params ENABLE_DIC "1"
|
||||
dict set params MIN_FRAME_LENGTH "64"
|
||||
|
@ -62,6 +62,10 @@ SYN_FILES += rtl/common/tdma_ber_ch.v
|
||||
SYN_FILES += lib/eth/rtl/eth_mac_10g.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_rx_64.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_tx_64.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx_if.v
|
||||
|
@ -113,6 +113,8 @@ dict set params TX_CPL_FIFO_DEPTH "32"
|
||||
dict set params TX_CHECKSUM_ENABLE "1"
|
||||
dict set params RX_HASH_ENABLE "1"
|
||||
dict set params RX_CHECKSUM_ENABLE "1"
|
||||
dict set params PFC_ENABLE "1"
|
||||
dict set params LFC_ENABLE [dict get $params PFC_ENABLE]
|
||||
dict set params ENABLE_PADDING "1"
|
||||
dict set params ENABLE_DIC "1"
|
||||
dict set params MIN_FRAME_LENGTH "64"
|
||||
|
@ -74,6 +74,8 @@ module fpga #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter ENABLE_PADDING = 1,
|
||||
parameter ENABLE_DIC = 1,
|
||||
parameter MIN_FRAME_LENGTH = 64,
|
||||
@ -2137,6 +2139,8 @@ fpga_core #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.ENABLE_PADDING(ENABLE_PADDING),
|
||||
.ENABLE_DIC(ENABLE_DIC),
|
||||
.MIN_FRAME_LENGTH(MIN_FRAME_LENGTH),
|
||||
|
@ -81,6 +81,8 @@ module fpga_core #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter ENABLE_PADDING = 1,
|
||||
parameter ENABLE_DIC = 1,
|
||||
parameter MIN_FRAME_LENGTH = 64,
|
||||
@ -979,7 +981,12 @@ wire [PORT_COUNT*TX_TAG_WIDTH-1:0] axis_eth_tx_ptp_ts_tag;
|
||||
wire [PORT_COUNT-1:0] axis_eth_tx_ptp_ts_valid;
|
||||
wire [PORT_COUNT-1:0] axis_eth_tx_ptp_ts_ready;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_tx_enable;
|
||||
wire [PORT_COUNT-1:0] eth_tx_status;
|
||||
wire [PORT_COUNT-1:0] eth_tx_lfc_en;
|
||||
wire [PORT_COUNT-1:0] eth_tx_lfc_req;
|
||||
wire [PORT_COUNT*8-1:0] eth_tx_pfc_en;
|
||||
wire [PORT_COUNT*8-1:0] eth_tx_pfc_req;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_rx_clk;
|
||||
wire [PORT_COUNT-1:0] eth_rx_rst;
|
||||
@ -994,7 +1001,14 @@ wire [PORT_COUNT-1:0] axis_eth_rx_tready;
|
||||
wire [PORT_COUNT-1:0] axis_eth_rx_tlast;
|
||||
wire [PORT_COUNT*AXIS_ETH_RX_USER_WIDTH-1:0] axis_eth_rx_tuser;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_rx_enable;
|
||||
wire [PORT_COUNT-1:0] eth_rx_status;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_en;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_req;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_ack;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_en;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_req;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_ack;
|
||||
|
||||
wire [PORT_COUNT-1:0] port_xgmii_tx_clk;
|
||||
wire [PORT_COUNT-1:0] port_xgmii_tx_rst;
|
||||
@ -1067,12 +1081,15 @@ generate
|
||||
.PTP_PERIOD_FNS(IF_PTP_PERIOD_FNS),
|
||||
.TX_PTP_TS_ENABLE(PTP_TS_ENABLE),
|
||||
.TX_PTP_TS_WIDTH(PTP_TS_WIDTH),
|
||||
.TX_PTP_TS_CTRL_IN_TUSER(0),
|
||||
.TX_PTP_TAG_ENABLE(PTP_TS_ENABLE),
|
||||
.TX_PTP_TAG_WIDTH(TX_TAG_WIDTH),
|
||||
.RX_PTP_TS_ENABLE(PTP_TS_ENABLE),
|
||||
.RX_PTP_TS_WIDTH(PTP_TS_WIDTH),
|
||||
.TX_USER_WIDTH(AXIS_ETH_TX_USER_WIDTH),
|
||||
.RX_USER_WIDTH(AXIS_ETH_RX_USER_WIDTH)
|
||||
.RX_USER_WIDTH(AXIS_ETH_RX_USER_WIDTH),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.PAUSE_ENABLE(LFC_ENABLE)
|
||||
)
|
||||
eth_mac_inst (
|
||||
.tx_clk(port_xgmii_tx_clk[n]),
|
||||
@ -1080,6 +1097,9 @@ generate
|
||||
.rx_clk(port_xgmii_rx_clk[n]),
|
||||
.rx_rst(port_xgmii_rx_rst[n]),
|
||||
|
||||
/*
|
||||
* AXI input
|
||||
*/
|
||||
.tx_axis_tdata(axis_eth_tx_tdata[n*AXIS_ETH_DATA_WIDTH +: AXIS_ETH_DATA_WIDTH]),
|
||||
.tx_axis_tkeep(axis_eth_tx_tkeep[n*AXIS_ETH_KEEP_WIDTH +: AXIS_ETH_KEEP_WIDTH]),
|
||||
.tx_axis_tvalid(axis_eth_tx_tvalid[n +: 1]),
|
||||
@ -1087,30 +1107,121 @@ generate
|
||||
.tx_axis_tlast(axis_eth_tx_tlast[n +: 1]),
|
||||
.tx_axis_tuser(axis_eth_tx_tuser[n*AXIS_ETH_TX_USER_WIDTH +: AXIS_ETH_TX_USER_WIDTH]),
|
||||
|
||||
/*
|
||||
* AXI output
|
||||
*/
|
||||
.rx_axis_tdata(axis_eth_rx_tdata[n*AXIS_ETH_DATA_WIDTH +: AXIS_ETH_DATA_WIDTH]),
|
||||
.rx_axis_tkeep(axis_eth_rx_tkeep[n*AXIS_ETH_KEEP_WIDTH +: AXIS_ETH_KEEP_WIDTH]),
|
||||
.rx_axis_tvalid(axis_eth_rx_tvalid[n +: 1]),
|
||||
.rx_axis_tlast(axis_eth_rx_tlast[n +: 1]),
|
||||
.rx_axis_tuser(axis_eth_rx_tuser[n*AXIS_ETH_RX_USER_WIDTH +: AXIS_ETH_RX_USER_WIDTH]),
|
||||
|
||||
/*
|
||||
* XGMII interface
|
||||
*/
|
||||
.xgmii_rxd(port_xgmii_rxd[n*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH]),
|
||||
.xgmii_rxc(port_xgmii_rxc[n*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH]),
|
||||
.xgmii_txd(port_xgmii_txd[n*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH]),
|
||||
.xgmii_txc(port_xgmii_txc[n*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH]),
|
||||
|
||||
/*
|
||||
* PTP
|
||||
*/
|
||||
.tx_ptp_ts(eth_tx_ptp_ts_96[n*PTP_TS_WIDTH +: PTP_TS_WIDTH]),
|
||||
.rx_ptp_ts(eth_rx_ptp_ts_96[n*PTP_TS_WIDTH +: PTP_TS_WIDTH]),
|
||||
.tx_axis_ptp_ts(axis_eth_tx_ptp_ts[n*PTP_TS_WIDTH +: PTP_TS_WIDTH]),
|
||||
.tx_axis_ptp_ts_tag(axis_eth_tx_ptp_ts_tag[n*TX_TAG_WIDTH +: TX_TAG_WIDTH]),
|
||||
.tx_axis_ptp_ts_valid(axis_eth_tx_ptp_ts_valid[n +: 1]),
|
||||
|
||||
/*
|
||||
* Link-level Flow Control (LFC) (IEEE 802.3 annex 31B PAUSE)
|
||||
*/
|
||||
.tx_lfc_req(eth_tx_lfc_req[n +: 1]),
|
||||
.tx_lfc_resend(1'b0),
|
||||
.rx_lfc_en(eth_rx_lfc_en[n +: 1]),
|
||||
.rx_lfc_req(eth_rx_lfc_req[n +: 1]),
|
||||
.rx_lfc_ack(eth_rx_lfc_ack[n +: 1]),
|
||||
|
||||
/*
|
||||
* Priority Flow Control (PFC) (IEEE 802.3 annex 31D PFC)
|
||||
*/
|
||||
.tx_pfc_req(eth_tx_pfc_req[n*8 +: 8]),
|
||||
.tx_pfc_resend(1'b0),
|
||||
.rx_pfc_en(eth_rx_pfc_en[n*8 +: 8]),
|
||||
.rx_pfc_req(eth_rx_pfc_req[n*8 +: 8]),
|
||||
.rx_pfc_ack(eth_rx_pfc_ack[n*8 +: 8]),
|
||||
|
||||
/*
|
||||
* Pause interface
|
||||
*/
|
||||
.tx_lfc_pause_en(1'b1),
|
||||
.tx_pause_req(1'b0),
|
||||
.tx_pause_ack(),
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
.tx_start_packet(),
|
||||
.tx_error_underflow(),
|
||||
.rx_start_packet(),
|
||||
.rx_error_bad_frame(),
|
||||
.rx_error_bad_fcs(),
|
||||
.stat_tx_mcf(),
|
||||
.stat_rx_mcf(),
|
||||
.stat_tx_lfc_pkt(),
|
||||
.stat_tx_lfc_xon(),
|
||||
.stat_tx_lfc_xoff(),
|
||||
.stat_tx_lfc_paused(),
|
||||
.stat_tx_pfc_pkt(),
|
||||
.stat_tx_pfc_xon(),
|
||||
.stat_tx_pfc_xoff(),
|
||||
.stat_tx_pfc_paused(),
|
||||
.stat_rx_lfc_pkt(),
|
||||
.stat_rx_lfc_xon(),
|
||||
.stat_rx_lfc_xoff(),
|
||||
.stat_rx_lfc_paused(),
|
||||
.stat_rx_pfc_pkt(),
|
||||
.stat_rx_pfc_xon(),
|
||||
.stat_rx_pfc_xoff(),
|
||||
.stat_rx_pfc_paused(),
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
.cfg_ifg(8'd12),
|
||||
.cfg_tx_enable(1'b1),
|
||||
.cfg_rx_enable(1'b1)
|
||||
.cfg_tx_enable(eth_tx_enable[n +: 1]),
|
||||
.cfg_rx_enable(eth_rx_enable[n +: 1]),
|
||||
.cfg_mcf_rx_eth_dst_mcast(48'h01_80_C2_00_00_01),
|
||||
.cfg_mcf_rx_check_eth_dst_mcast(1'b1),
|
||||
.cfg_mcf_rx_eth_dst_ucast(48'd0),
|
||||
.cfg_mcf_rx_check_eth_dst_ucast(1'b0),
|
||||
.cfg_mcf_rx_eth_src(48'd0),
|
||||
.cfg_mcf_rx_check_eth_src(1'b0),
|
||||
.cfg_mcf_rx_eth_type(16'h8808),
|
||||
.cfg_mcf_rx_opcode_lfc(16'h0001),
|
||||
.cfg_mcf_rx_check_opcode_lfc(eth_rx_lfc_en[n +: 1]),
|
||||
.cfg_mcf_rx_opcode_pfc(16'h0101),
|
||||
.cfg_mcf_rx_check_opcode_pfc(eth_rx_pfc_en[n*8 +: 8] != 0),
|
||||
.cfg_mcf_rx_forward(1'b0),
|
||||
.cfg_mcf_rx_enable(eth_rx_lfc_en[n +: 1] || eth_rx_pfc_en[n*8 +: 8]),
|
||||
.cfg_tx_lfc_eth_dst(48'h01_80_C2_00_00_01),
|
||||
.cfg_tx_lfc_eth_src(48'h80_23_31_43_54_4C),
|
||||
.cfg_tx_lfc_eth_type(16'h8808),
|
||||
.cfg_tx_lfc_opcode(16'h0001),
|
||||
.cfg_tx_lfc_en(eth_tx_lfc_en[n +: 1]),
|
||||
.cfg_tx_lfc_quanta(16'hffff),
|
||||
.cfg_tx_lfc_refresh(16'h7fff),
|
||||
.cfg_tx_pfc_eth_dst(48'h01_80_C2_00_00_01),
|
||||
.cfg_tx_pfc_eth_src(48'h80_23_31_43_54_4C),
|
||||
.cfg_tx_pfc_eth_type(16'h8808),
|
||||
.cfg_tx_pfc_opcode(16'h0101),
|
||||
.cfg_tx_pfc_en(eth_tx_pfc_en[n*8 +: 8] != 0),
|
||||
.cfg_tx_pfc_quanta({8{16'hffff}}),
|
||||
.cfg_tx_pfc_refresh({8{16'h7fff}}),
|
||||
.cfg_rx_lfc_opcode(16'h0001),
|
||||
.cfg_rx_lfc_en(eth_rx_lfc_en[n +: 1]),
|
||||
.cfg_rx_pfc_opcode(16'h0101),
|
||||
.cfg_rx_pfc_en(eth_rx_pfc_en[n*8 +: 8] != 0)
|
||||
);
|
||||
|
||||
end
|
||||
@ -1184,6 +1295,9 @@ mqnic_core_pcie_us #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.MAC_CTRL_ENABLE(0),
|
||||
.TX_FIFO_DEPTH(TX_FIFO_DEPTH),
|
||||
.RX_FIFO_DEPTH(RX_FIFO_DEPTH),
|
||||
.MAX_TX_SIZE(MAX_TX_SIZE),
|
||||
@ -1465,7 +1579,13 @@ core_inst (
|
||||
.s_axis_eth_tx_cpl_valid(axis_eth_tx_ptp_ts_valid),
|
||||
.s_axis_eth_tx_cpl_ready(axis_eth_tx_ptp_ts_ready),
|
||||
|
||||
.eth_tx_enable(eth_tx_enable),
|
||||
.eth_tx_status(eth_tx_status),
|
||||
.eth_tx_lfc_en(eth_tx_lfc_en),
|
||||
.eth_tx_lfc_req(eth_tx_lfc_req),
|
||||
.eth_tx_pfc_en(eth_tx_pfc_en),
|
||||
.eth_tx_pfc_req(eth_tx_pfc_req),
|
||||
.eth_tx_fc_quanta_clk_en(0),
|
||||
|
||||
.eth_rx_clk(eth_rx_clk),
|
||||
.eth_rx_rst(eth_rx_rst),
|
||||
@ -1482,7 +1602,15 @@ core_inst (
|
||||
.s_axis_eth_rx_tlast(axis_eth_rx_tlast),
|
||||
.s_axis_eth_rx_tuser(axis_eth_rx_tuser),
|
||||
|
||||
.eth_rx_enable(eth_rx_enable),
|
||||
.eth_rx_status(eth_rx_status),
|
||||
.eth_rx_lfc_en(eth_rx_lfc_en),
|
||||
.eth_rx_lfc_req(eth_rx_lfc_req),
|
||||
.eth_rx_lfc_ack(eth_rx_lfc_ack),
|
||||
.eth_rx_pfc_en(eth_rx_pfc_en),
|
||||
.eth_rx_pfc_req(eth_rx_pfc_req),
|
||||
.eth_rx_pfc_ack(eth_rx_pfc_ack),
|
||||
.eth_rx_fc_quanta_clk_en(0),
|
||||
|
||||
/*
|
||||
* DDR
|
||||
|
@ -62,6 +62,10 @@ VERILOG_SOURCES += ../../rtl/common/tdma_ber_ch.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/eth_mac_10g.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/axis_xgmii_rx_64.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/axis_xgmii_tx_64.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/lfsr.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock.v
|
||||
VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock_cdc.v
|
||||
@ -167,6 +171,8 @@ export PARAM_TX_CPL_FIFO_DEPTH := 32
|
||||
export PARAM_TX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_RX_HASH_ENABLE := 1
|
||||
export PARAM_RX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_LFC_ENABLE := 1
|
||||
export PARAM_PFC_ENABLE := $(PARAM_LFC_ENABLE)
|
||||
export PARAM_TX_FIFO_DEPTH := 32768
|
||||
export PARAM_RX_FIFO_DEPTH := 32768
|
||||
export PARAM_MAX_TX_SIZE := 9214
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
import logging
|
||||
import os
|
||||
import struct
|
||||
import sys
|
||||
|
||||
import scapy.utils
|
||||
@ -17,7 +18,7 @@ from cocotb.clock import Clock
|
||||
from cocotb.triggers import RisingEdge, FallingEdge, Timer
|
||||
|
||||
from cocotbext.axi import AxiStreamBus, AxiLiteBus, AxiLiteRam
|
||||
from cocotbext.eth import XgmiiSource, XgmiiSink
|
||||
from cocotbext.eth import XgmiiSource, XgmiiSink, XgmiiFrame
|
||||
from cocotbext.pcie.core import RootComplex
|
||||
from cocotbext.pcie.xilinx.us import UltraScalePlusPcieDevice
|
||||
|
||||
@ -528,6 +529,35 @@ async def run_test_nic(dut):
|
||||
|
||||
tb.loopback_enable = False
|
||||
|
||||
if tb.driver.interfaces[0].if_feature_lfc:
|
||||
tb.log.info("Test LFC pause frame RX")
|
||||
|
||||
await tb.driver.interfaces[0].ports[0].set_lfc_ctrl(mqnic.MQNIC_PORT_LFC_CTRL_TX_LFC_EN | mqnic.MQNIC_PORT_LFC_CTRL_RX_LFC_EN)
|
||||
await tb.driver.hw_regs.read_dword(0)
|
||||
|
||||
lfc_xoff = Ether(src='DA:D1:D2:D3:D4:D5', dst='01:80:C2:00:00:01', type=0x8808) / struct.pack('!HH', 0x0001, 2000)
|
||||
|
||||
await tb.qsfp_source[0][0].send(XgmiiFrame.from_payload(bytes(lfc_xoff)))
|
||||
|
||||
count = 16
|
||||
|
||||
pkts = [bytearray([(x+k) % 256 for x in range(1514)]) for k in range(count)]
|
||||
|
||||
tb.loopback_enable = True
|
||||
|
||||
for p in pkts:
|
||||
await tb.driver.interfaces[0].start_xmit(p, 0)
|
||||
|
||||
for k in range(count):
|
||||
pkt = await tb.driver.interfaces[0].recv()
|
||||
|
||||
tb.log.info("Packet: %s", pkt)
|
||||
assert pkt.data == pkts[k]
|
||||
if tb.driver.interfaces[0].if_feature_rx_csum:
|
||||
assert pkt.rx_checksum == ~scapy.utils.checksum(bytes(pkt.data[14:])) & 0xffff
|
||||
|
||||
tb.loopback_enable = False
|
||||
|
||||
await RisingEdge(dut.clk_250mhz)
|
||||
await RisingEdge(dut.clk_250mhz)
|
||||
|
||||
@ -600,6 +630,10 @@ def test_fpga_core(request):
|
||||
os.path.join(eth_rtl_dir, "eth_mac_10g.v"),
|
||||
os.path.join(eth_rtl_dir, "axis_xgmii_rx_64.v"),
|
||||
os.path.join(eth_rtl_dir, "axis_xgmii_tx_64.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_rx.v"),
|
||||
os.path.join(eth_rtl_dir, "mac_pause_ctrl_tx.v"),
|
||||
os.path.join(eth_rtl_dir, "lfsr.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock.v"),
|
||||
os.path.join(eth_rtl_dir, "ptp_clock_cdc.v"),
|
||||
@ -706,6 +740,8 @@ def test_fpga_core(request):
|
||||
parameters['TX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['RX_HASH_ENABLE'] = 1
|
||||
parameters['RX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['LFC_ENABLE'] = 1
|
||||
parameters['PFC_ENABLE'] = parameters['LFC_ENABLE']
|
||||
parameters['TX_FIFO_DEPTH'] = 32768
|
||||
parameters['RX_FIFO_DEPTH'] = 32768
|
||||
parameters['MAX_TX_SIZE'] = 9214
|
||||
|
@ -101,6 +101,8 @@ dict set params TX_CPL_FIFO_DEPTH "32"
|
||||
dict set params TX_CHECKSUM_ENABLE "1"
|
||||
dict set params RX_HASH_ENABLE "1"
|
||||
dict set params RX_CHECKSUM_ENABLE "1"
|
||||
dict set params PFC_ENABLE "1"
|
||||
dict set params LFC_ENABLE [dict get $params PFC_ENABLE]
|
||||
dict set params TX_FIFO_DEPTH "32768"
|
||||
dict set params RX_FIFO_DEPTH "131072"
|
||||
dict set params MAX_TX_SIZE "9214"
|
||||
|
@ -101,6 +101,8 @@ dict set params TX_CPL_FIFO_DEPTH "32"
|
||||
dict set params TX_CHECKSUM_ENABLE "1"
|
||||
dict set params RX_HASH_ENABLE "1"
|
||||
dict set params RX_CHECKSUM_ENABLE "1"
|
||||
dict set params PFC_ENABLE "1"
|
||||
dict set params LFC_ENABLE [dict get $params PFC_ENABLE]
|
||||
dict set params TX_FIFO_DEPTH "32768"
|
||||
dict set params RX_FIFO_DEPTH "131072"
|
||||
dict set params MAX_TX_SIZE "9214"
|
||||
|
@ -7,8 +7,10 @@ set_property -dict [list \
|
||||
CONFIG.USER_INTERFACE {AXIS} \
|
||||
CONFIG.GT_DRP_CLK {125} \
|
||||
CONFIG.GT_LOCATION {0} \
|
||||
CONFIG.TX_FLOW_CONTROL {0} \
|
||||
CONFIG.RX_FLOW_CONTROL {0} \
|
||||
CONFIG.TX_FLOW_CONTROL {1} \
|
||||
CONFIG.RX_FLOW_CONTROL {1} \
|
||||
CONFIG.RX_FORWARD_CONTROL_FRAMES {0} \
|
||||
CONFIG.RX_CHECK_ACK {1} \
|
||||
CONFIG.INCLUDE_RS_FEC {1} \
|
||||
CONFIG.ENABLE_TIME_STAMPING {1}
|
||||
] [get_ips cmac_usplus]
|
||||
|
@ -71,6 +71,8 @@ module fpga #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter TX_FIFO_DEPTH = 32768,
|
||||
parameter RX_FIFO_DEPTH = 131072,
|
||||
parameter MAX_TX_SIZE = 9214,
|
||||
@ -1109,7 +1111,20 @@ wire qsfp0_drp_we;
|
||||
wire [15:0] qsfp0_drp_do;
|
||||
wire qsfp0_drp_rdy;
|
||||
|
||||
wire qsfp0_rx_status;
|
||||
wire qsfp0_tx_enable;
|
||||
wire qsfp0_tx_lfc_en;
|
||||
wire qsfp0_tx_lfc_req;
|
||||
wire [7:0] qsfp0_tx_pfc_en;
|
||||
wire [7:0] qsfp0_tx_pfc_req;
|
||||
|
||||
wire qsfp0_rx_enable;
|
||||
wire qsfp0_rx_status;
|
||||
wire qsfp0_rx_lfc_en;
|
||||
wire qsfp0_rx_lfc_req;
|
||||
wire qsfp0_rx_lfc_ack;
|
||||
wire [7:0] qsfp0_rx_pfc_en;
|
||||
wire [7:0] qsfp0_rx_pfc_req;
|
||||
wire [7:0] qsfp0_rx_pfc_ack;
|
||||
|
||||
wire qsfp0_gtpowergood;
|
||||
|
||||
@ -1204,6 +1219,12 @@ qsfp0_cmac_inst (
|
||||
.tx_ptp_ts_tag(qsfp0_tx_ptp_ts_tag_int),
|
||||
.tx_ptp_ts_valid(qsfp0_tx_ptp_ts_valid_int),
|
||||
|
||||
.tx_enable(qsfp0_tx_enable),
|
||||
.tx_lfc_en(qsfp0_tx_lfc_en),
|
||||
.tx_lfc_req(qsfp0_tx_lfc_req),
|
||||
.tx_pfc_en(qsfp0_tx_pfc_en),
|
||||
.tx_pfc_req(qsfp0_tx_pfc_req),
|
||||
|
||||
.rx_clk(qsfp0_rx_clk_int),
|
||||
.rx_rst(qsfp0_rx_rst_int),
|
||||
|
||||
@ -1217,7 +1238,14 @@ qsfp0_cmac_inst (
|
||||
.rx_ptp_rst(qsfp0_rx_ptp_rst_int),
|
||||
.rx_ptp_time(qsfp0_rx_ptp_time_int),
|
||||
|
||||
.rx_status(qsfp0_rx_status)
|
||||
.rx_enable(qsfp0_rx_enable),
|
||||
.rx_status(qsfp0_rx_status),
|
||||
.rx_lfc_en(qsfp0_rx_lfc_en),
|
||||
.rx_lfc_req(qsfp0_rx_lfc_req),
|
||||
.rx_lfc_ack(qsfp0_rx_lfc_ack),
|
||||
.rx_pfc_en(qsfp0_rx_pfc_en),
|
||||
.rx_pfc_req(qsfp0_rx_pfc_req),
|
||||
.rx_pfc_ack(qsfp0_rx_pfc_ack)
|
||||
);
|
||||
|
||||
// QSFP1 CMAC
|
||||
@ -1261,7 +1289,20 @@ wire qsfp1_drp_we;
|
||||
wire [15:0] qsfp1_drp_do;
|
||||
wire qsfp1_drp_rdy;
|
||||
|
||||
wire qsfp1_rx_status;
|
||||
wire qsfp1_tx_enable;
|
||||
wire qsfp1_tx_lfc_en;
|
||||
wire qsfp1_tx_lfc_req;
|
||||
wire [7:0] qsfp1_tx_pfc_en;
|
||||
wire [7:0] qsfp1_tx_pfc_req;
|
||||
|
||||
wire qsfp1_rx_enable;
|
||||
wire qsfp1_rx_status;
|
||||
wire qsfp1_rx_lfc_en;
|
||||
wire qsfp1_rx_lfc_req;
|
||||
wire qsfp1_rx_lfc_ack;
|
||||
wire [7:0] qsfp1_rx_pfc_en;
|
||||
wire [7:0] qsfp1_rx_pfc_req;
|
||||
wire [7:0] qsfp1_rx_pfc_ack;
|
||||
|
||||
wire qsfp1_gtpowergood;
|
||||
|
||||
@ -1354,6 +1395,12 @@ qsfp1_cmac_inst (
|
||||
.tx_ptp_ts_tag(qsfp1_tx_ptp_ts_tag_int),
|
||||
.tx_ptp_ts_valid(qsfp1_tx_ptp_ts_valid_int),
|
||||
|
||||
.tx_enable(qsfp1_tx_enable),
|
||||
.tx_lfc_en(qsfp1_tx_lfc_en),
|
||||
.tx_lfc_req(qsfp1_tx_lfc_req),
|
||||
.tx_pfc_en(qsfp1_tx_pfc_en),
|
||||
.tx_pfc_req(qsfp1_tx_pfc_req),
|
||||
|
||||
.rx_clk(qsfp1_rx_clk_int),
|
||||
.rx_rst(qsfp1_rx_rst_int),
|
||||
|
||||
@ -1367,7 +1414,14 @@ qsfp1_cmac_inst (
|
||||
.rx_ptp_rst(qsfp1_rx_ptp_rst_int),
|
||||
.rx_ptp_time(qsfp1_rx_ptp_time_int),
|
||||
|
||||
.rx_status(qsfp1_rx_status)
|
||||
.rx_enable(qsfp1_rx_enable),
|
||||
.rx_status(qsfp1_rx_status),
|
||||
.rx_lfc_en(qsfp1_rx_lfc_en),
|
||||
.rx_lfc_req(qsfp1_rx_lfc_req),
|
||||
.rx_lfc_ack(qsfp1_rx_lfc_ack),
|
||||
.rx_pfc_en(qsfp1_rx_pfc_en),
|
||||
.rx_pfc_req(qsfp1_rx_pfc_req),
|
||||
.rx_pfc_ack(qsfp1_rx_pfc_ack)
|
||||
);
|
||||
|
||||
wire ptp_clk;
|
||||
@ -2001,6 +2055,8 @@ fpga_core #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.TX_FIFO_DEPTH(TX_FIFO_DEPTH),
|
||||
.RX_FIFO_DEPTH(RX_FIFO_DEPTH),
|
||||
.MAX_TX_SIZE(MAX_TX_SIZE),
|
||||
@ -2205,6 +2261,12 @@ core_inst (
|
||||
.qsfp0_tx_ptp_ts_tag(qsfp0_tx_ptp_ts_tag_int),
|
||||
.qsfp0_tx_ptp_ts_valid(qsfp0_tx_ptp_ts_valid_int),
|
||||
|
||||
.qsfp0_tx_enable(qsfp0_tx_enable),
|
||||
.qsfp0_tx_lfc_en(qsfp0_tx_lfc_en),
|
||||
.qsfp0_tx_lfc_req(qsfp0_tx_lfc_req),
|
||||
.qsfp0_tx_pfc_en(qsfp0_tx_pfc_en),
|
||||
.qsfp0_tx_pfc_req(qsfp0_tx_pfc_req),
|
||||
|
||||
.qsfp0_rx_clk(qsfp0_rx_clk_int),
|
||||
.qsfp0_rx_rst(qsfp0_rx_rst_int),
|
||||
.qsfp0_rx_axis_tdata(qsfp0_rx_axis_tdata_int),
|
||||
@ -2216,7 +2278,14 @@ core_inst (
|
||||
.qsfp0_rx_ptp_rst(qsfp0_rx_ptp_rst_int),
|
||||
.qsfp0_rx_ptp_time(qsfp0_rx_ptp_time_int),
|
||||
|
||||
.qsfp0_rx_enable(qsfp0_rx_enable),
|
||||
.qsfp0_rx_status(qsfp0_rx_status),
|
||||
.qsfp0_rx_lfc_en(qsfp0_rx_lfc_en),
|
||||
.qsfp0_rx_lfc_req(qsfp0_rx_lfc_req),
|
||||
.qsfp0_rx_lfc_ack(qsfp0_rx_lfc_ack),
|
||||
.qsfp0_rx_pfc_en(qsfp0_rx_pfc_en),
|
||||
.qsfp0_rx_pfc_req(qsfp0_rx_pfc_req),
|
||||
.qsfp0_rx_pfc_ack(qsfp0_rx_pfc_ack),
|
||||
|
||||
.qsfp0_drp_clk(qsfp0_drp_clk),
|
||||
.qsfp0_drp_rst(qsfp0_drp_rst),
|
||||
@ -2246,6 +2315,12 @@ core_inst (
|
||||
.qsfp1_tx_ptp_ts_tag(qsfp1_tx_ptp_ts_tag_int),
|
||||
.qsfp1_tx_ptp_ts_valid(qsfp1_tx_ptp_ts_valid_int),
|
||||
|
||||
.qsfp1_tx_enable(qsfp1_tx_enable),
|
||||
.qsfp1_tx_lfc_en(qsfp1_tx_lfc_en),
|
||||
.qsfp1_tx_lfc_req(qsfp1_tx_lfc_req),
|
||||
.qsfp1_tx_pfc_en(qsfp1_tx_pfc_en),
|
||||
.qsfp1_tx_pfc_req(qsfp1_tx_pfc_req),
|
||||
|
||||
.qsfp1_rx_clk(qsfp1_rx_clk_int),
|
||||
.qsfp1_rx_rst(qsfp1_rx_rst_int),
|
||||
.qsfp1_rx_axis_tdata(qsfp1_rx_axis_tdata_int),
|
||||
@ -2257,7 +2332,14 @@ core_inst (
|
||||
.qsfp1_rx_ptp_rst(qsfp1_rx_ptp_rst_int),
|
||||
.qsfp1_rx_ptp_time(qsfp1_rx_ptp_time_int),
|
||||
|
||||
.qsfp1_rx_enable(qsfp1_rx_enable),
|
||||
.qsfp1_rx_status(qsfp1_rx_status),
|
||||
.qsfp1_rx_lfc_en(qsfp1_rx_lfc_en),
|
||||
.qsfp1_rx_lfc_req(qsfp1_rx_lfc_req),
|
||||
.qsfp1_rx_lfc_ack(qsfp1_rx_lfc_ack),
|
||||
.qsfp1_rx_pfc_en(qsfp1_rx_pfc_en),
|
||||
.qsfp1_rx_pfc_req(qsfp1_rx_pfc_req),
|
||||
.qsfp1_rx_pfc_ack(qsfp1_rx_pfc_ack),
|
||||
|
||||
.qsfp1_drp_clk(qsfp1_drp_clk),
|
||||
.qsfp1_drp_rst(qsfp1_drp_rst),
|
||||
|
@ -77,6 +77,8 @@ module fpga_core #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter TX_FIFO_DEPTH = 32768,
|
||||
parameter RX_FIFO_DEPTH = 131072,
|
||||
parameter MAX_TX_SIZE = 9214,
|
||||
@ -283,6 +285,12 @@ module fpga_core #
|
||||
input wire [15:0] qsfp0_tx_ptp_ts_tag,
|
||||
input wire qsfp0_tx_ptp_ts_valid,
|
||||
|
||||
output wire qsfp0_tx_enable,
|
||||
output wire qsfp0_tx_lfc_en,
|
||||
output wire qsfp0_tx_lfc_req,
|
||||
output wire [7:0] qsfp0_tx_pfc_en,
|
||||
output wire [7:0] qsfp0_tx_pfc_req,
|
||||
|
||||
input wire qsfp0_rx_clk,
|
||||
input wire qsfp0_rx_rst,
|
||||
|
||||
@ -296,7 +304,14 @@ module fpga_core #
|
||||
input wire qsfp0_rx_ptp_rst,
|
||||
output wire [79:0] qsfp0_rx_ptp_time,
|
||||
|
||||
output wire qsfp0_rx_enable,
|
||||
input wire qsfp0_rx_status,
|
||||
output wire qsfp0_rx_lfc_en,
|
||||
input wire qsfp0_rx_lfc_req,
|
||||
output wire qsfp0_rx_lfc_ack,
|
||||
output wire [7:0] qsfp0_rx_pfc_en,
|
||||
input wire [7:0] qsfp0_rx_pfc_req,
|
||||
output wire [7:0] qsfp0_rx_pfc_ack,
|
||||
|
||||
input wire qsfp0_drp_clk,
|
||||
input wire qsfp0_drp_rst,
|
||||
@ -328,6 +343,12 @@ module fpga_core #
|
||||
input wire [15:0] qsfp1_tx_ptp_ts_tag,
|
||||
input wire qsfp1_tx_ptp_ts_valid,
|
||||
|
||||
output wire qsfp1_tx_enable,
|
||||
output wire qsfp1_tx_lfc_en,
|
||||
output wire qsfp1_tx_lfc_req,
|
||||
output wire [7:0] qsfp1_tx_pfc_en,
|
||||
output wire [7:0] qsfp1_tx_pfc_req,
|
||||
|
||||
input wire qsfp1_rx_clk,
|
||||
input wire qsfp1_rx_rst,
|
||||
|
||||
@ -341,7 +362,14 @@ module fpga_core #
|
||||
input wire qsfp1_rx_ptp_rst,
|
||||
output wire [79:0] qsfp1_rx_ptp_time,
|
||||
|
||||
output wire qsfp1_rx_enable,
|
||||
input wire qsfp1_rx_status,
|
||||
output wire qsfp1_rx_lfc_en,
|
||||
input wire qsfp1_rx_lfc_req,
|
||||
output wire qsfp1_rx_lfc_ack,
|
||||
output wire [7:0] qsfp1_rx_pfc_en,
|
||||
input wire [7:0] qsfp1_rx_pfc_req,
|
||||
output wire [7:0] qsfp1_rx_pfc_ack,
|
||||
|
||||
input wire qsfp1_drp_clk,
|
||||
input wire qsfp1_drp_rst,
|
||||
@ -837,7 +865,12 @@ wire [PORT_COUNT*TX_TAG_WIDTH-1:0] axis_eth_tx_ptp_ts_tag;
|
||||
wire [PORT_COUNT-1:0] axis_eth_tx_ptp_ts_valid;
|
||||
wire [PORT_COUNT-1:0] axis_eth_tx_ptp_ts_ready;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_tx_enable;
|
||||
wire [PORT_COUNT-1:0] eth_tx_status;
|
||||
wire [PORT_COUNT-1:0] eth_tx_lfc_en;
|
||||
wire [PORT_COUNT-1:0] eth_tx_lfc_req;
|
||||
wire [PORT_COUNT*8-1:0] eth_tx_pfc_en;
|
||||
wire [PORT_COUNT*8-1:0] eth_tx_pfc_req;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_rx_clk;
|
||||
wire [PORT_COUNT-1:0] eth_rx_rst;
|
||||
@ -854,7 +887,14 @@ wire [PORT_COUNT-1:0] axis_eth_rx_tready;
|
||||
wire [PORT_COUNT-1:0] axis_eth_rx_tlast;
|
||||
wire [PORT_COUNT*AXIS_ETH_RX_USER_WIDTH-1:0] axis_eth_rx_tuser;
|
||||
|
||||
wire [PORT_COUNT-1:0] eth_rx_enable;
|
||||
wire [PORT_COUNT-1:0] eth_rx_status;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_en;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_req;
|
||||
wire [PORT_COUNT-1:0] eth_rx_lfc_ack;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_en;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_req;
|
||||
wire [PORT_COUNT*8-1:0] eth_rx_pfc_ack;
|
||||
|
||||
wire [PTP_TS_WIDTH-1:0] qsfp0_tx_ptp_time_int;
|
||||
wire [PTP_TS_WIDTH-1:0] qsfp1_tx_ptp_time_int;
|
||||
@ -905,7 +945,12 @@ mqnic_port_map_mac_axis_inst (
|
||||
.s_axis_mac_tx_ptp_ts_valid({qsfp1_tx_ptp_ts_valid, qsfp0_tx_ptp_ts_valid}),
|
||||
.s_axis_mac_tx_ptp_ts_ready(),
|
||||
|
||||
.mac_tx_enable({qsfp1_tx_enable, qsfp0_tx_enable}),
|
||||
.mac_tx_status(2'b11),
|
||||
.mac_tx_lfc_en({qsfp1_tx_lfc_en, qsfp0_tx_lfc_en}),
|
||||
.mac_tx_lfc_req({qsfp1_tx_lfc_req, qsfp0_tx_lfc_req}),
|
||||
.mac_tx_pfc_en({qsfp1_tx_pfc_en, qsfp0_tx_pfc_en}),
|
||||
.mac_tx_pfc_req({qsfp1_tx_pfc_req, qsfp0_tx_pfc_req}),
|
||||
|
||||
.mac_rx_clk({qsfp1_rx_clk, qsfp0_rx_clk}),
|
||||
.mac_rx_rst({qsfp1_rx_rst, qsfp0_rx_rst}),
|
||||
@ -922,7 +967,14 @@ mqnic_port_map_mac_axis_inst (
|
||||
.s_axis_mac_rx_tlast({qsfp1_rx_axis_tlast, qsfp0_rx_axis_tlast}),
|
||||
.s_axis_mac_rx_tuser({{qsfp1_rx_axis_tuser[80:1], 16'd0, qsfp1_rx_axis_tuser[0]}, {qsfp0_rx_axis_tuser[80:1], 16'd0, qsfp0_rx_axis_tuser[0]}}),
|
||||
|
||||
.mac_rx_enable({qsfp1_rx_enable, qsfp0_rx_enable}),
|
||||
.mac_rx_status({qsfp1_rx_status, qsfp0_rx_status}),
|
||||
.mac_rx_lfc_en({qsfp1_rx_lfc_en, qsfp0_rx_lfc_en}),
|
||||
.mac_rx_lfc_req({qsfp1_rx_lfc_req, qsfp0_rx_lfc_req}),
|
||||
.mac_rx_lfc_ack({qsfp1_rx_lfc_ack, qsfp0_rx_lfc_ack}),
|
||||
.mac_rx_pfc_en({qsfp1_rx_pfc_en, qsfp0_rx_pfc_en}),
|
||||
.mac_rx_pfc_req({qsfp1_rx_pfc_req, qsfp0_rx_pfc_req}),
|
||||
.mac_rx_pfc_ack({qsfp1_rx_pfc_ack, qsfp0_rx_pfc_ack}),
|
||||
|
||||
// towards datapath
|
||||
.tx_clk(eth_tx_clk),
|
||||
@ -945,7 +997,12 @@ mqnic_port_map_mac_axis_inst (
|
||||
.m_axis_tx_ptp_ts_valid(axis_eth_tx_ptp_ts_valid),
|
||||
.m_axis_tx_ptp_ts_ready(axis_eth_tx_ptp_ts_ready),
|
||||
|
||||
.tx_enable(eth_tx_enable),
|
||||
.tx_status(eth_tx_status),
|
||||
.tx_lfc_en(eth_tx_lfc_en),
|
||||
.tx_lfc_req(eth_tx_lfc_req),
|
||||
.tx_pfc_en(eth_tx_pfc_en),
|
||||
.tx_pfc_req(eth_tx_pfc_req),
|
||||
|
||||
.rx_clk(eth_rx_clk),
|
||||
.rx_rst(eth_rx_rst),
|
||||
@ -962,7 +1019,14 @@ mqnic_port_map_mac_axis_inst (
|
||||
.m_axis_rx_tlast(axis_eth_rx_tlast),
|
||||
.m_axis_rx_tuser(axis_eth_rx_tuser),
|
||||
|
||||
.rx_status(eth_rx_status)
|
||||
.rx_enable(eth_rx_enable),
|
||||
.rx_status(eth_rx_status),
|
||||
.rx_lfc_en(eth_rx_lfc_en),
|
||||
.rx_lfc_req(eth_rx_lfc_req),
|
||||
.rx_lfc_ack(eth_rx_lfc_ack),
|
||||
.rx_pfc_en(eth_rx_pfc_en),
|
||||
.rx_pfc_req(eth_rx_pfc_req),
|
||||
.rx_pfc_ack(eth_rx_pfc_ack)
|
||||
);
|
||||
|
||||
mqnic_core_pcie_us #(
|
||||
@ -1032,6 +1096,9 @@ mqnic_core_pcie_us #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.MAC_CTRL_ENABLE(0),
|
||||
.TX_FIFO_DEPTH(TX_FIFO_DEPTH),
|
||||
.RX_FIFO_DEPTH(RX_FIFO_DEPTH),
|
||||
.MAX_TX_SIZE(MAX_TX_SIZE),
|
||||
@ -1313,7 +1380,13 @@ core_inst (
|
||||
.s_axis_eth_tx_cpl_valid(axis_eth_tx_ptp_ts_valid),
|
||||
.s_axis_eth_tx_cpl_ready(axis_eth_tx_ptp_ts_ready),
|
||||
|
||||
.eth_tx_enable(eth_tx_enable),
|
||||
.eth_tx_status(eth_tx_status),
|
||||
.eth_tx_lfc_en(eth_tx_lfc_en),
|
||||
.eth_tx_lfc_req(eth_tx_lfc_req),
|
||||
.eth_tx_pfc_en(eth_tx_pfc_en),
|
||||
.eth_tx_pfc_req(eth_tx_pfc_req),
|
||||
.eth_tx_fc_quanta_clk_en(0),
|
||||
|
||||
.eth_rx_clk(eth_rx_clk),
|
||||
.eth_rx_rst(eth_rx_rst),
|
||||
@ -1330,7 +1403,15 @@ core_inst (
|
||||
.s_axis_eth_rx_tlast(axis_eth_rx_tlast),
|
||||
.s_axis_eth_rx_tuser(axis_eth_rx_tuser),
|
||||
|
||||
.eth_rx_enable(eth_rx_enable),
|
||||
.eth_rx_status(eth_rx_status),
|
||||
.eth_rx_lfc_en(eth_rx_lfc_en),
|
||||
.eth_rx_lfc_req(eth_rx_lfc_req),
|
||||
.eth_rx_lfc_ack(eth_rx_lfc_ack),
|
||||
.eth_rx_pfc_en(eth_rx_pfc_en),
|
||||
.eth_rx_pfc_req(eth_rx_pfc_req),
|
||||
.eth_rx_pfc_ack(eth_rx_pfc_ack),
|
||||
.eth_rx_fc_quanta_clk_en(0),
|
||||
|
||||
/*
|
||||
* DDR
|
||||
|
@ -161,6 +161,8 @@ export PARAM_TX_CPL_FIFO_DEPTH := 32
|
||||
export PARAM_TX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_RX_HASH_ENABLE := 1
|
||||
export PARAM_RX_CHECKSUM_ENABLE := 1
|
||||
export PARAM_LFC_ENABLE := 1
|
||||
export PARAM_PFC_ENABLE := $(PARAM_LFC_ENABLE)
|
||||
export PARAM_TX_FIFO_DEPTH := 32768
|
||||
export PARAM_RX_FIFO_DEPTH := 131072
|
||||
export PARAM_MAX_TX_SIZE := 9214
|
||||
|
@ -300,6 +300,8 @@ class TB(object):
|
||||
self.qsfp_mac.append(mac)
|
||||
|
||||
getattr(dut, f"qsfp{k}_rx_status").setimmediatevalue(1)
|
||||
getattr(dut, f"qsfp{k}_rx_lfc_req").setimmediatevalue(0)
|
||||
getattr(dut, f"qsfp{k}_rx_pfc_req").setimmediatevalue(0)
|
||||
|
||||
cocotb.start_soon(Clock(getattr(dut, f"qsfp{k}_drp_clk"), 8, units="ns").start())
|
||||
getattr(dut, f"qsfp{k}_drp_rst").setimmediatevalue(0)
|
||||
@ -307,7 +309,7 @@ class TB(object):
|
||||
getattr(dut, f"qsfp{k}_drp_rdy").setimmediatevalue(0)
|
||||
|
||||
getattr(dut, f"qsfp{k}_modprsl").setimmediatevalue(0)
|
||||
getattr(dut, f"qsfp{k}_intl").setimmediatevalue(0)
|
||||
getattr(dut, f"qsfp{k}_intl").setimmediatevalue(1)
|
||||
|
||||
dut.sw.setimmediatevalue(0)
|
||||
|
||||
@ -723,6 +725,8 @@ def test_fpga_core(request):
|
||||
parameters['TX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['RX_HASH_ENABLE'] = 1
|
||||
parameters['RX_CHECKSUM_ENABLE'] = 1
|
||||
parameters['LFC_ENABLE'] = 1
|
||||
parameters['PFC_ENABLE'] = parameters['LFC_ENABLE']
|
||||
parameters['TX_FIFO_DEPTH'] = 32768
|
||||
parameters['RX_FIFO_DEPTH'] = 131072
|
||||
parameters['MAX_TX_SIZE'] = 9214
|
||||
|
@ -62,6 +62,10 @@ SYN_FILES += rtl/common/tdma_ber_ch.v
|
||||
SYN_FILES += lib/eth/rtl/eth_mac_10g.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_rx_64.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_tx_64.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx_if.v
|
||||
|
@ -113,6 +113,8 @@ dict set params TX_CPL_FIFO_DEPTH "32"
|
||||
dict set params TX_CHECKSUM_ENABLE "1"
|
||||
dict set params RX_HASH_ENABLE "1"
|
||||
dict set params RX_CHECKSUM_ENABLE "1"
|
||||
dict set params PFC_ENABLE "1"
|
||||
dict set params LFC_ENABLE [dict get $params PFC_ENABLE]
|
||||
dict set params ENABLE_PADDING "1"
|
||||
dict set params ENABLE_DIC "1"
|
||||
dict set params MIN_FRAME_LENGTH "64"
|
||||
|
@ -62,6 +62,10 @@ SYN_FILES += rtl/common/tdma_ber_ch.v
|
||||
SYN_FILES += lib/eth/rtl/eth_mac_10g.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_rx_64.v
|
||||
SYN_FILES += lib/eth/rtl/axis_xgmii_tx_64.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_rx.v
|
||||
SYN_FILES += lib/eth/rtl/mac_pause_ctrl_tx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx.v
|
||||
SYN_FILES += lib/eth/rtl/eth_phy_10g_rx_if.v
|
||||
|
@ -113,6 +113,8 @@ dict set params TX_CPL_FIFO_DEPTH "32"
|
||||
dict set params TX_CHECKSUM_ENABLE "1"
|
||||
dict set params RX_HASH_ENABLE "1"
|
||||
dict set params RX_CHECKSUM_ENABLE "1"
|
||||
dict set params PFC_ENABLE "1"
|
||||
dict set params LFC_ENABLE [dict get $params PFC_ENABLE]
|
||||
dict set params ENABLE_PADDING "1"
|
||||
dict set params ENABLE_DIC "1"
|
||||
dict set params MIN_FRAME_LENGTH "64"
|
||||
|
@ -74,6 +74,8 @@ module fpga #
|
||||
parameter TX_CHECKSUM_ENABLE = 1,
|
||||
parameter RX_HASH_ENABLE = 1,
|
||||
parameter RX_CHECKSUM_ENABLE = 1,
|
||||
parameter PFC_ENABLE = 1,
|
||||
parameter LFC_ENABLE = PFC_ENABLE,
|
||||
parameter ENABLE_PADDING = 1,
|
||||
parameter ENABLE_DIC = 1,
|
||||
parameter MIN_FRAME_LENGTH = 64,
|
||||
@ -2137,6 +2139,8 @@ fpga_core #(
|
||||
.TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE),
|
||||
.RX_HASH_ENABLE(RX_HASH_ENABLE),
|
||||
.RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE),
|
||||
.PFC_ENABLE(PFC_ENABLE),
|
||||
.LFC_ENABLE(LFC_ENABLE),
|
||||
.ENABLE_PADDING(ENABLE_PADDING),
|
||||
.ENABLE_DIC(ENABLE_DIC),
|
||||
.MIN_FRAME_LENGTH(MIN_FRAME_LENGTH),
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user