Exemplo n.º 1
0
 def __getattr__(self, name):
     # 2019-10-09: deprecate shadow_base, introduce io_regions
     if name == "shadow_base":
         deprecated_warning(": shadow_base replaced by IO regions.")
         return self.retro_compat_shadow_base
     else:
         return Module.__getattr__(self, name)
Exemplo n.º 2
0
 def add_memory_region(self,
                       name,
                       origin,
                       length,
                       type="cached",
                       io_region=False):
     if io_region:  # 2019-10-30: io_region retro-compatibility
         deprecated_warning(": io_region replaced by type=\"io\".")
         type = "io"
     length = 2**log2_int(length, False)
     if "io" in type:
         self.check_io_region(name, origin, length)
     if name in self.mem_regions.keys():
         raise ValueError(
             "Memory region conflict, {} name already used".format(name))
     self.mem_regions[name] = SoCMemRegion(origin, length, type)
     overlap = self.check_regions_overlap(self.mem_regions)
     if overlap is not None:
         o0, o1 = overlap[0], overlap[1]
         raise ValueError(
             "Memory region conflict between {} ({}) and {} ({})".format(
                 o0,
                 self.mem_regions[o0],
                 o1,
                 self.mem_regions[o1],
             ))
Exemplo n.º 3
0
 def add_memory_region(self,
                       name,
                       origin,
                       length,
                       type="cached",
                       io_region=False):
     if io_region:  # 2019-10-30: io_region retro-compatibility
         deprecated_warning(": io_region replaced by type=\"io\".")
         type = "io"
     assert name in self.mem_map.keys()
     self.add_mem_region(name, length, type)
Exemplo n.º 4
0
 def add_retro_compat(self, kwargs):
     # 2019-10-09 : deprecate shadow_base, introduce io_regions
     if "shadow_base" in kwargs.keys():
         deprecated_warning(": shadow_base replaced by IO regions.")
     self.retro_compat_shadow_base = kwargs.get("shadow_base", 0x80000000)
     self.config["SHADOW_BASE"] = self.retro_compat_shadow_base
Exemplo n.º 5
0
 def add_cpu_or_bridge(self, cpu_or_bridge):
     deprecated_warning("SoCCore's \"add_cpu_or_bridge\" call to \"add_cpu\"")
     self.add_cpu(cpu_or_bridge)
     self.cpu_or_bridge = self.cpu
