From 542e56b80a245943dd9074a0f151095f3e908f6b Mon Sep 17 00:00:00 2001 From: stnolting Date: Thu, 31 Oct 2024 22:29:13 +0100 Subject: [PATCH 1/7] [image_gen] emit full VHDL packages as images --- sw/image_gen/image_gen.c | 87 +++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 45 deletions(-) diff --git a/sw/image_gen/image_gen.c b/sw/image_gen/image_gen.c index cf5cf06b3..967b44844 100644 --- a/sw/image_gen/image_gen.c +++ b/sw/image_gen/image_gen.c @@ -20,8 +20,8 @@ const uint32_t signature = 0x4788CAFE; // output file types (operation select) enum operation_enum { OP_APP_BIN, - OP_APP_IMG, - OP_BLD_IMG, + OP_APP_VHD, + OP_BLD_VHD, OP_RAW_HEX, OP_RAW_BIN, OP_RAW_COE, @@ -36,8 +36,8 @@ int main(int argc, char *argv[]) { "Three arguments are required.\n" "1st: Operation\n" " -app_bin : Generate application executable binary (binary file, little-endian, with header) \n" - " -app_img : Generate application raw executable memory image (vhdl package body file, no header)\n" - " -bld_img : Generate bootloader raw executable memory image (vhdl package body file, no header)\n" + " -app_vhd : Generate application raw executable memory image (vhdl package body file, no header)\n" + " -bld_vhd : Generate bootloader raw executable memory image (vhdl package body file, no header)\n" " -raw_hex : Generate application raw executable (ASCII hex file, no header)\n" " -raw_bin : Generate application raw executable (binary file, no header)\n" " -raw_coe : Generate application raw executable (COE file, no header)\n" @@ -58,22 +58,22 @@ int main(int argc, char *argv[]) { unsigned long raw_exe_size = 0; if (strcmp(argv[1], "-app_bin") == 0) { operation = OP_APP_BIN; } - else if (strcmp(argv[1], "-app_img") == 0) { operation = OP_APP_IMG; } - else if (strcmp(argv[1], "-bld_img") == 0) { operation = OP_BLD_IMG; } + else if (strcmp(argv[1], "-app_vhd") == 0) { operation = OP_APP_VHD; } + else if (strcmp(argv[1], "-bld_vhd") == 0) { operation = OP_BLD_VHD; } else if (strcmp(argv[1], "-raw_hex") == 0) { operation = OP_RAW_HEX; } else if (strcmp(argv[1], "-raw_bin") == 0) { operation = OP_RAW_BIN; } else if (strcmp(argv[1], "-raw_coe") == 0) { operation = OP_RAW_COE; } else if (strcmp(argv[1], "-raw_mem") == 0) { operation = OP_RAW_MEM; } else if (strcmp(argv[1], "-raw_mif") == 0) { operation = OP_RAW_MIF; } else { - printf("Invalid operation!"); + printf("Invalid operation '%s'!\n", argv[1]); return -1; } // open input file input = fopen(argv[2], "rb"); if(input == NULL) { - printf("Input file error!"); + printf("Input file error (%s)!\n", argv[2]); return -2; } @@ -84,12 +84,12 @@ int main(int argc, char *argv[]) { rewind(input); if ((input_size % 4) != 0) { - printf("WARNING - image size is not a multiple of 4 bytes.\n"); + printf("WARNING - image size is not a multiple of 4 bytes!\n"); } // input file empty? if(input_size == 0) { - printf("Input file is empty!"); + printf("Input file is empty (%s)!\n", argv[2]); fclose(input); return -3; } @@ -97,32 +97,21 @@ int main(int argc, char *argv[]) { // open output file output = fopen(argv[3], "wb"); if(output == NULL) { - printf("Output file error!"); + printf("Output file error (%s)!\n", argv[3]); fclose(input); return -4; } - // -------------------------------------------------------------------------- - // Try to find out targeted CPU configuration via MARCH environment variable - // -------------------------------------------------------------------------- - char string_march[64] = "default"; - char *envvar_march = "MARCH"; - if (getenv(envvar_march)) { - if (snprintf(string_march, 64, "%s", getenv(envvar_march)) >= 64){ - strcpy(string_march, "default"); - } - } - // -------------------------------------------------------------------------- - // Get image's compilation date and time + // Image's compilation date and time // -------------------------------------------------------------------------- time_t time_current; time(&time_current); struct tm *time_local = localtime(&time_current); char compile_time[64]; - snprintf(compile_time, 64, "%02d.%02d.%d %02d:%02d:%02d (dd.mm.yyyy hh:mm:ss)", + snprintf(compile_time, 64, "%02d.%02d.%d %02d:%02d:%02d", time_local->tm_mday, time_local->tm_mon + 1, time_local->tm_year + 1900, @@ -133,7 +122,7 @@ int main(int argc, char *argv[]) { // -------------------------------------------------------------------------- - // Get size of application (in bytes) + // Size of application (in bytes) // -------------------------------------------------------------------------- fseek(input, 0L, SEEK_END); @@ -204,22 +193,26 @@ int main(int argc, char *argv[]) { // -------------------------------------------------------------------------- - // Generate RAW APPLICATION's executable memory initialization file - // -> VHDL package body + // Generate APPLICATION executable memory initialization image package (IMEM) // -------------------------------------------------------------------------- - else if (operation == OP_APP_IMG) { + else if (operation == OP_APP_VHD) { // header - sprintf(tmp_string, "-- The NEORV32 RISC-V Processor: https://github.com/stnolting/neorv32\n" - "-- Auto-generated memory initialization file (for APPLICATION) from source file <%s/%s>\n" + sprintf(tmp_string, "-- The NEORV32 RISC-V Processor - github.com/stnolting/neorv32\n" + "-- Auto-generated memory initialization package (for internal IMEM)\n" + "-- Source: %s/%s\n" "-- Size: %lu bytes\n" - "-- MARCH: %s\n" "-- Built: %s\n" "\n" - "-- prototype defined in 'neorv32_package.vhd'\n" - "package body neorv32_application_image is\n" + "library ieee;\n" + "use ieee.std_logic_1164.all;\n" "\n" - "constant application_init_image : mem32_t := (\n", argv[4], argv[2], raw_exe_size, string_march, compile_time); + "library neorv32;\n" + "use neorv32.neorv32_package.all;\n" + "\n" + "package neorv32_application_image is\n" + "\n" + "constant application_init_image : mem32_t := (\n", argv[4], argv[2], raw_exe_size, compile_time); fputs(tmp_string, output); i = 0; @@ -261,22 +254,26 @@ int main(int argc, char *argv[]) { // -------------------------------------------------------------------------- - // Generate RAW BOOTLOADER's executable memory initialization file - // -> VHDL package body + // Generate BOOTLOADER executable memory initialization image package (BOOTROM) // -------------------------------------------------------------------------- - else if (operation == OP_BLD_IMG) { + else if (operation == OP_BLD_VHD) { // header - sprintf(tmp_string, "-- The NEORV32 RISC-V Processor: https://github.com/stnolting/neorv32\n" - "-- Auto-generated memory initialization file (for BOOTLOADER) from source file <%s/%s>\n" + sprintf(tmp_string, "-- The NEORV32 RISC-V Processor - github.com/stnolting/neorv32\n" + "-- Auto-generated memory initialization package (for internal BOOTROM)\n" + "-- Source: %s/%s\n" "-- Size: %lu bytes\n" - "-- MARCH: %s\n" "-- Built: %s\n" "\n" - "-- prototype defined in 'neorv32_package.vhd'\n" - "package body neorv32_bootloader_image is\n" + "library ieee;\n" + "use ieee.std_logic_1164.all;\n" + "\n" + "library neorv32;\n" + "use neorv32.neorv32_package.all;\n" + "\n" + "package neorv32_bootloader_image is\n" "\n" - "constant bootloader_init_image : mem32_t := (\n", argv[4], argv[2], raw_exe_size, string_march, compile_time); + "constant bootloader_init_image : mem32_t := (\n", argv[4], argv[2], raw_exe_size, compile_time); fputs(tmp_string, output); i = 0; @@ -435,7 +432,7 @@ int main(int argc, char *argv[]) { // Invalid operation // -------------------------------------------------------------------------- else { - printf("Invalid operation!"); + printf("Invalid operation!\n"); fclose(input); fclose(output); return -1; @@ -443,7 +440,7 @@ int main(int argc, char *argv[]) { // -------------------------------------------------------------------------- - // Done, clean up + // Clean up // -------------------------------------------------------------------------- fclose(input); fclose(output); From a742ba684ff53cba09fac084ae6ad7499529d1ea Mon Sep 17 00:00:00 2001 From: stnolting Date: Thu, 31 Oct 2024 22:29:41 +0100 Subject: [PATCH 2/7] [sw/common] update image_gen switches --- docs/datasheet/software.adoc | 4 ++-- sw/common/common.mk | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/datasheet/software.adoc b/docs/datasheet/software.adoc index dffc8d732..e8e80d2e6 100644 --- a/docs/datasheet/software.adoc +++ b/docs/datasheet/software.adoc @@ -429,8 +429,8 @@ by a flag when calling the generator. [grid="none"] |======================= | `-app_bin` | Generates an executable binary file (including a bootloader header) for upload via the bootloader. -| `-app_img` | Generates an executable VHDL memory initialization image for the processor-internal IMEM. -| `-bld_img` | Generates an executable VHDL memory initialization image for the processor-internal BOOT ROM. +| `-app_vhd` | Generates an executable VHDL memory initialization image for the processor-internal IMEM. +| `-bld_vhd` | Generates an executable VHDL memory initialization image for the processor-internal BOOT ROM. | `-raw_hex` | Generates a raw 8x ASCII hex-char file for custom purpose. | `-raw_bin` | Generates a raw binary file `for custom purpose. | `-raw_coe` | Generates a raw COE file for FPGA memory initialization. diff --git a/sw/common/common.mk b/sw/common/common.mk index a03f88a35..353abbb41 100644 --- a/sw/common/common.mk +++ b/sw/common/common.mk @@ -202,7 +202,7 @@ $(APP_EXE): main.bin $(IMAGE_GEN) # Generate NEORV32 executable VHDL boot image $(APP_VHD): main.bin $(IMAGE_GEN) @set -e - @$(IMAGE_GEN) -app_img $< $@ $(shell basename $(CURDIR)) + @$(IMAGE_GEN) -app_vhd $< $@ $(shell basename $(CURDIR)) # Install VHDL memory initialization file install-$(APP_VHD): $(APP_VHD) @@ -241,7 +241,7 @@ $(APP_MEM): main.bin $(IMAGE_GEN) # Create local VHDL BOOTROM image bl_image: main.bin $(IMAGE_GEN) @set -e - @$(IMAGE_GEN) -bld_img $< $(BOOT_VHD) $(shell basename $(CURDIR)) + @$(IMAGE_GEN) -bld_vhd $< $(BOOT_VHD) $(shell basename $(CURDIR)) # Install BOOTROM image to VHDL source directory bootloader: bl_image From 5b5e0ad707f8df1942775b0cd95dfb1774cc96e0 Mon Sep 17 00:00:00 2001 From: stnolting Date: Thu, 31 Oct 2024 22:30:07 +0100 Subject: [PATCH 3/7] [rtl] update/cleanup file list files --- rtl/file_list_cpu.f | 2 -- rtl/file_list_soc.f | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/rtl/file_list_cpu.f b/rtl/file_list_cpu.f index 55a56fa46..c830a770d 100644 --- a/rtl/file_list_cpu.f +++ b/rtl/file_list_cpu.f @@ -14,5 +14,3 @@ NEORV32_RTL_PATH_PLACEHOLDER/core/neorv32_cpu_lsu.vhd NEORV32_RTL_PATH_PLACEHOLDER/core/neorv32_cpu_pmp.vhd NEORV32_RTL_PATH_PLACEHOLDER/core/neorv32_cpu.vhd -NEORV32_RTL_PATH_PLACEHOLDER/core/neorv32_bootloader_image.vhd -NEORV32_RTL_PATH_PLACEHOLDER/core/neorv32_application_image.vhd diff --git a/rtl/file_list_soc.f b/rtl/file_list_soc.f index 88cf13f91..e10289f20 100644 --- a/rtl/file_list_soc.f +++ b/rtl/file_list_soc.f @@ -19,8 +19,10 @@ NEORV32_RTL_PATH_PLACEHOLDER/core/neorv32_bus.vhd NEORV32_RTL_PATH_PLACEHOLDER/core/neorv32_cache.vhd NEORV32_RTL_PATH_PLACEHOLDER/core/neorv32_dma.vhd +NEORV32_RTL_PATH_PLACEHOLDER/core/neorv32_application_image.vhd NEORV32_RTL_PATH_PLACEHOLDER/core/neorv32_imem.vhd NEORV32_RTL_PATH_PLACEHOLDER/core/neorv32_dmem.vhd +NEORV32_RTL_PATH_PLACEHOLDER/core/neorv32_bootloader_image.vhd NEORV32_RTL_PATH_PLACEHOLDER/core/neorv32_boot_rom.vhd NEORV32_RTL_PATH_PLACEHOLDER/core/neorv32_xip.vhd NEORV32_RTL_PATH_PLACEHOLDER/core/neorv32_xbus.vhd @@ -45,5 +47,3 @@ NEORV32_RTL_PATH_PLACEHOLDER/core/neorv32_debug_auth.vhd NEORV32_RTL_PATH_PLACEHOLDER/core/neorv32_debug_dm.vhd NEORV32_RTL_PATH_PLACEHOLDER/core/neorv32_top.vhd -NEORV32_RTL_PATH_PLACEHOLDER/core/neorv32_application_image.vhd -NEORV32_RTL_PATH_PLACEHOLDER/core/neorv32_bootloader_image.vhd From 7b08c036a3a94efdc0f04a7cfcf848b619cfbd85 Mon Sep 17 00:00:00 2001 From: stnolting Date: Thu, 31 Oct 2024 22:31:21 +0100 Subject: [PATCH 4/7] [package] remove image declarations --- rtl/core/neorv32_package.vhd | 39 +----------------------------------- 1 file changed, 1 insertion(+), 38 deletions(-) diff --git a/rtl/core/neorv32_package.vhd b/rtl/core/neorv32_package.vhd index 9c318cc31..e49b9ad5e 100644 --- a/rtl/core/neorv32_package.vhd +++ b/rtl/core/neorv32_package.vhd @@ -29,7 +29,7 @@ package neorv32_package is -- Architecture Constants ----------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01100600"; -- hardware version + constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01100601"; -- hardware version constant archid_c : natural := 19; -- official RISC-V architecture ID constant XLEN : natural := 32; -- native data path width @@ -1116,40 +1116,3 @@ package body neorv32_package is end function print_version_f; end neorv32_package; - --- ********************************************************************************************************** --- Additional Packages --- ********************************************************************************************************** - - -- Prototype Definition: bootloader_init_image -------------------------------------------- - -- ------------------------------------------------------------------------------------------- - -- > memory content in 'neorv32_bootloader_image.vhd', auto-generated by 'image_gen' - -- > used by 'neorv32_boot_rom.vhd' - -- > enables body-only recompile in case of firmware change (NEORV32 PR #338) - -library ieee; -use ieee.std_logic_1164.all; - -library neorv32; -use neorv32.neorv32_package.all; - -package neorv32_bootloader_image is - constant bootloader_init_image : mem32_t; -end neorv32_bootloader_image; - - - -- Prototype Definition: neorv32_application_image ---------------------------------------- - -- ------------------------------------------------------------------------------------------- - -- > memory content in 'neorv32_application_image.vhd', auto-generated by 'image_gen' - -- > used by 'mem/neorv32_imem.*.vhd' - -- > enables body-only recompile in case of firmware change (NEORV32 PR #338) - -library ieee; -use ieee.std_logic_1164.all; - -library neorv32; -use neorv32.neorv32_package.all; - -package neorv32_application_image is - constant application_init_image : mem32_t; -end neorv32_application_image; From 5e418b884f72e597a7793d2457046ad8279aab18 Mon Sep 17 00:00:00 2001 From: stnolting Date: Thu, 31 Oct 2024 22:33:28 +0100 Subject: [PATCH 5/7] [rtl] update memory images now these are full-featured VHDL packages --- rtl/core/neorv32_application_image.vhd | 17 +++++++++++------ rtl/core/neorv32_bootloader_image.vhd | 23 ++++++++++++++--------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/rtl/core/neorv32_application_image.vhd b/rtl/core/neorv32_application_image.vhd index d2804b224..2412e231b 100644 --- a/rtl/core/neorv32_application_image.vhd +++ b/rtl/core/neorv32_application_image.vhd @@ -1,11 +1,16 @@ --- The NEORV32 RISC-V Processor: https://github.com/stnolting/neorv32 --- Auto-generated memory initialization file (for APPLICATION) from source file +-- The NEORV32 RISC-V Processor - github.com/stnolting/neorv32 +-- Auto-generated memory initialization package (for internal IMEM) +-- Source: demo_blink_led/main.bin -- Size: 1100 bytes --- MARCH: default --- Built: 15.09.2024 21:48:24 (dd.mm.yyyy hh:mm:ss) +-- Built: 31.10.2024 22:32:21 --- prototype defined in 'neorv32_package.vhd' -package body neorv32_application_image is +library ieee; +use ieee.std_logic_1164.all; + +library neorv32; +use neorv32.neorv32_package.all; + +package neorv32_application_image is constant application_init_image : mem32_t := ( x"000020b7", diff --git a/rtl/core/neorv32_bootloader_image.vhd b/rtl/core/neorv32_bootloader_image.vhd index ec92bf2cf..18487d5e4 100644 --- a/rtl/core/neorv32_bootloader_image.vhd +++ b/rtl/core/neorv32_bootloader_image.vhd @@ -1,11 +1,16 @@ --- The NEORV32 RISC-V Processor: https://github.com/stnolting/neorv32 --- Auto-generated memory initialization file (for BOOTLOADER) from source file +-- The NEORV32 RISC-V Processor - github.com/stnolting/neorv32 +-- Auto-generated memory initialization package (for internal BOOTROM) +-- Source: bootloader/main.bin -- Size: 4072 bytes --- MARCH: default --- Built: 27.09.2024 05:54:10 (dd.mm.yyyy hh:mm:ss) +-- Built: 31.10.2024 22:31:51 --- prototype defined in 'neorv32_package.vhd' -package body neorv32_bootloader_image is +library ieee; +use ieee.std_logic_1164.all; + +library neorv32; +use neorv32.neorv32_package.all; + +package neorv32_bootloader_image is constant bootloader_init_image : mem32_t := ( x"000020b7", @@ -894,9 +899,9 @@ x"6f6c746f", x"72656461", x"0a3e3e20", x"444c420a", -x"53203a56", -x"32207065", -x"30322037", +x"4f203a56", +x"33207463", +x"30322031", x"480a3432", x"203a5657", x"00000020", From 1cf491b5ec1d61943ddc2e0d42b59623843de4b2 Mon Sep 17 00:00:00 2001 From: stnolting Date: Fri, 1 Nov 2024 10:33:03 +0100 Subject: [PATCH 6/7] [changelog] add v1.10.6.1 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 69daac9ef..7a07b43fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ mimpid = 0x01040312 -> Version 01.04.03.12 -> v1.4.3.12 | Date | Version | Comment | Ticket | |:----:|:-------:|:--------|:------:| +| 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) | | 21.10.2024 | 1.10.5.10 | :test_tube: rework linker script's ROM/IMEM default size (=16kB); add customization variable to all makefiles in `sw/example` | [#1072](https://github.com/stnolting/neorv32/pull/1072) | From c26e13cfc077a2dfc906ed2a499cfe559dc14d9f Mon Sep 17 00:00:00 2001 From: stnolting Date: Fri, 1 Nov 2024 10:46:08 +0100 Subject: [PATCH 7/7] [docs] minor edits --- docs/datasheet/overview.adoc | 6 +++--- docs/datasheet/soc_bootrom.adoc | 11 ++++++----- docs/datasheet/soc_imem.adoc | 15 ++++++++------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/docs/datasheet/overview.adoc b/docs/datasheet/overview.adoc index c8557e29e..3fc05877e 100644 --- a/docs/datasheet/overview.adoc +++ b/docs/datasheet/overview.adoc @@ -179,7 +179,7 @@ All core VHDL files from the list below have to be assigned to a **new library** [NOTE] See section <<_file_list_files>> for more information. -.RTL File List and Hierarchy +.RTL File List and Hierarchy (in alphabetical order) ................................... neorv32_top.vhd - NEORV32 PROCESSOR/SOC TOP ENTITY │ @@ -199,7 +199,7 @@ neorv32_top.vhd - NEORV32 PROCESSOR/SOC TOP ENTITY │└neorv32_cpu_regfile.vhd - Data register file │ ├neorv32_boot_rom.vhd - Bootloader ROM -│└neorv32_bootloader_image.vhd - Bootloader ROM memory image +│└neorv32_bootloader_image.vhd - Bootloader ROM memory image (package) ├neorv32_bus.vhd - SoC bus infrastructure modules ├neorv32_cache.vhd - Generic cache module ├neorv32_cfs.vhd - Custom functions subsystem @@ -214,7 +214,7 @@ neorv32_top.vhd - NEORV32 PROCESSOR/SOC TOP ENTITY ├neorv32_gpio.vhd - General purpose input/output port unit ├neorv32_gptmr.vhd - General purpose 32-bit timer ├neorv32_imem.vhd - Generic processor-internal instruction memory -│└neorv32_application_image.vhd - IMEM application initialization image +│└neorv32_application_image.vhd - IMEM application initialization image (package) ├neorv32_mtime.vhd - Machine system timer ├neorv32_neoled.vhd - NeoPixel (TM) compatible smart LED interface ├neorv32_onewire.vhd - One-Wire serial interface controller diff --git a/docs/datasheet/soc_bootrom.adoc b/docs/datasheet/soc_bootrom.adoc index 4a0932a86..78d454a11 100644 --- a/docs/datasheet/soc_bootrom.adoc +++ b/docs/datasheet/soc_bootrom.adoc @@ -5,11 +5,12 @@ [cols="<3,<3,<4"] [frame="topbot",grid="none"] |======================= -| Hardware source files: | neorv32_boot_rom.vhd | -| Software driver files: | none | -| Top entity ports: | none | -| Configuration generics: | `INT_BOOTLOADER_EN` | implement processor-internal bootloader when `true` -| CPU interrupts: | none | +| Hardware source files: | neorv32_boot_rom.vhd | default platform-agnostic bootloader ROM +| | 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` +| CPU interrupts: | none | | Access restrictions: 2+| privileged access only, read-only |======================= diff --git a/docs/datasheet/soc_imem.adoc b/docs/datasheet/soc_imem.adoc index 9836a8f4d..ba7893ce0 100644 --- a/docs/datasheet/soc_imem.adoc +++ b/docs/datasheet/soc_imem.adoc @@ -5,13 +5,14 @@ [cols="<3,<3,<4"] [frame="topbot",grid="none"] |======================= -| Hardware source files: | neorv32_imem.vhd | default platform-agnostic instruction memory -| Software driver files: | none | _implicitly used_ -| 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) -| CPU interrupts: | none | +| Hardware source files: | neorv32_imem.vhd | default platform-agnostic instruction memory (RAM or ROM) +| | neorv32_application_image.vhd | initialization image (a VHDL package) +| Software driver files: | none | _implicitly used_ +| 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) +| CPU interrupts: | none | | Access restrictions: 2+| none / read-only if `INT_BOOTLOADER_EN = true` |=======================