[rtl] remove core/mem folder

This commit is contained in:
stnolting 2024-08-09 11:10:39 +02:00
parent a7c4f870ce
commit 542d45c9b5
6 changed files with 2 additions and 441 deletions

View file

@ -4,20 +4,11 @@
This folder contains the core VHDL files for the NEORV32 CPU and the NEORV32 Processor.
When creating a new synthesis/simulation project make sure to add all `*.vhd` files from this
folder to a **new design library** called `neorv32`. The processor's top entity
is [`neorv32_top.vhd`](https://github.com/stnolting/neorv32/blob/main/rtl/core/neorv32_top.vhd).
> [!IMPORTANT]
> The sub-folder [`core/mem`](https://github.com/stnolting/neorv32/tree/main/rtl/core/mem)
contains different _platform-agnostic_ VHDL architectures of the processor-internal instruction and
data memories (IMEM & DMEM). Make sure to add only **one** of each modules to the project's HDL
file list. However, these default files can also be replaced by optimized technology-specific memory modules.
folder to a **new design library** called `neorv32`.
> [!TIP]
> Two file-list files (`*.f`) are provided that list all required rtl files for the CPU core and
for the entire processor including their recommended compile order. Make sure to substitute
the `NEORV32_RTL_PATH_PLACEHOLDER` placeholder by the actual path to _this_ folder (`path/to/neorv32/rtl`).
The `*.f` files can be re-generated using the provided GHDL bash script (`generate_file_lists.sh`).
for the entire processor including their recommended compile order.
See the online documentation for more information:
https://stnolting.github.io/neorv32/#_file_list_files

View file

@ -1,18 +0,0 @@
## Processor Memory Source Files
This folder provides the architecture-only VHDL sources for the processor-internal memories
(instruction memory "IMEM", data memory "DMEM"). Different implementations are available, but
only **one** version of each (IMEM and DMEM) should be added as actual source files.
For an initial setup the `*.default.vhd` files should be selected. The HDL style for describing
memories used by these files has proven quite good platform-independence across several FPGA
architectures and toolchains.
If synthesis fails to infer block RAM resources from these default files, try the legacy
`*.legacy.vhd` files, which provide a different HDL style. These files are also intended for
legacy support of older Intel/Altera Quartus versions (13.0 and older). However, these files
still do not use platform-specific macros or primitives - so they might also work for other
FPGAs and toolchains.
> [!IMPORTANT]
> Make sure to add the selected files from this folder also to the `neorv32` design library.

View file

@ -1,82 +0,0 @@
-- ================================================================================ --
-- NEORV32 SoC - Processor-Internal Data Memory (DMEM) --
-- -------------------------------------------------------------------------------- --
-- Default architecture style. --
-- -------------------------------------------------------------------------------- --
-- The NEORV32 RISC-V Processor - https://github.com/stnolting/neorv32 --
-- Copyright (c) NEORV32 contributors. --
-- Copyright (c) 2020 - 2024 Stephan Nolting. All rights reserved. --
-- Licensed under the BSD-3-Clause license, see LICENSE for details. --
-- SPDX-License-Identifier: BSD-3-Clause --
-- ================================================================================ --
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library neorv32;
use neorv32.neorv32_package.all;
architecture neorv32_dmem_rtl of neorv32_dmem is
-- local signals --
signal rdata : std_ulogic_vector(31 downto 0);
signal rden : std_ulogic;
signal addr : std_ulogic_vector(index_size_f(DMEM_SIZE/4)-1 downto 0);
-- The memory (RAM) is built from 4 individual byte-wide memories because some synthesis
-- tools have issues inferring 32-bit memories that provide dedicated byte-enable signals
-- and/or with multi-dimensional arrays. [NOTE] Read-during-write behavior is irrelevant
-- as read and write accesses are mutually exclusive.
signal mem_ram_b0, mem_ram_b1, mem_ram_b2, mem_ram_b3 : mem8_t(0 to DMEM_SIZE/4-1);
begin
-- Memory Access --------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
mem_access: process(clk_i)
begin
if rising_edge(clk_i) then -- no reset to infer block RAM
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(07 downto 00);
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 08);
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);
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);
end if;
end if;
rdata(07 downto 00) <= mem_ram_b0(to_integer(unsigned(addr)));
rdata(15 downto 08) <= 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)));
end if;
end process mem_access;
-- word aligned access --
addr <= bus_req_i.addr(index_size_f(DMEM_SIZE/4)+1 downto 2);
-- Bus Feedback ---------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
bus_feedback: process(rstn_i, clk_i)
begin
if (rstn_i = '0') then
rden <= '0';
bus_rsp_o.ack <= '0';
elsif rising_edge(clk_i) then
rden <= bus_req_i.stb and (not bus_req_i.rw);
bus_rsp_o.ack <= bus_req_i.stb;
end if;
end process bus_feedback;
bus_rsp_o.data <= rdata when (rden = '1') else (others => '0'); -- output gate
bus_rsp_o.err <= '0'; -- no access error possible
end neorv32_dmem_rtl;

