Example #1
0
    def __init__(self,
                 with_sdram=False,
                 with_ethernet=False,
                 ethernet_phy_model="sim",
                 with_etherbone=False,
                 etherbone_mac_address=0x10e2d5000001,
                 etherbone_ip_address="192.168.1.51",
                 with_analyzer=False,
                 sdram_module="MT48LC16M16",
                 sdram_init=[],
                 sdram_data_width=32,
                 sdram_spd_data=None,
                 sdram_verbosity=0,
                 with_i2c=False,
                 with_sdcard=False,
                 with_spi_flash=False,
                 spi_flash_init=[],
                 with_gpio=False,
                 sim_debug=False,
                 trace_reset_on=False,
                 **kwargs):
        platform = Platform()
        sys_clk_freq = int(1e6)

        # SoCCore ----------------------------------------------------------------------------------
        SoCCore.__init__(self,
                         platform,
                         clk_freq=sys_clk_freq,
                         ident="LiteX Simulation",
                         **kwargs)

        # CRG --------------------------------------------------------------------------------------
        self.submodules.crg = CRG(platform.request("sys_clk"))

        # SDRAM ------------------------------------------------------------------------------------
        if not self.integrated_main_ram_size and with_sdram:
            sdram_clk_freq = int(100e6)  # FIXME: use 100MHz timings
            if sdram_spd_data is None:
                sdram_module_cls = getattr(litedram_modules, sdram_module)
                sdram_rate = "1:{}".format(
                    sdram_module_nphases[sdram_module_cls.memtype])
                sdram_module = sdram_module_cls(sdram_clk_freq, sdram_rate)
            else:
                sdram_module = litedram_modules.SDRAMModule.from_spd_data(
                    sdram_spd_data, sdram_clk_freq)
            self.submodules.sdrphy = SDRAMPHYModel(module=sdram_module,
                                                   data_width=sdram_data_width,
                                                   clk_freq=sdram_clk_freq,
                                                   verbosity=sdram_verbosity,
                                                   init=sdram_init)
            self.add_sdram("sdram",
                           phy=self.sdrphy,
                           module=sdram_module,
                           origin=self.mem_map["main_ram"],
                           size=kwargs.get("max_sdram_size", 0x40000000),
                           l2_cache_size=kwargs.get("l2_size", 8192),
                           l2_cache_min_data_width=kwargs.get(
                               "min_l2_data_width", 128),
                           l2_cache_reverse=False)
            if sdram_init != []:
                # Skip SDRAM test to avoid corrupting pre-initialized contents.
                self.add_constant("SDRAM_TEST_DISABLE")
            else:
                # Reduce memtest size for simulation speedup
                self.add_constant("MEMTEST_DATA_SIZE", 8 * 1024)
                self.add_constant("MEMTEST_ADDR_SIZE", 8 * 1024)

        # Ethernet / Etherbone PHY -----------------------------------------------------------------
        if with_ethernet or with_etherbone:
            if ethernet_phy_model == "sim":
                self.submodules.ethphy = LiteEthPHYModel(
                    self.platform.request("eth", 0))
            elif ethernet_phy_model == "xgmii":
                self.submodules.ethphy = LiteEthPHYXGMII(None,
                                                         self.platform.request(
                                                             "xgmii_eth", 0),
                                                         model=True)
            elif ethernet_phy_model == "gmii":
                self.submodules.ethphy = LiteEthPHYGMII(None,
                                                        self.platform.request(
                                                            "gmii_eth", 0),
                                                        model=True)
            else:
                raise ValueError("Unknown Ethernet PHY model:",
                                 ethernet_phy_model)

        # Ethernet and Etherbone -------------------------------------------------------------------
        if with_ethernet and with_etherbone:
            etherbone_ip_address = convert_ip(etherbone_ip_address)
            # Ethernet MAC
            self.submodules.ethmac = LiteEthMAC(phy=self.ethphy,
                                                dw=8,
                                                interface="hybrid",
                                                endianness=self.cpu.endianness,
                                                hw_mac=etherbone_mac_address)

            # SoftCPU
            self.add_memory_region("ethmac",
                                   self.mem_map.get("ethmac", None),
                                   0x2000,
                                   type="io")
            self.add_wb_slave(self.mem_regions["ethmac"].origin,
                              self.ethmac.bus, 0x2000)
            if self.irq.enabled:
                self.irq.add("ethmac", use_loc_if_exists=True)
            # HW ethernet
            self.submodules.arp = LiteEthARP(self.ethmac,
                                             etherbone_mac_address,
                                             etherbone_ip_address,
                                             sys_clk_freq,
                                             dw=8)
            self.submodules.ip = LiteEthIP(self.ethmac,
                                           etherbone_mac_address,
                                           etherbone_ip_address,
                                           self.arp.table,
                                           dw=8)
            self.submodules.icmp = LiteEthICMP(self.ip,
                                               etherbone_ip_address,
                                               dw=8)
            self.submodules.udp = LiteEthUDP(self.ip,
                                             etherbone_ip_address,
                                             dw=8)
            # Etherbone
            self.submodules.etherbone = LiteEthEtherbone(self.udp,
                                                         1234,
                                                         mode="master")
            self.add_wb_master(self.etherbone.wishbone.bus)

        # Ethernet ---------------------------------------------------------------------------------
        elif with_ethernet:
            # Ethernet MAC
            self.submodules.ethmac = ethmac = LiteEthMAC(
                phy=self.ethphy,
                dw=64 if ethernet_phy_model == "xgmii" else 32,
                interface="wishbone",
                endianness=self.cpu.endianness)
            ethmac_region_size = (
                ethmac.rx_slots.read() +
                ethmac.tx_slots.read()) * ethmac.slot_size.read()
            self.add_memory_region("ethmac",
                                   self.mem_map.get("ethmac", None),
                                   ethmac_region_size,
                                   type="io")
            self.add_wb_slave(self.mem_regions["ethmac"].origin, ethmac.bus,
                              ethmac_region_size)
            if self.irq.enabled:
                self.irq.add("ethmac", use_loc_if_exists=True)

        # Etherbone --------------------------------------------------------------------------------
        elif with_etherbone:
            self.add_etherbone(phy=self.ethphy,
                               ip_address=etherbone_ip_address,
                               mac_address=etherbone_mac_address)

        # I2C --------------------------------------------------------------------------------------
        if with_i2c:
            pads = platform.request("i2c", 0)
            self.submodules.i2c = I2CMasterSim(pads)

        # SDCard -----------------------------------------------------------------------------------
        if with_sdcard:
            self.add_sdcard("sdcard", use_emulator=True)

        # SPI Flash --------------------------------------------------------------------------------
        if with_spi_flash:
            from litespi.phy.model import LiteSPIPHYModel
            from litespi.modules import S25FL128L
            from litespi.opcodes import SpiNorFlashOpCodes as Codes
            spiflash_module = S25FL128L(Codes.READ_1_1_4)
            if spi_flash_init is None:
                platform.add_sources(
                    os.path.abspath(os.path.dirname(__file__)),
                    "../build/sim/verilog/iddr_verilog.v")
                platform.add_sources(
                    os.path.abspath(os.path.dirname(__file__)),
                    "../build/sim/verilog/oddr_verilog.v")
            self.submodules.spiflash_phy = LiteSPIPHYModel(spiflash_module,
                                                           init=spi_flash_init)
            self.add_spi_flash(phy=self.spiflash_phy,
                               mode="4x",
                               module=spiflash_module,
                               with_master=True)

        # GPIO --------------------------------------------------------------------------------------
        if with_gpio:
            self.submodules.gpio = GPIOTristate(platform.request("gpio"),
                                                with_irq=True)
            self.irq.add("gpio", use_loc_if_exists=True)

        # Simulation debugging ----------------------------------------------------------------------
        if sim_debug:
            platform.add_debug(self, reset=1 if trace_reset_on else 0)
        else:
            self.comb += platform.trace.eq(1)

        # Analyzer ---------------------------------------------------------------------------------
        if with_analyzer:
            analyzer_signals = [
                # IBus (could also just added as self.cpu.ibus)
                self.cpu.ibus.stb,
                self.cpu.ibus.cyc,
                self.cpu.ibus.adr,
                self.cpu.ibus.we,
                self.cpu.ibus.ack,
                self.cpu.ibus.sel,
                self.cpu.ibus.dat_w,
                self.cpu.ibus.dat_r,
                # DBus (could also just added as self.cpu.dbus)
                self.cpu.dbus.stb,
                self.cpu.dbus.cyc,
                self.cpu.dbus.adr,
                self.cpu.dbus.we,
                self.cpu.dbus.ack,
                self.cpu.dbus.sel,
                self.cpu.dbus.dat_w,
                self.cpu.dbus.dat_r,
            ]
            self.submodules.analyzer = LiteScopeAnalyzer(
                analyzer_signals,
                depth=512,
                clock_domain="sys",
                csr_csv="analyzer.csv")
