mirror of
https://github.com/enjoy-digital/litex.git
synced 2025-01-04 09:52:26 -05:00
integration/soc: Switch to LiteXModule and from self.submodules/self.clock_domains to self.
This commit is contained in:
parent
f8702d744f
commit
1f2d4f017a
1 changed files with 61 additions and 62 deletions
|
@ -113,7 +113,7 @@ class SoCCSRRegion:
|
||||||
|
|
||||||
# SoCBusHandler ------------------------------------------------------------------------------------
|
# SoCBusHandler ------------------------------------------------------------------------------------
|
||||||
|
|
||||||
class SoCBusHandler(Module):
|
class SoCBusHandler(LiteXModule):
|
||||||
supported_standard = ["wishbone", "axi-lite", "axi"]
|
supported_standard = ["wishbone", "axi-lite", "axi"]
|
||||||
supported_data_width = [32, 64]
|
supported_data_width = [32, 64]
|
||||||
supported_address_width = [32]
|
supported_address_width = [32]
|
||||||
|
@ -485,7 +485,7 @@ class SoCBusHandler(Module):
|
||||||
|
|
||||||
# SoCLocHandler ------------------------------------------------------------------------------------
|
# SoCLocHandler ------------------------------------------------------------------------------------
|
||||||
|
|
||||||
class SoCLocHandler(Module):
|
class SoCLocHandler(LiteXModule):
|
||||||
# Creation -------------------------------------------------------------------------------------
|
# Creation -------------------------------------------------------------------------------------
|
||||||
def __init__(self, name, n_locs):
|
def __init__(self, name, n_locs):
|
||||||
self.name = name
|
self.name = name
|
||||||
|
@ -732,7 +732,7 @@ class SoCIRQHandler(SoCLocHandler):
|
||||||
|
|
||||||
# SoCController ------------------------------------------------------------------------------------
|
# SoCController ------------------------------------------------------------------------------------
|
||||||
|
|
||||||
class SoCController(Module, AutoCSR):
|
class SoCController(LiteXModule):
|
||||||
def __init__(self, with_reset=True, with_scratch=True, with_errors=True):
|
def __init__(self, with_reset=True, with_scratch=True, with_errors=True):
|
||||||
if with_reset:
|
if with_reset:
|
||||||
self._reset = CSRStorage(fields=[
|
self._reset = CSRStorage(fields=[
|
||||||
|
@ -808,7 +808,7 @@ class SoC(LiteXModule):
|
||||||
self.csr_regions = {}
|
self.csr_regions = {}
|
||||||
|
|
||||||
# SoC Bus Handler --------------------------------------------------------------------------
|
# SoC Bus Handler --------------------------------------------------------------------------
|
||||||
self.submodules.bus = SoCBusHandler(
|
self.bus = SoCBusHandler(
|
||||||
standard = bus_standard,
|
standard = bus_standard,
|
||||||
data_width = bus_data_width,
|
data_width = bus_data_width,
|
||||||
address_width = bus_address_width,
|
address_width = bus_address_width,
|
||||||
|
@ -819,7 +819,7 @@ class SoC(LiteXModule):
|
||||||
)
|
)
|
||||||
|
|
||||||
# SoC Bus Handler --------------------------------------------------------------------------
|
# SoC Bus Handler --------------------------------------------------------------------------
|
||||||
self.submodules.csr = SoCCSRHandler(
|
self.csr = SoCCSRHandler(
|
||||||
data_width = csr_data_width,
|
data_width = csr_data_width,
|
||||||
address_width = csr_address_width,
|
address_width = csr_address_width,
|
||||||
alignment = 32,
|
alignment = 32,
|
||||||
|
@ -829,7 +829,7 @@ class SoC(LiteXModule):
|
||||||
)
|
)
|
||||||
|
|
||||||
# SoC IRQ Handler --------------------------------------------------------------------------
|
# SoC IRQ Handler --------------------------------------------------------------------------
|
||||||
self.submodules.irq = SoCIRQHandler(
|
self.irq = SoCIRQHandler(
|
||||||
n_irqs = irq_n_irqs,
|
n_irqs = irq_n_irqs,
|
||||||
reserved_irqs = irq_reserved_irqs
|
reserved_irqs = irq_reserved_irqs
|
||||||
)
|
)
|
||||||
|
@ -891,7 +891,7 @@ class SoC(LiteXModule):
|
||||||
self.logger.info("Controller {} {}.".format(
|
self.logger.info("Controller {} {}.".format(
|
||||||
colorer(name, color="underline"),
|
colorer(name, color="underline"),
|
||||||
colorer("added", color="green")))
|
colorer("added", color="green")))
|
||||||
setattr(self.submodules, name, SoCController(**kwargs))
|
setattr(self, name, SoCController(**kwargs))
|
||||||
|
|
||||||
def add_ram(self, name, origin, size, contents=[], mode="rwx"):
|
def add_ram(self, name, origin, size, contents=[], mode="rwx"):
|
||||||
ram_cls = {
|
ram_cls = {
|
||||||
|
@ -916,7 +916,7 @@ class SoC(LiteXModule):
|
||||||
colorer(name),
|
colorer(name),
|
||||||
colorer("added", color="green"),
|
colorer("added", color="green"),
|
||||||
self.bus.regions[name]))
|
self.bus.regions[name]))
|
||||||
setattr(self.submodules, name, ram)
|
setattr(self, name, ram)
|
||||||
if contents != []:
|
if contents != []:
|
||||||
self.add_config(f"{name}_INIT", 1)
|
self.add_config(f"{name}_INIT", 1)
|
||||||
|
|
||||||
|
@ -951,7 +951,7 @@ class SoC(LiteXModule):
|
||||||
self.logger.info("CSR Bridge {} {}.".format(
|
self.logger.info("CSR Bridge {} {}.".format(
|
||||||
colorer(name, color="underline"),
|
colorer(name, color="underline"),
|
||||||
colorer("added", color="green")))
|
colorer("added", color="green")))
|
||||||
setattr(self.submodules, csr_bridge_name, csr_bridge)
|
setattr(self, csr_bridge_name, csr_bridge)
|
||||||
csr_size = 2**(self.csr.address_width + 2)
|
csr_size = 2**(self.csr.address_width + 2)
|
||||||
csr_region = SoCRegion(origin=origin, size=csr_size, cached=False, decode=self.cpu.csr_decode)
|
csr_region = SoCRegion(origin=origin, size=csr_size, cached=False, decode=self.cpu.csr_decode)
|
||||||
bus_standard = {
|
bus_standard = {
|
||||||
|
@ -989,7 +989,7 @@ class SoC(LiteXModule):
|
||||||
colorer("\n - ".join(sorted(cpu_cls.variants)))))
|
colorer("\n - ".join(sorted(cpu_cls.variants)))))
|
||||||
raise SoCError()
|
raise SoCError()
|
||||||
self.check_if_exists("cpu")
|
self.check_if_exists("cpu")
|
||||||
self.submodules.cpu = cpu_cls(self.platform, variant)
|
self.cpu = cpu_cls(self.platform, variant)
|
||||||
self.logger.info("CPU {} {}.".format(
|
self.logger.info("CPU {} {}.".format(
|
||||||
colorer(name, color="underline"),
|
colorer(name, color="underline"),
|
||||||
colorer("added", color="green")))
|
colorer("added", color="green")))
|
||||||
|
@ -1060,7 +1060,7 @@ class SoC(LiteXModule):
|
||||||
self.logger.info("CPU {} {} DMA Bus.".format(
|
self.logger.info("CPU {} {} DMA Bus.".format(
|
||||||
colorer(name, color="underline"),
|
colorer(name, color="underline"),
|
||||||
colorer("adding", color="cyan")))
|
colorer("adding", color="cyan")))
|
||||||
self.submodules.dma_bus = SoCBusHandler(
|
self.dma_bus = SoCBusHandler(
|
||||||
name = "SoCDMABusHandler",
|
name = "SoCDMABusHandler",
|
||||||
standard = "wishbone",
|
standard = "wishbone",
|
||||||
data_width = self.bus.data_width,
|
data_width = self.bus.data_width,
|
||||||
|
@ -1097,7 +1097,7 @@ class SoC(LiteXModule):
|
||||||
def add_timer(self, name="timer0"):
|
def add_timer(self, name="timer0"):
|
||||||
from litex.soc.cores.timer import Timer
|
from litex.soc.cores.timer import Timer
|
||||||
self.check_if_exists(name)
|
self.check_if_exists(name)
|
||||||
setattr(self.submodules, name, Timer())
|
setattr(self, name, Timer())
|
||||||
if self.irq.enabled:
|
if self.irq.enabled:
|
||||||
self.irq.add(name, use_loc_if_exists=True)
|
self.irq.add(name, use_loc_if_exists=True)
|
||||||
|
|
||||||
|
@ -1142,7 +1142,7 @@ class SoC(LiteXModule):
|
||||||
if ((len(self.bus.masters) == 1) and
|
if ((len(self.bus.masters) == 1) and
|
||||||
(len(self.bus.slaves) == 1) and
|
(len(self.bus.slaves) == 1) and
|
||||||
(next(iter(self.bus.regions.values())).origin == 0)):
|
(next(iter(self.bus.regions.values())).origin == 0)):
|
||||||
self.submodules.bus_interconnect = interconnect_p2p_cls(
|
self.bus_interconnect = interconnect_p2p_cls(
|
||||||
master = next(iter(self.bus.masters.values())),
|
master = next(iter(self.bus.masters.values())),
|
||||||
slave = next(iter(self.bus.slaves.values())))
|
slave = next(iter(self.bus.slaves.values())))
|
||||||
# Otherwise, use InterconnectShared/Crossbar.
|
# Otherwise, use InterconnectShared/Crossbar.
|
||||||
|
@ -1151,7 +1151,7 @@ class SoC(LiteXModule):
|
||||||
"shared" : interconnect_shared_cls,
|
"shared" : interconnect_shared_cls,
|
||||||
"crossbar": interconnect_crossbar_cls,
|
"crossbar": interconnect_crossbar_cls,
|
||||||
}[self.bus.interconnect]
|
}[self.bus.interconnect]
|
||||||
self.submodules.bus_interconnect = interconnect_cls(
|
self.bus_interconnect = interconnect_cls(
|
||||||
masters = list(self.bus.masters.values()),
|
masters = list(self.bus.masters.values()),
|
||||||
slaves = [(self.bus.regions[n].decoder(self.bus), s) for n, s in self.bus.slaves.items()],
|
slaves = [(self.bus.regions[n].decoder(self.bus), s) for n, s in self.bus.slaves.items()],
|
||||||
register = True,
|
register = True,
|
||||||
|
@ -1175,12 +1175,12 @@ class SoC(LiteXModule):
|
||||||
if ((len(self.dma_bus.masters) == 1) and
|
if ((len(self.dma_bus.masters) == 1) and
|
||||||
(len(self.dma_bus.slaves) == 1) and
|
(len(self.dma_bus.slaves) == 1) and
|
||||||
(next(iter(self.dma_bus.regions.values())).origin == 0)):
|
(next(iter(self.dma_bus.regions.values())).origin == 0)):
|
||||||
self.submodules.dma_bus_interconnect = wishbone.InterconnectPointToPoint(
|
self.dma_bus_interconnect = wishbone.InterconnectPointToPoint(
|
||||||
master = next(iter(self.dma_bus.masters.values())),
|
master = next(iter(self.dma_bus.masters.values())),
|
||||||
slave = next(iter(self.dma_bus.slaves.values())))
|
slave = next(iter(self.dma_bus.slaves.values())))
|
||||||
# Otherwise, use InterconnectShared.
|
# Otherwise, use InterconnectShared.
|
||||||
else:
|
else:
|
||||||
self.submodules.dma_bus_interconnect = wishbone.InterconnectShared(
|
self.dma_bus_interconnect = wishbone.InterconnectShared(
|
||||||
masters = list(self.dma_bus.masters.values()),
|
masters = list(self.dma_bus.masters.values()),
|
||||||
slaves = [(self.dma_bus.regions[n].decoder(self.dma_bus), s) for n, s in self.dma_bus.slaves.items()],
|
slaves = [(self.dma_bus.regions[n].decoder(self.dma_bus), s) for n, s in self.dma_bus.slaves.items()],
|
||||||
register = True)
|
register = True)
|
||||||
|
@ -1191,7 +1191,7 @@ class SoC(LiteXModule):
|
||||||
self.add_config("CPU_HAS_DMA_BUS")
|
self.add_config("CPU_HAS_DMA_BUS")
|
||||||
|
|
||||||
# SoC CSR Interconnect ---------------------------------------------------------------------
|
# SoC CSR Interconnect ---------------------------------------------------------------------
|
||||||
self.submodules.csr_bankarray = csr_bus.CSRBankArray(self,
|
self.csr_bankarray = csr_bus.CSRBankArray(self,
|
||||||
address_map = self.csr.address_map,
|
address_map = self.csr.address_map,
|
||||||
data_width = self.csr.data_width,
|
data_width = self.csr.data_width,
|
||||||
address_width = self.csr.address_width,
|
address_width = self.csr.address_width,
|
||||||
|
@ -1200,7 +1200,7 @@ class SoC(LiteXModule):
|
||||||
ordering = self.csr.ordering,
|
ordering = self.csr.ordering,
|
||||||
soc_bus_data_width = self.bus.data_width)
|
soc_bus_data_width = self.bus.data_width)
|
||||||
if len(self.csr.masters):
|
if len(self.csr.masters):
|
||||||
self.submodules.csr_interconnect = csr_bus.InterconnectShared(
|
self.csr_interconnect = csr_bus.InterconnectShared(
|
||||||
masters = list(self.csr.masters.values()),
|
masters = list(self.csr.masters.values()),
|
||||||
slaves = self.csr_bankarray.get_buses())
|
slaves = self.csr_bankarray.get_buses())
|
||||||
|
|
||||||
|
@ -1298,7 +1298,7 @@ class LiteXSoC(SoC):
|
||||||
identifier += " " + build_time()
|
identifier += " " + build_time()
|
||||||
else:
|
else:
|
||||||
self.add_config("BIOS_NO_BUILD_TIME")
|
self.add_config("BIOS_NO_BUILD_TIME")
|
||||||
setattr(self.submodules, name, Identifier(identifier))
|
setattr(self, name, Identifier(identifier))
|
||||||
|
|
||||||
# Add UART -------------------------------------------------------------------------------------
|
# Add UART -------------------------------------------------------------------------------------
|
||||||
def add_uart(self, name="uart", uart_name="serial", baudrate=115200, fifo_depth=16):
|
def add_uart(self, name="uart", uart_name="serial", baudrate=115200, fifo_depth=16):
|
||||||
|
@ -1346,7 +1346,7 @@ class LiteXSoC(SoC):
|
||||||
elif uart_name in ["jtag_uart"]:
|
elif uart_name in ["jtag_uart"]:
|
||||||
from litex.soc.cores.jtag import JTAGPHY
|
from litex.soc.cores.jtag import JTAGPHY
|
||||||
# Run JTAG-UART in sys_jtag clk domain similar to sys clk domain but without sys_rst.
|
# Run JTAG-UART in sys_jtag clk domain similar to sys clk domain but without sys_rst.
|
||||||
self.clock_domains.cd_sys_jtag = ClockDomain()
|
self.cd_sys_jtag = ClockDomain()
|
||||||
self.comb += self.cd_sys_jtag.clk.eq(ClockSignal("sys"))
|
self.comb += self.cd_sys_jtag.clk.eq(ClockSignal("sys"))
|
||||||
uart_phy = JTAGPHY(device=self.platform.device, clock_domain="sys_jtag", platform=self.platform)
|
uart_phy = JTAGPHY(device=self.platform.device, clock_domain="sys_jtag", platform=self.platform)
|
||||||
uart = UART(uart_phy, **uart_kwargs)
|
uart = UART(uart_phy, **uart_kwargs)
|
||||||
|
@ -1373,7 +1373,7 @@ class LiteXSoC(SoC):
|
||||||
usb_pads = self.platform.request("usb")
|
usb_pads = self.platform.request("usb")
|
||||||
usb_iobuf = usbio.IoBuf(usb_pads.d_p, usb_pads.d_n, usb_pads.pullup)
|
usb_iobuf = usbio.IoBuf(usb_pads.d_p, usb_pads.d_n, usb_pads.pullup)
|
||||||
# Run USB-ACM in sys_usb clock domain similar to sys_clk domain but without sys_rst.
|
# Run USB-ACM in sys_usb clock domain similar to sys_clk domain but without sys_rst.
|
||||||
self.clock_domains.cd_sys_usb = ClockDomain()
|
self.cd_sys_usb = ClockDomain()
|
||||||
self.comb += self.cd_sys_usb.clk.eq(ClockSignal("sys"))
|
self.comb += self.cd_sys_usb.clk.eq(ClockSignal("sys"))
|
||||||
uart = ClockDomainsRenamer("sys_usb")(cdc_eptri.CDCUsb(usb_iobuf))
|
uart = ClockDomainsRenamer("sys_usb")(cdc_eptri.CDCUsb(usb_iobuf))
|
||||||
|
|
||||||
|
@ -1385,9 +1385,9 @@ class LiteXSoC(SoC):
|
||||||
|
|
||||||
# Add PHY/UART.
|
# Add PHY/UART.
|
||||||
if uart_phy is not None:
|
if uart_phy is not None:
|
||||||
setattr(self.submodules, name + "_phy", uart_phy)
|
setattr(self, name + "_phy", uart_phy)
|
||||||
if uart is not None:
|
if uart is not None:
|
||||||
setattr(self.submodules, name, uart)
|
setattr(self, name, uart)
|
||||||
|
|
||||||
# IRQ.
|
# IRQ.
|
||||||
if self.irq.enabled:
|
if self.irq.enabled:
|
||||||
|
@ -1404,8 +1404,8 @@ class LiteXSoC(SoC):
|
||||||
if clk_freq is None:
|
if clk_freq is None:
|
||||||
clk_freq = self.sys_clk_freq
|
clk_freq = self.sys_clk_freq
|
||||||
self.check_if_exists("uartbone")
|
self.check_if_exists("uartbone")
|
||||||
self.submodules.uartbone_phy = uart.UARTPHY(self.platform.request(name), clk_freq, baudrate)
|
self.uartbone_phy = uart.UARTPHY(self.platform.request(name), clk_freq, baudrate)
|
||||||
self.submodules.uartbone = uart.UARTBone(phy=self.uartbone_phy, clk_freq=clk_freq, cd=cd)
|
self.uartbone = uart.UARTBone(phy=self.uartbone_phy, clk_freq=clk_freq, cd=cd)
|
||||||
self.bus.add_master(name="uartbone", master=self.uartbone.wishbone)
|
self.bus.add_master(name="uartbone", master=self.uartbone.wishbone)
|
||||||
|
|
||||||
# Add JTAGbone ---------------------------------------------------------------------------------
|
# Add JTAGbone ---------------------------------------------------------------------------------
|
||||||
|
@ -1418,8 +1418,8 @@ class LiteXSoC(SoC):
|
||||||
self.check_if_exists(name)
|
self.check_if_exists(name)
|
||||||
jtagbone_phy = JTAGPHY(device=self.platform.device, chain=chain, platform=self.platform)
|
jtagbone_phy = JTAGPHY(device=self.platform.device, chain=chain, platform=self.platform)
|
||||||
jtagbone = uart.UARTBone(phy=jtagbone_phy, clk_freq=self.sys_clk_freq)
|
jtagbone = uart.UARTBone(phy=jtagbone_phy, clk_freq=self.sys_clk_freq)
|
||||||
setattr(self.submodules, f"{name}_phy", jtagbone_phy)
|
setattr(self, f"{name}_phy", jtagbone_phy)
|
||||||
setattr(self.submodules, name, jtagbone)
|
setattr(self, name, jtagbone)
|
||||||
self.bus.add_master(name=name, master=jtagbone.wishbone)
|
self.bus.add_master(name=name, master=jtagbone.wishbone)
|
||||||
|
|
||||||
# Add SDRAM ------------------------------------------------------------------------------------
|
# Add SDRAM ------------------------------------------------------------------------------------
|
||||||
|
@ -1447,7 +1447,7 @@ class LiteXSoC(SoC):
|
||||||
timing_settings = module.timing_settings,
|
timing_settings = module.timing_settings,
|
||||||
clk_freq = self.sys_clk_freq,
|
clk_freq = self.sys_clk_freq,
|
||||||
**kwargs)
|
**kwargs)
|
||||||
setattr(self.submodules, name, sdram)
|
setattr(self, name, sdram)
|
||||||
|
|
||||||
# Save SPD data to be able to verify it at runtime.
|
# Save SPD data to be able to verify it at runtime.
|
||||||
if hasattr(module, "_spd_data"):
|
if hasattr(module, "_spd_data"):
|
||||||
|
@ -1473,8 +1473,8 @@ class LiteXSoC(SoC):
|
||||||
if with_bist:
|
if with_bist:
|
||||||
sdram_generator = LiteDRAMBISTGenerator(sdram.crossbar.get_port())
|
sdram_generator = LiteDRAMBISTGenerator(sdram.crossbar.get_port())
|
||||||
sdram_checker = LiteDRAMBISTChecker( sdram.crossbar.get_port())
|
sdram_checker = LiteDRAMBISTChecker( sdram.crossbar.get_port())
|
||||||
setattr(self.submodules, f"{name}_generator", sdram_generator)
|
setattr(self, f"{name}_generator", sdram_generator)
|
||||||
setattr(self.submodules, f"{name}_checker", sdram_checker)
|
setattr(self, f"{name}_checker", sdram_checker)
|
||||||
|
|
||||||
if not with_soc_interconnect: return
|
if not with_soc_interconnect: return
|
||||||
|
|
||||||
|
@ -1589,7 +1589,7 @@ class LiteXSoC(SoC):
|
||||||
reverse = l2_cache_reverse)
|
reverse = l2_cache_reverse)
|
||||||
if l2_cache_full_memory_we:
|
if l2_cache_full_memory_we:
|
||||||
l2_cache = FullMemoryWE()(l2_cache)
|
l2_cache = FullMemoryWE()(l2_cache)
|
||||||
self.submodules.l2_cache = l2_cache
|
self.l2_cache = l2_cache
|
||||||
litedram_wb = self.l2_cache.slave
|
litedram_wb = self.l2_cache.slave
|
||||||
self.add_config("L2_SIZE", l2_cache_size)
|
self.add_config("L2_SIZE", l2_cache_size)
|
||||||
else:
|
else:
|
||||||
|
@ -1597,7 +1597,7 @@ class LiteXSoC(SoC):
|
||||||
self.submodules += wishbone.Converter(wb_sdram, litedram_wb)
|
self.submodules += wishbone.Converter(wb_sdram, litedram_wb)
|
||||||
|
|
||||||
# Wishbone Slave <--> LiteDRAM bridge.
|
# Wishbone Slave <--> LiteDRAM bridge.
|
||||||
self.submodules.wishbone_bridge = LiteDRAMWishbone2Native(
|
self.wishbone_bridge = LiteDRAMWishbone2Native(
|
||||||
wishbone = litedram_wb,
|
wishbone = litedram_wb,
|
||||||
port = port,
|
port = port,
|
||||||
base_address = self.bus.regions["main_ram"].origin
|
base_address = self.bus.regions["main_ram"].origin
|
||||||
|
@ -1635,7 +1635,7 @@ class LiteXSoC(SoC):
|
||||||
ethmac = ClockDomainsRenamer({
|
ethmac = ClockDomainsRenamer({
|
||||||
"eth_tx": phy_cd + "_tx",
|
"eth_tx": phy_cd + "_tx",
|
||||||
"eth_rx": phy_cd + "_rx"})(ethmac)
|
"eth_rx": phy_cd + "_rx"})(ethmac)
|
||||||
setattr(self.submodules, name, ethmac)
|
setattr(self, name, ethmac)
|
||||||
# Compute Regions size and add it to the SoC.
|
# Compute Regions size and add it to the SoC.
|
||||||
ethmac_region_size = (ethmac.rx_slots.constant + ethmac.tx_slots.constant)*ethmac.slot_size.constant
|
ethmac_region_size = (ethmac.rx_slots.constant + ethmac.tx_slots.constant)*ethmac.slot_size.constant
|
||||||
ethmac_region = SoCRegion(origin=self.mem_map.get(name, None), size=ethmac_region_size, cached=False)
|
ethmac_region = SoCRegion(origin=self.mem_map.get(name, None), size=ethmac_region_size, cached=False)
|
||||||
|
@ -1694,20 +1694,20 @@ class LiteXSoC(SoC):
|
||||||
"eth_tx": phy_cd + "_tx",
|
"eth_tx": phy_cd + "_tx",
|
||||||
"eth_rx": phy_cd + "_rx",
|
"eth_rx": phy_cd + "_rx",
|
||||||
"sys": phy_cd + "_rx"})(ethcore)
|
"sys": phy_cd + "_rx"})(ethcore)
|
||||||
setattr(self.submodules, "ethcore_" + name, ethcore)
|
setattr(self, "ethcore_" + name, ethcore)
|
||||||
|
|
||||||
etherbone_cd = "sys"
|
etherbone_cd = "sys"
|
||||||
if not with_sys_datapath:
|
if not with_sys_datapath:
|
||||||
# Create Etherbone clock domain and run it from sys clock domain.
|
# Create Etherbone clock domain and run it from sys clock domain.
|
||||||
etherbone_cd = name
|
etherbone_cd = name
|
||||||
setattr(self.clock_domains, f"cd_{name}", ClockDomain(name))
|
setattr(self, f"cd_{name}", ClockDomain(name))
|
||||||
self.comb += getattr(self, f"cd_{name}").clk.eq(ClockSignal("sys"))
|
self.comb += getattr(self, f"cd_{name}").clk.eq(ClockSignal("sys"))
|
||||||
self.comb += getattr(self, f"cd_{name}").rst.eq(ResetSignal("sys"))
|
self.comb += getattr(self, f"cd_{name}").rst.eq(ResetSignal("sys"))
|
||||||
|
|
||||||
# Etherbone
|
# Etherbone
|
||||||
self.check_if_exists(name)
|
self.check_if_exists(name)
|
||||||
etherbone = LiteEthEtherbone(ethcore.udp, udp_port, buffer_depth=buffer_depth, cd=etherbone_cd)
|
etherbone = LiteEthEtherbone(ethcore.udp, udp_port, buffer_depth=buffer_depth, cd=etherbone_cd)
|
||||||
setattr(self.submodules, name, etherbone)
|
setattr(self, name, etherbone)
|
||||||
self.bus.add_master(master=etherbone.wishbone.bus)
|
self.bus.add_master(master=etherbone.wishbone.bus)
|
||||||
|
|
||||||
# Timing constraints
|
# Timing constraints
|
||||||
|
@ -1736,12 +1736,12 @@ class LiteXSoC(SoC):
|
||||||
self.check_if_exists(name + "_phy")
|
self.check_if_exists(name + "_phy")
|
||||||
spiflash_pads = self.platform.request(name if mode == "1x" else name + mode)
|
spiflash_pads = self.platform.request(name if mode == "1x" else name + mode)
|
||||||
spiflash_phy = LiteSPIPHY(spiflash_pads, module, device=self.platform.device, default_divisor=int(self.sys_clk_freq/clk_freq), rate=rate)
|
spiflash_phy = LiteSPIPHY(spiflash_pads, module, device=self.platform.device, default_divisor=int(self.sys_clk_freq/clk_freq), rate=rate)
|
||||||
setattr(self.submodules, name + "_phy", spiflash_phy)
|
setattr(self, name + "_phy", spiflash_phy)
|
||||||
|
|
||||||
# Core.
|
# Core.
|
||||||
self.check_if_exists(name + "_mmap")
|
self.check_if_exists(name + "_mmap")
|
||||||
spiflash_core = LiteSPI(spiflash_phy, mmap_endianness=self.cpu.endianness, **kwargs)
|
spiflash_core = LiteSPI(spiflash_phy, mmap_endianness=self.cpu.endianness, **kwargs)
|
||||||
setattr(self.submodules, name + "_core", spiflash_core)
|
setattr(self, name + "_core", spiflash_core)
|
||||||
spiflash_region = SoCRegion(origin=self.mem_map.get(name, None), size=module.total_size)
|
spiflash_region = SoCRegion(origin=self.mem_map.get(name, None), size=module.total_size)
|
||||||
self.bus.add_slave(name=name, slave=spiflash_core.bus, region=spiflash_region)
|
self.bus.add_slave(name=name, slave=spiflash_core.bus, region=spiflash_region)
|
||||||
|
|
||||||
|
@ -1786,7 +1786,7 @@ class LiteXSoC(SoC):
|
||||||
spi_clk_freq = spi_clk_freq,
|
spi_clk_freq = spi_clk_freq,
|
||||||
)
|
)
|
||||||
spisdcard.add_clk_divider()
|
spisdcard.add_clk_divider()
|
||||||
setattr(self.submodules, name, spisdcard)
|
setattr(self, name, spisdcard)
|
||||||
|
|
||||||
# Debug.
|
# Debug.
|
||||||
if software_debug:
|
if software_debug:
|
||||||
|
@ -1814,13 +1814,13 @@ class LiteXSoC(SoC):
|
||||||
# Core.
|
# Core.
|
||||||
self.check_if_exists("sdphy")
|
self.check_if_exists("sdphy")
|
||||||
self.check_if_exists("sdcore")
|
self.check_if_exists("sdcore")
|
||||||
self.submodules.sdphy = SDPHY(sdcard_pads, self.platform.device, self.clk_freq, cmd_timeout=10e-1, data_timeout=10e-1)
|
self.sdphy = SDPHY(sdcard_pads, self.platform.device, self.clk_freq, cmd_timeout=10e-1, data_timeout=10e-1)
|
||||||
self.submodules.sdcore = SDCore(self.sdphy)
|
self.sdcore = SDCore(self.sdphy)
|
||||||
|
|
||||||
# Block2Mem DMA.
|
# Block2Mem DMA.
|
||||||
if "read" in mode:
|
if "read" in mode:
|
||||||
bus = wishbone.Interface(data_width=self.bus.data_width, adr_width=self.bus.get_address_width(standard="wishbone"))
|
bus = wishbone.Interface(data_width=self.bus.data_width, adr_width=self.bus.get_address_width(standard="wishbone"))
|
||||||
self.submodules.sdblock2mem = SDBlock2MemDMA(bus=bus, endianness=self.cpu.endianness)
|
self.sdblock2mem = SDBlock2MemDMA(bus=bus, endianness=self.cpu.endianness)
|
||||||
self.comb += self.sdcore.source.connect(self.sdblock2mem.sink)
|
self.comb += self.sdcore.source.connect(self.sdblock2mem.sink)
|
||||||
dma_bus = self.bus if not hasattr(self, "dma_bus") else self.dma_bus
|
dma_bus = self.bus if not hasattr(self, "dma_bus") else self.dma_bus
|
||||||
dma_bus.add_master("sdblock2mem", master=bus)
|
dma_bus.add_master("sdblock2mem", master=bus)
|
||||||
|
@ -1828,13 +1828,13 @@ class LiteXSoC(SoC):
|
||||||
# Mem2Block DMA.
|
# Mem2Block DMA.
|
||||||
if "write" in mode:
|
if "write" in mode:
|
||||||
bus = wishbone.Interface(data_width=self.bus.data_width, adr_width=self.bus.get_address_width(standard="wishbone"))
|
bus = wishbone.Interface(data_width=self.bus.data_width, adr_width=self.bus.get_address_width(standard="wishbone"))
|
||||||
self.submodules.sdmem2block = SDMem2BlockDMA(bus=bus, endianness=self.cpu.endianness)
|
self.sdmem2block = SDMem2BlockDMA(bus=bus, endianness=self.cpu.endianness)
|
||||||
self.comb += self.sdmem2block.source.connect(self.sdcore.sink)
|
self.comb += self.sdmem2block.source.connect(self.sdcore.sink)
|
||||||
dma_bus = self.bus if not hasattr(self, "dma_bus") else self.dma_bus
|
dma_bus = self.bus if not hasattr(self, "dma_bus") else self.dma_bus
|
||||||
dma_bus.add_master("sdmem2block", master=bus)
|
dma_bus.add_master("sdmem2block", master=bus)
|
||||||
|
|
||||||
# Interrupts.
|
# Interrupts.
|
||||||
self.submodules.sdirq = EventManager()
|
self.sdirq = EventManager()
|
||||||
self.sdirq.card_detect = EventSourcePulse(description="SDCard has been ejected/inserted.")
|
self.sdirq.card_detect = EventSourcePulse(description="SDCard has been ejected/inserted.")
|
||||||
if "read" in mode:
|
if "read" in mode:
|
||||||
self.sdirq.block2mem_dma = EventSourcePulse(description="Block2Mem DMA terminated.")
|
self.sdirq.block2mem_dma = EventSourcePulse(description="Block2Mem DMA terminated.")
|
||||||
|
@ -1877,22 +1877,21 @@ class LiteXSoC(SoC):
|
||||||
|
|
||||||
# Core.
|
# Core.
|
||||||
self.check_if_exists("sata_core")
|
self.check_if_exists("sata_core")
|
||||||
self.submodules.sata_core = LiteSATACore(phy)
|
self.sata_core = LiteSATACore(phy)
|
||||||
|
|
||||||
# Crossbar.
|
# Crossbar.
|
||||||
self.check_if_exists("sata_crossbar")
|
self.check_if_exists("sata_crossbar")
|
||||||
self.submodules.sata_crossbar = LiteSATACrossbar(self.sata_core)
|
self.sata_crossbar = LiteSATACrossbar(self.sata_core)
|
||||||
|
|
||||||
# Identify.
|
# Identify.
|
||||||
if with_identify:
|
if with_identify:
|
||||||
sata_identify = LiteSATAIdentify(self.sata_crossbar.get_port())
|
sata_identify = LiteSATAIdentify(self.sata_crossbar.get_port())
|
||||||
self.submodules += sata_identify
|
self.sata_identify = LiteSATAIdentifyCSR(sata_identify)
|
||||||
self.submodules.sata_identify = LiteSATAIdentifyCSR(sata_identify)
|
|
||||||
|
|
||||||
# Sector2Mem DMA.
|
# Sector2Mem DMA.
|
||||||
if "read" in mode:
|
if "read" in mode:
|
||||||
bus = wishbone.Interface(data_width=self.bus.data_width, adr_width=self.bus.get_address_width(standard="wishbone"))
|
bus = wishbone.Interface(data_width=self.bus.data_width, adr_width=self.bus.get_address_width(standard="wishbone"))
|
||||||
self.submodules.sata_sector2mem = LiteSATASector2MemDMA(
|
self.sata_sector2mem = LiteSATASector2MemDMA(
|
||||||
port = self.sata_crossbar.get_port(),
|
port = self.sata_crossbar.get_port(),
|
||||||
bus = bus,
|
bus = bus,
|
||||||
endianness = self.cpu.endianness)
|
endianness = self.cpu.endianness)
|
||||||
|
@ -1902,7 +1901,7 @@ class LiteXSoC(SoC):
|
||||||
# Mem2Sector DMA.
|
# Mem2Sector DMA.
|
||||||
if "write" in mode:
|
if "write" in mode:
|
||||||
bus = wishbone.Interface(data_width=self.bus.data_width, adr_width=self.bus.get_address_width(standard="wishbone"))
|
bus = wishbone.Interface(data_width=self.bus.data_width, adr_width=self.bus.get_address_width(standard="wishbone"))
|
||||||
self.submodules.sata_mem2sector = LiteSATAMem2SectorDMA(
|
self.sata_mem2sector = LiteSATAMem2SectorDMA(
|
||||||
bus = bus,
|
bus = bus,
|
||||||
port = self.sata_crossbar.get_port(),
|
port = self.sata_crossbar.get_port(),
|
||||||
endianness = self.cpu.endianness)
|
endianness = self.cpu.endianness)
|
||||||
|
@ -1910,7 +1909,7 @@ class LiteXSoC(SoC):
|
||||||
dma_bus.add_master("sata_mem2sector", master=bus)
|
dma_bus.add_master("sata_mem2sector", master=bus)
|
||||||
|
|
||||||
# Interrupts.
|
# Interrupts.
|
||||||
self.submodules.sata_irq = EventManager()
|
self.sata_irq = EventManager()
|
||||||
if "read" in mode:
|
if "read" in mode:
|
||||||
self.sata_irq.sector2mem_dma = EventSourcePulse(description="Sector2Mem DMA terminated.")
|
self.sata_irq.sector2mem_dma = EventSourcePulse(description="Sector2Mem DMA terminated.")
|
||||||
if "write" in mode:
|
if "write" in mode:
|
||||||
|
@ -1952,19 +1951,19 @@ class LiteXSoC(SoC):
|
||||||
endianness = phy.endianness,
|
endianness = phy.endianness,
|
||||||
address_width = address_width
|
address_width = address_width
|
||||||
)
|
)
|
||||||
setattr(self.submodules, f"{name}_endpoint", endpoint)
|
setattr(self, f"{name}_endpoint", endpoint)
|
||||||
|
|
||||||
# MMAP.
|
# MMAP.
|
||||||
self.check_if_exists(f"{name}_mmap")
|
self.check_if_exists(f"{name}_mmap")
|
||||||
mmap = LitePCIeWishboneMaster(self.pcie_endpoint, base_address=self.mem_map["csr"])
|
mmap = LitePCIeWishboneMaster(self.pcie_endpoint, base_address=self.mem_map["csr"])
|
||||||
setattr(self.submodules, f"{name}_mmap", mmap)
|
setattr(self, f"{name}_mmap", mmap)
|
||||||
self.bus.add_master(master=mmap.wishbone)
|
self.bus.add_master(master=mmap.wishbone)
|
||||||
|
|
||||||
# MSI.
|
# MSI.
|
||||||
if with_msi:
|
if with_msi:
|
||||||
self.check_if_exists(f"{name}_msi")
|
self.check_if_exists(f"{name}_msi")
|
||||||
msi = LitePCIeMSI()
|
msi = LitePCIeMSI()
|
||||||
setattr(self.submodules, f"{name}_msi", msi)
|
setattr(self, f"{name}_msi", msi)
|
||||||
self.comb += msi.source.connect(phy.msi)
|
self.comb += msi.source.connect(phy.msi)
|
||||||
self.msis = {}
|
self.msis = {}
|
||||||
|
|
||||||
|
@ -1978,7 +1977,7 @@ class LiteXSoC(SoC):
|
||||||
with_synchronizer = with_synchronizer,
|
with_synchronizer = with_synchronizer,
|
||||||
address_width = address_width
|
address_width = address_width
|
||||||
)
|
)
|
||||||
setattr(self.submodules, f"{name}_dma{i}", dma)
|
setattr(self, f"{name}_dma{i}", dma)
|
||||||
self.msis[f"{name.upper()}_DMA{i}_WRITER"] = dma.writer.irq
|
self.msis[f"{name.upper()}_DMA{i}_WRITER"] = dma.writer.irq
|
||||||
self.msis[f"{name.upper()}_DMA{i}_READER"] = dma.reader.irq
|
self.msis[f"{name.upper()}_DMA{i}_READER"] = dma.reader.irq
|
||||||
self.add_constant("DMA_CHANNELS", ndmas)
|
self.add_constant("DMA_CHANNELS", ndmas)
|
||||||
|
@ -2002,12 +2001,12 @@ class LiteXSoC(SoC):
|
||||||
self.check_if_exists(f"{name}_vtg")
|
self.check_if_exists(f"{name}_vtg")
|
||||||
vtg = VideoTimingGenerator(default_video_timings=timings if isinstance(timings, str) else timings[1])
|
vtg = VideoTimingGenerator(default_video_timings=timings if isinstance(timings, str) else timings[1])
|
||||||
vtg = ClockDomainsRenamer(clock_domain)(vtg)
|
vtg = ClockDomainsRenamer(clock_domain)(vtg)
|
||||||
setattr(self.submodules, f"{name}_vtg", vtg)
|
setattr(self, f"{name}_vtg", vtg)
|
||||||
|
|
||||||
# ColorsBars Pattern.
|
# ColorsBars Pattern.
|
||||||
self.check_if_exists(name)
|
self.check_if_exists(name)
|
||||||
colorbars = ClockDomainsRenamer(clock_domain)(ColorBarsPattern())
|
colorbars = ClockDomainsRenamer(clock_domain)(ColorBarsPattern())
|
||||||
setattr(self.submodules, name, colorbars)
|
setattr(self, name, colorbars)
|
||||||
|
|
||||||
# Connect Video Timing Generator to ColorsBars Pattern.
|
# Connect Video Timing Generator to ColorsBars Pattern.
|
||||||
self.comb += [
|
self.comb += [
|
||||||
|
@ -2024,7 +2023,7 @@ class LiteXSoC(SoC):
|
||||||
self.check_if_exists(f"{name}_vtg")
|
self.check_if_exists(f"{name}_vtg")
|
||||||
vtg = VideoTimingGenerator(default_video_timings=timings if isinstance(timings, str) else timings[1])
|
vtg = VideoTimingGenerator(default_video_timings=timings if isinstance(timings, str) else timings[1])
|
||||||
vtg = ClockDomainsRenamer(clock_domain)(vtg)
|
vtg = ClockDomainsRenamer(clock_domain)(vtg)
|
||||||
setattr(self.submodules, f"{name}_vtg", vtg)
|
setattr(self, f"{name}_vtg", vtg)
|
||||||
|
|
||||||
# Video Terminal.
|
# Video Terminal.
|
||||||
timings = timings if isinstance(timings, str) else timings[0]
|
timings = timings if isinstance(timings, str) else timings[0]
|
||||||
|
@ -2033,14 +2032,14 @@ class LiteXSoC(SoC):
|
||||||
vres = int(timings.split("@")[0].split("x")[1]),
|
vres = int(timings.split("@")[0].split("x")[1]),
|
||||||
)
|
)
|
||||||
vt = ClockDomainsRenamer(clock_domain)(vt)
|
vt = ClockDomainsRenamer(clock_domain)(vt)
|
||||||
setattr(self.submodules, name, vt)
|
setattr(self, name, vt)
|
||||||
|
|
||||||
# Connect Video Timing Generator to Video Terminal.
|
# Connect Video Timing Generator to Video Terminal.
|
||||||
self.comb += vtg.source.connect(vt.vtg_sink)
|
self.comb += vtg.source.connect(vt.vtg_sink)
|
||||||
|
|
||||||
# Connect UART to Video Terminal.
|
# Connect UART to Video Terminal.
|
||||||
uart_cdc = stream.ClockDomainCrossing([("data", 8)], cd_from="sys", cd_to=clock_domain)
|
uart_cdc = stream.ClockDomainCrossing([("data", 8)], cd_from="sys", cd_to=clock_domain)
|
||||||
setattr(self.submodules, f"{name}_uart_cdc", uart_cdc)
|
setattr(self, f"{name}_uart_cdc", uart_cdc)
|
||||||
self.comb += [
|
self.comb += [
|
||||||
uart_cdc.sink.valid.eq(self.uart.tx_fifo.source.valid & self.uart.tx_fifo.source.ready),
|
uart_cdc.sink.valid.eq(self.uart.tx_fifo.source.valid & self.uart.tx_fifo.source.ready),
|
||||||
uart_cdc.sink.data.eq(self.uart.tx_fifo.source.data),
|
uart_cdc.sink.data.eq(self.uart.tx_fifo.source.data),
|
||||||
|
@ -2058,7 +2057,7 @@ class LiteXSoC(SoC):
|
||||||
# Video Timing Generator.
|
# Video Timing Generator.
|
||||||
vtg = VideoTimingGenerator(default_video_timings=timings if isinstance(timings, str) else timings[1])
|
vtg = VideoTimingGenerator(default_video_timings=timings if isinstance(timings, str) else timings[1])
|
||||||
vtg = ClockDomainsRenamer(clock_domain)(vtg)
|
vtg = ClockDomainsRenamer(clock_domain)(vtg)
|
||||||
setattr(self.submodules, f"{name}_vtg", vtg)
|
setattr(self, f"{name}_vtg", vtg)
|
||||||
|
|
||||||
# Video FrameBuffer.
|
# Video FrameBuffer.
|
||||||
timings = timings if isinstance(timings, str) else timings[0]
|
timings = timings if isinstance(timings, str) else timings[0]
|
||||||
|
@ -2073,7 +2072,7 @@ class LiteXSoC(SoC):
|
||||||
clock_domain = clock_domain,
|
clock_domain = clock_domain,
|
||||||
clock_faster_than_sys = vtg.video_timings["pix_clk"] >= self.sys_clk_freq,
|
clock_faster_than_sys = vtg.video_timings["pix_clk"] >= self.sys_clk_freq,
|
||||||
)
|
)
|
||||||
setattr(self.submodules, name, vfb)
|
setattr(self, name, vfb)
|
||||||
|
|
||||||
# Connect Video Timing Generator to Video FrameBuffer.
|
# Connect Video Timing Generator to Video FrameBuffer.
|
||||||
self.comb += vtg.source.connect(vfb.vtg_sink)
|
self.comb += vtg.source.connect(vfb.vtg_sink)
|
||||||
|
|
Loading…
Reference in a new issue