soc/cores/liteeth_mini: add phy model for verilator simulation

This commit is contained in:
Florent Kermarrec 2015-11-11 14:22:27 +01:00
parent 481163b233
commit 1f6983da2c
8 changed files with 80 additions and 22 deletions

View File

@ -1,8 +1,8 @@
from migen import *
from migen.genlib.record import *
from misoc.interconnect.csr import *
from misoc.interconnect.stream import *
from litex.soc.interconnect.csr import *
from litex.soc.interconnect.stream import *
class Port:

View File

@ -1,4 +1,4 @@
from misoc.cores.liteeth_mini.common import *
from litex.soc.cores.liteeth_mini.common import *
def LiteEthPHY(clock_pads, pads, clk_freq=None, **kwargs):
@ -6,18 +6,18 @@ def LiteEthPHY(clock_pads, pads, clk_freq=None, **kwargs):
if hasattr(clock_pads, "gtx") and len(pads.tx_data) == 8:
if hasattr(clock_pads, "tx"):
# This is a 10/100/1G PHY
from misoc.cores.liteeth_mini.phy.gmii_mii import LiteEthPHYGMIIMII
from litex.soc.cores.liteeth_mini.phy.gmii_mii import LiteEthPHYGMIIMII
return LiteEthPHYGMIIMII(clock_pads, pads, clk_freq=clk_freq, **kwargs)
else:
# This is a pure 1G PHY
from misoc.cores.liteeth_mini.phy.gmii import LiteEthPHYGMII
from litex.soc.cores.liteeth_mini.phy.gmii import LiteEthPHYGMII
return LiteEthPHYGMII(clock_pads, pads, **kwargs)
elif hasattr(pads, "rx_ctl"):
# This is a 10/100/1G RGMII PHY
raise ValueError("RGMII PHYs are specific to vendors (for now), use direct instantiation")
elif len(pads.tx_data) == 4:
# This is a MII PHY
from misoc.cores.liteeth_mini.phy.mii import LiteEthPHYMII
from litex.soc.cores.liteeth_mini.phy.mii import LiteEthPHYMII
return LiteEthPHYMII(clock_pads, pads, **kwargs)
else:
raise ValueError("Unable to autodetect PHY from platform file, use direct instantiation")

View File

@ -2,7 +2,7 @@ from migen import *
from migen.genlib.io import DDROutput
from migen.genlib.resetsync import AsyncResetSynchronizer
from misoc.cores.liteeth_mini.common import *
from litex.soc.cores.liteeth_mini.common import *
class LiteEthPHYGMIITX(Module):

View File

@ -2,11 +2,11 @@ from migen import *
from migen.genlib.io import DDROutput
from migen.genlib.cdc import PulseSynchronizer
from misoc.interconnect.stream import *
from misoc.cores.liteeth_mini.common import *
from misoc.cores.liteeth_mini.phy.gmii import LiteEthPHYGMIICRG
from misoc.cores.liteeth_mini.phy.mii import LiteEthPHYMIITX, LiteEthPHYMIIRX
from misoc.cores.liteeth_mini.phy.gmii import LiteEthPHYGMIITX, LiteEthPHYGMIIRX
from litex.soc.interconnect.stream import *
from litex.soc.cores.liteeth_mini.common import *
from litex.soc.cores.liteeth_mini.phy.gmii import LiteEthPHYGMIICRG
from litex.soc.cores.liteeth_mini.phy.mii import LiteEthPHYMIITX, LiteEthPHYMIIRX
from litex.soc.cores.liteeth_mini.phy.gmii import LiteEthPHYGMIITX, LiteEthPHYGMIIRX
modes = {

View File

@ -1,9 +1,9 @@
from migen import *
from misoc.interconnect.csr import *
from misoc.interconnect.stream import *
from misoc.cores.liteeth_mini.common import *
from misoc.cores.liteeth.mini.generic import *
from litex.soc.interconnect.csr import *
from litex.soc.interconnect.stream import *
from litex.soc.cores.liteeth_mini.common import *
from litex.soc.cores.liteeth.mini.generic import *
class LiteEthPHYLoopbackCRG(Module, AutoCSR):

View File

@ -1,8 +1,8 @@
from migen import *
from misoc.interconnect.csr import *
from misoc.interconnect.stream import *
from misoc.cores.liteeth_mini.common import *
from litex.soc.interconnect.csr import *
from litex.soc.interconnect.stream import *
from litex.soc.cores.liteeth_mini.common import *
def converter_description(dw):

View File

@ -0,0 +1,58 @@
import os
from litex.soc.cores.liteeth_mini.common import *
class LiteEthPHYModelCRG(Module, AutoCSR):
def __init__(self):
self._reset = CSRStorage()
# # #
self.clock_domains.cd_eth_rx = ClockDomain()
self.clock_domains.cd_eth_tx = ClockDomain()
self.comb += [
self.cd_eth_rx.clk.eq(ClockSignal()),
self.cd_eth_tx.clk.eq(ClockSignal())
]
reset = self._reset.storage
self.comb += [
self.cd_eth_rx.rst.eq(reset),
self.cd_eth_tx.rst.eq(reset)
]
class LiteEthPHYModel(Module, AutoCSR):
def __init__(self, pads, tap="tap0", ip_address="192.168.0.14"):
self.dw = 8
self.submodules.crg = LiteEthPHYModelCRG()
self.sink = sink = Sink(eth_phy_description(8))
self.source = source = Source(eth_phy_description(8))
self.tap = tap
self.ip_address = ip_address
self.comb += [
pads.source_stb.eq(self.sink.stb),
pads.source_data.eq(self.sink.data),
self.sink.ack.eq(1)
]
self.sync += [
self.source.stb.eq(pads.sink_stb),
self.source.sop.eq(pads.sink_stb & ~self.source.stb),
self.source.data.eq(pads.sink_data),
]
self.comb += [
self.source.eop.eq(~pads.sink_stb & self.source.stb),
]
# TODO avoid use of os.system
os.system("openvpn --mktun --dev {}".format(self.tap))
os.system("ifconfig {} {} up".format(self.tap, self.ip_address))
os.system("mknod /dev/net/{} c 10 200".format(self.tap))
def do_exit(self, *args, **kwargs):
# TODO avoid use of os.system
os.system("rm -f /dev/net/{}".format(self.tap))
os.system("openvpn --rmtun --dev {}".format(self.tap))

View File

@ -5,9 +5,9 @@ from migen.genlib.io import DDROutput
from migen.genlib.misc import WaitTimer
from migen.genlib.fsm import FSM, NextState
from misoc.interconnect.stream import *
from misoc.interconnect.csr import *
from misoc.cores.liteeth_mini.common import *
from litex.soc.interconnect.stream import *
from litex.soc.interconnect.csr import *
from litex.soc.cores.liteeth_mini.common import *
class LiteEthPHYRGMIITX(Module):