View file

@ -1,85 +0,0 @@
-- ================================================================================ --
-- NEORV32 SoC - Processor-Internal Data Memory (DMEM) --
-- -------------------------------------------------------------------------------- --
-- Alternative legacy architecture style. --
-- -------------------------------------------------------------------------------- --
-- The NEORV32 RISC-V Processor - https://github.com/stnolting/neorv32 --
-- Copyright (c) NEORV32 contributors. --
-- Copyright (c) 2020 - 2024 Stephan Nolting. All rights reserved. --
-- Licensed under the BSD-3-Clause license, see LICENSE for details. --
-- SPDX-License-Identifier: BSD-3-Clause --
-- ================================================================================ --
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library neorv32;
use neorv32.neorv32_package.all;
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);
-- The memory (RAM) is built from 4 individual byte-wide memories because some synthesis
-- tools have issues inferring 32-bit memories that provide dedicated byte-enable signals
-- and/or with multi-dimensional arrays. [NOTE] Read-during-write behavior is irrelevant
-- as read and write accesses are mutually exclusive.
signal mem_ram_b0, mem_ram_b1, mem_ram_b2, mem_ram_b3 : mem8_t(0 to DMEM_SIZE/4-1);
begin
-- Memory Access --------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
mem_access: process(clk_i)
begin
if rising_edge(clk_i) then -- no reset to infer block RAM
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(07 downto 00);
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 08);
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);
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);
end if;
end if;
end if;
end process mem_access;
-- sync(!) read - alternative HDL style --
rdata(07 downto 00) <= mem_ram_b0(to_integer(unsigned(addr_ff)));
rdata(15 downto 08) <= 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)));
-- word aligned access --
addr <= bus_req_i.addr(index_size_f(DMEM_SIZE/4)+1 downto 2);
-- Bus Feedback ---------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
bus_feedback: process(rstn_i, clk_i)
begin
if (rstn_i = '0') then
rden <= '0';
bus_rsp_o.ack <= '0';
elsif rising_edge(clk_i) then
rden <= bus_req_i.stb and (not bus_req_i.rw);
bus_rsp_o.ack <= bus_req_i.stb;
end if;
end process bus_feedback;
bus_rsp_o.data <= rdata when (rden = '1') else (others => '0'); -- output gate
bus_rsp_o.err <= '0'; -- no access error possible
end neorv32_dmem_rtl;

View file

@ -1,121 +0,0 @@
-- ================================================================================ --
-- NEORV32 SoC - Processor-Internal instruction memory (IMEM) --
-- -------------------------------------------------------------------------------- --
-- Default architecture style. --
-- Optionally, this memory implemented as ROM already containing a memory image. --
-- -------------------------------------------------------------------------------- --
-- The NEORV32 RISC-V Processor - https://github.com/stnolting/neorv32 --
-- Copyright (c) NEORV32 contributors. --
-- Copyright (c) 2020 - 2024 Stephan Nolting. All rights reserved. --
-- Licensed under the BSD-3-Clause license, see LICENSE for details. --
-- SPDX-License-Identifier: BSD-3-Clause --
-- ================================================================================ --
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library neorv32;
use neorv32.neorv32_package.all;
use neorv32.neorv32_application_image.all; -- this file is generated by the image generator
architecture neorv32_imem_rtl of neorv32_imem is
-- local signals --
signal rdata : std_ulogic_vector(31 downto 0);
signal rden : std_ulogic;
signal addr : 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);
-- The memory (RAM) is built from 4 individual byte-wide memories because some synthesis
-- tools have issues inferring 32-bit memories that provide dedicated byte-enable signals
-- and/or with multi-dimensional arrays. [NOTE] Read-during-write behavior is irrelevant
-- as read and write accesses are mutually exclusive.
signal mem_ram_b0, mem_ram_b1, mem_ram_b2, mem_ram_b3 : mem8_t(0 to IMEM_SIZE/4-1);
begin
-- Sanity Checks --------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
assert false report
"[NEORV32] Implementing DEFAULT processor-internal IMEM as " &
cond_sel_string_f(IMEM_AS_IROM, "pre-initialized ROM.", "blank RAM.") severity note;
assert not ((IMEM_AS_IROM = 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 (ROM = " & natural'image(IMEM_SIZE) & " bytes)!" severity error;
-- Implement IMEM as pre-initialized ROM --------------------------------------------------
-- -------------------------------------------------------------------------------------------
imem_rom:
if (IMEM_AS_IROM = true) generate
mem_access: process(clk_i)
begin
if rising_edge(clk_i) then -- no reset to infer block RAM
rdata <= mem_rom_c(to_integer(unsigned(addr)));
end if;
end process mem_access;
end generate;
-- word aligned access --
addr <= bus_req_i.addr(index_size_f(IMEM_SIZE/4)+1 downto 2);
-- Implement IMEM as non-initialized RAM --------------------------------------------------
-- -------------------------------------------------------------------------------------------
imem_ram:
if (IMEM_AS_IROM = false) generate
mem_access: process(clk_i)
begin
if rising_edge(clk_i) then -- no reset to infer block RAM
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(07 downto 00);
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 08);
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);
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);
end if;
end if;
rdata(07 downto 00) <= mem_ram_b0(to_integer(unsigned(addr)));
rdata(15 downto 08) <= 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)));
end if;
end process mem_access;
end generate;
-- Bus Feedback ---------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
bus_feedback: process(rstn_i, clk_i)
begin
if (rstn_i = '0') then
rden <= '0';
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
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;
end if;
end if;
end process bus_feedback;
bus_rsp_o.data <= rdata when (rden = '1') else (others => '0'); -- output gate
bus_rsp_o.err <= '0'; -- no access error possible
end neorv32_imem_rtl;