Exemplo n.º 6
0
    def __init__(self, platform, clk_freq,
                # CPU parameters
                cpu_type="vexriscv", cpu_reset_address=0x00000000, cpu_variant=None,
                # MEM MAP parameters
                shadow_base=0x80000000,
                # ROM parameters
                integrated_rom_size=0, integrated_rom_init=[],
                # SRAM parameters
                integrated_sram_size=4096, integrated_sram_init=[],
                # MAIN_RAM parameters
                integrated_main_ram_size=0, integrated_main_ram_init=[],
                # CSR parameters
                csr_data_width=8, csr_address_width=14,
                # Identifier parameters
                ident="", ident_version=False,
                # UART parameters
                with_uart=True, uart_name="serial", uart_baudrate=115200, uart_stub=False,
                # Timer parameters
                with_timer=True,
                # Controller parameters
                with_ctrl=True,
                # Wishbone parameters
                wishbone_timeout_cycles=1e6):
        self.platform = platform
        self.clk_freq = clk_freq

        # config dictionary (store all SoC's parameters to be exported to software)
        self.config = dict()

        # SoC's register/interrupt/memory mappings (default or user defined + dynamically allocateds)
        self.soc_csr_map = {}
        self.soc_interrupt_map = {}
        self.soc_mem_map = self.mem_map

        # Regions / Constants lists
        self._memory_regions = []  # (name, origin, length)
        self._csr_regions = []     # (name, origin, busword, csr_list/Memory)
        self._constants = []       # (name, value)

        # Wishbone masters/slaves lists
        self._wb_masters = []
        self._wb_slaves = []

        # CSR masters list
        self._csr_masters = []

        # Parameters managment ---------------------------------------------------------------------

        # FIXME: RocketChip reserves the first 256Mbytes for internal use
        # remap rom to 0x10000000, sram to 0x20000000
        if cpu_type == "rocket":
            self.soc_mem_map["rom"]  = 0x10000000
            self.soc_mem_map["sram"] = 0x20000000

        if cpu_type == "None":
            cpu_type = None
        self.cpu_type = cpu_type

        # Support the old style which used underscore for separator
        if cpu_variant is None:
            cpu_variant = "standard"
        cpu_variant = cpu_variant.replace('_', '+')

        # Check for valid CPU variants.
        cpu_variant_processor, *cpu_variant_ext = cpu_variant.split('+')
        for key, values in CPU_VARIANTS.items():
            if cpu_variant_processor not in [key,]+values:
                continue
            self.cpu_variant = key
            break
        else:
            raise InvalidCPUVariantError(cpu_variant)

        # Check for valid CPU extensions.
        for ext in sorted(cpu_variant_ext):
            if ext not in CPU_VARIANTS_EXTENSIONS:
                raise InvalidCPUExtensionError(cpu_variant)
            self.cpu_variant += "+"+ext

        if integrated_rom_size:
            cpu_reset_address = self.soc_mem_map["rom"]
        self.cpu_reset_address = cpu_reset_address
        self.config["CPU_RESET_ADDR"] = self.cpu_reset_address

        self.shadow_base = shadow_base

        self.integrated_rom_size = integrated_rom_size
        self.integrated_rom_initialized = integrated_rom_init != []
        self.integrated_sram_size = integrated_sram_size
        self.integrated_main_ram_size = integrated_main_ram_size

        self.csr_data_width = csr_data_width
        self.csr_address_width = csr_address_width

        self.with_ctrl = with_ctrl

        self.with_uart = with_uart
        self.uart_baudrate = uart_baudrate

        self.wishbone_timeout_cycles = wishbone_timeout_cycles

        # Modules instances ------------------------------------------------------------------------

        # Add user's CSRs (needs to be done before the first dynamic allocation)
        for _name, _id in self.csr_map.items():
            self.add_csr(_name, _id)

        # Add SoCController
        if with_ctrl:
            self.submodules.ctrl = SoCController()
            self.add_csr("ctrl", allow_user_defined=True)

        # Add CPU
        self.config["CPU_TYPE"] = str(cpu_type).upper()
        if cpu_type is not None:
            # CPU selection / instance
            if cpu_type == "lm32":
                self.add_cpu(lm32.LM32(platform, self.cpu_reset_address, self.cpu_variant))
            elif cpu_type == "mor1kx" or cpu_type == "or1k":
                if cpu_type == "or1k":
                    deprecated_warning("SoCCore's \"cpu-type\" to \"mor1kx\"")
                self.add_cpu(mor1kx.MOR1KX(platform, self.cpu_reset_address, self.cpu_variant))
            elif cpu_type == "picorv32":
                self.add_cpu(picorv32.PicoRV32(platform, self.cpu_reset_address, self.cpu_variant))
            elif cpu_type == "vexriscv":
                self.add_cpu(vexriscv.VexRiscv(platform, self.cpu_reset_address, self.cpu_variant))
            elif cpu_type == "minerva":
                self.add_cpu(minerva.Minerva(platform, self.cpu_reset_address, self.cpu_variant))
            elif cpu_type == "rocket":
                self.add_cpu(rocket.RocketRV64(platform, self.cpu_reset_address, self.cpu_variant))
            else:
                raise ValueError("Unsupported CPU type: {}".format(cpu_type))

            # Add Instruction/Data buses as Wisbone masters
            self.add_wb_master(self.cpu.ibus)
            self.add_wb_master(self.cpu.dbus)

            # Add CPU CSR (dynamic)
            self.add_csr("cpu", allow_user_defined=True)

            # Add CPU reserved interrupts
            for _name, _id in self.cpu.reserved_interrupts.items():
                self.add_interrupt(_name, _id)

            # Allow SoCController to reset the CPU
            if with_ctrl:
                self.comb += self.cpu.reset.eq(self.ctrl.reset)

        # Add user's interrupts (needs to be done after CPU reserved interrupts are allocated)
        for _name, _id in self.interrupt_map.items():
            self.add_interrupt(_name, _id)

        # Add integrated ROM
        if integrated_rom_size:
            self.submodules.rom = wishbone.SRAM(integrated_rom_size, read_only=True, init=integrated_rom_init)
            self.register_rom(self.rom.bus, integrated_rom_size)

        # Add integrated SRAM
        if integrated_sram_size:
            self.submodules.sram = wishbone.SRAM(integrated_sram_size, init=integrated_sram_init)
            self.register_mem("sram", self.soc_mem_map["sram"], self.sram.bus, integrated_sram_size)

        # Add integrated MAIN_RAM (only useful when no external SRAM/SDRAM is available)
        if integrated_main_ram_size:
            self.submodules.main_ram = wishbone.SRAM(integrated_main_ram_size, init=integrated_main_ram_init)
            self.register_mem("main_ram", self.soc_mem_map["main_ram"], self.main_ram.bus, integrated_main_ram_size)

        # Add Wishbone to CSR bridge
        self.submodules.wishbone2csr = wishbone2csr.WB2CSR(
            bus_csr=csr_bus.Interface(csr_data_width, csr_address_width))
        self.add_csr_master(self.wishbone2csr.csr)
        self.config["CSR_DATA_WIDTH"] = csr_data_width
        self.add_constant("CSR_DATA_WIDTH", csr_data_width)
        self.register_mem("csr", self.soc_mem_map["csr"], self.wishbone2csr.wishbone)

        # Add UART
        if with_uart:
            if uart_stub:
                self.submodules.uart  = uart.UARTStub()
            else:
                self.submodules.uart_phy = uart.RS232PHY(platform.request(uart_name), clk_freq, uart_baudrate)
                self.submodules.uart = ResetInserter()(uart.UART(self.uart_phy))
            self.add_csr("uart_phy", allow_user_defined=True)
            self.add_csr("uart", allow_user_defined=True)
            self.add_interrupt("uart", allow_user_defined=True)

        # Add Identifier
        if ident:
            if ident_version:
                ident = ident + " " + version()
            self.submodules.identifier = identifier.Identifier(ident)
            self.add_csr("identifier_mem", allow_user_defined=True)
        self.config["CLOCK_FREQUENCY"] = int(clk_freq)
        self.add_constant("SYSTEM_CLOCK_FREQUENCY", int(clk_freq))

        # Add Timer
        if with_timer:
            self.submodules.timer0 = timer.Timer()
            self.add_csr("timer0", allow_user_defined=True)
            self.add_interrupt("timer0", allow_user_defined=True)