Example #2
0
    def __init__(self,
                 with_sdram=False,
                 with_spi_xip=False,
                 with_ethernet=False,
                 with_etherbone=False,
                 etherbone_mac_address=0x10e2d5000001,
                 etherbone_ip_address="192.168.1.51",
                 with_analyzer=False,
                 sdram_module="MT48LC16M16",
                 sdram_init=[],
                 sdram_data_width=32,
                 sdram_verbosity=0,
                 **kwargs):
        platform = Platform()
        sys_clk_freq = int(1e6)

        # SoCSDRAM ---------------------------------------------------------------------------------
        SoCSDRAM.__init__(self,
                          platform,
                          clk_freq=sys_clk_freq,
                          ident="LiteX Simulation",
                          ident_version=True,
                          l2_reverse=False,
                          **kwargs)
        # CRG --------------------------------------------------------------------------------------
        self.submodules.crg = CRG(platform.request("sys_clk"))

        # SPI XIP ----------------------------------------------------------------------------------
        if with_spi_xip:
            spi_xip_size = kwargs["spi_xip_size"]
            self.submodules.spiphy = LiteSPIPHYModel(
                spi_xip_size, init=kwargs["spi_xip_init"])
            self.submodules.spictl = LiteSPI(phy=self.spiphy,
                                             endianness=self.cpu.endianness)
            spi_xip_region = SoCRegion(origin=self.mem_map.get("spixip", None),
                                       size=spi_xip_size,
                                       cached=False)
            self.bus.add_slave(name="spixip",
                               slave=self.spictl.bus,
                               region=spi_xip_region)

        # SDRAM ------------------------------------------------------------------------------------
        if with_sdram:
            sdram_clk_freq = int(100e6)  # FIXME: use 100MHz timings
            sdram_module_cls = getattr(litedram_modules, sdram_module)
            sdram_rate = "1:{}".format(
                sdram_module_nphases[sdram_module_cls.memtype])
            sdram_module = sdram_module_cls(sdram_clk_freq, sdram_rate)
            phy_settings = get_sdram_phy_settings(memtype=sdram_module.memtype,
                                                  data_width=sdram_data_width,
                                                  clk_freq=sdram_clk_freq)
            self.submodules.sdrphy = SDRAMPHYModel(module=sdram_module,
                                                   settings=phy_settings,
                                                   clk_freq=sdram_clk_freq,
                                                   verbosity=sdram_verbosity,
                                                   init=sdram_init)
            self.register_sdram(self.sdrphy, sdram_module.geom_settings,
                                sdram_module.timing_settings)
            # Reduce memtest size for simulation speedup
            self.add_constant("MEMTEST_DATA_SIZE", 8 * 1024)
            self.add_constant("MEMTEST_ADDR_SIZE", 8 * 1024)

        #assert not (with_ethernet and with_etherbone)

        if with_ethernet and with_etherbone:
            dw = 8
            etherbone_ip_address = convert_ip(etherbone_ip_address)
            # Ethernet PHY
            self.submodules.ethphy = LiteEthPHYModel(
                self.platform.request("eth", 0))
            self.add_csr("ethphy")
            # Ethernet MAC
            self.submodules.ethmac = LiteEthMAC(phy=self.ethphy,
                                                dw=dw,
                                                interface="hybrid",
                                                endianness=self.cpu.endianness,
                                                hw_mac=etherbone_mac_address)

            # SoftCPU
            self.add_memory_region("ethmac",
                                   self.mem_map["ethmac"],
                                   0x2000,
                                   type="io")
            self.add_wb_slave(self.mem_regions["ethmac"].origin,
                              self.ethmac.bus, 0x2000)
            self.add_csr("ethmac")
            self.add_interrupt("ethmac")
            # HW ethernet
            self.submodules.arp = LiteEthARP(self.ethmac,
                                             etherbone_mac_address,
                                             etherbone_ip_address,
                                             sys_clk_freq,
                                             dw=dw)
            self.submodules.ip = LiteEthIP(self.ethmac,
                                           etherbone_mac_address,
                                           etherbone_ip_address,
                                           self.arp.table,
                                           dw=dw)
            self.submodules.icmp = LiteEthICMP(self.ip,
                                               etherbone_ip_address,
                                               dw=dw)
            self.submodules.udp = LiteEthUDP(self.ip,
                                             etherbone_ip_address,
                                             dw=dw)
            # Etherbone
            self.submodules.etherbone = LiteEthEtherbone(self.udp,
                                                         1234,
                                                         mode="master")
            self.add_wb_master(self.etherbone.wishbone.bus)

        # Ethernet ---------------------------------------------------------------------------------
        elif with_ethernet:
            # Ethernet PHY
            self.submodules.ethphy = LiteEthPHYModel(
                self.platform.request("eth", 0))
            self.add_csr("ethphy")
            # Ethernet MAC
            ethmac = LiteEthMAC(phy=self.ethphy,
                                dw=32,
                                interface="wishbone",
                                endianness=self.cpu.endianness)
            if with_etherbone:
                ethmac = ClockDomainsRenamer({
                    "eth_tx": "ethphy_eth_tx",
                    "eth_rx": "ethphy_eth_rx"
                })(ethmac)
            self.submodules.ethmac = ethmac
            self.add_memory_region("ethmac",
                                   self.mem_map["ethmac"],
                                   0x2000,
                                   type="io")
            self.add_wb_slave(self.mem_regions["ethmac"].origin,
                              self.ethmac.bus, 0x2000)
            self.add_csr("ethmac")
            self.add_interrupt("ethmac")

        # Etherbone --------------------------------------------------------------------------------
        elif with_etherbone:
            # Ethernet PHY
            self.submodules.ethphy = LiteEthPHYModel(
                self.platform.request("eth", 0))  # FIXME
            self.add_csr("ethphy")
            # Ethernet Core
            ethcore = LiteEthUDPIPCore(self.ethphy,
                                       mac_address=etherbone_mac_address,
                                       ip_address=etherbone_ip_address,
                                       clk_freq=sys_clk_freq)
            self.submodules.ethcore = ethcore
            # Etherbone
            self.submodules.etherbone = LiteEthEtherbone(self.ethcore.udp,
                                                         1234,
                                                         mode="master")
            self.add_wb_master(self.etherbone.wishbone.bus)

        # Analyzer ---------------------------------------------------------------------------------
        if with_analyzer:
            analyzer_signals = [self.cpu.ibus, self.cpu.dbus]
            self.submodules.analyzer = LiteScopeAnalyzer(analyzer_signals, 512)
            self.add_csr("analyzer")