mac: Move LiteEthMACLastBE module to common.py and rename to LiteEthLastHandler.

This commit is contained in:
Florent Kermarrec 2024-09-12 13:32:38 +02:00
parent a2a862dc1b
commit 0b5389feab
2 changed files with 42 additions and 24 deletions

View File

@ -1,7 +1,7 @@
#
# This file is part of LiteEth.
#
# Copyright (c) 2015-2021 Florent Kermarrec <florent@enjoy-digital.fr>
# Copyright (c) 2015-2024 Florent Kermarrec <florent@enjoy-digital.fr>
# SPDX-License-Identifier: BSD-2-Clause
from liteeth.common import *
@ -55,3 +55,31 @@ class LiteEthMACCrossbar(LiteEthCrossbar):
raise ValueError("Ethernet type {0:#x} already assigned".format(ethernet_type))
self.users[ethernet_type] = port
return port
# Last Handler -------------------------------------------------------------------------------------
class LiteEthLastHandler(LiteXModule):
def __init__(self, layout):
self.sink = sink = stream.Endpoint(layout)
self.source = source = stream.Endpoint(layout)
# # #
self.fsm = fsm = FSM(reset_state="COPY")
fsm.act("COPY",
sink.connect(source),
source.last.eq(sink.last_be != 0),
If(sink.valid & sink.ready,
# If last Byte but not last packet token.
If(source.last & ~sink.last,
NextState("WAIT-LAST")
)
)
)
fsm.act("WAIT-LAST",
# Accept incoming stream until we receive last packet token.
sink.ready.eq(1),
If(sink.valid & sink.last,
NextState("COPY")
)
)

View File

@ -1,40 +1,30 @@
#
# This file is part of LiteEth.
#
# Copyright (c) 2015-2020 Florent Kermarrec <florent@enjoy-digital.fr>
# Copyright (c) 2015-2024 Florent Kermarrec <florent@enjoy-digital.fr>
# Copyright (c) 2015 Sebastien Bourdeauducq <sb@m-labs.hk>
# Copyright (c) 2018 whitequark <whitequark@whitequark.org>
# SPDX-License-Identifier: BSD-2-Clause
from litex.gen import *
from liteeth.common import *
from liteeth.mac.common import LiteEthLastHandler
# MAC TX Last BE -----------------------------------------------------------------------------------
class LiteEthMACTXLastBE(Module):
class LiteEthMACTXLastBE(LiteXModule):
def __init__(self, dw):
self.sink = sink = stream.Endpoint(eth_phy_description(dw))
self.source = source = stream.Endpoint(eth_phy_description(dw))
# # #
self.submodules.fsm = fsm = FSM(reset_state="COPY")
fsm.act("COPY",
sink.connect(source),
source.last.eq(sink.last_be != 0),
If(sink.valid & sink.ready,
# If last Byte but not last packet token.
If(source.last & ~sink.last,
NextState("WAIT-LAST")
)
)
)
fsm.act("WAIT-LAST",
# Accept incoming stream until we receive last packet token.
sink.ready.eq(1),
If(sink.valid & sink.last,
NextState("COPY")
)
)
self.last_handler = LiteEthLastHandler(layout=eth_phy_description(dw))
self.comb += [
sink.connect(self.last_handler.sink),
self.last_handler.source.connect(source),
]
# MAC RX Last BE -----------------------------------------------------------------------------------