mirror of
https://github.com/stnolting/neorv32.git
synced 2025-04-24 22:27:21 -04:00
⚠️ Rework processor boot configuration (#1086)
This commit is contained in:
commit
28e1b46d25
27 changed files with 503 additions and 403 deletions
|
@ -29,6 +29,7 @@ mimpid = 0x01040312 -> Version 01.04.03.12 -> v1.4.3.12
|
|||
|
||||
| Date | Version | Comment | Ticket |
|
||||
|:----:|:-------:|:--------|:------:|
|
||||
| 02.11.2024 | 1.10.6.2 | :warning: rework processor boot configuration; add new boot-configuration generics | [#1086](https://github.com/stnolting/neorv32/pull/1086) |
|
||||
| 01.11.2024 | 1.10.6.1 | :test_tube: convert VHDL memory images into full-scale VHDL packages | [#1084](https://github.com/stnolting/neorv32/pull/1084) |
|
||||
| 26.10.2024 | [**:rocket:1.10.6**](https://github.com/stnolting/neorv32/releases/tag/v1.10.6) | **New release** | |
|
||||
| 26.10.2024 | 1.10.5.11 | cleanup central makefile and linker script | [#1077](https://github.com/stnolting/neorv32/pull/1077) |
|
||||
|
@ -150,7 +151,7 @@ mimpid = 0x01040312 -> Version 01.04.03.12 -> v1.4.3.12
|
|||
| 16.02.2024 | 1.9.5.2 | :warning: **revert** support for page faults (keep that in mmu branch for now) | [#809](https://github.com/stnolting/neorv32/pull/809) |
|
||||
| 16.02.2024 | 1.9.5.1 | :sparkles: add two new generics to exclude certain PMP modes from synthesis | [#808](https://github.com/stnolting/neorv32/pull/808) |
|
||||
| 16.02.2024 | [**:rocket:1.9.5**](https://github.com/stnolting/neorv32/releases/tag/v1.9.5) | **New release** | |
|
||||
| 15.02.2023 | 1.9.4.13 | allow the DMA to issue a FENCE operation | [#807](https://github.com/stnolting/neorv32/pull/807) |
|
||||
| 15.02.2024 | 1.9.4.13 | allow the DMA to issue a FENCE operation | [#807](https://github.com/stnolting/neorv32/pull/807) |
|
||||
| 14.02.2024 | 1.9.4.12 | :lock: close another illegal compressed instruction encoding loophole | [#806](https://github.com/stnolting/neorv32/pull/806) |
|
||||
| 11.02.2024 | 1.9.4.11 | :bug: fix several FPU bugs and design flaws | [#794](https://github.com/stnolting/neorv32/pull/794) |
|
||||
| 11.02.2024 | 1.9.4.10 | minor additions to previous version (1.9.4.9): fix HPM configuration read-back | [#804](https://github.com/stnolting/neorv32/pull/804) |
|
||||
|
|
|
@ -360,7 +360,7 @@ As software does not need to determine the interrupt cause the reduction in late
|
|||
|=======================
|
||||
| Name | Machine exception program counter
|
||||
| Address | `0x341`
|
||||
| Reset value | `0x00000000`
|
||||
| Reset value | `BOOT_ADDR` (CPU boot address, see <<_cpu_top_entity_generics>>)
|
||||
| ISA | `Zicsr`
|
||||
| Description | The `mepc` CSR provides the instruction address where execution has stopped/failed when
|
||||
an interrupt is triggered / an exception is raised. See section <<_traps_exceptions_and_interrupts>> for a list of all legal values.
|
||||
|
|
|
@ -202,12 +202,15 @@ The generic type "`suv(x:y)`" is an abbreviation for "`std_ulogic_vector(x downt
|
|||
[options="header",grid="rows"]
|
||||
|=======================
|
||||
| Name | Type | Default | Description
|
||||
4+^| **General**
|
||||
4+^| **<<_processor_clocking>>**
|
||||
| `CLOCK_FREQUENCY` | natural | 0 | The clock frequency of the processor's `clk_i` input port in Hertz (Hz).
|
||||
| `CLOCK_GATING_EN` | boolean | false | Enable clock gating when CPU is in sleep mode (see sections <<_sleep_mode>> and <<_processor_clocking>>).
|
||||
| `INT_BOOTLOADER_EN` | boolean | false | Implement the processor-internal <<_bootloader_rom_bootrom>>, pre-initialized with the default <<_bootloader>> image.
|
||||
| `HART_ID` | suv(31:0) | 0x00000000 | The hart thread ID of the CPU (passed to <<_mhartid>> CSR).
|
||||
| `JEDEC_ID` | suv(10:0) | 0b00000000000 | JEDEC ID; continuation codes plus vendor ID (passed to <<_mvendorid>> CSR and to the <<_debug_transport_module_dtm>>).
|
||||
4+^| **Core Identification**
|
||||
| `HART_ID` | suv(31:0) | x"00000000" | The hart thread ID of the CPU (passed to <<_mhartid>> CSR).
|
||||
| `JEDEC_ID` | suv(10:0) | "00000000000" | JEDEC ID; continuation codes plus vendor ID (passed to <<_mvendorid>> CSR and to the <<_debug_transport_module_dtm>>).
|
||||
4+^| **<<_boot_configuration>>**
|
||||
| `BOOT_MODE_SELECT` | natural | 0 | Boot mode select; see <<_boot_configuration>>.
|
||||
| `BOOT_ADDR_CUSTOM` | suv(31:0) | x"00000000" | Custom CPU boot address (available if `BOOT_MODE_SELECT` = 1).
|
||||
4+^| **<<_on_chip_debugger_ocd>>**
|
||||
| `OCD_EN` | boolean | false | Implement the on-chip debugger and the CPU debug mode.
|
||||
| `OCD_AUTHENTICATION` | boolean | false | Implement <<_debug_authentication>> module.
|
||||
|
@ -295,7 +298,7 @@ The generic type "`suv(x:y)`" is an abbreviation for "`std_ulogic_vector(x downt
|
|||
| `IO_TRNG_EN` | boolean | false | Implement the <<_true_random_number_generator_trng>>.
|
||||
| `IO_TRNG_FIFO` | natural | 1 | Depth of the TRNG data FIFO. Has to be a power of two, min 1, max 32768.
|
||||
| `IO_CFS_EN` | boolean | false | Implement the <<_custom_functions_subsystem_cfs>>.
|
||||
| `IO_CFS_CONFIG` | suv(31:0) | 0x00000000 | "Conduit" generic to pass user-defined flags to the <<_custom_functions_subsystem_cfs>>.
|
||||
| `IO_CFS_CONFIG` | suv(31:0) | x"00000000" | "Conduit" generic to pass user-defined flags to the <<_custom_functions_subsystem_cfs>>.
|
||||
| `IO_CFS_IN_SIZE` | natural | 32 | Size of the <<_custom_functions_subsystem_cfs>> input signal conduit (`cfs_in_i`).
|
||||
| `IO_CFS_OUT_SIZE` | natural | 32 | Size of the <<_custom_functions_subsystem_cfs>> output signal conduit (`cfs_out_o`).
|
||||
| `IO_NEOLED_EN` | boolean | false | Implement the <<_smart_led_interface_neoled>>.
|
||||
|
@ -564,7 +567,7 @@ monitor starts an internal timer. The accessed module has to respond ("ACK") to
|
|||
.Internal Bus Timeout Configuration
|
||||
[source,vhdl]
|
||||
----
|
||||
constant bus_timeout_c : natural := 15;
|
||||
constant bus_timeout_c : natural := 15;
|
||||
----
|
||||
|
||||
This constant defines the _maximum_ number of cycles after which a non-responding bus request (i.e. no `ack`
|
||||
|
@ -657,11 +660,11 @@ package file (`rtl/core/neorv323_package.vhd`).
|
|||
.Exemplary Cut-Out from the IO Address Map
|
||||
[source,vhdl]
|
||||
----
|
||||
-- IO Address Map --
|
||||
constant iodev_size_c : natural := 256; -- size of a single IO device (bytes)
|
||||
constant base_io_cfs_c : std_ulogic_vector(31 downto 0) := x"ffffeb00";
|
||||
constant base_io_slink_c : std_ulogic_vector(31 downto 0) := x"ffffec00";
|
||||
constant base_io_dma_c : std_ulogic_vector(31 downto 0) := x"ffffed00";
|
||||
-- IO Address Map --
|
||||
constant iodev_size_c : natural := 256; -- size of a single IO device (bytes)
|
||||
constant base_io_cfs_c : std_ulogic_vector(31 downto 0) := x"ffffeb00";
|
||||
constant base_io_slink_c : std_ulogic_vector(31 downto 0) := x"ffffec00";
|
||||
constant base_io_dma_c : std_ulogic_vector(31 downto 0) := x"ffffed00";
|
||||
----
|
||||
|
||||
.IO Access Latency
|
||||
|
@ -671,47 +674,67 @@ buffers the address bus. Hence, accesses to the processor-internal IO region req
|
|||
to complete.
|
||||
|
||||
|
||||
<<<
|
||||
// ####################################################################################################################
|
||||
:sectnums:
|
||||
==== Boot Configuration
|
||||
=== Boot Configuration
|
||||
|
||||
Due to the flexible memory configuration, the NEORV32 Processor provides several different boot scenarios.
|
||||
The following section illustrates the two most common boot scenarios.
|
||||
The NEORV32 processor provides some pre-defined boot configurations to adjust system start-up to
|
||||
the requirements of the application. The actual boot configuration is defined by the `BOOT_MODE_SELECT`
|
||||
generic (see <<_processor_top_entity_generics>>).
|
||||
|
||||
.NEORV32 Boot Configurations
|
||||
image::neorv32_boot_configurations.png[800]
|
||||
[cols="^2,^2,^2,<6"]
|
||||
[options="header",grid="rows"]
|
||||
|=======================
|
||||
| `BOOT_MODE_SELECT` | Name | Boot address | Description
|
||||
| 0 (default) | Bootloader | Base of internal BOOTROM | Implement the processor-internal <<_bootloader_rom_bootrom>> as pre-initialized ROM and boot from there.
|
||||
| 1 | Custom Address | `BOOT_ADDR_CUSTOM` generic | Start booting at user-defined address (`BOOT_ADDR_CUSTOM` top generic).
|
||||
| 2 | IMEM Image | Base of internal IMEM | Implement the processor-internal <<_instruction_memory_imem>> as pre-initialized ROM and boot from there.
|
||||
|=======================
|
||||
|
||||
There are two general boot scenarios: _Indirect Boot_ (1a and 1b) and _Direct Boot_ (2a and 2b) configured via the
|
||||
`INT_BOOTLOADER_EN` generic. If this generic is `true` the _indirect boot scenario_ is used. This is also the
|
||||
default boot configuration of the processor. If `INT_BOOTLOADER_EN` is `*false` the _direct boot scenario_ is used.
|
||||
|
||||
:sectnums!:
|
||||
===== Indirect Boot
|
||||
:sectnums:
|
||||
==== Booting via Bootloader
|
||||
|
||||
The indirect_boot scenarios **1a** and **1b** are based on the processor-internal <<_bootloader>>. This boot setup is enabled
|
||||
by setting the `INT_BOOTLOADER_EN` generic to `true`, which will implement the processor-internal <<_bootloader_rom_bootrom>>.
|
||||
This read-only memory is pre-initialized during synthesis with the default bootloader firmware. The bootloader provides several
|
||||
options to upload an executable copying it to the beginning of the _instruction address space_ so the CPU can execute it.
|
||||
This is the most common and thus, the default boot configuration. When selected, the processor-internal
|
||||
<<_bootloader_rom_bootrom>> is enabled. This ROM contains the executable image (`rtl/core/neorv32_bootloader_image.vhd`)
|
||||
of the default NEORV32 <<_bootloader>> that will be executed right after reset. The bootloader provides an interactive
|
||||
user console for executable upload as well as an automatic boot-configuration targeting external (SPI) memories.
|
||||
|
||||
Boot scenario **1a** uses the processor-internal IMEM. This scenario implements the internal <<_instruction_memory_imem>>
|
||||
as non-initialized RAM so the bootloader can copy the actual executable to it.
|
||||
If the processor-internal <<_instruction_memory_imem>> is enabled it will be implemented as _blank_ RAM.
|
||||
|
||||
Boot scenario **1b** uses a processor-external IMEM that is connected via the processor's bus interface. In this scenario
|
||||
the internal <<_instruction_memory_imem>> is not implemented at all and the bootloader will copy the executable to the
|
||||
processor-external memory. Hence, the external memory has to be implemented as RAM.
|
||||
|
||||
:sectnums!:
|
||||
===== Direct Boot
|
||||
:sectnums:
|
||||
==== Boot from Custom Address
|
||||
|
||||
The direct boot scenarios **2a** and **2b** do not use the processor-internal bootloader since the `INT_BOOTLOADER_EN`
|
||||
generic is set `false`. In this configuration the <<_bootloader_rom_bootrom>> is not implemented at all and the CPU will
|
||||
directly begin executing code from the beginning of the instruction address space after reset. An application-specific
|
||||
"pre-initialization" mechanism is required in order to provide an executable inside the memory.
|
||||
This is the most flexible boot configuration as it allows the user to specify a custom boot address via the
|
||||
`BOOT_ADDR_CUSTOM` generic. Note that this address has to be aligned to 4-byte boundary. The processor will
|
||||
start executing from the defined address right after reset. For example, this boot configuration ca be used to
|
||||
execute a _custom bootloader_ from a memory that is attached via the <<_processor_external_bus_interface_xbus>>.
|
||||
|
||||
Boot scenario **2a** uses the processor-internal IMEM implemented as _read-only memory_ in this scenario.
|
||||
It is pre-initialized (by the bitstream) with the actual application executable during synthesis.
|
||||
The <<_bootloader_rom_bootrom>> is not enabled / implement at all.
|
||||
If the processor-internal <<_instruction_memory_imem>> is enabled it will be implemented as _blank_ RAM.
|
||||
|
||||
In contrast, boot scenario **2b** uses a processor-external IMEM. In this scenario the system designer is responsible for
|
||||
providing an initialized external memory that contains the actual application to be executed.
|
||||
|
||||
:sectnums:
|
||||
==== Boot IMEM Image
|
||||
|
||||
This configuration will implement the <<_instruction_memory_imem>> as _pre-initialized read-only memory_ (ROM).
|
||||
The ROM is initialized during synthesis with the according application image file (`rtl/core/neorv32_application_image.vhd`).
|
||||
After reset, the CPU will directly start executing this image. Since the IMEM is implemented as ROM, the executable cannot
|
||||
be altered at runtime at all.
|
||||
|
||||
The <<_bootloader_rom_bootrom>> is not enabled / implement at all.
|
||||
|
||||
.Internal IMEM is Required
|
||||
[IMPORTANT]
|
||||
This boot configuration requires the IMEM to be enabled (`MEM_INT_IMEM_EN` = true).
|
||||
|
||||
.Simulation Setup
|
||||
[TIP]
|
||||
This boot configuration is handy for simulations as the application software is executed right away without the
|
||||
need for an explicit initialization / executable upload.
|
||||
|
||||
|
||||
<<<
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
| | neorv32_bootloader_image.vhd | initialization image (a VHDL package)
|
||||
| Software driver files: | none | _implicitly used_
|
||||
| Top entity ports: | none |
|
||||
| Configuration generics: | `INT_BOOTLOADER_EN` | implement processor-internal bootloader when `true`
|
||||
| Configuration generics: | `BOOT_MODE_SELECT` | implement BOOTROM when `BOOT_MODE_SELECT` = 0; see <<_boot_configuration>>
|
||||
| CPU interrupts: | none |
|
||||
| Access restrictions: 2+| privileged access only, read-only
|
||||
|=======================
|
||||
|
@ -17,17 +17,12 @@
|
|||
|
||||
**Overview**
|
||||
|
||||
This boot ROM module provides a read-only memory that contain the executable image of the default NEORV32
|
||||
<<_bootloader>>. If the internal bootloader is enabled via the `INT_BOOTLOADER_EN` generic the CPU's boot address
|
||||
is automatically set to the beginning of the bootloader ROM. See sections <<_address_space>> and
|
||||
<<_boot_configuration>> for more information regarding the processor's different boot scenarios.
|
||||
|
||||
.Memory Size
|
||||
[IMPORTANT]
|
||||
If the configured boot ROM size is **not** a power of two the actual memory size will be auto-adjusted to
|
||||
the next power of two (e.g. configuring a memory size of 6kB will result in a physical memory size of 8kB).
|
||||
The boot ROM contains the executable image of the default NEORV32 <<_bootloader>>. When the
|
||||
<<_boot_configuration>> is set to _bootloader_ mode (0) via the `BOOT_MODE_SELECT` generic, the
|
||||
boot ROM is automatically enabled and the CPU boot address is automatically adjusted to the
|
||||
base address of the boot ROM.
|
||||
|
||||
.Bootloader Image
|
||||
[IMPORTANT]
|
||||
The boot ROM is initialized during synthesis with the default bootloader image
|
||||
(`rtl/core/neorv32_bootloader_image.vhd`).
|
||||
(`rtl/core/neorv32_bootloader_image.vhd`). Note that the BOOTROM size is constrained to 4kB.
|
||||
|
|
|
@ -36,7 +36,7 @@ physical memory size of 64kB).
|
|||
|
||||
.Legacy HDL Style
|
||||
[TIP]
|
||||
If synthesis fails to infer block RAM for the DMEM, turn on the `alternaitve_style_en_c` option inside
|
||||
If synthesis fails to infer block RAM for the DMEM, turn on the `alt_style_c` option inside
|
||||
the memory's VHDL source file. When enabled, a different HDL style is used to describe the memory core.
|
||||
|
||||
.Execute from RAM
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
| Top entity ports: | none |
|
||||
| Configuration generics: | `MEM_INT_IMEM_EN` | implement processor-internal IMEM when `true`
|
||||
| | `MEM_INT_IMEM_SIZE` | IMEM size in bytes (use a power of 2)
|
||||
| | `INT_BOOTLOADER_EN` | use internal bootloader when `true` (implements IMEM as _uninitialized_ RAM, otherwise the IMEM is implemented an _pre-intialized_ ROM)
|
||||
| | `BOOT_MODE_SELECT` | implement IMEM as ROM when `BOOT_MODE_SELECT` = 2; see <<_boot_configuration>>
|
||||
| CPU interrupts: | none |
|
||||
| Access restrictions: 2+| none / read-only if `INT_BOOTLOADER_EN = true`
|
||||
|=======================
|
||||
|
@ -21,19 +21,19 @@
|
|||
|
||||
Implementation of the processor-internal instruction memory is enabled by the processor's
|
||||
`MEM_INT_IMEM_EN` generic. The total memory size in bytes is defined via the `MEM_INT_IMEM_SIZE` generic.
|
||||
Note that this size should be a power of two to optimize physical implementation. If the IMEM is implemented,
|
||||
it is mapped to base address `0x00000000` by default (see section <<_address_space>>).
|
||||
Note that this size should be a power of two to optimize physical implementation. If enabled,
|
||||
the IMEM is mapped to base address `0x00000000` (see section <<_address_space>>).
|
||||
|
||||
By default the IMEM is implemented as true RAM so the content can be modified during run time. This is
|
||||
required when using the bootloader (or the on-chip debugger) so it can update the content of the IMEM at
|
||||
any time. If this feature is not required the IMEM can be implemented as _pre-intialized_ ROM so that the
|
||||
application code permanently resides in memory. This is automatically implemented when the
|
||||
processor-internal bootloader is disabled (`INT_BOOTLOADER_EN` = `false`).
|
||||
required when using the <<_bootloader>> (or the <<_on_chip_debugger>>) so it can update the content of the IMEM at
|
||||
any time.
|
||||
|
||||
When the IMEM is implemented as ROM, it will be initialized during synthesis with the actual application program
|
||||
image. The compiler toolchain provides an option to generate and override the default VHDL initialization file
|
||||
`rtl/core/neorv32_application_image.vhd`, which is automatically inserted into the IMEM. If the IMEM is implemented
|
||||
as RAM (default), the memory block will **not be initialized at all**.
|
||||
Alternatively, the IMEM can be implemented as **pre-initialized read-only memory (ROM)**, so the processor can
|
||||
directly boot from it after reset. This option is configured via the `BOOT_MODE_SELECT` generic. See section
|
||||
<<_boot_configuration>> for more information. The initialization image is embedded into the bitstream during synthesis.
|
||||
The software framework provides an option to generate and override the default VHDL initialization file
|
||||
`rtl/core/neorv32_application_image.vhd`, which is automatically inserted into the IMEM (see <<_makefile_targets>>.
|
||||
If the IMEM is implemented as RAM (default), the memory block will not be initialized at all.
|
||||
|
||||
.Platform-Specific Memory Primitives
|
||||
[NOTE]
|
||||
|
@ -48,9 +48,9 @@ physical memory size of 64kB).
|
|||
|
||||
.Legacy HDL Style
|
||||
[TIP]
|
||||
If synthesis fails to infer block RAM for the IMEM, turn on the `alternaitve_style_en_c` option inside
|
||||
If synthesis fails to infer block RAM for the IMEM, turn on the `alt_style_c` option inside
|
||||
the memory's VHDL source file. When enabled, a different HDL style is used to describe the memory core.
|
||||
|
||||
.Read-Only Access
|
||||
[NOTE]
|
||||
If the IMEM is implemented as true ROM any write attempt to it will raise a _store access fault_ exception.
|
||||
If the IMEM is implemented as ROM any write attempt to it will raise a _store access fault_ exception.
|
||||
|
|
|
@ -62,7 +62,7 @@ Bit fields in this register are set to all-zero if the according memory system i
|
|||
| `0` | `SYSINFO_MEM_IMEM` | _log2_(internal IMEM size in bytes), via top's `MEM_INT_IMEM_SIZE` generic
|
||||
| `1` | `SYSINFO_MEM_DMEM` | _log2_(internal DMEM size in bytes), via top's `MEM_INT_DMEM_SIZE` generic
|
||||
| `2` | - | _reserved_, read as zero
|
||||
| `3` | - | _reserved_, read as zero
|
||||
| `3` | `SYSINFO_MEM_BOOT` | boot mode configuration, via top's `BOOT_MODE_SELECT` generic (see <<_boot_configuration>>))
|
||||
|=======================
|
||||
|
||||
|
||||
|
@ -73,37 +73,38 @@ Bit fields in this register are set to all-zero if the according memory system i
|
|||
[options="header",grid="all"]
|
||||
|=======================
|
||||
| Bit | Name [C] | Description
|
||||
| `0` | `SYSINFO_SOC_BOOTLOADER` | set if processor-internal bootloader is implemented (via top's `INT_BOOTLOADER_EN` generic)
|
||||
| `1` | `SYSINFO_SOC_XBUS` | set if external Wishbone bus interface is implemented (via top's `XBUS_EN` generic)
|
||||
| `2` | `SYSINFO_SOC_MEM_INT_IMEM` | set if processor-internal DMEM implemented (via top's `MEM_INT_DMEM_EN` generic)
|
||||
| `3` | `SYSINFO_SOC_MEM_INT_DMEM` | set if processor-internal IMEM is implemented (via top's `MEM_INT_IMEM_EN` generic)
|
||||
| `4` | `SYSINFO_SOC_OCD` | set if on-chip debugger is implemented (via top's `OCD_EN` generic)
|
||||
| `5` | `SYSINFO_SOC_ICACHE` | set if processor-internal instruction cache is implemented (via top's `ICACHE_EN` generic)
|
||||
| `6` | `SYSINFO_SOC_DCACHE` | set if processor-internal data cache is implemented (via top's `DCACHE_EN` generic)
|
||||
| `7` | `SYSINFO_SOC_CLOCK_GATING` | set if CPU clock gating is implemented (via top's `CLOCK_GATING_EN` generic)
|
||||
| `8` | `SYSINFO_SOC_XBUS_CACHE` | set if external bus interface cache is implemented (via top's `XBUS_CACHE_EN` generic)
|
||||
| `9` | `SYSINFO_SOC_XIP` | set if XIP module is implemented (via top's `XIP_EN` generic)
|
||||
| `10` | `SYSINFO_SOC_XIP_CACHE` | set if XIP cache is implemented (via top's `XIP_CACHE_EN` generic)
|
||||
| `11` | `SYSINFO_SOC_OCD_AUTH` | set if on-chip debugger authentication is implemented (via top's `OCD_AUTHENTICATION` generic)
|
||||
| `13:12` | - | _reserved_, read as zero
|
||||
| `14` | `SYSINFO_SOC_IO_DMA` | set if direct memory access controller is implemented (via top's `IO_DMA_EN` generic)
|
||||
| `15` | `SYSINFO_SOC_IO_GPIO` | set if GPIO is implemented (via top's `IO_GPIO_EN` generic)
|
||||
| `16` | `SYSINFO_SOC_IO_MTIME` | set if MTIME is implemented (via top's `IO_MTIME_EN` generic)
|
||||
| `17` | `SYSINFO_SOC_IO_UART0` | set if primary UART0 is implemented (via top's `IO_UART0_EN` generic)
|
||||
| `18` | `SYSINFO_SOC_IO_SPI` | set if SPI is implemented (via top's `IO_SPI_EN` generic)
|
||||
| `19` | `SYSINFO_SOC_IO_TWI` | set if TWI is implemented (via top's `IO_TWI_EN` generic)
|
||||
| `20` | `SYSINFO_SOC_IO_PWM` | set if PWM is implemented (via top's `IO_PWM_NUM_CH` generic)
|
||||
| `21` | `SYSINFO_SOC_IO_WDT` | set if WDT is implemented (via top's `IO_WDT_EN` generic)
|
||||
| `22` | `SYSINFO_SOC_IO_CFS` | set if custom functions subsystem is implemented (via top's `IO_CFS_EN` generic)
|
||||
| `23` | `SYSINFO_SOC_IO_TRNG` | set if TRNG is implemented (via top's `IO_TRNG_EN` generic)
|
||||
| `24` | `SYSINFO_SOC_IO_SDI` | set if SDI is implemented (via top's `IO_SDI_EN` generic)
|
||||
| `25` | `SYSINFO_SOC_IO_UART1` | set if secondary UART1 is implemented (via top's `IO_UART1_EN` generic)
|
||||
| `26` | `SYSINFO_SOC_IO_NEOLED` | set if NEOLED is implemented (via top's `IO_NEOLED_EN` generic)
|
||||
| `27` | `SYSINFO_SOC_IO_XIRQ` | set if XIRQ is implemented (via top's `XIRQ_NUM_CH` generic)
|
||||
| `28` | `SYSINFO_SOC_IO_GPTMR` | set if GPTMR is implemented (via top's `IO_GPTMR_EN` generic)
|
||||
| `29` | `SYSINFO_SOC_IO_SLINK` | set if stream link interface is implemented (via top's `IO_SLINK_EN` generic)
|
||||
| `30` | `SYSINFO_SOC_IO_ONEWIRE` | set if ONEWIRE interface is implemented (via top's `IO_ONEWIRE_EN` generic)
|
||||
| `31` | `SYSINFO_SOC_IO_CRC` | set if cyclic redundancy check unit is implemented (via top's `IO_CRC_EN` generic)
|
||||
| `0` | `SYSINFO_SOC_BOOTLOADER` | set if processor-internal bootloader is implemented (via top's `BOOT_MODE_SELECT` generic; see <<_boot_configuration>>)
|
||||
| `1` | `SYSINFO_SOC_XBUS` | set if external Wishbone bus interface is implemented (via top's `XBUS_EN` generic)
|
||||
| `2` | `SYSINFO_SOC_MEM_INT_IMEM` | set if processor-internal DMEM is implemented (via top's `MEM_INT_IMEM_EN` generic)
|
||||
| `3` | `SYSINFO_SOC_MEM_INT_DMEM` | set if processor-internal IMEM is implemented (via top's `MEM_INT_DMEM_EN` generic)
|
||||
| `4` | `SYSINFO_SOC_OCD` | set if on-chip debugger is implemented (via top's `OCD_EN` generic)
|
||||
| `5` | `SYSINFO_SOC_ICACHE` | set if processor-internal instruction cache is implemented (via top's `ICACHE_EN` generic)
|
||||
| `6` | `SYSINFO_SOC_DCACHE` | set if processor-internal data cache is implemented (via top's `DCACHE_EN` generic)
|
||||
| `7` | `SYSINFO_SOC_CLOCK_GATING` | set if CPU clock gating is implemented (via top's `CLOCK_GATING_EN` generic)
|
||||
| `8` | `SYSINFO_SOC_XBUS_CACHE` | set if external bus interface cache is implemented (via top's `XBUS_CACHE_EN` generic)
|
||||
| `9` | `SYSINFO_SOC_XIP` | set if XIP module is implemented (via top's `XIP_EN` generic)
|
||||
| `10` | `SYSINFO_SOC_XIP_CACHE` | set if XIP cache is implemented (via top's `XIP_CACHE_EN` generic)
|
||||
| `11` | `SYSINFO_SOC_OCD_AUTH` | set if on-chip debugger authentication is implemented (via top's `OCD_AUTHENTICATION` generic)
|
||||
| `12` | `SYSINFO_SOC_IMEM_ROM` | set if processor-internal IMEM is implemented as pre-initialized ROM (via top's `BOOT_MODE_SELECT` generic; see <<_boot_configuration>>)
|
||||
| `13` | - | _reserved_, read as zero
|
||||
| `14` | `SYSINFO_SOC_IO_DMA` | set if direct memory access controller is implemented (via top's `IO_DMA_EN` generic)
|
||||
| `15` | `SYSINFO_SOC_IO_GPIO` | set if GPIO is implemented (via top's `IO_GPIO_EN` generic)
|
||||
| `16` | `SYSINFO_SOC_IO_MTIME` | set if MTIME is implemented (via top's `IO_MTIME_EN` generic)
|
||||
| `17` | `SYSINFO_SOC_IO_UART0` | set if primary UART0 is implemented (via top's `IO_UART0_EN` generic)
|
||||
| `18` | `SYSINFO_SOC_IO_SPI` | set if SPI is implemented (via top's `IO_SPI_EN` generic)
|
||||
| `19` | `SYSINFO_SOC_IO_TWI` | set if TWI is implemented (via top's `IO_TWI_EN` generic)
|
||||
| `20` | `SYSINFO_SOC_IO_PWM` | set if PWM is implemented (via top's `IO_PWM_NUM_CH` generic)
|
||||
| `21` | `SYSINFO_SOC_IO_WDT` | set if WDT is implemented (via top's `IO_WDT_EN` generic)
|
||||
| `22` | `SYSINFO_SOC_IO_CFS` | set if custom functions subsystem is implemented (via top's `IO_CFS_EN` generic)
|
||||
| `23` | `SYSINFO_SOC_IO_TRNG` | set if TRNG is implemented (via top's `IO_TRNG_EN` generic)
|
||||
| `24` | `SYSINFO_SOC_IO_SDI` | set if SDI is implemented (via top's `IO_SDI_EN` generic)
|
||||
| `25` | `SYSINFO_SOC_IO_UART1` | set if secondary UART1 is implemented (via top's `IO_UART1_EN` generic)
|
||||
| `26` | `SYSINFO_SOC_IO_NEOLED` | set if NEOLED is implemented (via top's `IO_NEOLED_EN` generic)
|
||||
| `27` | `SYSINFO_SOC_IO_XIRQ` | set if XIRQ is implemented (via top's `XIRQ_NUM_CH` generic)
|
||||
| `28` | `SYSINFO_SOC_IO_GPTMR` | set if GPTMR is implemented (via top's `IO_GPTMR_EN` generic)
|
||||
| `29` | `SYSINFO_SOC_IO_SLINK` | set if stream link interface is implemented (via top's `IO_SLINK_EN` generic)
|
||||
| `30` | `SYSINFO_SOC_IO_ONEWIRE` | set if ONEWIRE interface is implemented (via top's `IO_ONEWIRE_EN` generic)
|
||||
| `31` | `SYSINFO_SOC_IO_CRC` | set if cyclic redundancy check unit is implemented (via top's `IO_CRC_EN` generic)
|
||||
|=======================
|
||||
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ The bootloader requires certain CPU and SoC extensions and modules to be enabled
|
|||
[cols="^2,<8"]
|
||||
[grid="none"]
|
||||
|=======================
|
||||
| **REQUIRED** | The bootloader is implemented only if the `INT_BOOTLOADER_EN` top generic is `true`. This will automatically select the CPU's <<_indirect_boot>> boot configuration.
|
||||
| **REQUIRED** | The <<_boot_configuration>> (`BOOT_MODE_SELECT` generic) has to be set to "bootloader" mode.
|
||||
| **REQUIRED** | The bootloader requires the privileged architecture CPU extension (<<_zicsr_isa_extension>>) to be enabled.
|
||||
| **REQUIRED** | At least 512 bytes of data memory (processor-internal DMEM or processor-external DMEM) are required for the bootloader's stack and global variables.
|
||||
| _RECOMMENDED_ | For user interaction via the <<_bootloader_console>> (like uploading executables) the primary UART (<<_primary_universal_asynchronous_receiver_and_transmitter_uart0>>) is required.
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 86 KiB |
|
@ -1410,7 +1410,7 @@ begin
|
|||
csr.mie_firq <= (others => '0');
|
||||
csr.mtvec <= (others => '0');
|
||||
csr.mscratch <= x"19880704";
|
||||
csr.mepc <= (others => '0');
|
||||
csr.mepc <= BOOT_ADDR(XLEN-1 downto 2) & "00"; -- 32-bit-aligned boot address
|
||||
csr.mcause <= (others => '0');
|
||||
csr.mtval <= (others => '0');
|
||||
csr.mtinst <= (others => '0');
|
||||
|
|
|
@ -20,7 +20,7 @@ use neorv32.neorv32_package.all;
|
|||
|
||||
entity neorv32_dmem is
|
||||
generic (
|
||||
DMEM_SIZE : natural -- processor-internal instruction memory size in bytes, has to be a power of 2
|
||||
DMEM_SIZE : natural -- memory size in bytes, has to be a power of 2, min 4
|
||||
);
|
||||
port (
|
||||
clk_i : in std_ulogic; -- global clock line
|
||||
|
@ -38,7 +38,7 @@ architecture neorv32_dmem_rtl of neorv32_dmem is
|
|||
-- local signals --
|
||||
signal rdata : std_ulogic_vector(31 downto 0);
|
||||
signal rden : std_ulogic;
|
||||
signal addr, addr_ff : std_ulogic_vector(index_size_f(DMEM_SIZE/4)-1 downto 0);
|
||||
signal addr, addr_ff : unsigned(index_size_f(DMEM_SIZE/4)-1 downto 0);
|
||||
|
||||
-- [NOTE] The memory (RAM) is built from 4 individual byte-wide memories as some synthesis tools
|
||||
-- have issues inferring 32-bit memories with individual byte-enable signals.
|
||||
|
@ -57,22 +57,22 @@ begin
|
|||
if rising_edge(clk_i) then
|
||||
if (bus_req_i.stb = '1') and (bus_req_i.rw = '1') then
|
||||
if (bus_req_i.ben(0) = '1') then -- byte 0
|
||||
mem_ram_b0(to_integer(unsigned(addr))) <= bus_req_i.data(7 downto 0);
|
||||
mem_ram_b0(to_integer(addr)) <= bus_req_i.data(7 downto 0);
|
||||
end if;
|
||||
if (bus_req_i.ben(1) = '1') then -- byte 1
|
||||
mem_ram_b1(to_integer(unsigned(addr))) <= bus_req_i.data(15 downto 8);
|
||||
mem_ram_b1(to_integer(addr)) <= bus_req_i.data(15 downto 8);
|
||||
end if;
|
||||
if (bus_req_i.ben(2) = '1') then -- byte 2
|
||||
mem_ram_b2(to_integer(unsigned(addr))) <= bus_req_i.data(23 downto 16);
|
||||
mem_ram_b2(to_integer(addr)) <= bus_req_i.data(23 downto 16);
|
||||
end if;
|
||||
if (bus_req_i.ben(3) = '1') then -- byte 3
|
||||
mem_ram_b3(to_integer(unsigned(addr))) <= bus_req_i.data(31 downto 24);
|
||||
mem_ram_b3(to_integer(addr)) <= bus_req_i.data(31 downto 24);
|
||||
end if;
|
||||
end if;
|
||||
rdata(7 downto 0) <= mem_ram_b0(to_integer(unsigned(addr)));
|
||||
rdata(15 downto 8) <= mem_ram_b1(to_integer(unsigned(addr)));
|
||||
rdata(23 downto 16) <= mem_ram_b2(to_integer(unsigned(addr)));
|
||||
rdata(31 downto 24) <= mem_ram_b3(to_integer(unsigned(addr)));
|
||||
rdata(7 downto 0) <= mem_ram_b0(to_integer(addr));
|
||||
rdata(15 downto 8) <= mem_ram_b1(to_integer(addr));
|
||||
rdata(23 downto 16) <= mem_ram_b2(to_integer(addr));
|
||||
rdata(31 downto 24) <= mem_ram_b3(to_integer(addr));
|
||||
end if;
|
||||
end process mem_access;
|
||||
addr_ff <= (others => '0'); -- unused
|
||||
|
@ -86,28 +86,28 @@ begin
|
|||
addr_ff <= addr;
|
||||
if (bus_req_i.stb = '1') and (bus_req_i.rw = '1') then
|
||||
if (bus_req_i.ben(0) = '1') then -- byte 0
|
||||
mem_ram_b0(to_integer(unsigned(addr))) <= bus_req_i.data(7 downto 0);
|
||||
mem_ram_b0(to_integer(addr)) <= bus_req_i.data(7 downto 0);
|
||||
end if;
|
||||
if (bus_req_i.ben(1) = '1') then -- byte 1
|
||||
mem_ram_b1(to_integer(unsigned(addr))) <= bus_req_i.data(15 downto 8);
|
||||
mem_ram_b1(to_integer(addr)) <= bus_req_i.data(15 downto 8);
|
||||
end if;
|
||||
if (bus_req_i.ben(2) = '1') then -- byte 2
|
||||
mem_ram_b2(to_integer(unsigned(addr))) <= bus_req_i.data(23 downto 16);
|
||||
mem_ram_b2(to_integer(addr)) <= bus_req_i.data(23 downto 16);
|
||||
end if;
|
||||
if (bus_req_i.ben(3) = '1') then -- byte 3
|
||||
mem_ram_b3(to_integer(unsigned(addr))) <= bus_req_i.data(31 downto 24);
|
||||
mem_ram_b3(to_integer(addr)) <= bus_req_i.data(31 downto 24);
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
end process mem_access;
|
||||
rdata(7 downto 0) <= mem_ram_b0(to_integer(unsigned(addr_ff)));
|
||||
rdata(15 downto 8) <= mem_ram_b1(to_integer(unsigned(addr_ff)));
|
||||
rdata(23 downto 16) <= mem_ram_b2(to_integer(unsigned(addr_ff)));
|
||||
rdata(31 downto 24) <= mem_ram_b3(to_integer(unsigned(addr_ff)));
|
||||
rdata(7 downto 0) <= mem_ram_b0(to_integer(addr_ff));
|
||||
rdata(15 downto 8) <= mem_ram_b1(to_integer(addr_ff));
|
||||
rdata(23 downto 16) <= mem_ram_b2(to_integer(addr_ff));
|
||||
rdata(31 downto 24) <= mem_ram_b3(to_integer(addr_ff));
|
||||
end generate;
|
||||
|
||||
-- word aligned access address --
|
||||
addr <= bus_req_i.addr(index_size_f(DMEM_SIZE/4)+1 downto 2);
|
||||
addr <= unsigned(bus_req_i.addr(index_size_f(DMEM_SIZE/4)+1 downto 2));
|
||||
|
||||
|
||||
-- Bus Response ---------------------------------------------------------------------------
|
||||
|
|
|
@ -21,8 +21,8 @@ use neorv32.neorv32_application_image.all; -- generated by the image generator
|
|||
|
||||
entity neorv32_imem is
|
||||
generic (
|
||||
IMEM_SIZE : natural; -- processor-internal instruction memory size in bytes, has to be a power of 2
|
||||
IMEM_AS_IROM : boolean -- implement IMEM as pre-initialized read-only memory?
|
||||
IMEM_SIZE : natural; -- memory size in bytes, has to be a power of 2, min 4
|
||||
IMEM_INIT : boolean -- implement IMEM as pre-initialized read-only memory?
|
||||
);
|
||||
port (
|
||||
clk_i : in std_ulogic; -- global clock line
|
||||
|
@ -37,16 +37,14 @@ architecture neorv32_imem_rtl of neorv32_imem is
|
|||
-- alternative memory description style --
|
||||
constant alt_style_c : boolean := false; -- [TIP] enable this if synthesis fails to infer block RAM
|
||||
|
||||
-- ROM - initialized with executable code --
|
||||
constant imem_app_size_c : natural := (application_init_image'length)*4; -- application (image) size in bytes
|
||||
constant mem_rom_c : mem32_t(0 to IMEM_SIZE/4-1) := mem32_init_f(application_init_image, IMEM_SIZE/4);
|
||||
|
||||
-- local signals --
|
||||
signal rdata : std_ulogic_vector(31 downto 0);
|
||||
signal rden : std_ulogic;
|
||||
signal addr, addr_ff : std_ulogic_vector(index_size_f(IMEM_SIZE/4)-1 downto 0);
|
||||
|
||||
-- application (image) size in bytes --
|
||||
constant imem_app_size_c : natural := (application_init_image'length)*4;
|
||||
|
||||
-- ROM - initialized with executable code --
|
||||
constant mem_rom_c : mem32_t(0 to IMEM_SIZE/4-1) := mem32_init_f(application_init_image, IMEM_SIZE/4);
|
||||
signal addr, addr_ff : unsigned(index_size_f(IMEM_SIZE/4)-1 downto 0);
|
||||
|
||||
-- [NOTE] The memory (RAM) is built from 4 individual byte-wide memories as some synthesis tools
|
||||
-- have issues inferring 32-bit memories with individual byte-enable signals.
|
||||
|
@ -60,9 +58,9 @@ begin
|
|||
-- -------------------------------------------------------------------------------------------
|
||||
assert false report
|
||||
"[NEORV32] Implementing processor-internal IMEM as " &
|
||||
cond_sel_string_f(IMEM_AS_IROM, "pre-initialized ROM.", "blank RAM.") severity note;
|
||||
cond_sel_string_f(IMEM_INIT, "pre-initialized ROM.", "blank RAM.") severity note;
|
||||
|
||||
assert not ((IMEM_AS_IROM = true) and (imem_app_size_c > IMEM_SIZE)) report
|
||||
assert not ((IMEM_INIT = true) and (imem_app_size_c > IMEM_SIZE)) report
|
||||
"[NEORV32] Application image (" & natural'image(imem_app_size_c) &
|
||||
" bytes) does not fit into processor-internal IMEM (" &
|
||||
natural'image(IMEM_SIZE) & " bytes)!" severity error;
|
||||
|
@ -71,14 +69,14 @@ begin
|
|||
-- Implement IMEM as pre-initialized ROM --------------------------------------------------
|
||||
-- -------------------------------------------------------------------------------------------
|
||||
imem_rom:
|
||||
if IMEM_AS_IROM generate
|
||||
if IMEM_INIT generate
|
||||
|
||||
imem_rom_default: -- default memory HDL style
|
||||
if not alt_style_c generate
|
||||
mem_access: process(clk_i)
|
||||
begin
|
||||
if rising_edge(clk_i) then
|
||||
rdata <= mem_rom_c(to_integer(unsigned(addr)));
|
||||
rdata <= mem_rom_c(to_integer(addr));
|
||||
end if;
|
||||
end process mem_access;
|
||||
addr_ff <= (others => '0'); -- unused
|
||||
|
@ -92,19 +90,19 @@ begin
|
|||
addr_ff <= addr;
|
||||
end if;
|
||||
end process mem_access;
|
||||
rdata <= mem_rom_c(to_integer(unsigned(addr_ff)));
|
||||
rdata <= mem_rom_c(to_integer(addr_ff));
|
||||
end generate;
|
||||
|
||||
end generate;
|
||||
|
||||
-- word aligned access address --
|
||||
addr <= bus_req_i.addr(index_size_f(IMEM_SIZE/4)+1 downto 2);
|
||||
addr <= unsigned(bus_req_i.addr(index_size_f(IMEM_SIZE/4)+1 downto 2));
|
||||
|
||||
|
||||
-- Implement IMEM as non-initialized RAM --------------------------------------------------
|
||||
-- -------------------------------------------------------------------------------------------
|
||||
imem_ram:
|
||||
if not IMEM_AS_IROM generate
|
||||
if not IMEM_INIT generate
|
||||
|
||||
imem_ram_default: -- default memory HDL style
|
||||
if not alt_style_c generate
|
||||
|
@ -113,22 +111,22 @@ begin
|
|||
if rising_edge(clk_i) then
|
||||
if (bus_req_i.stb = '1') and (bus_req_i.rw = '1') then
|
||||
if (bus_req_i.ben(0) = '1') then -- byte 0
|
||||
mem_ram_b0(to_integer(unsigned(addr))) <= bus_req_i.data(7 downto 0);
|
||||
mem_ram_b0(to_integer(addr)) <= bus_req_i.data(7 downto 0);
|
||||
end if;
|
||||
if (bus_req_i.ben(1) = '1') then -- byte 1
|
||||
mem_ram_b1(to_integer(unsigned(addr))) <= bus_req_i.data(15 downto 8);
|
||||
mem_ram_b1(to_integer(addr)) <= bus_req_i.data(15 downto 8);
|
||||
end if;
|
||||
if (bus_req_i.ben(2) = '1') then -- byte 2
|
||||
mem_ram_b2(to_integer(unsigned(addr))) <= bus_req_i.data(23 downto 16);
|
||||
mem_ram_b2(to_integer(addr)) <= bus_req_i.data(23 downto 16);
|
||||
end if;
|
||||
if (bus_req_i.ben(3) = '1') then -- byte 3
|
||||
mem_ram_b3(to_integer(unsigned(addr))) <= bus_req_i.data(31 downto 24);
|
||||
mem_ram_b3(to_integer(addr)) <= bus_req_i.data(31 downto 24);
|
||||
end if;
|
||||
end if;
|
||||
rdata(7 downto 0) <= mem_ram_b0(to_integer(unsigned(addr)));
|
||||
rdata(15 downto 8) <= mem_ram_b1(to_integer(unsigned(addr)));
|
||||
rdata(23 downto 16) <= mem_ram_b2(to_integer(unsigned(addr)));
|
||||
rdata(31 downto 24) <= mem_ram_b3(to_integer(unsigned(addr)));
|
||||
rdata(7 downto 0) <= mem_ram_b0(to_integer(addr));
|
||||
rdata(15 downto 8) <= mem_ram_b1(to_integer(addr));
|
||||
rdata(23 downto 16) <= mem_ram_b2(to_integer(addr));
|
||||
rdata(31 downto 24) <= mem_ram_b3(to_integer(addr));
|
||||
end if;
|
||||
end process mem_access;
|
||||
addr_ff <= (others => '0'); -- unused
|
||||
|
@ -142,24 +140,24 @@ begin
|
|||
addr_ff <= addr;
|
||||
if (bus_req_i.stb = '1') and (bus_req_i.rw = '1') then
|
||||
if (bus_req_i.ben(0) = '1') then -- byte 0
|
||||
mem_ram_b0(to_integer(unsigned(addr))) <= bus_req_i.data(7 downto 0);
|
||||
mem_ram_b0(to_integer(addr)) <= bus_req_i.data(7 downto 0);
|
||||
end if;
|
||||
if (bus_req_i.ben(1) = '1') then -- byte 1
|
||||
mem_ram_b1(to_integer(unsigned(addr))) <= bus_req_i.data(15 downto 8);
|
||||
mem_ram_b1(to_integer(addr)) <= bus_req_i.data(15 downto 8);
|
||||
end if;
|
||||
if (bus_req_i.ben(2) = '1') then -- byte 2
|
||||
mem_ram_b2(to_integer(unsigned(addr))) <= bus_req_i.data(23 downto 16);
|
||||
mem_ram_b2(to_integer(addr)) <= bus_req_i.data(23 downto 16);
|
||||
end if;
|
||||
if (bus_req_i.ben(3) = '1') then -- byte 3
|
||||
mem_ram_b3(to_integer(unsigned(addr))) <= bus_req_i.data(31 downto 24);
|
||||
mem_ram_b3(to_integer(addr)) <= bus_req_i.data(31 downto 24);
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
end process mem_access;
|
||||
rdata(7 downto 0) <= mem_ram_b0(to_integer(unsigned(addr_ff)));
|
||||
rdata(15 downto 8) <= mem_ram_b1(to_integer(unsigned(addr_ff)));
|
||||
rdata(23 downto 16) <= mem_ram_b2(to_integer(unsigned(addr_ff)));
|
||||
rdata(31 downto 24) <= mem_ram_b3(to_integer(unsigned(addr_ff)));
|
||||
rdata(7 downto 0) <= mem_ram_b0(to_integer(addr_ff));
|
||||
rdata(15 downto 8) <= mem_ram_b1(to_integer(addr_ff));
|
||||
rdata(23 downto 16) <= mem_ram_b2(to_integer(addr_ff));
|
||||
rdata(31 downto 24) <= mem_ram_b3(to_integer(addr_ff));
|
||||
end generate;
|
||||
|
||||
end generate;
|
||||
|
@ -174,7 +172,7 @@ begin
|
|||
bus_rsp_o.ack <= '0';
|
||||
elsif rising_edge(clk_i) then
|
||||
rden <= bus_req_i.stb and (not bus_req_i.rw);
|
||||
if (IMEM_AS_IROM = true) then
|
||||
if (IMEM_INIT = true) then
|
||||
bus_rsp_o.ack <= bus_req_i.stb and (not bus_req_i.rw); -- read-only!
|
||||
else
|
||||
bus_rsp_o.ack <= bus_req_i.stb;
|
||||
|
|
|
@ -29,7 +29,7 @@ package neorv32_package is
|
|||
|
||||
-- Architecture Constants -----------------------------------------------------------------
|
||||
-- -------------------------------------------------------------------------------------------
|
||||
constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01100601"; -- hardware version
|
||||
constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01100602"; -- hardware version
|
||||
constant archid_c : natural := 19; -- official RISC-V architecture ID
|
||||
constant XLEN : natural := 32; -- native data path width
|
||||
|
||||
|
@ -667,12 +667,15 @@ package neorv32_package is
|
|||
|
||||
component neorv32_top
|
||||
generic (
|
||||
-- General --
|
||||
-- Clocking --
|
||||
CLOCK_FREQUENCY : natural := 0;
|
||||
CLOCK_GATING_EN : boolean := false;
|
||||
-- Identification --
|
||||
HART_ID : std_ulogic_vector(31 downto 0) := x"00000000";
|
||||
JEDEC_ID : std_ulogic_vector(10 downto 0) := "00000000000";
|
||||
INT_BOOTLOADER_EN : boolean := false;
|
||||
-- Boot Configuration --
|
||||
BOOT_MODE_SELECT : natural range 0 to 2 := 0;
|
||||
BOOT_ADDR_CUSTOM : std_ulogic_vector(31 downto 0) := x"00000000";
|
||||
-- On-Chip Debugger (OCD) --
|
||||
OCD_EN : boolean := false;
|
||||
OCD_AUTHENTICATION : boolean := false;
|
||||
|
|
|
@ -19,8 +19,10 @@ entity neorv32_sysinfo is
|
|||
generic (
|
||||
CLOCK_FREQUENCY : natural; -- clock frequency of clk_i in Hz
|
||||
CLOCK_GATING_EN : boolean; -- enable clock gating when in sleep mode
|
||||
BOOT_MODE_SELECT : natural; -- boot configuration select (default = 0 = bootloader)
|
||||
INT_BOOTLOADER_EN : boolean; -- boot configuration: true = boot explicit bootloader; false = boot from int/ext (I)MEM
|
||||
MEM_INT_IMEM_EN : boolean; -- implement processor-internal instruction memory
|
||||
MEM_INT_IMEM_ROM : boolean; -- implement processor-internal instruction memory as pre-initialized ROM
|
||||
MEM_INT_IMEM_SIZE : natural; -- size of processor-internal instruction memory in bytes
|
||||
MEM_INT_DMEM_EN : boolean; -- implement processor-internal data memory
|
||||
MEM_INT_DMEM_SIZE : natural; -- size of processor-internal data memory in bytes
|
||||
|
@ -75,6 +77,7 @@ architecture neorv32_sysinfo_rtl of neorv32_sysinfo is
|
|||
constant xcache_en_c : boolean := XBUS_EN and XBUS_CACHE_EN;
|
||||
constant xip_cache_en_c : boolean := XIP_EN and XIP_CACHE_EN;
|
||||
constant ocd_auth_en_c : boolean := OCD_EN and OCD_AUTHENTICATION;
|
||||
constant int_imem_rom_c : boolean := int_imem_en_c and MEM_INT_IMEM_ROM;
|
||||
|
||||
-- system information memory --
|
||||
type sysinfo_t is array (0 to 3) of std_ulogic_vector(31 downto 0);
|
||||
|
@ -104,7 +107,7 @@ begin
|
|||
sysinfo(1)(7 downto 0) <= std_ulogic_vector(to_unsigned(index_size_f(MEM_INT_IMEM_SIZE), 8)); -- log2(IMEM size)
|
||||
sysinfo(1)(15 downto 8) <= std_ulogic_vector(to_unsigned(index_size_f(MEM_INT_DMEM_SIZE), 8)); -- log2(DMEM size)
|
||||
sysinfo(1)(23 downto 16) <= (others => '0'); -- reserved
|
||||
sysinfo(1)(31 downto 24) <= (others => '0'); -- reserved
|
||||
sysinfo(1)(31 downto 24) <= std_ulogic_vector(to_unsigned(BOOT_MODE_SELECT, 8)); -- boot configuration
|
||||
|
||||
-- SYSINFO(2): SoC Configuration --
|
||||
sysinfo(2)(0) <= '1' when INT_BOOTLOADER_EN else '0'; -- processor-internal bootloader implemented?
|
||||
|
@ -119,7 +122,7 @@ begin
|
|||
sysinfo(2)(9) <= '1' when XIP_EN else '0'; -- execute in-place module implemented?
|
||||
sysinfo(2)(10) <= '1' when xip_cache_en_c else '0'; -- execute in-place cache implemented?
|
||||
sysinfo(2)(11) <= '1' when ocd_auth_en_c else '0'; -- on-chip debugger authentication implemented?
|
||||
sysinfo(2)(12) <= '0'; -- reserved
|
||||
sysinfo(2)(12) <= '1' when int_imem_rom_c else '0'; -- processor-internal instruction memory implemented as pre-initialized ROM?
|
||||
sysinfo(2)(13) <= '0'; -- reserved
|
||||
sysinfo(2)(14) <= '1' when IO_DMA_EN else '0'; -- direct memory access controller (DMA) implemented?
|
||||
sysinfo(2)(15) <= '1' when IO_GPIO_EN else '0'; -- general purpose input/output port unit (GPIO) implemented?
|
||||
|
|
|
@ -21,12 +21,17 @@ use neorv32.neorv32_package.all;
|
|||
|
||||
entity neorv32_top is
|
||||
generic (
|
||||
-- General --
|
||||
-- Processor Clocking --
|
||||
CLOCK_FREQUENCY : natural := 0; -- clock frequency of clk_i in Hz
|
||||
CLOCK_GATING_EN : boolean := false; -- enable clock gating when in sleep mode
|
||||
|
||||
-- Core Identification --
|
||||
HART_ID : std_ulogic_vector(31 downto 0) := x"00000000"; -- hardware thread ID
|
||||
JEDEC_ID : std_ulogic_vector(10 downto 0) := "00000000000"; -- JEDEC ID: continuation codes + vendor ID
|
||||
INT_BOOTLOADER_EN : boolean := false; -- boot configuration: true = boot explicit bootloader; false = boot from int/ext (I)MEM
|
||||
|
||||
-- Boot Configuration --
|
||||
BOOT_MODE_SELECT : natural range 0 to 2 := 0; -- boot configuration select (default = 0 = bootloader)
|
||||
BOOT_ADDR_CUSTOM : std_ulogic_vector(31 downto 0) := x"00000000"; -- custom CPU boot address (if boot_config = 1)
|
||||
|
||||
-- On-Chip Debugger (OCD) --
|
||||
OCD_EN : boolean := false; -- implement on-chip debugger
|
||||
|
@ -244,16 +249,28 @@ end neorv32_top;
|
|||
|
||||
architecture neorv32_top_rtl of neorv32_top is
|
||||
|
||||
-- ----------------------------------------------------------
|
||||
-- Boot Configuration (BOOT_MODE_SELECT)
|
||||
-- ----------------------------------------------------------
|
||||
-- 0: Internal bootloader ROM
|
||||
-- 1: Custom (use BOOT_ADDR_CUSTOM)
|
||||
-- 2: Internal IMEM initialized with application image
|
||||
-- ----------------------------------------------------------
|
||||
constant bootrom_en_c : boolean := boolean(BOOT_MODE_SELECT = 0);
|
||||
constant imem_as_rom_c : boolean := boolean(BOOT_MODE_SELECT = 2);
|
||||
constant cpu_boot_addr_c : std_ulogic_vector(31 downto 0) :=
|
||||
cond_sel_suv_f(boolean(BOOT_MODE_SELECT = 0), mem_boot_base_c,
|
||||
cond_sel_suv_f(boolean(BOOT_MODE_SELECT = 1), BOOT_ADDR_CUSTOM,
|
||||
cond_sel_suv_f(boolean(BOOT_MODE_SELECT = 2), mem_imem_base_c, x"00000000")));
|
||||
|
||||
-- auto-configuration --
|
||||
constant cpu_boot_addr_c : std_ulogic_vector(31 downto 0) := cond_sel_suv_f(INT_BOOTLOADER_EN, mem_boot_base_c, mem_imem_base_c);
|
||||
constant imem_as_rom_c : boolean := not INT_BOOTLOADER_EN;
|
||||
constant io_gpio_en_c : boolean := boolean(IO_GPIO_NUM > 0);
|
||||
constant io_xirq_en_c : boolean := boolean(XIRQ_NUM_CH > 0);
|
||||
constant io_pwm_en_c : boolean := boolean(IO_PWM_NUM_CH > 0);
|
||||
constant cpu_smpmp_c : boolean := boolean(PMP_NUM_REGIONS > 0);
|
||||
constant io_sysinfo_en_c : boolean := not IO_DISABLE_SYSINFO;
|
||||
|
||||
-- convert JEDEC ID to mvendorid CSR --
|
||||
-- convert JEDEC ID to MVENDORID CSR --
|
||||
constant vendorid_c : std_ulogic_vector(31 downto 0) := x"00000" & "0" & JEDEC_ID;
|
||||
|
||||
-- make sure physical memory sizes are a power of two --
|
||||
|
@ -282,7 +299,7 @@ architecture neorv32_top_rtl of neorv32_top is
|
|||
signal dmi_rsp : dmi_rsp_t;
|
||||
|
||||
-- debug core interface (DCI) --
|
||||
signal dci_ndmrstn, dci_halt_req : std_ulogic;
|
||||
signal dci_ndmrstn, dci_haltreq : std_ulogic;
|
||||
|
||||
-- bus: core complex (CPU + caches) and DMA --
|
||||
signal cpu_i_req, cpu_d_req, icache_req, dcache_req, core_req, main_req, main2_req, dma_req : bus_req_t;
|
||||
|
@ -330,9 +347,9 @@ begin
|
|||
-- show SoC configuration --
|
||||
assert false report
|
||||
"[NEORV32] Processor Configuration: CPU " & -- cpu core is always enabled
|
||||
cond_sel_string_f(MEM_INT_IMEM_EN, "IMEM ", "") &
|
||||
cond_sel_string_f(MEM_INT_IMEM_EN, cond_sel_string_f(imem_as_rom_c, "IMEM_ROM ", "IMEM "), "") &
|
||||
cond_sel_string_f(MEM_INT_DMEM_EN, "DMEM ", "") &
|
||||
cond_sel_string_f(INT_BOOTLOADER_EN, "BOOTROM ", "") &
|
||||
cond_sel_string_f(bootrom_en_c, "BOOTROM ", "") &
|
||||
cond_sel_string_f(ICACHE_EN, "I-CACHE ", "") &
|
||||
cond_sel_string_f(DCACHE_EN, "D-CACHE ", "") &
|
||||
cond_sel_string_f(XBUS_EN, "XBUS ", "") &
|
||||
|
@ -358,7 +375,7 @@ begin
|
|||
cond_sel_string_f(IO_SLINK_EN, "SLINK ", "") &
|
||||
cond_sel_string_f(IO_CRC_EN, "CRC ", "") &
|
||||
cond_sel_string_f(io_sysinfo_en_c, "SYSINFO ", "") &
|
||||
cond_sel_string_f(OCD_EN, cond_sel_string_f(OCD_AUTHENTICATION, "OCD-AUTH ", "OCD "), "") &
|
||||
cond_sel_string_f(OCD_EN, cond_sel_string_f(OCD_AUTHENTICATION, "OCD-AUTH ", "OCD "), "") &
|
||||
""
|
||||
severity note;
|
||||
|
||||
|
@ -378,6 +395,15 @@ begin
|
|||
assert not (CLOCK_FREQUENCY = 0) report
|
||||
"[NEORV32] CLOCK_FREQUENCY must be configured according to the frequency of clk_i port!" severity warning;
|
||||
|
||||
-- Boot configuration notifier --
|
||||
assert not (BOOT_MODE_SELECT = 0) report "[NEORV32] BOOT_MODE_SELECT = 0: booting via bootloader" severity note;
|
||||
assert not (BOOT_MODE_SELECT = 1) report "[NEORV32] BOOT_MODE_SELECT = 1: booting from custom address" severity note;
|
||||
assert not (BOOT_MODE_SELECT = 2) report "[NEORV32] BOOT_MODE_SELECT = 2: booting IMEM image" severity note;
|
||||
|
||||
-- Boot configuration: boot from initialized IMEM requires the IMEM to be enabled --
|
||||
assert not ((BOOT_MODE_SELECT = 2) and (MEM_INT_IMEM_EN = false)) report
|
||||
"[NEORV32] BOOT_MODE_SELECT = 2 (boot IMEM image) requires the internal instruction memory (IMEM) to be enabled!" severity error;
|
||||
|
||||
end generate; -- /sanity_checks
|
||||
|
||||
|
||||
|
@ -507,7 +533,7 @@ begin
|
|||
mei_i => mext_irq_i,
|
||||
mti_i => mtime_irq,
|
||||
firq_i => cpu_firq,
|
||||
dbi_i => dci_halt_req,
|
||||
dbi_i => dci_haltreq,
|
||||
-- instruction bus interface --
|
||||
ibus_req_o => cpu_i_req,
|
||||
ibus_rsp_i => cpu_i_rsp,
|
||||
|
@ -717,7 +743,7 @@ begin
|
|||
C_TMO_EN => false, -- no timeout for XIP accesses
|
||||
C_PRIV => false,
|
||||
-- port D: BOOT ROM --
|
||||
D_ENABLE => INT_BOOTLOADER_EN,
|
||||
D_ENABLE => bootrom_en_c,
|
||||
D_BASE => mem_boot_base_c,
|
||||
D_SIZE => mem_boot_size_c,
|
||||
D_TMO_EN => true,
|
||||
|
@ -768,8 +794,8 @@ begin
|
|||
if MEM_INT_IMEM_EN generate
|
||||
neorv32_int_imem_inst: entity neorv32.neorv32_imem
|
||||
generic map (
|
||||
IMEM_SIZE => imem_size_c,
|
||||
IMEM_AS_IROM => imem_as_rom_c
|
||||
IMEM_SIZE => imem_size_c,
|
||||
IMEM_INIT => imem_as_rom_c
|
||||
)
|
||||
port map (
|
||||
clk_i => clk_i,
|
||||
|
@ -810,7 +836,7 @@ begin
|
|||
-- Processor-Internal Bootloader ROM (BOOTROM) --------------------------------------------
|
||||
-- -------------------------------------------------------------------------------------------
|
||||
neorv32_boot_rom_inst_true:
|
||||
if INT_BOOTLOADER_EN generate
|
||||
if bootrom_en_c generate
|
||||
neorv32_boot_rom_inst: entity neorv32.neorv32_boot_rom
|
||||
port map (
|
||||
clk_i => clk_i,
|
||||
|
@ -821,7 +847,7 @@ begin
|
|||
end generate;
|
||||
|
||||
neorv32_boot_rom_inst_false:
|
||||
if not INT_BOOTLOADER_EN generate
|
||||
if not bootrom_en_c generate
|
||||
boot_rsp <= rsp_terminate_c;
|
||||
end generate;
|
||||
|
||||
|
@ -1551,8 +1577,10 @@ begin
|
|||
generic map (
|
||||
CLOCK_FREQUENCY => CLOCK_FREQUENCY,
|
||||
CLOCK_GATING_EN => CLOCK_GATING_EN,
|
||||
INT_BOOTLOADER_EN => INT_BOOTLOADER_EN,
|
||||
BOOT_MODE_SELECT => BOOT_MODE_SELECT,
|
||||
INT_BOOTLOADER_EN => bootrom_en_c,
|
||||
MEM_INT_IMEM_EN => MEM_INT_IMEM_EN,
|
||||
MEM_INT_IMEM_ROM => imem_as_rom_c,
|
||||
MEM_INT_IMEM_SIZE => imem_size_c,
|
||||
MEM_INT_DMEM_EN => MEM_INT_DMEM_EN,
|
||||
MEM_INT_DMEM_SIZE => dmem_size_c,
|
||||
|
@ -1649,7 +1677,7 @@ begin
|
|||
bus_req_i => iodev_req(IODEV_OCD),
|
||||
bus_rsp_o => iodev_rsp(IODEV_OCD),
|
||||
cpu_ndmrstn_o => dci_ndmrstn,
|
||||
cpu_halt_req_o => dci_halt_req
|
||||
cpu_halt_req_o => dci_haltreq
|
||||
);
|
||||
|
||||
end generate;
|
||||
|
@ -1659,7 +1687,7 @@ begin
|
|||
iodev_rsp(IODEV_OCD) <= rsp_terminate_c;
|
||||
jtag_tdo_o <= jtag_tdi_i; -- JTAG pass-through
|
||||
dci_ndmrstn <= '1';
|
||||
dci_halt_req <= '0';
|
||||
dci_haltreq <= '0';
|
||||
end generate;
|
||||
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ library neorv32;
|
|||
|
||||
entity neorv32_ProcessorTop_Minimal is
|
||||
generic (
|
||||
-- General --
|
||||
-- Clocking --
|
||||
CLOCK_FREQUENCY : natural := 0; -- clock frequency of clk_i in Hz
|
||||
-- Internal Instruction memory --
|
||||
MEM_INT_IMEM_EN : boolean := true; -- implement processor-internal instruction memory
|
||||
|
@ -47,9 +47,10 @@ begin
|
|||
-- -------------------------------------------------------------------------------------------
|
||||
neorv32_inst: entity neorv32.neorv32_top
|
||||
generic map (
|
||||
-- General --
|
||||
-- Clocking --
|
||||
CLOCK_FREQUENCY => CLOCK_FREQUENCY, -- clock frequency of clk_i in Hz
|
||||
INT_BOOTLOADER_EN => false, -- boot configuration: true = boot explicit bootloader; false = boot from int/ext (I)MEM
|
||||
-- Boot Configuration --
|
||||
BOOT_MODE_SELECT => 2, -- boot from pre-initialized interal IMEM
|
||||
-- Internal Instruction memory --
|
||||
MEM_INT_IMEM_EN => MEM_INT_IMEM_EN, -- implement processor-internal instruction memory
|
||||
MEM_INT_IMEM_SIZE => MEM_INT_IMEM_SIZE, -- size of processor-internal instruction memory in bytes
|
||||
|
|
|
@ -16,7 +16,7 @@ library neorv32;
|
|||
|
||||
entity neorv32_ProcessorTop_MinimalBoot is
|
||||
generic (
|
||||
-- General --
|
||||
-- Clocking --
|
||||
CLOCK_FREQUENCY : natural := 0; -- clock frequency of clk_i in Hz
|
||||
-- Internal Instruction memory --
|
||||
MEM_INT_IMEM_EN : boolean := true; -- implement processor-internal instruction memory
|
||||
|
@ -54,9 +54,10 @@ begin
|
|||
-- -------------------------------------------------------------------------------------------
|
||||
neorv32_inst: entity neorv32.neorv32_top
|
||||
generic map (
|
||||
-- General --
|
||||
-- Clocking --
|
||||
CLOCK_FREQUENCY => CLOCK_FREQUENCY, -- clock frequency of clk_i in Hz
|
||||
INT_BOOTLOADER_EN => true, -- boot configuration: true = boot explicit bootloader; false = boot from int/ext (I)MEM
|
||||
-- Boot Configuration --
|
||||
BOOT_MODE_SELECT => 0, -- boot via internal bootloader
|
||||
-- Internal Instruction memory --
|
||||
MEM_INT_IMEM_EN => MEM_INT_IMEM_EN, -- implement processor-internal instruction memory
|
||||
MEM_INT_IMEM_SIZE => MEM_INT_IMEM_SIZE, -- size of processor-internal instruction memory in bytes
|
||||
|
|
|
@ -16,7 +16,7 @@ library neorv32;
|
|||
|
||||
entity neorv32_ProcessorTop_UP5KDemo is
|
||||
generic (
|
||||
-- General --
|
||||
-- Clocking --
|
||||
CLOCK_FREQUENCY : natural := 0; -- clock frequency of clk_i in Hz
|
||||
-- Internal Instruction memory --
|
||||
MEM_INT_IMEM_EN : boolean := true; -- implement processor-internal instruction memory
|
||||
|
@ -77,9 +77,10 @@ begin
|
|||
-- -------------------------------------------------------------------------------------------
|
||||
neorv32_inst: entity neorv32.neorv32_top
|
||||
generic map (
|
||||
-- General --
|
||||
-- Clocking --
|
||||
CLOCK_FREQUENCY => CLOCK_FREQUENCY, -- clock frequency of clk_i in Hz
|
||||
INT_BOOTLOADER_EN => true, -- boot configuration: true = boot explicit bootloader; false = boot from int/ext (I)MEM
|
||||
-- Boot Configuration --
|
||||
BOOT_MODE_SELECT => 0, -- boot via internal bootloader
|
||||
-- RISC-V CPU Extensions --
|
||||
RISCV_ISA_M => true, -- implement mul/div extension?
|
||||
RISCV_ISA_U => true, -- implement user mode extension?
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
# -- SPDX-License-Identifier: BSD-3-Clause --
|
||||
# -- ================================================================================ --
|
||||
|
||||
|
||||
# **************************************************************
|
||||
# Global configuration
|
||||
# **************************************************************
|
||||
|
@ -20,6 +21,7 @@ set ip_logo docs/figures/neorv32_logo_riscv_small.png
|
|||
set outputdir neorv32_vivado_ip_work
|
||||
set cur_dir [file normalize .]
|
||||
|
||||
|
||||
# **************************************************************
|
||||
# Create empty (!) output/working directory
|
||||
# **************************************************************
|
||||
|
@ -30,11 +32,13 @@ if {[llength $files] != 0} {
|
|||
file delete -force {*}[glob -directory $outputdir *];
|
||||
}
|
||||
|
||||
|
||||
# **************************************************************
|
||||
# Create Vivado project
|
||||
# **************************************************************
|
||||
create_project "neorv32-ip" $outputdir
|
||||
#set_property target_language VHDL [current_project]
|
||||
set_property INCREMENTAL false [get_filesets sim_1]
|
||||
|
||||
|
||||
# **************************************************************
|
||||
# Import HDL source files
|
||||
|
@ -55,6 +59,7 @@ set_property top $ip_top [current_fileset]
|
|||
|
||||
update_compile_order -fileset sources_1
|
||||
|
||||
|
||||
# **************************************************************
|
||||
# Package as IP block
|
||||
# **************************************************************
|
||||
|
@ -64,6 +69,10 @@ set_property vendor_display_name "Stephan Nolting" [ipx::current_core]
|
|||
set_property company_url https://github.com/stnolting/neorv32 [ipx::current_core]
|
||||
set_property description "The NEORV32 RISC-V Processor" [ipx::current_core]
|
||||
|
||||
|
||||
# **************************************************************
|
||||
# Setup configuration GUI
|
||||
# **************************************************************
|
||||
proc setup_ip_gui {} {
|
||||
proc set_param_properties {name {display_name ""} {tooltip ""} {enablement_expr ""} {value_expr ""}} {
|
||||
set param_spec [ipgui::get_guiparamspec -name $name -component [ipx::current_core]]
|
||||
|
@ -105,28 +114,33 @@ proc setup_ip_gui {} {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
# **************************************************************
|
||||
# Interfaces: Configuration Dependencies
|
||||
# **************************************************************
|
||||
set_property enablement_dependency {$AXI4_STREAM_EN} [ipx::get_bus_interfaces s0_axis -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$AXI4_STREAM_EN} [ipx::get_bus_interfaces s1_axis -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$XBUS_EN} [ipx::get_bus_interfaces m_axi -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$OCD_EN} [ipx::get_ports jtag_* -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$XIP_EN} [ipx::get_ports xip_* -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_GPIO_EN} [ipx::get_ports gpio_* -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_UART0_EN} [ipx::get_ports uart0_* -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_UART1_EN} [ipx::get_ports uart1_* -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_SPI_EN} [ipx::get_ports spi_* -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_SDI_EN} [ipx::get_ports sdi_* -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_TWI_EN} [ipx::get_ports twi_* -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_ONEWIRE_EN} [ipx::get_ports onewire_* -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_PWM_EN} [ipx::get_ports pwm_o -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_CFS_EN} [ipx::get_ports cfs_* -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_NEOLED_EN} [ipx::get_ports neoled_o -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$XIRQ_EN} [ipx::get_ports xirq_i -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_MTIME_EN} [ipx::get_ports mtime_time_o -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {!$IO_MTIME_EN} [ipx::get_ports mtime_irq_i -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_SLINK_EN} [ipx::get_bus_interfaces s0_axis -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_SLINK_EN} [ipx::get_bus_interfaces s1_axis -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$XBUS_EN} [ipx::get_bus_interfaces m_axi -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$OCD_EN} [ipx::get_ports jtag_* -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$XIP_EN} [ipx::get_ports xip_* -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_GPIO_EN} [ipx::get_ports gpio_* -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_UART0_EN} [ipx::get_ports uart0_* -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_UART1_EN} [ipx::get_ports uart1_* -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_SPI_EN} [ipx::get_ports spi_* -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_SDI_EN} [ipx::get_ports sdi_* -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_TWI_EN} [ipx::get_ports twi_* -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_ONEWIRE_EN} [ipx::get_ports onewire_* -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_PWM_EN} [ipx::get_ports pwm_o -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_CFS_EN} [ipx::get_ports cfs_* -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_NEOLED_EN} [ipx::get_ports neoled_o -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$XIRQ_EN} [ipx::get_ports xirq_i -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {$IO_MTIME_EN} [ipx::get_ports mtime_time_o -of_objects [ipx::current_core]]
|
||||
set_property enablement_dependency {!$IO_MTIME_EN} [ipx::get_ports mtime_irq_i -of_objects [ipx::current_core]]
|
||||
|
||||
|
||||
# **************************************************************
|
||||
# Configuration pages
|
||||
# **************************************************************
|
||||
# Remove default page
|
||||
set page [ipgui::get_pagespec -name "Page 0" -component [ipx::current_core]]
|
||||
if {$page ne ""} {
|
||||
|
@ -139,8 +153,23 @@ proc setup_ip_gui {} {
|
|||
set page [add_page {General}]
|
||||
|
||||
# { param_name {display_name} {tooltip} {enablement_expr} {value_expr} }
|
||||
|
||||
set group [add_group $page {Clocking}]
|
||||
add_params $page {
|
||||
{ CLOCK_FREQUENCY {Clock Frequency (Hz)} {Frequency of the clk signal in Hz} }
|
||||
{ CLOCK_FREQUENCY {Clock Frequency (Hz)} {Frequency of the clk input signal in Hz} }
|
||||
}
|
||||
|
||||
set group [add_group $page {Boot Configuration}]
|
||||
add_params $group {
|
||||
{ BOOT_MODE_SELECT {Boot mode select} {Processor boot configuration} }
|
||||
{ BOOT_ADDR_CUSTOM {Custom boot address} {Available if BOOT_MODE_SELECT = 1; has to be 4-byte aligned} {$BOOT_MODE_SELECT == 1}}
|
||||
}
|
||||
set_property widget {comboBox} [ipgui::get_guiparamspec -name "BOOT_MODE_SELECT" -component [ipx::current_core] ]
|
||||
set_property value_validation_type pairs [ipx::get_user_parameters BOOT_MODE_SELECT -of_objects [ipx::current_core]]
|
||||
set_property value_validation_pairs {{Internal bootloader} 0 {Custom address} 1 {Internal IMEM image} 2} [ipx::get_user_parameters BOOT_MODE_SELECT -of_objects [ipx::current_core]]
|
||||
|
||||
set group [add_group $page {Core Identification}]
|
||||
add_params $group {
|
||||
{ HART_ID {HART ID} {The hart thread ID of the CPU (passed to mhartid CSR)} }
|
||||
{ JEDEC_ID {JEDEC ID} {For JTAG tap identification and mvendorid CSR} }
|
||||
}
|
||||
|
@ -159,6 +188,7 @@ proc setup_ip_gui {} {
|
|||
|
||||
set sub_group [add_group $group {XBUS Cache}]
|
||||
add_params $sub_group {
|
||||
{ XBUS_REGSTAGE_EN {Add register stages} {Relaxes timing, but will increase latency} {$XBUS_EN} }
|
||||
{ XBUS_CACHE_EN {Enable XBUS Cache} {} {$XBUS_EN} {$XBUS_EN ? $XBUS_CACHE_EN : false}}
|
||||
{ XBUS_CACHE_NUM_BLOCKS {Number of Blocks} {} {$XBUS_CACHE_EN} }
|
||||
{ XBUS_CACHE_BLOCK_SIZE {Block Size} {In bytes (use a power of two)} {$XBUS_CACHE_EN} }
|
||||
|
@ -166,9 +196,9 @@ proc setup_ip_gui {} {
|
|||
|
||||
set group [add_group $page {Stream Link Interface (SLINK / AXI4-Stream Source & Sink)}]
|
||||
add_params $group {
|
||||
{ AXI4_STREAM_EN {Enable SLINK} {} }
|
||||
{ IO_SLINK_RX_FIFO {RX FIFO Depth} {Number of entries (use a power of two)} {$AXI4_STREAM_EN} }
|
||||
{ IO_SLINK_TX_FIFO {TX FIFO Depth} {Number of entries (use a power of two)} {$AXI4_STREAM_EN} }
|
||||
{ IO_SLINK_EN {Enable SLINK} {} }
|
||||
{ IO_SLINK_RX_FIFO {RX FIFO Depth} {Number of entries (use a power of two)} {$IO_SLINK_EN} }
|
||||
{ IO_SLINK_TX_FIFO {TX FIFO Depth} {Number of entries (use a power of two)} {$IO_SLINK_EN} }
|
||||
}
|
||||
|
||||
|
||||
|
@ -214,7 +244,7 @@ proc setup_ip_gui {} {
|
|||
}
|
||||
set_property value_validation_range_minimum 4 [ipx::get_user_parameters PMP_MIN_GRANULARITY -of_objects [ipx::current_core]]
|
||||
|
||||
set group [add_group $page {Architecture Tuning Options}]
|
||||
set group [add_group $page {Tuning Options}]
|
||||
add_params $group {
|
||||
{ FAST_MUL_EN {DSP-Based Multiplier} }
|
||||
{ FAST_SHIFT_EN {Barrel Shifter} }
|
||||
|
@ -261,11 +291,6 @@ proc setup_ip_gui {} {
|
|||
{ XIP_CACHE_BLOCK_SIZE {Cache Block Size} {In bytes (use a power of two)} {$XIP_CACHE_EN} }
|
||||
}
|
||||
|
||||
set group [add_group $page {Internal Bootloader}]
|
||||
add_params $group {
|
||||
{ INT_BOOTLOADER_EN {Enable Bootloader} {Start interactive bootloader console after reset} }
|
||||
}
|
||||
|
||||
|
||||
# **************************************************************
|
||||
# GUI Page: Peripherals
|
||||
|
@ -376,6 +401,7 @@ proc setup_ip_gui {} {
|
|||
|
||||
setup_ip_gui
|
||||
|
||||
|
||||
# **************************************************************
|
||||
# Configuration GUI: IP logo
|
||||
# **************************************************************
|
||||
|
@ -392,6 +418,7 @@ set_property type LOGO [ipx::get_files ../../$neorv32_home/$ip_logo -of_objects
|
|||
ipx::add_file_group -type product_guide {} [ipx::current_core]
|
||||
ipx::add_file {https://stnolting.github.io/neorv32/} [ipx::get_file_groups xilinx_productguide -of_objects [ipx::current_core]]
|
||||
|
||||
|
||||
# **************************************************************
|
||||
# Finalize and add to IP repository
|
||||
# **************************************************************
|
||||
|
|
|
@ -25,13 +25,14 @@ entity neorv32_vivado_ip is
|
|||
-- ------------------------------------------------------------
|
||||
-- Configuration Generics
|
||||
-- ------------------------------------------------------------
|
||||
-- AXI-Stream Interfaces --
|
||||
AXI4_STREAM_EN : boolean := false;
|
||||
-- General --
|
||||
-- Clocking --
|
||||
CLOCK_FREQUENCY : natural := 100_000_000;
|
||||
-- Identification --
|
||||
HART_ID : std_logic_vector(31 downto 0) := x"00000000";
|
||||
JEDEC_ID : std_logic_vector(10 downto 0) := "00000000000";
|
||||
INT_BOOTLOADER_EN : boolean := false;
|
||||
-- Boot Configuration --
|
||||
BOOT_MODE_SELECT : natural range 0 to 2 := 0;
|
||||
BOOT_ADDR_CUSTOM : std_ulogic_vector(31 downto 0) := x"00000000";
|
||||
-- On-Chip Debugger (OCD) --
|
||||
OCD_EN : boolean := false;
|
||||
OCD_AUTHENTICATION : boolean := false;
|
||||
|
@ -87,6 +88,7 @@ entity neorv32_vivado_ip is
|
|||
-- External Bus Interface --
|
||||
XBUS_EN : boolean := true;
|
||||
XBUS_TIMEOUT : natural range 8 to 65536 := 64;
|
||||
XBUS_REGSTAGE_EN : boolean := false;
|
||||
XBUS_CACHE_EN : boolean := false;
|
||||
XBUS_CACHE_NUM_BLOCKS : natural range 1 to 256 := 8;
|
||||
XBUS_CACHE_BLOCK_SIZE : natural range 1 to 2**16 := 256;
|
||||
|
@ -129,6 +131,7 @@ entity neorv32_vivado_ip is
|
|||
IO_GPTMR_EN : boolean := false;
|
||||
IO_ONEWIRE_EN : boolean := false;
|
||||
IO_DMA_EN : boolean := false;
|
||||
IO_SLINK_EN : boolean := false;
|
||||
IO_SLINK_RX_FIFO : natural range 1 to 2**15 := 1;
|
||||
IO_SLINK_TX_FIFO : natural range 1 to 2**15 := 1;
|
||||
IO_CRC_EN : boolean := false
|
||||
|
@ -170,7 +173,7 @@ entity neorv32_vivado_ip is
|
|||
m_axi_bvalid : in std_logic := '0';
|
||||
m_axi_bready : out std_logic;
|
||||
-- ------------------------------------------------------------
|
||||
-- AXI4-Stream Interfaces (available if AXI4_STREAM_EN = true)
|
||||
-- AXI4-Stream Interfaces (available if IO_SLINK_EN = true)
|
||||
-- ------------------------------------------------------------
|
||||
-- Source --
|
||||
-- s0_axis_aclk : in std_logic := '0'; -- just to satisfy Vivado, but not actually used
|
||||
|
@ -334,16 +337,16 @@ architecture neorv32_vivado_ip_rtl of neorv32_vivado_ip is
|
|||
signal xirq_i_aux : std_ulogic_vector(31 downto 0);
|
||||
|
||||
-- internal wishbone bus --
|
||||
signal xbus_adr : std_ulogic_vector(31 downto 0); -- address
|
||||
signal xbus_do : std_ulogic_vector(31 downto 0); -- write data
|
||||
signal xbus_tag : std_ulogic_vector(2 downto 0); -- access tag
|
||||
signal xbus_we : std_ulogic; -- read/write
|
||||
signal xbus_sel : std_ulogic_vector(3 downto 0); -- byte enable
|
||||
signal xbus_stb : std_ulogic; -- strobe
|
||||
signal xbus_cyc : std_ulogic; -- valid cycle
|
||||
signal xbus_di : std_ulogic_vector(31 downto 0); -- read data
|
||||
signal xbus_ack : std_ulogic; -- transfer acknowledge
|
||||
signal xbus_err : std_ulogic; -- transfer error
|
||||
signal xbus_adr : std_ulogic_vector(31 downto 0); -- address
|
||||
signal xbus_do : std_ulogic_vector(31 downto 0); -- write data
|
||||
signal xbus_tag : std_ulogic_vector(2 downto 0); -- access tag
|
||||
signal xbus_we : std_ulogic; -- read/write
|
||||
signal xbus_sel : std_ulogic_vector(3 downto 0); -- byte enable
|
||||
signal xbus_stb : std_ulogic; -- strobe
|
||||
signal xbus_cyc : std_ulogic; -- valid cycle
|
||||
signal xbus_di : std_ulogic_vector(31 downto 0); -- read data
|
||||
signal xbus_ack : std_ulogic; -- transfer acknowledge
|
||||
signal xbus_err : std_ulogic; -- transfer error
|
||||
|
||||
begin
|
||||
|
||||
|
@ -351,12 +354,15 @@ begin
|
|||
-- -------------------------------------------------------------------------------------------
|
||||
neorv32_top_inst: neorv32_top
|
||||
generic map (
|
||||
-- General --
|
||||
-- Clocking --
|
||||
CLOCK_FREQUENCY => CLOCK_FREQUENCY,
|
||||
CLOCK_GATING_EN => false, -- clock gating is not supported here
|
||||
-- Identification --
|
||||
HART_ID => std_ulogic_vector(HART_ID),
|
||||
JEDEC_ID => std_ulogic_vector(JEDEC_ID),
|
||||
INT_BOOTLOADER_EN => INT_BOOTLOADER_EN,
|
||||
-- Boot Configuration --
|
||||
BOOT_MODE_SELECT => BOOT_MODE_SELECT,
|
||||
BOOT_ADDR_CUSTOM => BOOT_ADDR_CUSTOM,
|
||||
-- On-Chip Debugger --
|
||||
OCD_EN => OCD_EN,
|
||||
OCD_AUTHENTICATION => OCD_AUTHENTICATION,
|
||||
|
@ -412,7 +418,7 @@ begin
|
|||
-- External bus interface --
|
||||
XBUS_EN => XBUS_EN,
|
||||
XBUS_TIMEOUT => XBUS_TIMEOUT,
|
||||
XBUS_REGSTAGE_EN => false,
|
||||
XBUS_REGSTAGE_EN => XBUS_REGSTAGE_EN,
|
||||
XBUS_CACHE_EN => XBUS_CACHE_EN,
|
||||
XBUS_CACHE_NUM_BLOCKS => XBUS_CACHE_NUM_BLOCKS,
|
||||
XBUS_CACHE_BLOCK_SIZE => XBUS_CACHE_BLOCK_SIZE,
|
||||
|
@ -424,6 +430,7 @@ begin
|
|||
-- External Interrupts Controller --
|
||||
XIRQ_NUM_CH => num_xirq_c,
|
||||
-- Processor peripherals --
|
||||
IO_DISABLE_SYSINFO => false,
|
||||
IO_GPIO_NUM => num_gpio_c,
|
||||
IO_MTIME_EN => IO_MTIME_EN,
|
||||
IO_UART0_EN => IO_UART0_EN,
|
||||
|
@ -451,7 +458,7 @@ begin
|
|||
IO_GPTMR_EN => IO_GPTMR_EN,
|
||||
IO_ONEWIRE_EN => IO_ONEWIRE_EN,
|
||||
IO_DMA_EN => IO_DMA_EN,
|
||||
IO_SLINK_EN => AXI4_STREAM_EN,
|
||||
IO_SLINK_EN => IO_SLINK_EN,
|
||||
IO_SLINK_RX_FIFO => IO_SLINK_RX_FIFO,
|
||||
IO_SLINK_TX_FIFO => IO_SLINK_TX_FIFO,
|
||||
IO_CRC_EN => IO_CRC_EN
|
||||
|
|
|
@ -41,9 +41,10 @@ begin
|
|||
-- -------------------------------------------------------------------------------------------
|
||||
neorv32_top_inst: neorv32_top
|
||||
generic map (
|
||||
-- General --
|
||||
-- Clocking --
|
||||
CLOCK_FREQUENCY => CLOCK_FREQUENCY, -- clock frequency of clk_i in Hz
|
||||
INT_BOOTLOADER_EN => false, -- boot configuration: true = boot explicit bootloader; false = boot from int/ext (I)MEM
|
||||
-- Boot Configuration --
|
||||
BOOT_MODE_SELECT => 2, -- boot from pre-initialized IMEM
|
||||
-- RISC-V CPU Extensions --
|
||||
RISCV_ISA_C => true, -- implement compressed extension?
|
||||
RISCV_ISA_M => true, -- implement mul/div extension?
|
||||
|
|
|
@ -44,9 +44,10 @@ begin
|
|||
-- -------------------------------------------------------------------------------------------
|
||||
neorv32_top_inst: neorv32_top
|
||||
generic map (
|
||||
-- General --
|
||||
-- Clocking --
|
||||
CLOCK_FREQUENCY => CLOCK_FREQUENCY, -- clock frequency of clk_i in Hz
|
||||
INT_BOOTLOADER_EN => true, -- boot configuration: true = boot explicit bootloader; false = boot from int/ext (I)MEM
|
||||
-- Boot Configuration --
|
||||
BOOT_MODE_SELECT => 0, -- boot via internal bootloader
|
||||
-- RISC-V CPU Extensions --
|
||||
RISCV_ISA_C => true, -- implement compressed extension?
|
||||
RISCV_ISA_M => true, -- implement mul/div extension?
|
||||
|
|
|
@ -49,9 +49,10 @@ begin
|
|||
-- -------------------------------------------------------------------------------------------
|
||||
neorv32_top_inst: neorv32_top
|
||||
generic map (
|
||||
-- General --
|
||||
-- Clocking --
|
||||
CLOCK_FREQUENCY => CLOCK_FREQUENCY, -- clock frequency of clk_i in Hz
|
||||
INT_BOOTLOADER_EN => true, -- boot configuration: true = boot explicit bootloader; false = boot from int/ext (I)MEM
|
||||
-- Boot Configuration --
|
||||
BOOT_MODE_SELECT => 0, -- boot via internal bootloader
|
||||
-- On-Chip Debugger (OCD) --
|
||||
OCD_EN => true, -- implement on-chip debugger
|
||||
-- RISC-V CPU Extensions --
|
||||
|
|
|
@ -163,193 +163,196 @@ begin
|
|||
-- -------------------------------------------------------------------------------------------
|
||||
neorv32_top_inst: neorv32_top
|
||||
generic map (
|
||||
-- General --
|
||||
CLOCK_FREQUENCY => f_clock_c, -- clock frequency of clk_i in Hz
|
||||
CLOCK_GATING_EN => true, -- enable clock gating when in sleep mode
|
||||
HART_ID => x"00000000", -- hardware thread ID
|
||||
JEDEC_ID => "00000000000", -- vendor's JEDEC ID
|
||||
INT_BOOTLOADER_EN => false, -- boot configuration: true = boot explicit bootloader; false = boot from int/ext (I)MEM
|
||||
-- Clocking --
|
||||
CLOCK_FREQUENCY => f_clock_c,
|
||||
CLOCK_GATING_EN => true,
|
||||
-- Identification --
|
||||
HART_ID => x"00000000",
|
||||
JEDEC_ID => "00000000000",
|
||||
-- Boot Configuration --
|
||||
BOOT_MODE_SELECT => 2, -- boot from pre-initialized internal IMEM
|
||||
BOOT_ADDR_CUSTOM => x"00000000",
|
||||
-- On-Chip Debugger (OCD) --
|
||||
OCD_EN => true, -- implement on-chip debugger
|
||||
OCD_AUTHENTICATION => true, -- implement on-chip debugger authentication
|
||||
OCD_EN => true,
|
||||
OCD_AUTHENTICATION => true,
|
||||
-- RISC-V CPU Extensions --
|
||||
RISCV_ISA_C => false, -- implement compressed extension?
|
||||
RISCV_ISA_E => false, -- implement embedded RF extension?
|
||||
RISCV_ISA_M => true, -- implement mul/div extension?
|
||||
RISCV_ISA_U => true, -- implement user mode extension?
|
||||
RISCV_ISA_Zalrsc => true, -- implement atomic reservation-set extension
|
||||
RISCV_ISA_Zba => true, -- implement shifted-add bit-manipulation extension
|
||||
RISCV_ISA_Zbb => true, -- implement basic bit-manipulation extension
|
||||
RISCV_ISA_Zbkb => true, -- implement bit-manipulation instructions for cryptography
|
||||
RISCV_ISA_Zbkc => true, -- implement carry-less multiplication instructions?
|
||||
RISCV_ISA_Zbkx => true, -- implement cryptography crossbar permutation extension?
|
||||
RISCV_ISA_Zbs => true, -- implement single-bit bit-manipulation extension
|
||||
RISCV_ISA_Zfinx => true, -- implement 32-bit floating-point extension (using INT reg!)
|
||||
RISCV_ISA_Zicntr => true, -- implement base counters?
|
||||
RISCV_ISA_Zicond => true, -- implement integer conditional operations?
|
||||
RISCV_ISA_Zihpm => true, -- implement hardware performance monitors?
|
||||
RISCV_ISA_Zknd => true, -- implement cryptography NIST AES decryption extension?
|
||||
RISCV_ISA_Zkne => true, -- implement cryptography NIST AES encryption extension?
|
||||
RISCV_ISA_Zknh => true, -- implement cryptography NIST hash extension?
|
||||
RISCV_ISA_Zksed => true, -- implement ShangMi block cypher extension?
|
||||
RISCV_ISA_Zksh => true, -- implement ShangMi hash extension?
|
||||
RISCV_ISA_Zmmul => false, -- implement multiply-only M sub-extension?
|
||||
RISCV_ISA_Zxcfu => true, -- implement custom (instr.) functions unit?
|
||||
RISCV_ISA_C => false,
|
||||
RISCV_ISA_E => false,
|
||||
RISCV_ISA_M => true,
|
||||
RISCV_ISA_U => true,
|
||||
RISCV_ISA_Zalrsc => true,
|
||||
RISCV_ISA_Zba => true,
|
||||
RISCV_ISA_Zbb => true,
|
||||
RISCV_ISA_Zbkb => true,
|
||||
RISCV_ISA_Zbkc => true,
|
||||
RISCV_ISA_Zbkx => true,
|
||||
RISCV_ISA_Zbs => true,
|
||||
RISCV_ISA_Zfinx => true,
|
||||
RISCV_ISA_Zicntr => true,
|
||||
RISCV_ISA_Zicond => true,
|
||||
RISCV_ISA_Zihpm => true,
|
||||
RISCV_ISA_Zknd => true,
|
||||
RISCV_ISA_Zkne => true,
|
||||
RISCV_ISA_Zknh => true,
|
||||
RISCV_ISA_Zksed => true,
|
||||
RISCV_ISA_Zksh => true,
|
||||
RISCV_ISA_Zmmul => false,
|
||||
RISCV_ISA_Zxcfu => true,
|
||||
-- Extension Options --
|
||||
FAST_MUL_EN => performance_options_c.fast_mul_en_c(PERFORMANCE_OPTION), -- use DSPs for M extension's multiplier
|
||||
FAST_SHIFT_EN => performance_options_c.fast_shift_en_c(PERFORMANCE_OPTION), -- use barrel shifter for shift operations
|
||||
REGFILE_HW_RST => false, -- no hardware reset
|
||||
FAST_MUL_EN => performance_options_c.fast_mul_en_c(PERFORMANCE_OPTION),
|
||||
FAST_SHIFT_EN => performance_options_c.fast_shift_en_c(PERFORMANCE_OPTION),
|
||||
REGFILE_HW_RST => false,
|
||||
-- Physical Memory Protection (PMP) --
|
||||
PMP_NUM_REGIONS => 5, -- number of regions (0..16)
|
||||
PMP_MIN_GRANULARITY => 4, -- minimal region granularity in bytes, has to be a power of 2, min 4 bytes
|
||||
PMP_TOR_MODE_EN => true, -- implement TOR mode
|
||||
PMP_NAP_MODE_EN => true, -- implement NAPOT/NA4 mode
|
||||
PMP_NUM_REGIONS => 5,
|
||||
PMP_MIN_GRANULARITY => 4,
|
||||
PMP_TOR_MODE_EN => true,
|
||||
PMP_NAP_MODE_EN => true,
|
||||
-- Hardware Performance Monitors (HPM) --
|
||||
HPM_NUM_CNTS => 12, -- number of implemented HPM counters (0..29)
|
||||
HPM_CNT_WIDTH => 40, -- total size of HPM counters (0..64)
|
||||
HPM_NUM_CNTS => 12,
|
||||
HPM_CNT_WIDTH => 40,
|
||||
-- Internal Instruction memory --
|
||||
MEM_INT_IMEM_EN => int_imem_c , -- implement processor-internal instruction memory
|
||||
MEM_INT_IMEM_SIZE => performance_options_c.imem_size_c(PERFORMANCE_OPTION), -- size of processor-internal instruction memory in bytes
|
||||
MEM_INT_IMEM_EN => int_imem_c ,
|
||||
MEM_INT_IMEM_SIZE => performance_options_c.imem_size_c(PERFORMANCE_OPTION),
|
||||
-- Internal Data memory --
|
||||
MEM_INT_DMEM_EN => int_dmem_c, -- implement processor-internal data memory
|
||||
MEM_INT_DMEM_SIZE => dmem_size_c, -- size of processor-internal data memory in bytes
|
||||
MEM_INT_DMEM_EN => int_dmem_c,
|
||||
MEM_INT_DMEM_SIZE => dmem_size_c,
|
||||
-- Internal Cache memory --
|
||||
ICACHE_EN => performance_options_c.icache_en_c(PERFORMANCE_OPTION), -- implement instruction cache
|
||||
ICACHE_NUM_BLOCKS => 64, -- i-cache: number of blocks (min 2), has to be a power of 2
|
||||
ICACHE_BLOCK_SIZE => performance_options_c.icache_block_size_c(PERFORMANCE_OPTION), -- i-cache: block size in bytes (min 4), has to be a power of 2
|
||||
ICACHE_EN => performance_options_c.icache_en_c(PERFORMANCE_OPTION),
|
||||
ICACHE_NUM_BLOCKS => 64,
|
||||
ICACHE_BLOCK_SIZE => performance_options_c.icache_block_size_c(PERFORMANCE_OPTION),
|
||||
-- Internal Data Cache (dCACHE) --
|
||||
DCACHE_EN => performance_options_c.dcache_en_c(PERFORMANCE_OPTION), -- implement data cache
|
||||
DCACHE_NUM_BLOCKS => 32, -- d-cache: number of blocks (min 1), has to be a power of 2
|
||||
DCACHE_BLOCK_SIZE => performance_options_c.dcache_block_size_c(PERFORMANCE_OPTION), -- d-cache: block size in bytes (min 4), has to be a power of 2
|
||||
DCACHE_EN => performance_options_c.dcache_en_c(PERFORMANCE_OPTION),
|
||||
DCACHE_NUM_BLOCKS => 32,
|
||||
DCACHE_BLOCK_SIZE => performance_options_c.dcache_block_size_c(PERFORMANCE_OPTION),
|
||||
-- External bus interface --
|
||||
XBUS_EN => true, -- implement external memory bus interface?
|
||||
XBUS_TIMEOUT => 256, -- cycles after a pending bus access auto-terminates (0 = disabled)
|
||||
XBUS_REGSTAGE_EN => true, -- add register stage
|
||||
XBUS_CACHE_EN => true, -- enable external bus cache (x-cache)
|
||||
XBUS_CACHE_NUM_BLOCKS => 4, -- x-cache: number of blocks (min 1), has to be a power of 2
|
||||
XBUS_CACHE_BLOCK_SIZE => 32, -- x-cache: block size in bytes (min 4), has to be a power of 2
|
||||
XBUS_EN => true,
|
||||
XBUS_TIMEOUT => 256,
|
||||
XBUS_REGSTAGE_EN => true,
|
||||
XBUS_CACHE_EN => true,
|
||||
XBUS_CACHE_NUM_BLOCKS => 4,
|
||||
XBUS_CACHE_BLOCK_SIZE => 32,
|
||||
-- Execute in-place module (XIP) --
|
||||
XIP_EN => true, -- implement execute in place module (XIP)?
|
||||
XIP_CACHE_EN => true, -- implement XIP cache?
|
||||
XIP_CACHE_NUM_BLOCKS => 4, -- number of blocks (min 1), has to be a power of 2
|
||||
XIP_CACHE_BLOCK_SIZE => 256, -- block size in bytes (min 4), has to be a power of 2
|
||||
XIP_EN => true,
|
||||
XIP_CACHE_EN => true,
|
||||
XIP_CACHE_NUM_BLOCKS => 4,
|
||||
XIP_CACHE_BLOCK_SIZE => 256,
|
||||
-- External Interrupts Controller (XIRQ) --
|
||||
XIRQ_NUM_CH => 32, -- number of external IRQ channels (0..32)
|
||||
XIRQ_NUM_CH => 32,
|
||||
-- Processor peripherals --
|
||||
IO_GPIO_NUM => 64, -- number of GPIO input/output pairs (0..64)
|
||||
IO_MTIME_EN => true, -- implement machine system timer (MTIME)?
|
||||
IO_UART0_EN => true, -- implement primary universal asynchronous receiver/transmitter (UART0)?
|
||||
IO_UART0_RX_FIFO => 32, -- RX fifo depth, has to be a power of two, min 1
|
||||
IO_UART0_TX_FIFO => 32, -- TX fifo depth, has to be a power of two, min 1
|
||||
IO_UART1_EN => true, -- implement secondary universal asynchronous receiver/transmitter (UART1)?
|
||||
IO_UART1_RX_FIFO => 1, -- RX fifo depth, has to be a power of two, min 1
|
||||
IO_UART1_TX_FIFO => 1, -- TX fifo depth, has to be a power of two, min 1
|
||||
IO_SPI_EN => true, -- implement serial peripheral interface (SPI)?
|
||||
IO_SPI_FIFO => 4, -- SPI RTX fifo depth, has to be zero or a power of two
|
||||
IO_SDI_EN => true, -- implement serial data interface (SDI)?
|
||||
IO_SDI_FIFO => 4, -- SDI RTX fifo depth, has to be zero or a power of two
|
||||
IO_TWI_EN => true, -- implement two-wire interface (TWI)?
|
||||
IO_TWI_FIFO => 4, -- RTX fifo depth, has to be zero or a power of two, min 1
|
||||
IO_PWM_NUM_CH => 8, -- number of PWM channels to implement (0..16)
|
||||
IO_WDT_EN => true, -- implement watch dog timer (WDT)?
|
||||
IO_TRNG_EN => true, -- implement true random number generator (TRNG)?
|
||||
IO_TRNG_FIFO => 4, -- TRNG fifo depth, has to be a power of two, min 1
|
||||
IO_CFS_EN => true, -- implement custom functions subsystem (CFS)?
|
||||
IO_CFS_CONFIG => (others => '0'), -- custom CFS configuration generic
|
||||
IO_CFS_IN_SIZE => 32, -- size of CFS input conduit in bits
|
||||
IO_CFS_OUT_SIZE => 32, -- size of CFS output conduit in bits
|
||||
IO_NEOLED_EN => true, -- implement NeoPixel-compatible smart LED interface (NEOLED)?
|
||||
IO_NEOLED_TX_FIFO => 8, -- NEOLED TX FIFO depth, 1..32k, has to be a power of two
|
||||
IO_GPTMR_EN => true, -- implement general purpose timer (GPTMR)?
|
||||
IO_ONEWIRE_EN => true, -- implement 1-wire interface (ONEWIRE)?
|
||||
IO_DMA_EN => true, -- implement direct memory access controller (DMA)?
|
||||
IO_SLINK_EN => true, -- implement stream link interface (SLINK)?
|
||||
IO_SLINK_RX_FIFO => 4, -- RX fifo depth, has to be a power of two, min 1
|
||||
IO_SLINK_TX_FIFO => 4, -- TX fifo depth, has to be a power of two, min 1
|
||||
IO_CRC_EN => true -- implement cyclic redundancy check unit (CRC)?
|
||||
IO_GPIO_NUM => 64,
|
||||
IO_MTIME_EN => true,
|
||||
IO_UART0_EN => true,
|
||||
IO_UART0_RX_FIFO => 32,
|
||||
IO_UART0_TX_FIFO => 32,
|
||||
IO_UART1_EN => true,
|
||||
IO_UART1_RX_FIFO => 1,
|
||||
IO_UART1_TX_FIFO => 1,
|
||||
IO_SPI_EN => true,
|
||||
IO_SPI_FIFO => 4,
|
||||
IO_SDI_EN => true,
|
||||
IO_SDI_FIFO => 4,
|
||||
IO_TWI_EN => true,
|
||||
IO_TWI_FIFO => 4,
|
||||
IO_PWM_NUM_CH => 8,
|
||||
IO_WDT_EN => true,
|
||||
IO_TRNG_EN => true,
|
||||
IO_TRNG_FIFO => 4,
|
||||
IO_CFS_EN => true,
|
||||
IO_CFS_CONFIG => (others => '0'),
|
||||
IO_CFS_IN_SIZE => 32,
|
||||
IO_CFS_OUT_SIZE => 32,
|
||||
IO_NEOLED_EN => true,
|
||||
IO_NEOLED_TX_FIFO => 8,
|
||||
IO_GPTMR_EN => true,
|
||||
IO_ONEWIRE_EN => true,
|
||||
IO_DMA_EN => true,
|
||||
IO_SLINK_EN => true,
|
||||
IO_SLINK_RX_FIFO => 4,
|
||||
IO_SLINK_TX_FIFO => 4,
|
||||
IO_CRC_EN => true
|
||||
)
|
||||
port map (
|
||||
-- Global control --
|
||||
clk_i => clk_gen, -- global clock, rising edge
|
||||
rstn_i => rst_gen, -- global reset, low-active, async
|
||||
clk_i => clk_gen,
|
||||
rstn_i => rst_gen,
|
||||
-- JTAG on-chip debugger interface (available if OCD_EN = true) --
|
||||
jtag_tck_i => '0', -- serial clock
|
||||
jtag_tdi_i => '0', -- serial data input
|
||||
jtag_tdo_o => open, -- serial data output
|
||||
jtag_tms_i => '0', -- mode select
|
||||
jtag_tck_i => '0',
|
||||
jtag_tdi_i => '0',
|
||||
jtag_tdo_o => open,
|
||||
jtag_tms_i => '0',
|
||||
-- External bus interface (available if XBUS_EN = true) --
|
||||
xbus_adr_o => wb_cpu.addr, -- address
|
||||
xbus_dat_o => wb_cpu.wdata, -- write data
|
||||
xbus_tag_o => wb_cpu.tag, -- access tag
|
||||
xbus_we_o => wb_cpu.we, -- read/write
|
||||
xbus_sel_o => wb_cpu.sel, -- byte enable
|
||||
xbus_stb_o => wb_cpu.stb, -- strobe
|
||||
xbus_cyc_o => wb_cpu.cyc, -- valid cycle
|
||||
xbus_dat_i => wb_cpu.rdata, -- read data
|
||||
xbus_ack_i => wb_cpu.ack, -- transfer acknowledge
|
||||
xbus_err_i => wb_cpu.err, -- transfer error
|
||||
xbus_adr_o => wb_cpu.addr,
|
||||
xbus_dat_o => wb_cpu.wdata,
|
||||
xbus_tag_o => wb_cpu.tag,
|
||||
xbus_we_o => wb_cpu.we,
|
||||
xbus_sel_o => wb_cpu.sel,
|
||||
xbus_stb_o => wb_cpu.stb,
|
||||
xbus_cyc_o => wb_cpu.cyc,
|
||||
xbus_dat_i => wb_cpu.rdata,
|
||||
xbus_ack_i => wb_cpu.ack,
|
||||
xbus_err_i => wb_cpu.err,
|
||||
-- Stream Link Interface (available if IO_SLINK_EN = true) --
|
||||
slink_rx_dat_i => slink_dat, -- RX input data
|
||||
slink_rx_src_i => slink_id, -- RX source routing information
|
||||
slink_rx_val_i => slink_val, -- RX valid input
|
||||
slink_rx_lst_i => slink_lst, -- RX last element of stream
|
||||
slink_rx_rdy_o => slink_rdy, -- RX ready to receive
|
||||
slink_tx_dat_o => slink_dat, -- TX output data
|
||||
slink_tx_dst_o => slink_id, -- TX destination routing information
|
||||
slink_tx_val_o => slink_val, -- TX valid output
|
||||
slink_tx_lst_o => slink_lst, -- TX last element of stream
|
||||
slink_tx_rdy_i => slink_rdy, -- TX ready to send
|
||||
slink_rx_dat_i => slink_dat,
|
||||
slink_rx_src_i => slink_id,
|
||||
slink_rx_val_i => slink_val,
|
||||
slink_rx_lst_i => slink_lst,
|
||||
slink_rx_rdy_o => slink_rdy,
|
||||
slink_tx_dat_o => slink_dat,
|
||||
slink_tx_dst_o => slink_id,
|
||||
slink_tx_val_o => slink_val,
|
||||
slink_tx_lst_o => slink_lst,
|
||||
slink_tx_rdy_i => slink_rdy,
|
||||
-- XIP (execute in place via SPI) signals (available if XIP_EN = true) --
|
||||
xip_csn_o => open, -- chip-select, low-active
|
||||
xip_clk_o => open, -- serial clock
|
||||
xip_dat_i => '0', -- device data input
|
||||
xip_dat_o => open, -- controller data output
|
||||
xip_csn_o => open,
|
||||
xip_clk_o => open,
|
||||
xip_dat_i => '0',
|
||||
xip_dat_o => open,
|
||||
-- GPIO (available if IO_GPIO_NUM > true) --
|
||||
gpio_o => gpio, -- parallel output
|
||||
gpio_i => gpio, -- parallel input
|
||||
gpio_o => gpio,
|
||||
gpio_i => gpio,
|
||||
-- primary UART0 (available if IO_UART0_EN = true) --
|
||||
uart0_txd_o => uart0_txd, -- UART0 send data
|
||||
uart0_rxd_i => uart0_txd, -- UART0 receive data
|
||||
uart0_rts_o => uart1_cts, -- HW flow control: UART0.RX ready to receive ("RTR"), low-active, optional
|
||||
uart0_cts_i => uart0_cts, -- HW flow control: UART0.TX allowed to transmit, low-active, optional
|
||||
uart0_txd_o => uart0_txd,
|
||||
uart0_rxd_i => uart0_txd,
|
||||
uart0_rts_o => uart1_cts,
|
||||
uart0_cts_i => uart0_cts,
|
||||
-- secondary UART1 (available if IO_UART1_EN = true) --
|
||||
uart1_txd_o => uart1_txd, -- UART1 send data
|
||||
uart1_rxd_i => uart1_txd, -- UART1 receive data
|
||||
uart1_rts_o => uart0_cts, -- HW flow control: UART0.RX ready to receive ("RTR"), low-active, optional
|
||||
uart1_cts_i => uart1_cts, -- HW flow control: UART0.TX allowed to transmit, low-active, optional
|
||||
uart1_txd_o => uart1_txd,
|
||||
uart1_rxd_i => uart1_txd,
|
||||
uart1_rts_o => uart0_cts,
|
||||
uart1_cts_i => uart1_cts,
|
||||
-- SPI (available if IO_SPI_EN = true) --
|
||||
spi_clk_o => spi_clk, -- SPI serial clock
|
||||
spi_dat_o => spi_do, -- controller data out, peripheral data in
|
||||
spi_dat_i => spi_di, -- controller data in, peripheral data out
|
||||
spi_csn_o => spi_csn, -- SPI CS
|
||||
spi_clk_o => spi_clk,
|
||||
spi_dat_o => spi_do,
|
||||
spi_dat_i => spi_di,
|
||||
spi_csn_o => spi_csn,
|
||||
-- SDI (available if IO_SDI_EN = true) --
|
||||
sdi_clk_i => sdi_clk, -- SDI serial clock
|
||||
sdi_dat_o => sdi_do, -- controller data out, peripheral data in
|
||||
sdi_dat_i => sdi_di, -- controller data in, peripheral data out
|
||||
sdi_csn_i => sdi_csn, -- chip-select
|
||||
sdi_clk_i => sdi_clk,
|
||||
sdi_dat_o => sdi_do,
|
||||
sdi_dat_i => sdi_di,
|
||||
sdi_csn_i => sdi_csn,
|
||||
-- TWI (available if IO_TWI_EN = true) --
|
||||
twi_sda_i => twi_sda_i, -- serial data line sense input
|
||||
twi_sda_o => twi_sda_o, -- serial data line output (pull low only)
|
||||
twi_scl_i => twi_scl_i, -- serial clock line sense input
|
||||
twi_scl_o => twi_scl_o, -- serial clock line output (pull low only)
|
||||
twi_sda_i => twi_sda_i,
|
||||
twi_sda_o => twi_sda_o,
|
||||
twi_scl_i => twi_scl_i,
|
||||
twi_scl_o => twi_scl_o,
|
||||
-- 1-Wire Interface (available if IO_ONEWIRE_EN = true) --
|
||||
onewire_i => onewire_i, -- 1-wire bus sense input
|
||||
onewire_o => onewire_o, -- 1-wire bus output (pull low only)
|
||||
onewire_i => onewire_i,
|
||||
onewire_o => onewire_o,
|
||||
-- PWM (available if IO_PWM_NUM_CH > 0) --
|
||||
pwm_o => open, -- pwm channels
|
||||
pwm_o => open,
|
||||
-- Custom Functions Subsystem IO --
|
||||
cfs_in_i => (others => '0'), -- custom CFS inputs
|
||||
cfs_out_o => open, -- custom CFS outputs
|
||||
cfs_in_i => (others => '0'),
|
||||
cfs_out_o => open,
|
||||
-- NeoPixel-compatible smart LED interface (available if IO_NEOLED_EN = true) --
|
||||
neoled_o => open, -- async serial data line
|
||||
neoled_o => open,
|
||||
-- Machine timer system time (available if IO_MTIME_EN = true) --
|
||||
mtime_time_o => open,
|
||||
-- External platform interrupts (available if XIRQ_NUM_CH > 0) --
|
||||
xirq_i => gpio(31 downto 0), -- IRQ channels
|
||||
xirq_i => gpio(31 downto 0),
|
||||
-- CPU Interrupts --
|
||||
mtime_irq_i => '0', -- machine software interrupt, available if IO_MTIME_EN = false
|
||||
msw_irq_i => msi_ring, -- machine software interrupt
|
||||
mext_irq_i => mei_ring -- machine external interrupt
|
||||
mtime_irq_i => '0',
|
||||
msw_irq_i => msi_ring,
|
||||
mext_irq_i => mei_ring
|
||||
);
|
||||
|
||||
-- TWI tri-state driver --
|
||||
|
|
|
@ -37,12 +37,14 @@ typedef volatile struct __attribute__((packed,aligned(4))) {
|
|||
/** NEORV32_SYSINFO.MEM (r/-): Memory configuration (sizes) */
|
||||
enum NEORV32_SYSINFO_MEM_enum {
|
||||
SYSINFO_MEM_IMEM = 0, /**< SYSINFO_MEM byte 0 (r/-): log2(internal IMEM size in bytes) (via MEM_INT_IMEM_SIZE generic) */
|
||||
SYSINFO_MEM_DMEM = 1 /**< SYSINFO_MEM byte 1 (r/-): log2(internal DMEM size in bytes) (via MEM_INT_DMEM_SIZE generic) */
|
||||
SYSINFO_MEM_DMEM = 1, /**< SYSINFO_MEM byte 1 (r/-): log2(internal DMEM size in bytes) (via MEM_INT_DMEM_SIZE generic) */
|
||||
SYSINFO_MEM_res = 2, /**< SYSINFO_MEM byte 2 (r/-): reserved, read as zero */
|
||||
SYSINFO_MEM_BOOT = 3 /**< SYSINFO_MEM byte 3 (r/-): boot mode configuration (via BOOT_MODE_SELECT generic) */
|
||||
};
|
||||
|
||||
/** NEORV32_SYSINFO.SOC (r/-): Implemented processor devices/features */
|
||||
enum NEORV32_SYSINFO_SOC_enum {
|
||||
SYSINFO_SOC_BOOTLOADER = 0, /**< SYSINFO_SOC (0) (r/-): Bootloader implemented when 1 (via INT_BOOTLOADER_EN generic) */
|
||||
SYSINFO_SOC_BOOTLOADER = 0, /**< SYSINFO_SOC (0) (r/-): Bootloader implemented when 1 (via BOOT_MODE_SELECT generic) */
|
||||
SYSINFO_SOC_XBUS = 1, /**< SYSINFO_SOC (1) (r/-): External bus interface implemented when 1 (via XBUS_EN generic) */
|
||||
SYSINFO_SOC_MEM_INT_IMEM = 2, /**< SYSINFO_SOC (2) (r/-): Processor-internal instruction memory implemented when 1 (via MEM_INT_IMEM_EN generic) */
|
||||
SYSINFO_SOC_MEM_INT_DMEM = 3, /**< SYSINFO_SOC (3) (r/-): Processor-internal data memory implemented when 1 (via MEM_INT_DMEM_EN generic) */
|
||||
|
@ -54,6 +56,7 @@ enum NEORV32_SYSINFO_SOC_enum {
|
|||
SYSINFO_SOC_XIP = 9, /**< SYSINFO_SOC (9) (r/-): Execute in-place module implemented when 1 (via XIP_EN generic) */
|
||||
SYSINFO_SOC_XIP_CACHE = 10, /**< SYSINFO_SOC (10) (r/-): Execute in-place cache implemented when 1 (via XIP_CACHE_EN generic) */
|
||||
SYSINFO_SOC_OCD_AUTH = 11, /**< SYSINFO_SOC (11) (r/-): On-chip debugger authentication implemented when 1 (via OCD_AUTHENTICATION generic) */
|
||||
SYSINFO_SOC_IMEM_ROM = 12, /**< SYSINFO_SOC (12) (r/-): Processor-internal instruction memory implemented as pre-initialized ROM when 1 (via BOOT_MODE_SELECT generic) */
|
||||
|
||||
SYSINFO_SOC_IO_DMA = 14, /**< SYSINFO_SOC (14) (r/-): Direct memory access controller implemented when 1 (via IO_DMA_EN generic) */
|
||||
SYSINFO_SOC_IO_GPIO = 15, /**< SYSINFO_SOC (15) (r/-): General purpose input/output port unit implemented when 1 (via IO_GPIO_EN generic) */
|
||||
|
|
|
@ -524,12 +524,13 @@ void neorv32_rte_print_hw_config(void) {
|
|||
neorv32_uart0_printf("none");
|
||||
}
|
||||
|
||||
neorv32_uart0_printf("\nBoot configuration: Boot ");
|
||||
if (NEORV32_SYSINFO->SOC & (1 << SYSINFO_SOC_BOOTLOADER)) {
|
||||
neorv32_uart0_printf("via Bootloader\n");
|
||||
}
|
||||
else {
|
||||
neorv32_uart0_printf("from memory\n");
|
||||
neorv32_uart0_printf("\nBoot configuration: ");
|
||||
int boot_config = (int)(NEORV32_SYSINFO->MEM[SYSINFO_MEM_BOOT]);
|
||||
switch (boot_config) {
|
||||
case 0: neorv32_uart0_printf("boot via bootloader (0)\n"); break;
|
||||
case 1: neorv32_uart0_printf("boot from custom address (1)\n"); break;
|
||||
case 2: neorv32_uart0_printf("boot from pre-initialized IMEM (2)\n"); break;
|
||||
default: neorv32_uart0_printf("unknown (%u)\n", boot_config); break;
|
||||
}
|
||||
|
||||
// internal IMEM
|
||||
|
|
|
@ -1591,10 +1591,10 @@
|
|||
<addressOffset>0x04</addressOffset>
|
||||
<access>read-only</access>
|
||||
<fields>
|
||||
<field><name>SYSINFO_MEM_0</name><bitRange>[7:0]</bitRange><description>log2(IMEM size in bytes)</description></field>
|
||||
<field><name>SYSINFO_MEM_1</name><bitRange>[15:8]</bitRange><description>log2(DMEM size in bytes)</description></field>
|
||||
<field><name>SYSINFO_MEM_2</name><bitRange>[23:16]</bitRange><description>yet unused</description></field>
|
||||
<field><name>SYSINFO_MEM_3</name><bitRange>[31:24]</bitRange><description>yet unused</description></field>
|
||||
<field><name>SYSINFO_MEM_IMEM</name><bitRange>[7:0]</bitRange><description>log2(IMEM size in bytes)</description></field>
|
||||
<field><name>SYSINFO_MEM_DMEM</name><bitRange>[15:8]</bitRange><description>log2(DMEM size in bytes)</description></field>
|
||||
<field><name>SYSINFO_MEM_res</name><bitRange>[23:16]</bitRange><description>yet unused</description></field>
|
||||
<field><name>SYSINFO_MEM_BOOT</name><bitRange>[31:24]</bitRange><description>Boot mode configuration select</description></field>
|
||||
</fields>
|
||||
</register>
|
||||
<register>
|
||||
|
@ -1615,6 +1615,7 @@
|
|||
<field><name>SYSINFO_SOC_XIP</name><bitRange>[9:9]</bitRange><description>Execute in place module implemented</description></field>
|
||||
<field><name>SYSINFO_SOC_XIP_CACHE</name><bitRange>[10:10]</bitRange><description>Execute in place cache implemented</description></field>
|
||||
<field><name>SYSINFO_SOC_OCD_AUTH</name><bitRange>[11:11]</bitRange><description>On-chip debugger authentication implemented</description></field>
|
||||
<field><name>SYSINFO_SOC_IMEM_ROM</name><bitRange>[12:12]</bitRange><description>Processor-internal instruction memory implemented as pre-initialized ROM</description></field>
|
||||
<field><name>SYSINFO_SOC_IO_DMA</name><bitRange>[14:14]</bitRange><description>Direct memory access controller implemented</description></field>
|
||||
<field><name>SYSINFO_SOC_IO_GPIO</name><bitRange>[15:15]</bitRange><description>General purpose input/output port unit implemented</description></field>
|
||||
<field><name>SYSINFO_SOC_IO_MTIME</name><bitRange>[16:16]</bitRange><description>Machine system timer implemented</description></field>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue