Skip to content

Commit 2825967

Browse files
authored
Add option to disable SYSINFO module (#952)
2 parents 3b42668 + efbece7 commit 2825967

File tree

4 files changed

+70
-52
lines changed

4 files changed

+70
-52
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ mimpid = 0x01040312 -> Version 01.04.03.12 -> v1.4.3.12
2929

3030
| Date | Version | Comment | Ticket |
3131
|:----:|:-------:|:--------|:------:|
32+
| 18.07.2024 | 1.10.1.3 | :test_tube: add new generic to disable the SYSINFO module (:warning: for advanced users only that wish to use a CPU-only setup): `IO_DISABLE_SYSINFO` | [#952](https://github.com/stnolting/neorv32/pull/952) |
3233
| 10.07.2024 | 1.10.1.2 | minor rtl edits and cleanups | [#948](https://github.com/stnolting/neorv32/pull/948) |
3334
| 05.07.2024 | 1.10.1.1 | minor rtl cleanups and optimizations | [#941](https://github.com/stnolting/neorv32/pull/941) |
3435
| 04.07.2024 | [**:rocket:1.10.1**](https://github.com/stnolting/neorv32/releases/tag/v1.10.1) | **New release** | |

docs/datasheet/soc.adoc

+1
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ The generic type "`suv(x:y)`" is an abbreviation for "`std_ulogic_vector(x downt
258258
4+^| **<<_external_interrupt_controller_xirq>>**
259259
| `XIRQ_NUM_CH` | natural | 0 | Number of channels of the external interrupt controller. Valid values are 0..32.
260260
4+^| **Peripheral/IO Modules**
261+
| `IO_DISABLE_SYSINFO` | boolean | false | Disable <<_system_configuration_information_memory_sysinfo>> module; ⚠️ not recommended - for advanced users only!
261262
| `IO_GPIO_NUM` | natural | 0 | Number of general purpose input/output pairs of the <<_general_purpose_input_and_output_port_gpio>>.
262263
| `IO_MTIME_EN` | boolean | false | Implement the <<_machine_system_timer_mtime>>.
263264
| `IO_UART0_EN` | boolean | false | Implement the <<_primary_universal_asynchronous_receiver_and_transmitter_uart0>>.

rtl/core/neorv32_package.vhd

+2-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ package neorv32_package is
2929

3030
-- Architecture Constants -----------------------------------------------------------------
3131
-- -------------------------------------------------------------------------------------------
32-
constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01100102"; -- hardware version
32+
constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01100103"; -- hardware version
3333
constant archid_c : natural := 19; -- official RISC-V architecture ID
3434
constant XLEN : natural := 32; -- native data path width
3535

@@ -772,6 +772,7 @@ package neorv32_package is
772772
-- External Interrupts Controller (XIRQ) --
773773
XIRQ_NUM_CH : natural range 0 to 32 := 0;
774774
-- Processor peripherals --
775+
IO_DISABLE_SYSINFO : boolean := false;
775776
IO_GPIO_NUM : natural range 0 to 64 := 0;
776777
IO_MTIME_EN : boolean := false;
777778
IO_UART0_EN : boolean := false;

rtl/core/neorv32_top.vhd

+66-51
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ entity neorv32_top is
9898
XIRQ_NUM_CH : natural range 0 to 32 := 0; -- number of external IRQ channels (0..32)
9999

100100
-- Processor peripherals --
101+
IO_DISABLE_SYSINFO : boolean := false; -- disable the SYSINFO module (for advanced users only)
101102
IO_GPIO_NUM : natural range 0 to 64 := 0; -- number of GPIO input/output pairs (0..64)
102103
IO_MTIME_EN : boolean := false; -- implement machine system timer (MTIME)?
103104
IO_UART0_EN : boolean := false; -- implement primary universal asynchronous receiver/transmitter (UART0)?
@@ -241,6 +242,7 @@ architecture neorv32_top_rtl of neorv32_top is
241242
constant io_xirq_en_c : boolean := boolean(XIRQ_NUM_CH > 0);
242243
constant io_pwm_en_c : boolean := boolean(IO_PWM_NUM_CH > 0);
243244
constant cpu_smpmp_c : boolean := boolean(PMP_NUM_REGIONS > 0);
245+
constant io_sysinfo_en_c : boolean := not IO_DISABLE_SYSINFO;
244246

245247
-- convert JEDEC ID to mvendor CSR --
246248
constant vendorid_c : std_ulogic_vector(31 downto 0) := x"00000" & "0" & JEDEC_ID;
@@ -363,7 +365,7 @@ begin
363365
cond_sel_string_f(IO_DMA_EN, "DMA ", "") &
364366
cond_sel_string_f(IO_SLINK_EN, "SLINK ", "") &
365367
cond_sel_string_f(IO_CRC_EN, "CRC ", "") &
366-
cond_sel_string_f(true, "SYSINFO ", "") & -- always enabled
368+
cond_sel_string_f(io_sysinfo_en_c, "SYSINFO ", "") &
367369
cond_sel_string_f(ON_CHIP_DEBUGGER_EN, "OCD ", "") &
368370
""
369371
severity note;
@@ -376,6 +378,10 @@ begin
376378
assert not ((dmem_size_valid_c = false) and (MEM_INT_DMEM_EN = true)) report
377379
"[NEORV32] Auto-adjusting invalid DMEM size configuration." severity warning;
378380

381+
-- SYSINFO warning --
382+
assert not (io_sysinfo_en_c = false) report
383+
"[NEORV32] SYSINFO module disabled - large parts of the NEORV32 software framework will no longer work!" severity warning;
384+
379385
end generate; -- /sanity_checks
380386

381387

@@ -1001,7 +1007,7 @@ begin
10011007
generic map (
10021008
DEV_SIZE => iodev_size_c, -- size of a single IO device
10031009
DEV_00_EN => ON_CHIP_DEBUGGER_EN, DEV_00_BASE => base_io_dm_c,
1004-
DEV_01_EN => true, DEV_01_BASE => base_io_sysinfo_c, -- always enabled (mandatory core module)
1010+
DEV_01_EN => io_sysinfo_en_c, DEV_01_BASE => base_io_sysinfo_c,
10051011
DEV_02_EN => IO_NEOLED_EN, DEV_02_BASE => base_io_neoled_c,
10061012
DEV_03_EN => io_gpio_en_c, DEV_03_BASE => base_io_gpio_c,
10071013
DEV_04_EN => IO_WDT_EN, DEV_04_BASE => base_io_wdt_c,
@@ -1567,55 +1573,64 @@ begin
15671573

15681574
-- System Configuration Information Memory (SYSINFO) --------------------------------------
15691575
-- -------------------------------------------------------------------------------------------
1570-
neorv32_sysinfo_inst: entity neorv32.neorv32_sysinfo
1571-
generic map (
1572-
CLOCK_FREQUENCY => CLOCK_FREQUENCY,
1573-
CLOCK_GATING_EN => CLOCK_GATING_EN,
1574-
INT_BOOTLOADER_EN => INT_BOOTLOADER_EN,
1575-
MEM_INT_IMEM_EN => MEM_INT_IMEM_EN,
1576-
MEM_INT_IMEM_SIZE => imem_size_c,
1577-
MEM_INT_DMEM_EN => MEM_INT_DMEM_EN,
1578-
MEM_INT_DMEM_SIZE => dmem_size_c,
1579-
ICACHE_EN => ICACHE_EN,
1580-
ICACHE_NUM_BLOCKS => ICACHE_NUM_BLOCKS,
1581-
ICACHE_BLOCK_SIZE => ICACHE_BLOCK_SIZE,
1582-
DCACHE_EN => DCACHE_EN,
1583-
DCACHE_NUM_BLOCKS => DCACHE_NUM_BLOCKS,
1584-
DCACHE_BLOCK_SIZE => DCACHE_BLOCK_SIZE,
1585-
XBUS_EN => XBUS_EN,
1586-
XBUS_CACHE_EN => XBUS_CACHE_EN,
1587-
XBUS_CACHE_NUM_BLOCKS => XBUS_CACHE_NUM_BLOCKS,
1588-
XBUS_CACHE_BLOCK_SIZE => XBUS_CACHE_BLOCK_SIZE,
1589-
XIP_EN => XIP_EN,
1590-
XIP_CACHE_EN => XIP_CACHE_EN,
1591-
XIP_CACHE_NUM_BLOCKS => XIP_CACHE_NUM_BLOCKS,
1592-
XIP_CACHE_BLOCK_SIZE => XIP_CACHE_BLOCK_SIZE,
1593-
ON_CHIP_DEBUGGER_EN => ON_CHIP_DEBUGGER_EN,
1594-
IO_GPIO_EN => io_gpio_en_c,
1595-
IO_MTIME_EN => IO_MTIME_EN,
1596-
IO_UART0_EN => IO_UART0_EN,
1597-
IO_UART1_EN => IO_UART1_EN,
1598-
IO_SPI_EN => IO_SPI_EN,
1599-
IO_SDI_EN => IO_SDI_EN,
1600-
IO_TWI_EN => IO_TWI_EN,
1601-
IO_PWM_EN => io_pwm_en_c,
1602-
IO_WDT_EN => IO_WDT_EN,
1603-
IO_TRNG_EN => IO_TRNG_EN,
1604-
IO_CFS_EN => IO_CFS_EN,
1605-
IO_NEOLED_EN => IO_NEOLED_EN,
1606-
IO_XIRQ_EN => io_xirq_en_c,
1607-
IO_GPTMR_EN => IO_GPTMR_EN,
1608-
IO_ONEWIRE_EN => IO_ONEWIRE_EN,
1609-
IO_DMA_EN => IO_DMA_EN,
1610-
IO_SLINK_EN => IO_SLINK_EN,
1611-
IO_CRC_EN => IO_CRC_EN
1612-
)
1613-
port map (
1614-
clk_i => clk_i,
1615-
rstn_i => rstn_sys,
1616-
bus_req_i => iodev_req(IODEV_SYSINFO),
1617-
bus_rsp_o => iodev_rsp(IODEV_SYSINFO)
1618-
);
1576+
neorv32_sysinfo_inst_true:
1577+
if io_sysinfo_en_c generate
1578+
neorv32_sysinfo_inst: entity neorv32.neorv32_sysinfo
1579+
generic map (
1580+
CLOCK_FREQUENCY => CLOCK_FREQUENCY,
1581+
CLOCK_GATING_EN => CLOCK_GATING_EN,
1582+
INT_BOOTLOADER_EN => INT_BOOTLOADER_EN,
1583+
MEM_INT_IMEM_EN => MEM_INT_IMEM_EN,
1584+
MEM_INT_IMEM_SIZE => imem_size_c,
1585+
MEM_INT_DMEM_EN => MEM_INT_DMEM_EN,
1586+
MEM_INT_DMEM_SIZE => dmem_size_c,
1587+
ICACHE_EN => ICACHE_EN,
1588+
ICACHE_NUM_BLOCKS => ICACHE_NUM_BLOCKS,
1589+
ICACHE_BLOCK_SIZE => ICACHE_BLOCK_SIZE,
1590+
DCACHE_EN => DCACHE_EN,
1591+
DCACHE_NUM_BLOCKS => DCACHE_NUM_BLOCKS,
1592+
DCACHE_BLOCK_SIZE => DCACHE_BLOCK_SIZE,
1593+
XBUS_EN => XBUS_EN,
1594+
XBUS_CACHE_EN => XBUS_CACHE_EN,
1595+
XBUS_CACHE_NUM_BLOCKS => XBUS_CACHE_NUM_BLOCKS,
1596+
XBUS_CACHE_BLOCK_SIZE => XBUS_CACHE_BLOCK_SIZE,
1597+
XIP_EN => XIP_EN,
1598+
XIP_CACHE_EN => XIP_CACHE_EN,
1599+
XIP_CACHE_NUM_BLOCKS => XIP_CACHE_NUM_BLOCKS,
1600+
XIP_CACHE_BLOCK_SIZE => XIP_CACHE_BLOCK_SIZE,
1601+
ON_CHIP_DEBUGGER_EN => ON_CHIP_DEBUGGER_EN,
1602+
IO_GPIO_EN => io_gpio_en_c,
1603+
IO_MTIME_EN => IO_MTIME_EN,
1604+
IO_UART0_EN => IO_UART0_EN,
1605+
IO_UART1_EN => IO_UART1_EN,
1606+
IO_SPI_EN => IO_SPI_EN,
1607+
IO_SDI_EN => IO_SDI_EN,
1608+
IO_TWI_EN => IO_TWI_EN,
1609+
IO_PWM_EN => io_pwm_en_c,
1610+
IO_WDT_EN => IO_WDT_EN,
1611+
IO_TRNG_EN => IO_TRNG_EN,
1612+
IO_CFS_EN => IO_CFS_EN,
1613+
IO_NEOLED_EN => IO_NEOLED_EN,
1614+
IO_XIRQ_EN => io_xirq_en_c,
1615+
IO_GPTMR_EN => IO_GPTMR_EN,
1616+
IO_ONEWIRE_EN => IO_ONEWIRE_EN,
1617+
IO_DMA_EN => IO_DMA_EN,
1618+
IO_SLINK_EN => IO_SLINK_EN,
1619+
IO_CRC_EN => IO_CRC_EN
1620+
)
1621+
port map (
1622+
clk_i => clk_i,
1623+
rstn_i => rstn_sys,
1624+
bus_req_i => iodev_req(IODEV_SYSINFO),
1625+
bus_rsp_o => iodev_rsp(IODEV_SYSINFO)
1626+
);
1627+
end generate;
1628+
1629+
neorv32_sysinfo_inst_false:
1630+
if not io_sysinfo_en_c generate
1631+
iodev_rsp(IODEV_SYSINFO) <= rsp_terminate_c;
1632+
end generate;
1633+
16191634

16201635
end generate; -- /io_system
16211636

0 commit comments

Comments
 (0)