Exemplo n.º 7
0
    def __init__(self, platform, clk_freq,
                # CPU parameters
                cpu_type="vexriscv", cpu_reset_address=0x00000000, cpu_variant=None,
                # MEM MAP parameters
                shadow_base=0x80000000,
                # ROM parameters
                integrated_rom_size=0, integrated_rom_init=[],
                # SRAM parameters
                integrated_sram_size=4096, integrated_sram_init=[],
                # MAIN_RAM parameters
                integrated_main_ram_size=0, integrated_main_ram_init=[],
                # CSR parameters
                csr_data_width=8, csr_alignment=32, csr_address_width=14,
                # Identifier parameters
                ident="", ident_version=False,
                # UART parameters
                with_uart=True, uart_name="serial", uart_baudrate=115200, uart_stub=False,
                # Timer parameters
                with_timer=True,
                # Controller parameters
                with_ctrl=True,
                # Wishbone parameters
                with_wishbone=True, wishbone_timeout_cycles=1e6):
        self.platform = platform
        self.clk_freq = clk_freq

        # config dictionary (store all SoC's parameters to be exported to software)
        self.config = dict()

        # SoC's register/interrupt/memory mappings (default or user defined + dynamically allocateds)
        self.soc_csr_map = {}
        self.soc_interrupt_map = {}
        self.soc_mem_map = self.mem_map

        # Regions / Constants lists
        self._memory_regions = []  # (name, origin, length)
        self._csr_regions = []     # (name, origin, busword, csr_list/Memory)
        self._constants = []       # (name, value)

        # Wishbone masters/slaves lists
        self._wb_masters = []
        self._wb_slaves = []

        # CSR masters list
        self._csr_masters = []

        # Parameters managment ---------------------------------------------------------------------

        # NOTE: RocketChip reserves the first 256Mbytes for internal use,
        #       so we must change default mem_map;
        #       Also, CSRs *must* be 64-bit aligned.
        if cpu_type == "rocket":
            self.soc_mem_map["rom"]  = 0x10000000
            self.soc_mem_map["sram"] = 0x11000000
            self.soc_mem_map["csr"]  = 0x12000000
            csr_alignment = 64

        # Mainline Linux OpenRISC arch code requires Linux kernel to be loaded
        # at the physical address of 0x0. As we are running Linux from the
        # MAIN_RAM region - move it to satisfy that requirement.
        if cpu_type == "mor1kx" and cpu_variant == "linux":
            self.soc_mem_map["main_ram"] = 0x00000000
            self.soc_mem_map["rom"]      = 0x10000000
            self.soc_mem_map["sram"]     = 0x50000000
            self.soc_mem_map["csr"]      = 0x60000000

        if cpu_type == "None":
            cpu_type = None

        if not with_wishbone:
            self.soc_mem_map["csr"]  = 0x00000000

        self.cpu_type    = cpu_type
        self.cpu_variant = cpu.check_format_cpu_variant(cpu_variant)

        if integrated_rom_size:
            cpu_reset_address = self.soc_mem_map["rom"]
        self.cpu_reset_address = cpu_reset_address
        self.config["CPU_RESET_ADDR"] = self.cpu_reset_address

        self.shadow_base = shadow_base

        self.integrated_rom_size = integrated_rom_size
        self.integrated_rom_initialized = integrated_rom_init != []
        self.integrated_sram_size = integrated_sram_size
        self.integrated_main_ram_size = integrated_main_ram_size

        assert csr_data_width in [8, 32, 64]
        assert csr_alignment in [32, 64]
        assert 2**(csr_address_width + 2) <= 0x1000000
        self.csr_data_width = csr_data_width
        self.csr_alignment = csr_alignment
        self.csr_address_width = csr_address_width

        self.with_ctrl = with_ctrl

        self.with_uart = with_uart
        self.uart_baudrate = uart_baudrate

        self.with_wishbone = with_wishbone
        self.wishbone_timeout_cycles = wishbone_timeout_cycles

        # Modules instances ------------------------------------------------------------------------

        # Add user's CSRs (needs to be done before the first dynamic allocation)
        for _name, _id in self.csr_map.items():
            self.add_csr(_name, _id)

        # Add SoCController
        if with_ctrl:
            self.submodules.ctrl = SoCController()
            self.add_csr("ctrl", allow_user_defined=True)

        # Add CPU
        self.config["CPU_TYPE"] = str(cpu_type).upper()
        if cpu_type is not None:
            if cpu_variant is not None:
                self.config["CPU_VARIANT"] = str(cpu_variant.split('+')[0]).upper()
            # CPU selection / instance
            if cpu_type == "lm32":
                self.add_cpu(cpu.lm32.LM32(platform, self.cpu_reset_address, self.cpu_variant))
            elif cpu_type == "mor1kx" or cpu_type == "or1k":
                if cpu_type == "or1k":
                    deprecated_warning("SoCCore's \"cpu-type\" to \"mor1kx\"")
                self.add_cpu(cpu.mor1kx.MOR1KX(platform, self.cpu_reset_address, self.cpu_variant))
            elif cpu_type == "picorv32":
                self.add_cpu(cpu.picorv32.PicoRV32(platform, self.cpu_reset_address, self.cpu_variant))
            elif cpu_type == "vexriscv":
                self.add_cpu(cpu.vexriscv.VexRiscv(platform, self.cpu_reset_address, self.cpu_variant))
            elif cpu_type == "minerva":
                self.add_cpu(cpu.minerva.Minerva(platform, self.cpu_reset_address, self.cpu_variant))
            elif cpu_type == "rocket":
                self.add_cpu(cpu.rocket.RocketRV64(platform, self.cpu_reset_address, self.cpu_variant))
            else:
                raise ValueError("Unsupported CPU type: {}".format(cpu_type))

            # Add Instruction/Data buses as Wisbone masters
            self.add_wb_master(self.cpu.ibus)
            self.add_wb_master(self.cpu.dbus)

            # Add CPU CSR (dynamic)
            self.add_csr("cpu", allow_user_defined=True)

            # Add CPU reserved interrupts
            for _name, _id in self.cpu.reserved_interrupts.items():
                self.add_interrupt(_name, _id)

            # Allow SoCController to reset the CPU
            if with_ctrl:
                self.comb += self.cpu.reset.eq(self.ctrl.reset)

        # Add user's interrupts (needs to be done after CPU reserved interrupts are allocated)
        for _name, _id in self.interrupt_map.items():
            self.add_interrupt(_name, _id)

        # Add integrated ROM
        if integrated_rom_size:
            self.submodules.rom = wishbone.SRAM(integrated_rom_size, read_only=True, init=integrated_rom_init)
            self.register_rom(self.rom.bus, integrated_rom_size)

        # Add integrated SRAM
        if integrated_sram_size:
            self.submodules.sram = wishbone.SRAM(integrated_sram_size, init=integrated_sram_init)
            self.register_mem("sram", self.soc_mem_map["sram"], self.sram.bus, integrated_sram_size)

        # Add integrated MAIN_RAM (only useful when no external SRAM/SDRAM is available)
        if integrated_main_ram_size:
            self.submodules.main_ram = wishbone.SRAM(integrated_main_ram_size, init=integrated_main_ram_init)
            self.register_mem("main_ram", self.soc_mem_map["main_ram"], self.main_ram.bus, integrated_main_ram_size)

        # Add UART
        if with_uart:
            if uart_stub:
                self.submodules.uart  = uart.UARTStub()
            else:
                if uart_name == "jtag_atlantic":
                    from litex.soc.cores.jtag import JTAGAtlantic
                    self.submodules.uart_phy = JTAGAtlantic()
                elif uart_name == "jtag_uart":
                    from litex.soc.cores.jtag import JTAGPHY
                    self.submodules.uart_phy = JTAGPHY(device=platform.device)
                else:
                    self.submodules.uart_phy = uart.UARTPHY(platform.request(uart_name), clk_freq, uart_baudrate)
                self.submodules.uart = ResetInserter()(uart.UART(self.uart_phy))
            self.add_csr("uart_phy", allow_user_defined=True)
            self.add_csr("uart", allow_user_defined=True)
            self.add_interrupt("uart", allow_user_defined=True)

        # Add Identifier
        if ident:
            if ident_version:
                ident = ident + " " + version()
            self.submodules.identifier = identifier.Identifier(ident)
            self.add_csr("identifier_mem", allow_user_defined=True)
        self.config["CLOCK_FREQUENCY"] = int(clk_freq)

        # Add Timer
        if with_timer:
            self.submodules.timer0 = timer.Timer()
            self.add_csr("timer0", allow_user_defined=True)
            self.add_interrupt("timer0", allow_user_defined=True)

        # Add Wishbone to CSR bridge
        self.config["CSR_DATA_WIDTH"] = self.csr_data_width
        self.config["CSR_ALIGNMENT"]  = self.csr_alignment
        if with_wishbone:
            self.submodules.wishbone2csr = wishbone2csr.WB2CSR(
                bus_csr=csr_bus.Interface(
                    address_width=self.csr_address_width,
                    data_width=self.csr_data_width))
            self.add_csr_master(self.wishbone2csr.csr)
            self.register_mem("csr", self.soc_mem_map["csr"], self.wishbone2csr.wishbone, 0x1000000)
    def __init__(self,
                 platform,
                 clk_freq,
                 cpu_type="vexriscv",
                 cpu_reset_address=0x00000000,
                 cpu_variant=None,
                 integrated_rom_size=0,
                 integrated_rom_init=[],
                 integrated_sram_size=4096,
                 integrated_sram_init=[],
                 integrated_main_ram_size=0,
                 integrated_main_ram_init=[],
                 shadow_base=0x80000000,
                 csr_data_width=8,
                 csr_address_width=14,
                 with_uart=True,
                 uart_name="serial",
                 uart_baudrate=115200,
                 uart_stub=False,
                 ident="",
                 ident_version=False,
                 wishbone_timeout_cycles=1e6,
                 with_timer=True,
                 with_ctrl=True):
        self.config = dict()

        self.platform = platform
        self.clk_freq = clk_freq

        self.soc_csr_map = {}
        self.soc_interrupt_map = {}
        self.soc_mem_map = self.mem_map

        # FIXME: RocketChip reserves the first 256Mbytes for internal use
        # remap rom to 0x10000000, sram to 0x20000000
        if cpu_type == "rocket":
            self.soc_mem_map["rom"] = 0x10000000
            self.soc_mem_map["sram"] = 0x20000000

        if cpu_type == "None":
            cpu_type = None
        self.cpu_type = cpu_type

        # Support the old style which used underscore for separator
        if cpu_variant is None:
            cpu_variant = "standard"
        cpu_variant = cpu_variant.replace('_', '+')
        # Check for valid CPU variants.
        cpu_variant_processor, *cpu_variant_ext = cpu_variant.split('+')
        for key, values in CPU_VARIANTS.items():
            if cpu_variant_processor not in [
                    key,
            ] + values:
                continue
            self.cpu_variant = key
            break
        else:
            raise InvalidCPUVariantError(cpu_variant)

        # Check for valid CPU extensions.
        for ext in sorted(cpu_variant_ext):
            if ext not in CPU_VARIANTS_EXTENSIONS:
                raise InvalidCPUExtensionError(cpu_variant)
            self.cpu_variant += "+" + ext

        if integrated_rom_size:
            cpu_reset_address = self.soc_mem_map["rom"]
        self.cpu_reset_address = cpu_reset_address
        self.config["CPU_RESET_ADDR"] = self.cpu_reset_address

        self.integrated_rom_size = integrated_rom_size
        self.integrated_rom_initialized = integrated_rom_init != []
        self.integrated_sram_size = integrated_sram_size
        self.integrated_main_ram_size = integrated_main_ram_size

        self.with_uart = with_uart
        self.uart_baudrate = uart_baudrate

        self.shadow_base = shadow_base

        self.wishbone_timeout_cycles = wishbone_timeout_cycles

        self.csr_data_width = csr_data_width
        self.csr_address_width = csr_address_width

        self.with_ctrl = with_ctrl

        self._memory_regions = []  # list of (name, origin, length)
        self._csr_regions = [
        ]  # list of (name, origin, busword, csr_list/Memory)
        self._constants = []  # list of (name, value)

        self._wb_masters = []
        self._wb_slaves = []
        self._csr_masters = []

        # add user csrs
        for _name, _id in self.csr_map.items():
            self.add_csr(_name, _id)

        if with_ctrl:
            self.submodules.ctrl = SoCController()
            self.add_csr("ctrl", allow_user_defined=True)

        if cpu_type is not None:
            if cpu_type == "lm32":
                self.add_cpu(
                    lm32.LM32(platform, self.cpu_reset_address,
                              self.cpu_variant))
            elif cpu_type == "mor1kx" or cpu_type == "or1k":
                if cpu_type == "or1k":
                    deprecated_warning("SoCCore's \"cpu-type\" to \"mor1kx\"")
                self.add_cpu(
                    mor1kx.MOR1KX(platform, self.cpu_reset_address,
                                  self.cpu_variant))
            elif cpu_type == "picorv32":
                self.add_cpu(
                    picorv32.PicoRV32(platform, self.cpu_reset_address,
                                      self.cpu_variant))
            elif cpu_type == "vexriscv":
                self.add_cpu(
                    vexriscv.VexRiscv(platform, self.cpu_reset_address,
                                      self.cpu_variant))
            elif cpu_type == "minerva":
                self.add_cpu(
                    minerva.Minerva(platform, self.cpu_reset_address,
                                    self.cpu_variant))
            elif cpu_type == "rocket":
                self.add_cpu(
                    rocket.RocketRV64(platform, self.cpu_reset_address,
                                      self.cpu_variant))
            else:
                raise ValueError("Unsupported CPU type: {}".format(cpu_type))
            self.add_csr("cpu", allow_user_defined=True)
            self.add_wb_master(self.cpu.ibus)
            self.add_wb_master(self.cpu.dbus)
            if with_ctrl:
                self.comb += self.cpu.reset.eq(self.ctrl.reset)
            # add cpu reserved interrupts
            for _name, _id in self.cpu.reserved_interrupts.items():
                self.add_interrupt(_name, _id)

        # add user interrupts
        for _name, _id in self.interrupt_map.items():
            self.add_interrupt(_name, _id)

        self.config["CPU_TYPE"] = str(cpu_type).upper()
        if self.cpu_variant:
            self.config["CPU_VARIANT"] = str(cpu_type).upper()

        if integrated_rom_size:
            self.submodules.rom = wishbone.SRAM(integrated_rom_size,
                                                read_only=True,
                                                init=integrated_rom_init)
            self.register_rom(self.rom.bus, integrated_rom_size)

        if integrated_sram_size:
            self.submodules.sram = wishbone.SRAM(integrated_sram_size,
                                                 init=integrated_sram_init)
            self.register_mem("sram", self.soc_mem_map["sram"], self.sram.bus,
                              integrated_sram_size)

        # Note: Main Ram can be used when no external SDRAM is available and use SDRAM mapping.
        if integrated_main_ram_size:
            self.submodules.main_ram = wishbone.SRAM(
                integrated_main_ram_size, init=integrated_main_ram_init)
            self.register_mem("main_ram", self.soc_mem_map["main_ram"],
                              self.main_ram.bus, integrated_main_ram_size)

        self.submodules.wishbone2csr = wishbone2csr.WB2CSR(
            bus_csr=csr_bus.Interface(csr_data_width, csr_address_width))
        self.add_csr_master(self.wishbone2csr.csr)
        self.config["CSR_DATA_WIDTH"] = csr_data_width
        self.add_constant("CSR_DATA_WIDTH", csr_data_width)
        self.register_mem("csr", self.soc_mem_map["csr"],
                          self.wishbone2csr.wishbone)

        if with_uart:
            if uart_stub:
                self.submodules.uart = uart.UARTStub()
            else:
                self.submodules.uart_phy = uart.RS232PHY(
                    platform.request(uart_name), clk_freq, uart_baudrate)
                self.submodules.uart = ResetInserter()(uart.UART(
                    self.uart_phy))
            self.add_csr("uart_phy", allow_user_defined=True)
            self.add_csr("uart", allow_user_defined=True)
            self.add_interrupt("uart", allow_user_defined=True)

        if ident:
            if ident_version:
                ident = ident + " " + version()
            self.submodules.identifier = identifier.Identifier(ident)
            self.add_csr("identifier_mem", allow_user_defined=True)
        self.config["CLOCK_FREQUENCY"] = int(clk_freq)
        self.add_constant("SYSTEM_CLOCK_FREQUENCY", int(clk_freq))

        if with_timer:
            self.submodules.timer0 = timer.Timer()
            self.add_csr("timer0", allow_user_defined=True)
            self.add_interrupt("timer0", allow_user_defined=True)