View file

@ -1,124 +0,0 @@
-- ================================================================================ --
-- NEORV32 SoC - Processor-Internal Instruction Memory (IMEM); Legacy Style --
-- -------------------------------------------------------------------------------- --
-- Alternative legacy architecture style. --
-- Optionally, this memory implemented as ROM already containing a memory image. --
-- -------------------------------------------------------------------------------- --
-- The NEORV32 RISC-V Processor - https://github.com/stnolting/neorv32 --
-- Copyright (c) NEORV32 contributors. --
-- Copyright (c) 2020 - 2024 Stephan Nolting. All rights reserved. --
-- Licensed under the BSD-3-Clause license, see LICENSE for details. --
-- SPDX-License-Identifier: BSD-3-Clause --
-- ================================================================================ --
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library neorv32;
use neorv32.neorv32_package.all;
use neorv32.neorv32_application_image.all; -- this file is generated by the image generator
architecture neorv32_imem_rtl of neorv32_imem 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(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);
-- The memory (RAM) is built from 4 individual byte-wide memories because some synthesis
-- tools have issues inferring 32-bit memories that provide dedicated byte-enable signals
-- and/or with multi-dimensional arrays. [NOTE] Read-during-write behavior is irrelevant
-- as read and write accesses are mutually exclusive.
signal mem_ram_b0, mem_ram_b1, mem_ram_b2, mem_ram_b3 : mem8_t(0 to IMEM_SIZE/4-1);
begin
-- Sanity Checks --------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
assert false report
"[NEORV32] Implementing LEGACY processor-internal IMEM as " &
cond_sel_string_f(IMEM_AS_IROM, "pre-initialized ROM.", "blank RAM.") severity note;
assert not ((IMEM_AS_IROM = 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 (ROM = " & natural'image(IMEM_SIZE) & " bytes)!" severity error;
-- Implement IMEM as pre-initialized ROM --------------------------------------------------
-- -------------------------------------------------------------------------------------------
imem_rom:
if (IMEM_AS_IROM = true) generate
mem_access: process(clk_i)
begin
if rising_edge(clk_i) then -- no reset to infer block RAM
rdata <= mem_rom_c(to_integer(unsigned(addr)));
end if;
end process mem_access;
end generate;
-- word aligned access --
addr <= bus_req_i.addr(index_size_f(IMEM_SIZE/4)+1 downto 2);
-- Implement IMEM as non-initialized RAM --------------------------------------------------
-- -------------------------------------------------------------------------------------------
imem_ram:
if (IMEM_AS_IROM = false) generate
mem_access: process(clk_i)
begin
if rising_edge(clk_i) then
addr_ff <= addr;
if (bus_req_i.stb = '1') and (bus_req_i.rw = '1') then -- no reset to infer block RAM
if (bus_req_i.ben(0) = '1') then -- byte 0
mem_ram_b0(to_integer(unsigned(addr))) <= bus_req_i.data(07 downto 00);
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 08);
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);
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);
end if;
end if;
end if;
end process mem_access;
-- sync(!) read - alternative HDL style --
rdata(07 downto 00) <= mem_ram_b0(to_integer(unsigned(addr_ff)));
rdata(15 downto 08) <= 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)));
end generate;
-- Bus Feedback ---------------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
bus_feedback: process(rstn_i, clk_i)
begin
if (rstn_i = '0') then
rden <= '0';
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
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;
end if;
end if;
end process bus_feedback;
bus_rsp_o.data <= rdata when (rden = '1') else (others => '0'); -- output gate
bus_rsp_o.err <= '0'; -- no access error possible
end neorv32_imem_rtl;