OpenCores
URL https://opencores.org/ocsvn/neorv32/neorv32/trunk

Subversion Repositories neorv32

[/] [neorv32/] [trunk/] [rtl/] [core/] [neorv32_package.vhd] - Blame information for rev 59

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 zero_gravi
-- #################################################################################################
2
-- # << NEORV32 - Main VHDL package file >>                                                        #
3
-- # ********************************************************************************************* #
4
-- # BSD 3-Clause License                                                                          #
5
-- #                                                                                               #
6 42 zero_gravi
-- # Copyright (c) 2021, Stephan Nolting. All rights reserved.                                     #
7 2 zero_gravi
-- #                                                                                               #
8
-- # Redistribution and use in source and binary forms, with or without modification, are          #
9
-- # permitted provided that the following conditions are met:                                     #
10
-- #                                                                                               #
11
-- # 1. Redistributions of source code must retain the above copyright notice, this list of        #
12
-- #    conditions and the following disclaimer.                                                   #
13
-- #                                                                                               #
14
-- # 2. Redistributions in binary form must reproduce the above copyright notice, this list of     #
15
-- #    conditions and the following disclaimer in the documentation and/or other materials        #
16
-- #    provided with the distribution.                                                            #
17
-- #                                                                                               #
18
-- # 3. Neither the name of the copyright holder nor the names of its contributors may be used to  #
19
-- #    endorse or promote products derived from this software without specific prior written      #
20
-- #    permission.                                                                                #
21
-- #                                                                                               #
22
-- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS   #
23
-- # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF               #
24
-- # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE    #
25
-- # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,     #
26
-- # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
27
-- # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED    #
28
-- # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING     #
29
-- # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED  #
30
-- # OF THE POSSIBILITY OF SUCH DAMAGE.                                                            #
31
-- # ********************************************************************************************* #
32
-- # The NEORV32 Processor - https://github.com/stnolting/neorv32              (c) Stephan Nolting #
33
-- #################################################################################################
34
 
35
library ieee;
36
use ieee.std_logic_1164.all;
37
use ieee.numeric_std.all;
38
 
39
package neorv32_package is
40
 
41 36 zero_gravi
  -- Architecture Configuration -------------------------------------------------------------
42
  -- -------------------------------------------------------------------------------------------
43 40 zero_gravi
  -- address space --
44
  constant ispace_base_c : std_ulogic_vector(31 downto 0) := x"00000000"; -- default instruction memory address space base address
45
  constant dspace_base_c : std_ulogic_vector(31 downto 0) := x"80000000"; -- default data memory address space base address
46 36 zero_gravi
 
47 40 zero_gravi
  -- (external) bus interface --
48
  constant wb_pipe_mode_c    : boolean := false; -- *external* bus protocol: false=classic/standard wishbone mode (default), true=pipelined wishbone mode
49
  constant xbus_big_endian_c : boolean := true; -- external memory access byte order: true=big endian (default); false=little endian
50
 
51
  -- CPU core --
52 57 zero_gravi
  constant ipb_entries_c     : natural := 4; -- entries in CPU instruction prefetch buffer, has to be a power of 2, default=2
53 56 zero_gravi
  constant cp_timeout_en_c   : boolean := false; -- auto-terminate pending co-processor operations after 256 cycles (for debugging only), default = false
54
  constant dedicated_reset_c : boolean := false; -- use dedicated hardware reset value for UNCRITICAL registers (FALSE=reset value is irrelevant (might simplify HW), default; TRUE=defined LOW reset value)
55 40 zero_gravi
 
56 54 zero_gravi
  -- "critical" number of implemented PMP regions --
57
  -- if more PMP regions (> pmp_num_regions_critical_c) are defined, another register stage is automatically inserted into the memory interfaces
58
  -- increasing instruction fetch & data access latency by +1 cycle but also reducing critical path length
59
  constant pmp_num_regions_critical_c : natural := 8; -- default=8
60 47 zero_gravi
 
61 57 zero_gravi
  -- "response time window" for processor-internal memories and IO devices
62
  constant max_proc_int_response_time_c : natural := 15; -- cycles after which an *unacknowledged* internal bus access will timeout and trigger a bus fault exception (min 2)
63
 
64 59 zero_gravi
  -- jtag tap - identifier --
65
  constant jtag_tap_idcode_version_c : std_ulogic_vector(03 downto 0) := x"0"; -- version
66
  constant jtag_tap_idcode_partid_c  : std_ulogic_vector(15 downto 0) := x"cafe"; -- part number
67
  constant jtag_tap_idcode_manid_c   : std_ulogic_vector(10 downto 0) := "00000000000"; -- manufacturer id
68
 
69 12 zero_gravi
  -- Helper Functions -----------------------------------------------------------------------
70 2 zero_gravi
  -- -------------------------------------------------------------------------------------------
71
  function index_size_f(input : natural) return natural;
72
  function cond_sel_natural_f(cond : boolean; val_t : natural; val_f : natural) return natural;
73 56 zero_gravi
  function cond_sel_int_f(cond : boolean; val_t : integer; val_f : integer) return integer;
74 2 zero_gravi
  function cond_sel_stdulogicvector_f(cond : boolean; val_t : std_ulogic_vector; val_f : std_ulogic_vector) return std_ulogic_vector;
75 56 zero_gravi
  function cond_sel_stdulogic_f(cond : boolean; val_t : std_ulogic; val_f : std_ulogic) return std_ulogic;
76 50 zero_gravi
  function cond_sel_string_f(cond : boolean; val_t : string; val_f : string) return string;
77 2 zero_gravi
  function bool_to_ulogic_f(cond : boolean) return std_ulogic;
78 15 zero_gravi
  function or_all_f(a : std_ulogic_vector) return std_ulogic;
79
  function and_all_f(a : std_ulogic_vector) return std_ulogic;
80
  function xor_all_f(a : std_ulogic_vector) return std_ulogic;
81 2 zero_gravi
  function xnor_all_f(a : std_ulogic_vector) return std_ulogic;
82 6 zero_gravi
  function to_hexchar_f(input : std_ulogic_vector(3 downto 0)) return character;
83 40 zero_gravi
  function hexchar_to_stdulogicvector_f(input : character) return std_ulogic_vector;
84 32 zero_gravi
  function bit_rev_f(input : std_ulogic_vector) return std_ulogic_vector;
85 36 zero_gravi
  function is_power_of_two_f(input : natural) return boolean;
86 40 zero_gravi
  function bswap32_f(input : std_ulogic_vector) return std_ulogic_vector;
87 2 zero_gravi
 
88 56 zero_gravi
  -- Architecture Constants (do not modify!) ------------------------------------------------
89
  -- -------------------------------------------------------------------------------------------
90
  constant data_width_c   : natural := 32; -- native data path width - do not change!
91 59 zero_gravi
  constant hw_version_c   : std_ulogic_vector(31 downto 0) := x"01050509"; -- no touchy!
92 56 zero_gravi
  constant archid_c       : natural := 19; -- official NEORV32 architecture ID - hands off!
93
  constant rf_r0_is_reg_c : boolean := true; -- x0 is a *physical register* that has to be initialized to zero by the CPU
94
  constant def_rst_val_c  : std_ulogic := cond_sel_stdulogic_f(dedicated_reset_c, '0', '-');
95
 
96 15 zero_gravi
  -- Internal Types -------------------------------------------------------------------------
97
  -- -------------------------------------------------------------------------------------------
98 42 zero_gravi
  type pmp_ctrl_if_t is array (0 to 63) of std_ulogic_vector(07 downto 0);
99
  type pmp_addr_if_t is array (0 to 63) of std_ulogic_vector(33 downto 0);
100 49 zero_gravi
  type cp_data_if_t  is array (0 to 7)  of std_ulogic_vector(data_width_c-1 downto 0);
101 15 zero_gravi
 
102 23 zero_gravi
  -- Processor-Internal Address Space Layout ------------------------------------------------
103
  -- -------------------------------------------------------------------------------------------
104 34 zero_gravi
  -- Internal Instruction Memory (IMEM) and Date Memory (DMEM) --
105 39 zero_gravi
  constant imem_base_c          : std_ulogic_vector(data_width_c-1 downto 0) := ispace_base_c; -- internal instruction memory base address
106
  constant dmem_base_c          : std_ulogic_vector(data_width_c-1 downto 0) := dspace_base_c; -- internal data memory base address
107 42 zero_gravi
  --> internal data/instruction memory sizes are configured via top's generics
108 2 zero_gravi
 
109 23 zero_gravi
  -- Internal Bootloader ROM --
110 56 zero_gravi
  constant boot_rom_base_c      : std_ulogic_vector(data_width_c-1 downto 0) := x"ffff0000"; -- bootloader base address, fixed!
111 47 zero_gravi
  constant boot_rom_size_c      : natural := 4*1024; -- module's address space in bytes
112
  constant boot_rom_max_size_c  : natural := 32*1024; -- max module's address space in bytes, fixed!
113 23 zero_gravi
 
114 59 zero_gravi
  -- On-Chip Debugger: Debug Module --
115
  constant dm_base_c            : std_ulogic_vector(data_width_c-1 downto 0) := x"fffff800"; -- base address, fixed!
116
  constant dm_size_c            : natural := 4*32*4; -- debug ROM address space in bytes, fixed
117
  constant dm_code_base_c       : std_ulogic_vector(data_width_c-1 downto 0) := x"fffff800";
118
  constant dm_pbuf_base_c       : std_ulogic_vector(data_width_c-1 downto 0) := x"fffff880";
119
  constant dm_data_base_c       : std_ulogic_vector(data_width_c-1 downto 0) := x"fffff900";
120
  constant dm_sreg_base_c       : std_ulogic_vector(data_width_c-1 downto 0) := x"fffff980";
121
 
122 2 zero_gravi
  -- IO: Peripheral Devices ("IO") Area --
123
  -- Control register(s) (including the device-enable) should be located at the base address of each device
124 56 zero_gravi
  constant io_base_c            : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff00";
125 47 zero_gravi
  constant io_size_c            : natural := 64*4; -- module's address space in bytes, fixed!
126 2 zero_gravi
 
127 47 zero_gravi
  -- Custom Functions Subsystem (CFS) --
128 56 zero_gravi
  constant cfs_base_c           : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff00"; -- base address
129 47 zero_gravi
  constant cfs_size_c           : natural := 32*4; -- module's address space in bytes
130 56 zero_gravi
  constant cfs_reg0_addr_c      : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff00";
131
  constant cfs_reg1_addr_c      : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff04";
132
  constant cfs_reg2_addr_c      : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff08";
133
  constant cfs_reg3_addr_c      : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff0c";
134
  constant cfs_reg4_addr_c      : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff10";
135
  constant cfs_reg5_addr_c      : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff14";
136
  constant cfs_reg6_addr_c      : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff18";
137
  constant cfs_reg7_addr_c      : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff1c";
138
  constant cfs_reg8_addr_c      : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff20";
139
  constant cfs_reg9_addr_c      : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff24";
140
  constant cfs_reg10_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff28";
141
  constant cfs_reg11_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff2c";
142
  constant cfs_reg12_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff30";
143
  constant cfs_reg13_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff34";
144
  constant cfs_reg14_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff38";
145
  constant cfs_reg15_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff3c";
146
  constant cfs_reg16_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff40";
147
  constant cfs_reg17_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff44";
148
  constant cfs_reg18_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff48";
149
  constant cfs_reg19_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff4c";
150
  constant cfs_reg20_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff50";
151
  constant cfs_reg21_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff54";
152
  constant cfs_reg22_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff58";
153
  constant cfs_reg23_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff5c";
154
  constant cfs_reg24_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff60";
155
  constant cfs_reg25_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff64";
156
  constant cfs_reg26_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff68";
157
  constant cfs_reg27_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff6c";
158
  constant cfs_reg28_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff70";
159
  constant cfs_reg29_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff74";
160
  constant cfs_reg30_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff78";
161
  constant cfs_reg31_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff7c";
162 47 zero_gravi
 
163 2 zero_gravi
  -- General Purpose Input/Output Unit (GPIO) --
164 56 zero_gravi
  constant gpio_base_c          : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff80"; -- base address
165 47 zero_gravi
  constant gpio_size_c          : natural := 2*4; -- module's address space in bytes
166 56 zero_gravi
  constant gpio_in_addr_c       : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff80";
167
  constant gpio_out_addr_c      : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff84";
168 2 zero_gravi
 
169 30 zero_gravi
  -- True Random Number Generator (TRNG) --
170 56 zero_gravi
  constant trng_base_c          : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff88"; -- base address
171 47 zero_gravi
  constant trng_size_c          : natural := 1*4; -- module's address space in bytes
172 56 zero_gravi
  constant trng_ctrl_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff88";
173 2 zero_gravi
 
174
  -- Watch Dog Timer (WDT) --
175 56 zero_gravi
  constant wdt_base_c           : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff8c"; -- base address
176 47 zero_gravi
  constant wdt_size_c           : natural := 1*4; -- module's address space in bytes
177 56 zero_gravi
  constant wdt_ctrl_addr_c      : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff8c";
178 2 zero_gravi
 
179
  -- Machine System Timer (MTIME) --
180 56 zero_gravi
  constant mtime_base_c         : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff90"; -- base address
181 47 zero_gravi
  constant mtime_size_c         : natural := 4*4; -- module's address space in bytes
182 56 zero_gravi
  constant mtime_time_lo_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff90";
183
  constant mtime_time_hi_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff94";
184
  constant mtime_cmp_lo_addr_c  : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff98";
185
  constant mtime_cmp_hi_addr_c  : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff9c";
186 2 zero_gravi
 
187 58 zero_gravi
  -- Primary Universal Asynchronous Receiver/Transmitter (UART0) --
188 56 zero_gravi
  constant uart0_base_c         : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffa0"; -- base address
189 50 zero_gravi
  constant uart0_size_c         : natural := 2*4; -- module's address space in bytes
190 56 zero_gravi
  constant uart0_ctrl_addr_c    : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffa0";
191
  constant uart0_rtx_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffa4";
192 2 zero_gravi
 
193
  -- Serial Peripheral Interface (SPI) --
194 56 zero_gravi
  constant spi_base_c           : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffa8"; -- base address
195 47 zero_gravi
  constant spi_size_c           : natural := 2*4; -- module's address space in bytes
196 56 zero_gravi
  constant spi_ctrl_addr_c      : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffa8";
197
  constant spi_rtx_addr_c       : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffac";
198 2 zero_gravi
 
199
  -- Two Wire Interface (TWI) --
200 56 zero_gravi
  constant twi_base_c           : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffb0"; -- base address
201 47 zero_gravi
  constant twi_size_c           : natural := 2*4; -- module's address space in bytes
202 56 zero_gravi
  constant twi_ctrl_addr_c      : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffb0";
203
  constant twi_rtx_addr_c       : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffb4";
204 2 zero_gravi
 
205
  -- Pulse-Width Modulation Controller (PWM) --
206 56 zero_gravi
  constant pwm_base_c           : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffb8"; -- base address
207 47 zero_gravi
  constant pwm_size_c           : natural := 2*4; -- module's address space in bytes
208 56 zero_gravi
  constant pwm_ctrl_addr_c      : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffb8";
209
  constant pwm_duty_addr_c      : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffbc";
210 2 zero_gravi
 
211 49 zero_gravi
  -- Numerically-Controlled Oscillator (NCO) --
212 56 zero_gravi
  constant nco_base_c           : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffc0"; -- base address
213 49 zero_gravi
  constant nco_size_c           : natural := 4*4; -- module's address space in bytes
214 56 zero_gravi
  constant nco_ctrl_addr_c      : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffc0";
215
  constant nco_ch0_addr_c       : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffc4";
216
  constant nco_ch1_addr_c       : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffc8";
217
  constant nco_ch2_addr_c       : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffcc";
218 49 zero_gravi
 
219 58 zero_gravi
  -- Secondary Universal Asynchronous Receiver/Transmitter (UART1) --
220 56 zero_gravi
  constant uart1_base_c         : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffd0"; -- base address
221 50 zero_gravi
  constant uart1_size_c         : natural := 2*4; -- module's address space in bytes
222 56 zero_gravi
  constant uart1_ctrl_addr_c    : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffd0";
223
  constant uart1_rtx_addr_c     : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffd4";
224 50 zero_gravi
 
225 52 zero_gravi
  -- Smart LED (WS2811/WS2812) Interface (NEOLED) --
226 56 zero_gravi
  constant neoled_base_c        : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffd8"; -- base address
227 52 zero_gravi
  constant neoled_size_c        : natural := 2*4; -- module's address space in bytes
228 56 zero_gravi
  constant neoled_ctrl_addr_c   : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffd8";
229
  constant neoled_data_addr_c   : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffdc";
230 12 zero_gravi
 
231 23 zero_gravi
  -- System Information Memory (SYSINFO) --
232 56 zero_gravi
  constant sysinfo_base_c       : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffe0"; -- base address
233 47 zero_gravi
  constant sysinfo_size_c       : natural := 8*4; -- module's address space in bytes
234 12 zero_gravi
 
235 59 zero_gravi
  -- Main CPU Control Bus -------------------------------------------------------------------
236 2 zero_gravi
  -- -------------------------------------------------------------------------------------------
237
  -- register file --
238 49 zero_gravi
  constant ctrl_rf_in_mux_c     : natural :=  0; -- input source select lsb (0=MEM, 1=ALU)
239
  constant ctrl_rf_rs1_adr0_c   : natural :=  1; -- source register 1 address bit 0
240
  constant ctrl_rf_rs1_adr1_c   : natural :=  2; -- source register 1 address bit 1
241
  constant ctrl_rf_rs1_adr2_c   : natural :=  3; -- source register 1 address bit 2
242
  constant ctrl_rf_rs1_adr3_c   : natural :=  4; -- source register 1 address bit 3
243
  constant ctrl_rf_rs1_adr4_c   : natural :=  5; -- source register 1 address bit 4
244
  constant ctrl_rf_rs2_adr0_c   : natural :=  6; -- source register 2 address bit 0
245
  constant ctrl_rf_rs2_adr1_c   : natural :=  7; -- source register 2 address bit 1
246
  constant ctrl_rf_rs2_adr2_c   : natural :=  8; -- source register 2 address bit 2
247
  constant ctrl_rf_rs2_adr3_c   : natural :=  9; -- source register 2 address bit 3
248
  constant ctrl_rf_rs2_adr4_c   : natural := 10; -- source register 2 address bit 4
249 58 zero_gravi
  constant ctrl_rf_rd_adr0_c    : natural := 11; -- destination register address bit 0
250
  constant ctrl_rf_rd_adr1_c    : natural := 12; -- destination register address bit 1
251
  constant ctrl_rf_rd_adr2_c    : natural := 13; -- destination register address bit 2
252
  constant ctrl_rf_rd_adr3_c    : natural := 14; -- destination register address bit 3
253
  constant ctrl_rf_rd_adr4_c    : natural := 15; -- destination register address bit 4
254 49 zero_gravi
  constant ctrl_rf_wb_en_c      : natural := 16; -- write back enable
255
  constant ctrl_rf_r0_we_c      : natural := 17; -- force write access and force rd=r0
256 2 zero_gravi
  -- alu --
257 49 zero_gravi
  constant ctrl_alu_arith_c     : natural := 18; -- ALU arithmetic command
258
  constant ctrl_alu_logic0_c    : natural := 19; -- ALU logic command bit 0
259
  constant ctrl_alu_logic1_c    : natural := 20; -- ALU logic command bit 1
260
  constant ctrl_alu_func0_c     : natural := 21; -- ALU function select command bit 0
261
  constant ctrl_alu_func1_c     : natural := 22; -- ALU function select command bit 1
262
  constant ctrl_alu_addsub_c    : natural := 23; -- 0=ADD, 1=SUB
263
  constant ctrl_alu_opa_mux_c   : natural := 24; -- operand A select (0=rs1, 1=PC)
264
  constant ctrl_alu_opb_mux_c   : natural := 25; -- operand B select (0=rs2, 1=IMM)
265
  constant ctrl_alu_unsigned_c  : natural := 26; -- is unsigned ALU operation
266
  constant ctrl_alu_shift_dir_c : natural := 27; -- shift direction (0=left, 1=right)
267
  constant ctrl_alu_shift_ar_c  : natural := 28; -- is arithmetic shift
268 2 zero_gravi
  -- bus interface --
269 49 zero_gravi
  constant ctrl_bus_size_lsb_c  : natural := 29; -- transfer size lsb (00=byte, 01=half-word)
270
  constant ctrl_bus_size_msb_c  : natural := 30; -- transfer size msb (10=word, 11=?)
271
  constant ctrl_bus_rd_c        : natural := 31; -- read data request
272
  constant ctrl_bus_wr_c        : natural := 32; -- write data request
273
  constant ctrl_bus_if_c        : natural := 33; -- instruction fetch request
274
  constant ctrl_bus_mo_we_c     : natural := 34; -- memory address and data output register write enable
275
  constant ctrl_bus_mi_we_c     : natural := 35; -- memory data input register write enable
276 53 zero_gravi
  constant ctrl_bus_unsigned_c  : natural := 36; -- is unsigned load
277
  constant ctrl_bus_ierr_ack_c  : natural := 37; -- acknowledge instruction fetch bus exceptions
278
  constant ctrl_bus_derr_ack_c  : natural := 38; -- acknowledge data access bus exceptions
279
  constant ctrl_bus_fence_c     : natural := 39; -- executed fence operation
280
  constant ctrl_bus_fencei_c    : natural := 40; -- executed fencei operation
281 57 zero_gravi
  constant ctrl_bus_lock_c      : natural := 41; -- make atomic/exclusive access lock
282
  constant ctrl_bus_de_lock_c   : natural := 42; -- remove atomic/exclusive access 
283
  constant ctrl_bus_ch_lock_c   : natural := 43; -- evaluate atomic/exclusive lock (SC operation)
284 26 zero_gravi
  -- co-processors --
285 57 zero_gravi
  constant ctrl_cp_id_lsb_c     : natural := 44; -- cp select ID lsb
286
  constant ctrl_cp_id_hsb_c     : natural := 45; -- cp select ID
287
  constant ctrl_cp_id_msb_c     : natural := 46; -- cp select ID msb
288 44 zero_gravi
  -- instruction's control blocks (used by cpu co-processors) --
289 53 zero_gravi
  constant ctrl_ir_funct3_0_c   : natural := 47; -- funct3 bit 0
290
  constant ctrl_ir_funct3_1_c   : natural := 48; -- funct3 bit 1
291
  constant ctrl_ir_funct3_2_c   : natural := 49; -- funct3 bit 2
292
  constant ctrl_ir_funct12_0_c  : natural := 50; -- funct12 bit 0
293
  constant ctrl_ir_funct12_1_c  : natural := 51; -- funct12 bit 1
294
  constant ctrl_ir_funct12_2_c  : natural := 52; -- funct12 bit 2
295
  constant ctrl_ir_funct12_3_c  : natural := 53; -- funct12 bit 3
296
  constant ctrl_ir_funct12_4_c  : natural := 54; -- funct12 bit 4
297
  constant ctrl_ir_funct12_5_c  : natural := 55; -- funct12 bit 5
298
  constant ctrl_ir_funct12_6_c  : natural := 56; -- funct12 bit 6
299
  constant ctrl_ir_funct12_7_c  : natural := 57; -- funct12 bit 7
300
  constant ctrl_ir_funct12_8_c  : natural := 58; -- funct12 bit 8
301
  constant ctrl_ir_funct12_9_c  : natural := 59; -- funct12 bit 9
302
  constant ctrl_ir_funct12_10_c : natural := 60; -- funct12 bit 10
303
  constant ctrl_ir_funct12_11_c : natural := 61; -- funct12 bit 11
304
  constant ctrl_ir_opcode7_0_c  : natural := 62; -- opcode7 bit 0
305
  constant ctrl_ir_opcode7_1_c  : natural := 63; -- opcode7 bit 1
306
  constant ctrl_ir_opcode7_2_c  : natural := 64; -- opcode7 bit 2
307
  constant ctrl_ir_opcode7_3_c  : natural := 65; -- opcode7 bit 3
308
  constant ctrl_ir_opcode7_4_c  : natural := 66; -- opcode7 bit 4
309
  constant ctrl_ir_opcode7_5_c  : natural := 67; -- opcode7 bit 5
310
  constant ctrl_ir_opcode7_6_c  : natural := 68; -- opcode7 bit 6
311 47 zero_gravi
  -- CPU status --
312 57 zero_gravi
  constant ctrl_priv_lvl_lsb_c  : natural := 69; -- privilege level lsb
313
  constant ctrl_priv_lvl_msb_c  : natural := 70; -- privilege level msb
314
  constant ctrl_sleep_c         : natural := 71; -- set when CPU is in sleep mode
315
  constant ctrl_trap_c          : natural := 72; -- set when CPU is entering trap execution
316 59 zero_gravi
  constant ctrl_debug_running_c : natural := 73; -- CPU is in debug mode when set
317 2 zero_gravi
  -- control bus size --
318 59 zero_gravi
  constant ctrl_width_c         : natural := 74; -- control bus size
319 2 zero_gravi
 
320 47 zero_gravi
  -- Comparator Bus -------------------------------------------------------------------------
321 2 zero_gravi
  -- -------------------------------------------------------------------------------------------
322 47 zero_gravi
  constant cmp_equal_c : natural := 0;
323
  constant cmp_less_c  : natural := 1; -- for signed and unsigned comparisons
324 2 zero_gravi
 
325
  -- RISC-V Opcode Layout -------------------------------------------------------------------
326
  -- -------------------------------------------------------------------------------------------
327
  constant instr_opcode_lsb_c  : natural :=  0; -- opcode bit 0
328
  constant instr_opcode_msb_c  : natural :=  6; -- opcode bit 6
329
  constant instr_rd_lsb_c      : natural :=  7; -- destination register address bit 0
330
  constant instr_rd_msb_c      : natural := 11; -- destination register address bit 4
331
  constant instr_funct3_lsb_c  : natural := 12; -- funct3 bit 0
332
  constant instr_funct3_msb_c  : natural := 14; -- funct3 bit 2
333
  constant instr_rs1_lsb_c     : natural := 15; -- source register 1 address bit 0
334
  constant instr_rs1_msb_c     : natural := 19; -- source register 1 address bit 4
335
  constant instr_rs2_lsb_c     : natural := 20; -- source register 2 address bit 0
336
  constant instr_rs2_msb_c     : natural := 24; -- source register 2 address bit 4
337
  constant instr_funct7_lsb_c  : natural := 25; -- funct7 bit 0
338
  constant instr_funct7_msb_c  : natural := 31; -- funct7 bit 6
339
  constant instr_funct12_lsb_c : natural := 20; -- funct12 bit 0
340
  constant instr_funct12_msb_c : natural := 31; -- funct12 bit 11
341
  constant instr_imm12_lsb_c   : natural := 20; -- immediate12 bit 0
342
  constant instr_imm12_msb_c   : natural := 31; -- immediate12 bit 11
343
  constant instr_imm20_lsb_c   : natural := 12; -- immediate20 bit 0
344
  constant instr_imm20_msb_c   : natural := 31; -- immediate20 bit 21
345
  constant instr_csr_id_lsb_c  : natural := 20; -- csr select bit 0
346
  constant instr_csr_id_msb_c  : natural := 31; -- csr select bit 11
347 39 zero_gravi
  constant instr_funct5_lsb_c  : natural := 27; -- funct5 select bit 0
348
  constant instr_funct5_msb_c  : natural := 31; -- funct5 select bit 4
349 2 zero_gravi
 
350
  -- RISC-V Opcodes -------------------------------------------------------------------------
351
  -- -------------------------------------------------------------------------------------------
352
  -- alu --
353
  constant opcode_lui_c    : std_ulogic_vector(6 downto 0) := "0110111"; -- load upper immediate
354
  constant opcode_auipc_c  : std_ulogic_vector(6 downto 0) := "0010111"; -- add upper immediate to PC
355
  constant opcode_alui_c   : std_ulogic_vector(6 downto 0) := "0010011"; -- ALU operation with immediate (operation via funct3 and funct7)
356
  constant opcode_alu_c    : std_ulogic_vector(6 downto 0) := "0110011"; -- ALU operation (operation via funct3 and funct7)
357
  -- control flow --
358
  constant opcode_jal_c    : std_ulogic_vector(6 downto 0) := "1101111"; -- jump and link
359 29 zero_gravi
  constant opcode_jalr_c   : std_ulogic_vector(6 downto 0) := "1100111"; -- jump and link with register
360 2 zero_gravi
  constant opcode_branch_c : std_ulogic_vector(6 downto 0) := "1100011"; -- branch (condition set via funct3)
361
  -- memory access --
362
  constant opcode_load_c   : std_ulogic_vector(6 downto 0) := "0000011"; -- load (data type via funct3)
363
  constant opcode_store_c  : std_ulogic_vector(6 downto 0) := "0100011"; -- store (data type via funct3)
364
  -- system/csr --
365 8 zero_gravi
  constant opcode_fence_c  : std_ulogic_vector(6 downto 0) := "0001111"; -- fence / fence.i
366 2 zero_gravi
  constant opcode_syscsr_c : std_ulogic_vector(6 downto 0) := "1110011"; -- system/csr access (type via funct3)
367 52 zero_gravi
  -- atomic memory access (A) --
368 39 zero_gravi
  constant opcode_atomic_c : std_ulogic_vector(6 downto 0) := "0101111"; -- atomic operations (A extension)
369 53 zero_gravi
  -- floating point operations (Zfinx-only) (F/D/H/Q) --
370
  constant opcode_fop_c    : std_ulogic_vector(6 downto 0) := "1010011"; -- dual/single opearand instruction
371 2 zero_gravi
 
372
  -- RISC-V Funct3 --------------------------------------------------------------------------
373
  -- -------------------------------------------------------------------------------------------
374
  -- control flow --
375
  constant funct3_beq_c    : std_ulogic_vector(2 downto 0) := "000"; -- branch if equal
376
  constant funct3_bne_c    : std_ulogic_vector(2 downto 0) := "001"; -- branch if not equal
377
  constant funct3_blt_c    : std_ulogic_vector(2 downto 0) := "100"; -- branch if less than
378
  constant funct3_bge_c    : std_ulogic_vector(2 downto 0) := "101"; -- branch if greater than or equal
379
  constant funct3_bltu_c   : std_ulogic_vector(2 downto 0) := "110"; -- branch if less than (unsigned)
380
  constant funct3_bgeu_c   : std_ulogic_vector(2 downto 0) := "111"; -- branch if greater than or equal (unsigned)
381
  -- memory access --
382
  constant funct3_lb_c     : std_ulogic_vector(2 downto 0) := "000"; -- load byte
383
  constant funct3_lh_c     : std_ulogic_vector(2 downto 0) := "001"; -- load half word
384
  constant funct3_lw_c     : std_ulogic_vector(2 downto 0) := "010"; -- load word
385
  constant funct3_lbu_c    : std_ulogic_vector(2 downto 0) := "100"; -- load byte (unsigned)
386
  constant funct3_lhu_c    : std_ulogic_vector(2 downto 0) := "101"; -- load half word (unsigned)
387
  constant funct3_sb_c     : std_ulogic_vector(2 downto 0) := "000"; -- store byte
388
  constant funct3_sh_c     : std_ulogic_vector(2 downto 0) := "001"; -- store half word
389
  constant funct3_sw_c     : std_ulogic_vector(2 downto 0) := "010"; -- store word
390
  -- alu --
391
  constant funct3_subadd_c : std_ulogic_vector(2 downto 0) := "000"; -- sub/add via funct7
392
  constant funct3_sll_c    : std_ulogic_vector(2 downto 0) := "001"; -- shift logical left
393
  constant funct3_slt_c    : std_ulogic_vector(2 downto 0) := "010"; -- set on less
394
  constant funct3_sltu_c   : std_ulogic_vector(2 downto 0) := "011"; -- set on less unsigned
395
  constant funct3_xor_c    : std_ulogic_vector(2 downto 0) := "100"; -- xor
396
  constant funct3_sr_c     : std_ulogic_vector(2 downto 0) := "101"; -- shift right via funct7
397
  constant funct3_or_c     : std_ulogic_vector(2 downto 0) := "110"; -- or
398
  constant funct3_and_c    : std_ulogic_vector(2 downto 0) := "111"; -- and
399
  -- system/csr --
400 59 zero_gravi
  constant funct3_env_c    : std_ulogic_vector(2 downto 0) := "000"; -- ecall, ebreak, mret, wfi, ...
401 2 zero_gravi
  constant funct3_csrrw_c  : std_ulogic_vector(2 downto 0) := "001"; -- atomic r/w
402
  constant funct3_csrrs_c  : std_ulogic_vector(2 downto 0) := "010"; -- atomic read & set bit
403
  constant funct3_csrrc_c  : std_ulogic_vector(2 downto 0) := "011"; -- atomic read & clear bit
404
  constant funct3_csrrwi_c : std_ulogic_vector(2 downto 0) := "101"; -- atomic r/w immediate
405
  constant funct3_csrrsi_c : std_ulogic_vector(2 downto 0) := "110"; -- atomic read & set bit immediate
406
  constant funct3_csrrci_c : std_ulogic_vector(2 downto 0) := "111"; -- atomic read & clear bit immediate
407 8 zero_gravi
  -- fence --
408
  constant funct3_fence_c  : std_ulogic_vector(2 downto 0) := "000"; -- fence - order IO/memory access (->NOP)
409
  constant funct3_fencei_c : std_ulogic_vector(2 downto 0) := "001"; -- fencei - instructon stream sync
410 2 zero_gravi
 
411 39 zero_gravi
  -- RISC-V Funct12 -------------------------------------------------------------------------
412 11 zero_gravi
  -- -------------------------------------------------------------------------------------------
413
  -- system --
414
  constant funct12_ecall_c  : std_ulogic_vector(11 downto 0) := x"000"; -- ECALL
415
  constant funct12_ebreak_c : std_ulogic_vector(11 downto 0) := x"001"; -- EBREAK
416
  constant funct12_mret_c   : std_ulogic_vector(11 downto 0) := x"302"; -- MRET
417
  constant funct12_wfi_c    : std_ulogic_vector(11 downto 0) := x"105"; -- WFI
418 59 zero_gravi
  constant funct12_dret_c   : std_ulogic_vector(11 downto 0) := x"7b2"; -- DRET
419 11 zero_gravi
 
420 39 zero_gravi
  -- RISC-V Funct5 --------------------------------------------------------------------------
421
  -- -------------------------------------------------------------------------------------------
422
  -- atomic operations --
423
  constant funct5_a_lr_c : std_ulogic_vector(4 downto 0) := "00010"; -- LR
424
  constant funct5_a_sc_c : std_ulogic_vector(4 downto 0) := "00011"; -- SC
425
 
426 54 zero_gravi
  -- RISC-V Floating-Point Stuff ------------------------------------------------------------
427 52 zero_gravi
  -- -------------------------------------------------------------------------------------------
428 54 zero_gravi
  -- formats --
429
  constant float_single_c : std_ulogic_vector(1 downto 0) := "00"; -- single-precision (32-bit)
430
  constant float_double_c : std_ulogic_vector(1 downto 0) := "01"; -- double-precision (64-bit)
431
  constant float_half_c   : std_ulogic_vector(1 downto 0) := "10"; -- half-precision (16-bit)
432
  constant float_quad_c   : std_ulogic_vector(1 downto 0) := "11"; -- quad-precision (128-bit)
433 52 zero_gravi
 
434 54 zero_gravi
  -- number class flags --
435
  constant fp_class_neg_inf_c    : natural := 0; -- negative infinity
436
  constant fp_class_neg_norm_c   : natural := 1; -- negative normal number
437
  constant fp_class_neg_denorm_c : natural := 2; -- negative subnormal number
438
  constant fp_class_neg_zero_c   : natural := 3; -- negative zero
439
  constant fp_class_pos_zero_c   : natural := 4; -- positive zero
440
  constant fp_class_pos_denorm_c : natural := 5; -- positive subnormal number
441
  constant fp_class_pos_norm_c   : natural := 6; -- positive normal number
442
  constant fp_class_pos_inf_c    : natural := 7; -- positive infinity
443
  constant fp_class_snan_c       : natural := 8; -- signaling NaN (sNaN)
444
  constant fp_class_qnan_c       : natural := 9; -- quiet NaN (qNaN)
445
 
446
  -- exception flags --
447
  constant fp_exc_nv_c : natural := 0; -- invalid operation
448
  constant fp_exc_dz_c : natural := 1; -- divide by zero
449
  constant fp_exc_of_c : natural := 2; -- overflow
450
  constant fp_exc_uf_c : natural := 3; -- underflow
451
  constant fp_exc_nx_c : natural := 4; -- inexact
452
 
453
  -- special values (single-precision) --
454
  constant fp_single_qnan_c     : std_ulogic_vector(31 downto 0) := x"7fc00000"; -- quiet NaN
455
  constant fp_single_snan_c     : std_ulogic_vector(31 downto 0) := x"7fa00000"; -- signaling NaN
456
  constant fp_single_pos_inf_c  : std_ulogic_vector(31 downto 0) := x"7f800000"; -- positive infinity
457
  constant fp_single_neg_inf_c  : std_ulogic_vector(31 downto 0) := x"ff800000"; -- negative infinity
458
  constant fp_single_pos_zero_c : std_ulogic_vector(31 downto 0) := x"00000000"; -- positive zero
459
  constant fp_single_neg_zero_c : std_ulogic_vector(31 downto 0) := x"80000000"; -- negative zero
460
 
461 29 zero_gravi
  -- RISC-V CSR Addresses -------------------------------------------------------------------
462
  -- -------------------------------------------------------------------------------------------
463 56 zero_gravi
  -- <<< standard read/write CSRs >>> --
464
  -- user floating-point CSRs --
465 52 zero_gravi
  constant csr_class_float_c    : std_ulogic_vector(07 downto 0) := x"00"; -- floating point
466
  constant csr_fflags_c         : std_ulogic_vector(11 downto 0) := x"001";
467
  constant csr_frm_c            : std_ulogic_vector(11 downto 0) := x"002";
468
  constant csr_fcsr_c           : std_ulogic_vector(11 downto 0) := x"003";
469 56 zero_gravi
  -- machine trap setup --
470
  constant csr_class_setup_c    : std_ulogic_vector(07 downto 0) := x"30"; -- trap setup
471 42 zero_gravi
  constant csr_mstatus_c        : std_ulogic_vector(11 downto 0) := x"300";
472
  constant csr_misa_c           : std_ulogic_vector(11 downto 0) := x"301";
473
  constant csr_mie_c            : std_ulogic_vector(11 downto 0) := x"304";
474
  constant csr_mtvec_c          : std_ulogic_vector(11 downto 0) := x"305";
475
  constant csr_mcounteren_c     : std_ulogic_vector(11 downto 0) := x"306";
476
  constant csr_mstatush_c       : std_ulogic_vector(11 downto 0) := x"310";
477 56 zero_gravi
  -- machine counter setup --
478
  constant csr_cnt_setup_c      : std_ulogic_vector(06 downto 0) := x"3" & "001"; -- counter setup
479 42 zero_gravi
  constant csr_mcountinhibit_c  : std_ulogic_vector(11 downto 0) := x"320";
480
  constant csr_mhpmevent3_c     : std_ulogic_vector(11 downto 0) := x"323";
481
  constant csr_mhpmevent4_c     : std_ulogic_vector(11 downto 0) := x"324";
482
  constant csr_mhpmevent5_c     : std_ulogic_vector(11 downto 0) := x"325";
483
  constant csr_mhpmevent6_c     : std_ulogic_vector(11 downto 0) := x"326";
484
  constant csr_mhpmevent7_c     : std_ulogic_vector(11 downto 0) := x"327";
485
  constant csr_mhpmevent8_c     : std_ulogic_vector(11 downto 0) := x"328";
486
  constant csr_mhpmevent9_c     : std_ulogic_vector(11 downto 0) := x"329";
487
  constant csr_mhpmevent10_c    : std_ulogic_vector(11 downto 0) := x"32a";
488
  constant csr_mhpmevent11_c    : std_ulogic_vector(11 downto 0) := x"32b";
489
  constant csr_mhpmevent12_c    : std_ulogic_vector(11 downto 0) := x"32c";
490
  constant csr_mhpmevent13_c    : std_ulogic_vector(11 downto 0) := x"32d";
491
  constant csr_mhpmevent14_c    : std_ulogic_vector(11 downto 0) := x"32e";
492
  constant csr_mhpmevent15_c    : std_ulogic_vector(11 downto 0) := x"32f";
493
  constant csr_mhpmevent16_c    : std_ulogic_vector(11 downto 0) := x"330";
494
  constant csr_mhpmevent17_c    : std_ulogic_vector(11 downto 0) := x"331";
495
  constant csr_mhpmevent18_c    : std_ulogic_vector(11 downto 0) := x"332";
496
  constant csr_mhpmevent19_c    : std_ulogic_vector(11 downto 0) := x"333";
497
  constant csr_mhpmevent20_c    : std_ulogic_vector(11 downto 0) := x"334";
498
  constant csr_mhpmevent21_c    : std_ulogic_vector(11 downto 0) := x"335";
499
  constant csr_mhpmevent22_c    : std_ulogic_vector(11 downto 0) := x"336";
500
  constant csr_mhpmevent23_c    : std_ulogic_vector(11 downto 0) := x"337";
501
  constant csr_mhpmevent24_c    : std_ulogic_vector(11 downto 0) := x"338";
502
  constant csr_mhpmevent25_c    : std_ulogic_vector(11 downto 0) := x"339";
503
  constant csr_mhpmevent26_c    : std_ulogic_vector(11 downto 0) := x"33a";
504
  constant csr_mhpmevent27_c    : std_ulogic_vector(11 downto 0) := x"33b";
505
  constant csr_mhpmevent28_c    : std_ulogic_vector(11 downto 0) := x"33c";
506
  constant csr_mhpmevent29_c    : std_ulogic_vector(11 downto 0) := x"33d";
507
  constant csr_mhpmevent30_c    : std_ulogic_vector(11 downto 0) := x"33e";
508
  constant csr_mhpmevent31_c    : std_ulogic_vector(11 downto 0) := x"33f";
509 56 zero_gravi
  -- machine trap handling --
510 52 zero_gravi
  constant csr_class_trap_c     : std_ulogic_vector(07 downto 0) := x"34"; -- machine trap handling
511 42 zero_gravi
  constant csr_mscratch_c       : std_ulogic_vector(11 downto 0) := x"340";
512
  constant csr_mepc_c           : std_ulogic_vector(11 downto 0) := x"341";
513
  constant csr_mcause_c         : std_ulogic_vector(11 downto 0) := x"342";
514
  constant csr_mtval_c          : std_ulogic_vector(11 downto 0) := x"343";
515
  constant csr_mip_c            : std_ulogic_vector(11 downto 0) := x"344";
516 56 zero_gravi
  -- physical memory protection - configuration --
517 52 zero_gravi
  constant csr_class_pmpcfg_c   : std_ulogic_vector(07 downto 0) := x"3a"; -- pmp configuration
518 42 zero_gravi
  constant csr_pmpcfg0_c        : std_ulogic_vector(11 downto 0) := x"3a0";
519
  constant csr_pmpcfg1_c        : std_ulogic_vector(11 downto 0) := x"3a1";
520
  constant csr_pmpcfg2_c        : std_ulogic_vector(11 downto 0) := x"3a2";
521
  constant csr_pmpcfg3_c        : std_ulogic_vector(11 downto 0) := x"3a3";
522
  constant csr_pmpcfg4_c        : std_ulogic_vector(11 downto 0) := x"3a4";
523
  constant csr_pmpcfg5_c        : std_ulogic_vector(11 downto 0) := x"3a5";
524
  constant csr_pmpcfg6_c        : std_ulogic_vector(11 downto 0) := x"3a6";
525
  constant csr_pmpcfg7_c        : std_ulogic_vector(11 downto 0) := x"3a7";
526
  constant csr_pmpcfg8_c        : std_ulogic_vector(11 downto 0) := x"3a8";
527
  constant csr_pmpcfg9_c        : std_ulogic_vector(11 downto 0) := x"3a9";
528
  constant csr_pmpcfg10_c       : std_ulogic_vector(11 downto 0) := x"3aa";
529
  constant csr_pmpcfg11_c       : std_ulogic_vector(11 downto 0) := x"3ab";
530
  constant csr_pmpcfg12_c       : std_ulogic_vector(11 downto 0) := x"3ac";
531
  constant csr_pmpcfg13_c       : std_ulogic_vector(11 downto 0) := x"3ad";
532
  constant csr_pmpcfg14_c       : std_ulogic_vector(11 downto 0) := x"3ae";
533
  constant csr_pmpcfg15_c       : std_ulogic_vector(11 downto 0) := x"3af";
534 56 zero_gravi
  -- physical memory protection - address --
535 42 zero_gravi
  constant csr_pmpaddr0_c       : std_ulogic_vector(11 downto 0) := x"3b0";
536
  constant csr_pmpaddr1_c       : std_ulogic_vector(11 downto 0) := x"3b1";
537
  constant csr_pmpaddr2_c       : std_ulogic_vector(11 downto 0) := x"3b2";
538
  constant csr_pmpaddr3_c       : std_ulogic_vector(11 downto 0) := x"3b3";
539
  constant csr_pmpaddr4_c       : std_ulogic_vector(11 downto 0) := x"3b4";
540
  constant csr_pmpaddr5_c       : std_ulogic_vector(11 downto 0) := x"3b5";
541
  constant csr_pmpaddr6_c       : std_ulogic_vector(11 downto 0) := x"3b6";
542
  constant csr_pmpaddr7_c       : std_ulogic_vector(11 downto 0) := x"3b7";
543
  constant csr_pmpaddr8_c       : std_ulogic_vector(11 downto 0) := x"3b8";
544
  constant csr_pmpaddr9_c       : std_ulogic_vector(11 downto 0) := x"3b9";
545
  constant csr_pmpaddr10_c      : std_ulogic_vector(11 downto 0) := x"3ba";
546
  constant csr_pmpaddr11_c      : std_ulogic_vector(11 downto 0) := x"3bb";
547
  constant csr_pmpaddr12_c      : std_ulogic_vector(11 downto 0) := x"3bc";
548
  constant csr_pmpaddr13_c      : std_ulogic_vector(11 downto 0) := x"3bd";
549
  constant csr_pmpaddr14_c      : std_ulogic_vector(11 downto 0) := x"3be";
550
  constant csr_pmpaddr15_c      : std_ulogic_vector(11 downto 0) := x"3bf";
551
  constant csr_pmpaddr16_c      : std_ulogic_vector(11 downto 0) := x"3c0";
552
  constant csr_pmpaddr17_c      : std_ulogic_vector(11 downto 0) := x"3c1";
553
  constant csr_pmpaddr18_c      : std_ulogic_vector(11 downto 0) := x"3c2";
554
  constant csr_pmpaddr19_c      : std_ulogic_vector(11 downto 0) := x"3c3";
555
  constant csr_pmpaddr20_c      : std_ulogic_vector(11 downto 0) := x"3c4";
556
  constant csr_pmpaddr21_c      : std_ulogic_vector(11 downto 0) := x"3c5";
557
  constant csr_pmpaddr22_c      : std_ulogic_vector(11 downto 0) := x"3c6";
558
  constant csr_pmpaddr23_c      : std_ulogic_vector(11 downto 0) := x"3c7";
559
  constant csr_pmpaddr24_c      : std_ulogic_vector(11 downto 0) := x"3c8";
560
  constant csr_pmpaddr25_c      : std_ulogic_vector(11 downto 0) := x"3c9";
561
  constant csr_pmpaddr26_c      : std_ulogic_vector(11 downto 0) := x"3ca";
562
  constant csr_pmpaddr27_c      : std_ulogic_vector(11 downto 0) := x"3cb";
563
  constant csr_pmpaddr28_c      : std_ulogic_vector(11 downto 0) := x"3cc";
564
  constant csr_pmpaddr29_c      : std_ulogic_vector(11 downto 0) := x"3cd";
565
  constant csr_pmpaddr30_c      : std_ulogic_vector(11 downto 0) := x"3ce";
566
  constant csr_pmpaddr31_c      : std_ulogic_vector(11 downto 0) := x"3cf";
567
  constant csr_pmpaddr32_c      : std_ulogic_vector(11 downto 0) := x"3d0";
568
  constant csr_pmpaddr33_c      : std_ulogic_vector(11 downto 0) := x"3d1";
569
  constant csr_pmpaddr34_c      : std_ulogic_vector(11 downto 0) := x"3d2";
570
  constant csr_pmpaddr35_c      : std_ulogic_vector(11 downto 0) := x"3d3";
571
  constant csr_pmpaddr36_c      : std_ulogic_vector(11 downto 0) := x"3d4";
572
  constant csr_pmpaddr37_c      : std_ulogic_vector(11 downto 0) := x"3d5";
573
  constant csr_pmpaddr38_c      : std_ulogic_vector(11 downto 0) := x"3d6";
574
  constant csr_pmpaddr39_c      : std_ulogic_vector(11 downto 0) := x"3d7";
575
  constant csr_pmpaddr40_c      : std_ulogic_vector(11 downto 0) := x"3d8";
576
  constant csr_pmpaddr41_c      : std_ulogic_vector(11 downto 0) := x"3d9";
577
  constant csr_pmpaddr42_c      : std_ulogic_vector(11 downto 0) := x"3da";
578
  constant csr_pmpaddr43_c      : std_ulogic_vector(11 downto 0) := x"3db";
579
  constant csr_pmpaddr44_c      : std_ulogic_vector(11 downto 0) := x"3dc";
580
  constant csr_pmpaddr45_c      : std_ulogic_vector(11 downto 0) := x"3dd";
581
  constant csr_pmpaddr46_c      : std_ulogic_vector(11 downto 0) := x"3de";
582
  constant csr_pmpaddr47_c      : std_ulogic_vector(11 downto 0) := x"3df";
583
  constant csr_pmpaddr48_c      : std_ulogic_vector(11 downto 0) := x"3e0";
584
  constant csr_pmpaddr49_c      : std_ulogic_vector(11 downto 0) := x"3e1";
585
  constant csr_pmpaddr50_c      : std_ulogic_vector(11 downto 0) := x"3e2";
586
  constant csr_pmpaddr51_c      : std_ulogic_vector(11 downto 0) := x"3e3";
587
  constant csr_pmpaddr52_c      : std_ulogic_vector(11 downto 0) := x"3e4";
588
  constant csr_pmpaddr53_c      : std_ulogic_vector(11 downto 0) := x"3e5";
589
  constant csr_pmpaddr54_c      : std_ulogic_vector(11 downto 0) := x"3e6";
590
  constant csr_pmpaddr55_c      : std_ulogic_vector(11 downto 0) := x"3e7";
591
  constant csr_pmpaddr56_c      : std_ulogic_vector(11 downto 0) := x"3e8";
592
  constant csr_pmpaddr57_c      : std_ulogic_vector(11 downto 0) := x"3e9";
593
  constant csr_pmpaddr58_c      : std_ulogic_vector(11 downto 0) := x"3ea";
594
  constant csr_pmpaddr59_c      : std_ulogic_vector(11 downto 0) := x"3eb";
595
  constant csr_pmpaddr60_c      : std_ulogic_vector(11 downto 0) := x"3ec";
596
  constant csr_pmpaddr61_c      : std_ulogic_vector(11 downto 0) := x"3ed";
597
  constant csr_pmpaddr62_c      : std_ulogic_vector(11 downto 0) := x"3ee";
598
  constant csr_pmpaddr63_c      : std_ulogic_vector(11 downto 0) := x"3ef";
599 59 zero_gravi
  -- debug mode registers --
600
  constant csr_class_debug_c    : std_ulogic_vector(09 downto 0) := x"7b" & "00"; -- debug registers
601
  constant csr_dcsr_c           : std_ulogic_vector(11 downto 0) := x"7b0";
602
  constant csr_dpc_c            : std_ulogic_vector(11 downto 0) := x"7b1";
603
  constant csr_dscratch0_c      : std_ulogic_vector(11 downto 0) := x"7b2";
604 56 zero_gravi
  -- machine counters/timers --
605 42 zero_gravi
  constant csr_mcycle_c         : std_ulogic_vector(11 downto 0) := x"b00";
606
  constant csr_minstret_c       : std_ulogic_vector(11 downto 0) := x"b02";
607
  --
608
  constant csr_mhpmcounter3_c   : std_ulogic_vector(11 downto 0) := x"b03";
609
  constant csr_mhpmcounter4_c   : std_ulogic_vector(11 downto 0) := x"b04";
610
  constant csr_mhpmcounter5_c   : std_ulogic_vector(11 downto 0) := x"b05";
611
  constant csr_mhpmcounter6_c   : std_ulogic_vector(11 downto 0) := x"b06";
612
  constant csr_mhpmcounter7_c   : std_ulogic_vector(11 downto 0) := x"b07";
613
  constant csr_mhpmcounter8_c   : std_ulogic_vector(11 downto 0) := x"b08";
614
  constant csr_mhpmcounter9_c   : std_ulogic_vector(11 downto 0) := x"b09";
615
  constant csr_mhpmcounter10_c  : std_ulogic_vector(11 downto 0) := x"b0a";
616
  constant csr_mhpmcounter11_c  : std_ulogic_vector(11 downto 0) := x"b0b";
617
  constant csr_mhpmcounter12_c  : std_ulogic_vector(11 downto 0) := x"b0c";
618
  constant csr_mhpmcounter13_c  : std_ulogic_vector(11 downto 0) := x"b0d";
619
  constant csr_mhpmcounter14_c  : std_ulogic_vector(11 downto 0) := x"b0e";
620
  constant csr_mhpmcounter15_c  : std_ulogic_vector(11 downto 0) := x"b0f";
621
  constant csr_mhpmcounter16_c  : std_ulogic_vector(11 downto 0) := x"b10";
622
  constant csr_mhpmcounter17_c  : std_ulogic_vector(11 downto 0) := x"b11";
623
  constant csr_mhpmcounter18_c  : std_ulogic_vector(11 downto 0) := x"b12";
624
  constant csr_mhpmcounter19_c  : std_ulogic_vector(11 downto 0) := x"b13";
625
  constant csr_mhpmcounter20_c  : std_ulogic_vector(11 downto 0) := x"b14";
626
  constant csr_mhpmcounter21_c  : std_ulogic_vector(11 downto 0) := x"b15";
627
  constant csr_mhpmcounter22_c  : std_ulogic_vector(11 downto 0) := x"b16";
628
  constant csr_mhpmcounter23_c  : std_ulogic_vector(11 downto 0) := x"b17";
629
  constant csr_mhpmcounter24_c  : std_ulogic_vector(11 downto 0) := x"b18";
630
  constant csr_mhpmcounter25_c  : std_ulogic_vector(11 downto 0) := x"b19";
631
  constant csr_mhpmcounter26_c  : std_ulogic_vector(11 downto 0) := x"b1a";
632
  constant csr_mhpmcounter27_c  : std_ulogic_vector(11 downto 0) := x"b1b";
633
  constant csr_mhpmcounter28_c  : std_ulogic_vector(11 downto 0) := x"b1c";
634
  constant csr_mhpmcounter29_c  : std_ulogic_vector(11 downto 0) := x"b1d";
635
  constant csr_mhpmcounter30_c  : std_ulogic_vector(11 downto 0) := x"b1e";
636
  constant csr_mhpmcounter31_c  : std_ulogic_vector(11 downto 0) := x"b1f";
637
  --
638
  constant csr_mcycleh_c        : std_ulogic_vector(11 downto 0) := x"b80";
639
  constant csr_minstreth_c      : std_ulogic_vector(11 downto 0) := x"b82";
640
  --
641
  constant csr_mhpmcounter3h_c  : std_ulogic_vector(11 downto 0) := x"b83";
642
  constant csr_mhpmcounter4h_c  : std_ulogic_vector(11 downto 0) := x"b84";
643
  constant csr_mhpmcounter5h_c  : std_ulogic_vector(11 downto 0) := x"b85";
644
  constant csr_mhpmcounter6h_c  : std_ulogic_vector(11 downto 0) := x"b86";
645
  constant csr_mhpmcounter7h_c  : std_ulogic_vector(11 downto 0) := x"b87";
646
  constant csr_mhpmcounter8h_c  : std_ulogic_vector(11 downto 0) := x"b88";
647
  constant csr_mhpmcounter9h_c  : std_ulogic_vector(11 downto 0) := x"b89";
648
  constant csr_mhpmcounter10h_c : std_ulogic_vector(11 downto 0) := x"b8a";
649
  constant csr_mhpmcounter11h_c : std_ulogic_vector(11 downto 0) := x"b8b";
650
  constant csr_mhpmcounter12h_c : std_ulogic_vector(11 downto 0) := x"b8c";
651
  constant csr_mhpmcounter13h_c : std_ulogic_vector(11 downto 0) := x"b8d";
652
  constant csr_mhpmcounter14h_c : std_ulogic_vector(11 downto 0) := x"b8e";
653
  constant csr_mhpmcounter15h_c : std_ulogic_vector(11 downto 0) := x"b8f";
654
  constant csr_mhpmcounter16h_c : std_ulogic_vector(11 downto 0) := x"b90";
655
  constant csr_mhpmcounter17h_c : std_ulogic_vector(11 downto 0) := x"b91";
656
  constant csr_mhpmcounter18h_c : std_ulogic_vector(11 downto 0) := x"b92";
657
  constant csr_mhpmcounter19h_c : std_ulogic_vector(11 downto 0) := x"b93";
658
  constant csr_mhpmcounter20h_c : std_ulogic_vector(11 downto 0) := x"b94";
659
  constant csr_mhpmcounter21h_c : std_ulogic_vector(11 downto 0) := x"b95";
660
  constant csr_mhpmcounter22h_c : std_ulogic_vector(11 downto 0) := x"b96";
661
  constant csr_mhpmcounter23h_c : std_ulogic_vector(11 downto 0) := x"b97";
662
  constant csr_mhpmcounter24h_c : std_ulogic_vector(11 downto 0) := x"b98";
663
  constant csr_mhpmcounter25h_c : std_ulogic_vector(11 downto 0) := x"b99";
664
  constant csr_mhpmcounter26h_c : std_ulogic_vector(11 downto 0) := x"b9a";
665
  constant csr_mhpmcounter27h_c : std_ulogic_vector(11 downto 0) := x"b9b";
666
  constant csr_mhpmcounter28h_c : std_ulogic_vector(11 downto 0) := x"b9c";
667
  constant csr_mhpmcounter29h_c : std_ulogic_vector(11 downto 0) := x"b9d";
668
  constant csr_mhpmcounter30h_c : std_ulogic_vector(11 downto 0) := x"b9e";
669
  constant csr_mhpmcounter31h_c : std_ulogic_vector(11 downto 0) := x"b9f";
670
 
671 56 zero_gravi
  -- <<< standard read-only CSRs >>> --
672
  -- user counters/timers --
673 42 zero_gravi
  constant csr_cycle_c          : std_ulogic_vector(11 downto 0) := x"c00";
674
  constant csr_time_c           : std_ulogic_vector(11 downto 0) := x"c01";
675
  constant csr_instret_c        : std_ulogic_vector(11 downto 0) := x"c02";
676 29 zero_gravi
  --
677 42 zero_gravi
  constant csr_hpmcounter3_c    : std_ulogic_vector(11 downto 0) := x"c03";
678
  constant csr_hpmcounter4_c    : std_ulogic_vector(11 downto 0) := x"c04";
679
  constant csr_hpmcounter5_c    : std_ulogic_vector(11 downto 0) := x"c05";
680
  constant csr_hpmcounter6_c    : std_ulogic_vector(11 downto 0) := x"c06";
681
  constant csr_hpmcounter7_c    : std_ulogic_vector(11 downto 0) := x"c07";
682
  constant csr_hpmcounter8_c    : std_ulogic_vector(11 downto 0) := x"c08";
683
  constant csr_hpmcounter9_c    : std_ulogic_vector(11 downto 0) := x"c09";
684
  constant csr_hpmcounter10_c   : std_ulogic_vector(11 downto 0) := x"c0a";
685
  constant csr_hpmcounter11_c   : std_ulogic_vector(11 downto 0) := x"c0b";
686
  constant csr_hpmcounter12_c   : std_ulogic_vector(11 downto 0) := x"c0c";
687
  constant csr_hpmcounter13_c   : std_ulogic_vector(11 downto 0) := x"c0d";
688
  constant csr_hpmcounter14_c   : std_ulogic_vector(11 downto 0) := x"c0e";
689
  constant csr_hpmcounter15_c   : std_ulogic_vector(11 downto 0) := x"c0f";
690
  constant csr_hpmcounter16_c   : std_ulogic_vector(11 downto 0) := x"c10";
691
  constant csr_hpmcounter17_c   : std_ulogic_vector(11 downto 0) := x"c11";
692
  constant csr_hpmcounter18_c   : std_ulogic_vector(11 downto 0) := x"c12";
693
  constant csr_hpmcounter19_c   : std_ulogic_vector(11 downto 0) := x"c13";
694
  constant csr_hpmcounter20_c   : std_ulogic_vector(11 downto 0) := x"c14";
695
  constant csr_hpmcounter21_c   : std_ulogic_vector(11 downto 0) := x"c15";
696
  constant csr_hpmcounter22_c   : std_ulogic_vector(11 downto 0) := x"c16";
697
  constant csr_hpmcounter23_c   : std_ulogic_vector(11 downto 0) := x"c17";
698
  constant csr_hpmcounter24_c   : std_ulogic_vector(11 downto 0) := x"c18";
699
  constant csr_hpmcounter25_c   : std_ulogic_vector(11 downto 0) := x"c19";
700
  constant csr_hpmcounter26_c   : std_ulogic_vector(11 downto 0) := x"c1a";
701
  constant csr_hpmcounter27_c   : std_ulogic_vector(11 downto 0) := x"c1b";
702
  constant csr_hpmcounter28_c   : std_ulogic_vector(11 downto 0) := x"c1c";
703
  constant csr_hpmcounter29_c   : std_ulogic_vector(11 downto 0) := x"c1d";
704
  constant csr_hpmcounter30_c   : std_ulogic_vector(11 downto 0) := x"c1e";
705
  constant csr_hpmcounter31_c   : std_ulogic_vector(11 downto 0) := x"c1f";
706 29 zero_gravi
  --
707 42 zero_gravi
  constant csr_cycleh_c         : std_ulogic_vector(11 downto 0) := x"c80";
708
  constant csr_timeh_c          : std_ulogic_vector(11 downto 0) := x"c81";
709
  constant csr_instreth_c       : std_ulogic_vector(11 downto 0) := x"c82";
710 29 zero_gravi
  --
711 42 zero_gravi
  constant csr_hpmcounter3h_c   : std_ulogic_vector(11 downto 0) := x"c83";
712
  constant csr_hpmcounter4h_c   : std_ulogic_vector(11 downto 0) := x"c84";
713
  constant csr_hpmcounter5h_c   : std_ulogic_vector(11 downto 0) := x"c85";
714
  constant csr_hpmcounter6h_c   : std_ulogic_vector(11 downto 0) := x"c86";
715
  constant csr_hpmcounter7h_c   : std_ulogic_vector(11 downto 0) := x"c87";
716
  constant csr_hpmcounter8h_c   : std_ulogic_vector(11 downto 0) := x"c88";
717
  constant csr_hpmcounter9h_c   : std_ulogic_vector(11 downto 0) := x"c89";
718
  constant csr_hpmcounter10h_c  : std_ulogic_vector(11 downto 0) := x"c8a";
719
  constant csr_hpmcounter11h_c  : std_ulogic_vector(11 downto 0) := x"c8b";
720
  constant csr_hpmcounter12h_c  : std_ulogic_vector(11 downto 0) := x"c8c";
721
  constant csr_hpmcounter13h_c  : std_ulogic_vector(11 downto 0) := x"c8d";
722
  constant csr_hpmcounter14h_c  : std_ulogic_vector(11 downto 0) := x"c8e";
723
  constant csr_hpmcounter15h_c  : std_ulogic_vector(11 downto 0) := x"c8f";
724
  constant csr_hpmcounter16h_c  : std_ulogic_vector(11 downto 0) := x"c90";
725
  constant csr_hpmcounter17h_c  : std_ulogic_vector(11 downto 0) := x"c91";
726
  constant csr_hpmcounter18h_c  : std_ulogic_vector(11 downto 0) := x"c92";
727
  constant csr_hpmcounter19h_c  : std_ulogic_vector(11 downto 0) := x"c93";
728
  constant csr_hpmcounter20h_c  : std_ulogic_vector(11 downto 0) := x"c94";
729
  constant csr_hpmcounter21h_c  : std_ulogic_vector(11 downto 0) := x"c95";
730
  constant csr_hpmcounter22h_c  : std_ulogic_vector(11 downto 0) := x"c96";
731
  constant csr_hpmcounter23h_c  : std_ulogic_vector(11 downto 0) := x"c97";
732
  constant csr_hpmcounter24h_c  : std_ulogic_vector(11 downto 0) := x"c98";
733
  constant csr_hpmcounter25h_c  : std_ulogic_vector(11 downto 0) := x"c99";
734
  constant csr_hpmcounter26h_c  : std_ulogic_vector(11 downto 0) := x"c9a";
735
  constant csr_hpmcounter27h_c  : std_ulogic_vector(11 downto 0) := x"c9b";
736
  constant csr_hpmcounter28h_c  : std_ulogic_vector(11 downto 0) := x"c9c";
737
  constant csr_hpmcounter29h_c  : std_ulogic_vector(11 downto 0) := x"c9d";
738
  constant csr_hpmcounter30h_c  : std_ulogic_vector(11 downto 0) := x"c9e";
739
  constant csr_hpmcounter31h_c  : std_ulogic_vector(11 downto 0) := x"c9f";
740 56 zero_gravi
  -- machine information registers --
741 42 zero_gravi
  constant csr_mvendorid_c      : std_ulogic_vector(11 downto 0) := x"f11";
742
  constant csr_marchid_c        : std_ulogic_vector(11 downto 0) := x"f12";
743
  constant csr_mimpid_c         : std_ulogic_vector(11 downto 0) := x"f13";
744
  constant csr_mhartid_c        : std_ulogic_vector(11 downto 0) := x"f14";
745 56 zero_gravi
  -- <<< custom (NEORV32-specific) read-only CSRs >>> --
746 42 zero_gravi
  constant csr_mzext_c          : std_ulogic_vector(11 downto 0) := x"fc0";
747
 
748 44 zero_gravi
  -- Co-Processor IDs -----------------------------------------------------------------------
749 2 zero_gravi
  -- -------------------------------------------------------------------------------------------
750 57 zero_gravi
  constant cp_sel_csr_rd_c   : std_ulogic_vector(2 downto 0) := "000"; -- CSR read access ('Zicsr' extension)
751
  constant cp_sel_muldiv_c   : std_ulogic_vector(2 downto 0) := "001"; -- multiplication/division operations ('M' extension)
752 49 zero_gravi
  constant cp_sel_bitmanip_c : std_ulogic_vector(2 downto 0) := "010"; -- bit manipulation ('B' extension)
753 57 zero_gravi
  constant cp_sel_fpu_c      : std_ulogic_vector(2 downto 0) := "011"; -- floating-point unit ('Zfinx' extension)
754
--constant cp_sel_reserved_c : std_ulogic_vector(2 downto 0) := "100"; -- reserved
755
--constant cp_sel_reserved_c : std_ulogic_vector(2 downto 0) := "101"; -- reserved
756 52 zero_gravi
--constant cp_sel_reserved_c : std_ulogic_vector(2 downto 0) := "110"; -- reserved
757
--constant cp_sel_reserved_c : std_ulogic_vector(2 downto 0) := "111"; -- reserved
758 2 zero_gravi
 
759
  -- ALU Function Codes ---------------------------------------------------------------------
760
  -- -------------------------------------------------------------------------------------------
761 39 zero_gravi
  -- arithmetic core --
762
  constant alu_arith_cmd_addsub_c : std_ulogic := '0'; -- r.arith <= A +/- B
763
  constant alu_arith_cmd_slt_c    : std_ulogic := '1'; -- r.arith <= A < B
764
  -- logic core --
765
  constant alu_logic_cmd_movb_c   : std_ulogic_vector(1 downto 0) := "00"; -- r.logic <= B
766
  constant alu_logic_cmd_xor_c    : std_ulogic_vector(1 downto 0) := "01"; -- r.logic <= A xor B
767
  constant alu_logic_cmd_or_c     : std_ulogic_vector(1 downto 0) := "10"; -- r.logic <= A or B
768
  constant alu_logic_cmd_and_c    : std_ulogic_vector(1 downto 0) := "11"; -- r.logic <= A and B
769
  -- function select (actual alu result) --
770
  constant alu_func_cmd_arith_c   : std_ulogic_vector(1 downto 0) := "00"; -- r <= r.arith
771
  constant alu_func_cmd_logic_c   : std_ulogic_vector(1 downto 0) := "01"; -- r <= r.logic
772
  constant alu_func_cmd_shift_c   : std_ulogic_vector(1 downto 0) := "10"; -- r <= A <</>> B (iterative)
773
  constant alu_func_cmd_copro_c   : std_ulogic_vector(1 downto 0) := "11"; -- r <= CP result (iterative)
774 2 zero_gravi
 
775 12 zero_gravi
  -- Trap ID Codes --------------------------------------------------------------------------
776
  -- -------------------------------------------------------------------------------------------
777 59 zero_gravi
  -- MSB   : 1 = async exception (IRQ); 0 = sync exception (eg. ebreak)
778
  -- MSB-1 : 1 = entry to debug mode; 0 = normal trapping
779 48 zero_gravi
  -- RISC-V compliant sync. exceptions --
780 59 zero_gravi
  constant trap_ima_c      : std_ulogic_vector(6 downto 0) := "0" & "0" & "00000"; -- 0.0:  instruction misaligned
781
  constant trap_iba_c      : std_ulogic_vector(6 downto 0) := "0" & "0" & "00001"; -- 0.1:  instruction access fault
782
  constant trap_iil_c      : std_ulogic_vector(6 downto 0) := "0" & "0" & "00010"; -- 0.2:  illegal instruction
783
  constant trap_brk_c      : std_ulogic_vector(6 downto 0) := "0" & "0" & "00011"; -- 0.3:  breakpoint
784
  constant trap_lma_c      : std_ulogic_vector(6 downto 0) := "0" & "0" & "00100"; -- 0.4:  load address misaligned
785
  constant trap_lbe_c      : std_ulogic_vector(6 downto 0) := "0" & "0" & "00101"; -- 0.5:  load access fault
786
  constant trap_sma_c      : std_ulogic_vector(6 downto 0) := "0" & "0" & "00110"; -- 0.6:  store address misaligned
787
  constant trap_sbe_c      : std_ulogic_vector(6 downto 0) := "0" & "0" & "00111"; -- 0.7:  store access fault
788
  constant trap_uenv_c     : std_ulogic_vector(6 downto 0) := "0" & "0" & "01000"; -- 0.8:  environment call from u-mode
789
  constant trap_menv_c     : std_ulogic_vector(6 downto 0) := "0" & "0" & "01011"; -- 0.11: environment call from m-mode
790 48 zero_gravi
  -- RISC-V compliant interrupts (async. exceptions) --
791 59 zero_gravi
  constant trap_nmi_c      : std_ulogic_vector(6 downto 0) := "1" & "0" & "00000"; -- 1.0:  non-maskable interrupt
792
  constant trap_msi_c      : std_ulogic_vector(6 downto 0) := "1" & "0" & "00011"; -- 1.3:  machine software interrupt
793
  constant trap_mti_c      : std_ulogic_vector(6 downto 0) := "1" & "0" & "00111"; -- 1.7:  machine timer interrupt
794
  constant trap_mei_c      : std_ulogic_vector(6 downto 0) := "1" & "0" & "01011"; -- 1.11: machine external interrupt
795 48 zero_gravi
  -- NEORV32-specific (custom) interrupts (async. exceptions) --
796 59 zero_gravi
  constant trap_firq0_c    : std_ulogic_vector(6 downto 0) := "1" & "0" & "10000"; -- 1.16: fast interrupt 0
797
  constant trap_firq1_c    : std_ulogic_vector(6 downto 0) := "1" & "0" & "10001"; -- 1.17: fast interrupt 1
798
  constant trap_firq2_c    : std_ulogic_vector(6 downto 0) := "1" & "0" & "10010"; -- 1.18: fast interrupt 2
799
  constant trap_firq3_c    : std_ulogic_vector(6 downto 0) := "1" & "0" & "10011"; -- 1.19: fast interrupt 3
800
  constant trap_firq4_c    : std_ulogic_vector(6 downto 0) := "1" & "0" & "10100"; -- 1.20: fast interrupt 4
801
  constant trap_firq5_c    : std_ulogic_vector(6 downto 0) := "1" & "0" & "10101"; -- 1.21: fast interrupt 5
802
  constant trap_firq6_c    : std_ulogic_vector(6 downto 0) := "1" & "0" & "10110"; -- 1.22: fast interrupt 6
803
  constant trap_firq7_c    : std_ulogic_vector(6 downto 0) := "1" & "0" & "10111"; -- 1.23: fast interrupt 7
804
  constant trap_firq8_c    : std_ulogic_vector(6 downto 0) := "1" & "0" & "11000"; -- 1.24: fast interrupt 8
805
  constant trap_firq9_c    : std_ulogic_vector(6 downto 0) := "1" & "0" & "11001"; -- 1.25: fast interrupt 9
806
  constant trap_firq10_c   : std_ulogic_vector(6 downto 0) := "1" & "0" & "11010"; -- 1.26: fast interrupt 10
807
  constant trap_firq11_c   : std_ulogic_vector(6 downto 0) := "1" & "0" & "11011"; -- 1.27: fast interrupt 11
808
  constant trap_firq12_c   : std_ulogic_vector(6 downto 0) := "1" & "0" & "11100"; -- 1.28: fast interrupt 12
809
  constant trap_firq13_c   : std_ulogic_vector(6 downto 0) := "1" & "0" & "11101"; -- 1.29: fast interrupt 13
810
  constant trap_firq14_c   : std_ulogic_vector(6 downto 0) := "1" & "0" & "11110"; -- 1.30: fast interrupt 14
811
  constant trap_firq15_c   : std_ulogic_vector(6 downto 0) := "1" & "0" & "11111"; -- 1.31: fast interrupt 15
812
  -- entering debug mode - cause --
813
  constant trap_db_break_c : std_ulogic_vector(6 downto 0) := "0" & "1" & "00010"; -- break instruction (sync / EXCEPTION)
814
  constant trap_db_halt_c  : std_ulogic_vector(6 downto 0) := "1" & "1" & "00011"; -- external halt request (async / IRQ)
815
  constant trap_db_step_c  : std_ulogic_vector(6 downto 0) := "1" & "1" & "00100"; -- single-stepping (async / IRQ)
816 12 zero_gravi
 
817 2 zero_gravi
  -- CPU Control Exception System -----------------------------------------------------------
818
  -- -------------------------------------------------------------------------------------------
819
  -- exception source bits --
820 59 zero_gravi
  constant exception_iaccess_c   : natural :=  0; -- instruction access fault
821
  constant exception_iillegal_c  : natural :=  1; -- illegal instruction
822
  constant exception_ialign_c    : natural :=  2; -- instruction address misaligned
823 47 zero_gravi
  constant exception_m_envcall_c : natural :=  3; -- ENV call from m-mode
824
  constant exception_u_envcall_c : natural :=  4; -- ENV call from u-mode
825
  constant exception_break_c     : natural :=  5; -- breakpoint
826
  constant exception_salign_c    : natural :=  6; -- store address misaligned
827
  constant exception_lalign_c    : natural :=  7; -- load address misaligned
828
  constant exception_saccess_c   : natural :=  8; -- store access fault
829
  constant exception_laccess_c   : natural :=  9; -- load access fault
830 59 zero_gravi
  -- for debug mode only --
831
  constant exception_db_break_c  : natural := 10; -- enter debug mode via ebreak instruction ("sync EXCEPTION")
832 14 zero_gravi
  --
833 59 zero_gravi
  constant exception_width_c     : natural := 11; -- length of this list in bits
834 2 zero_gravi
  -- interrupt source bits --
835 58 zero_gravi
  constant interrupt_nm_irq_c    : natural :=  0; -- non-maskable interrupt
836
  constant interrupt_msw_irq_c   : natural :=  1; -- machine software interrupt
837
  constant interrupt_mtime_irq_c : natural :=  2; -- machine timer interrupt
838
  constant interrupt_mext_irq_c  : natural :=  3; -- machine external interrupt
839
  constant interrupt_firq_0_c    : natural :=  4; -- fast interrupt channel 0
840
  constant interrupt_firq_1_c    : natural :=  5; -- fast interrupt channel 1
841
  constant interrupt_firq_2_c    : natural :=  6; -- fast interrupt channel 2
842
  constant interrupt_firq_3_c    : natural :=  7; -- fast interrupt channel 3
843
  constant interrupt_firq_4_c    : natural :=  8; -- fast interrupt channel 4
844
  constant interrupt_firq_5_c    : natural :=  9; -- fast interrupt channel 5
845
  constant interrupt_firq_6_c    : natural := 10; -- fast interrupt channel 6
846
  constant interrupt_firq_7_c    : natural := 11; -- fast interrupt channel 7
847
  constant interrupt_firq_8_c    : natural := 12; -- fast interrupt channel 8
848
  constant interrupt_firq_9_c    : natural := 13; -- fast interrupt channel 9
849
  constant interrupt_firq_10_c   : natural := 14; -- fast interrupt channel 10
850
  constant interrupt_firq_11_c   : natural := 15; -- fast interrupt channel 11
851
  constant interrupt_firq_12_c   : natural := 16; -- fast interrupt channel 12
852
  constant interrupt_firq_13_c   : natural := 17; -- fast interrupt channel 13
853
  constant interrupt_firq_14_c   : natural := 18; -- fast interrupt channel 14
854
  constant interrupt_firq_15_c   : natural := 19; -- fast interrupt channel 15
855 59 zero_gravi
  -- for debug mode only --
856
  constant interrupt_db_halt_c   : natural := 20; -- enter debug mode via external halt request ("async IRQ")
857
  constant interrupt_db_step_c   : natural := 21; -- enter debug mode via single-stepping ("async IRQ")
858 14 zero_gravi
  --
859 59 zero_gravi
  constant interrupt_width_c     : natural := 22; -- length of this list in bits
860 2 zero_gravi
 
861 15 zero_gravi
  -- CPU Privilege Modes --------------------------------------------------------------------
862
  -- -------------------------------------------------------------------------------------------
863 29 zero_gravi
  constant priv_mode_m_c : std_ulogic_vector(1 downto 0) := "11"; -- machine mode
864
  constant priv_mode_u_c : std_ulogic_vector(1 downto 0) := "00"; -- user mode
865 15 zero_gravi
 
866 42 zero_gravi
  -- HPM Event System -----------------------------------------------------------------------
867
  -- -------------------------------------------------------------------------------------------
868
  constant hpmcnt_event_cy_c      : natural := 0;  -- Active cycle
869 56 zero_gravi
  constant hpmcnt_event_never_c   : natural := 1;  -- Unused / never (actually, this would be used for TIME)
870 42 zero_gravi
  constant hpmcnt_event_ir_c      : natural := 2;  -- Retired instruction
871
  constant hpmcnt_event_cir_c     : natural := 3;  -- Retired compressed instruction
872
  constant hpmcnt_event_wait_if_c : natural := 4;  -- Instruction fetch memory wait cycle
873
  constant hpmcnt_event_wait_ii_c : natural := 5;  -- Instruction issue wait cycle
874 45 zero_gravi
  constant hpmcnt_event_wait_mc_c : natural := 6;  -- Multi-cycle ALU-operation wait cycle
875
  constant hpmcnt_event_load_c    : natural := 7;  -- Load operation
876
  constant hpmcnt_event_store_c   : natural := 8;  -- Store operation
877
  constant hpmcnt_event_wait_ls_c : natural := 9;  -- Load/store memory wait cycle
878
  constant hpmcnt_event_jump_c    : natural := 10; -- Unconditional jump
879
  constant hpmcnt_event_branch_c  : natural := 11; -- Conditional branch (taken or not taken)
880
  constant hpmcnt_event_tbranch_c : natural := 12; -- Conditional taken branch
881
  constant hpmcnt_event_trap_c    : natural := 13; -- Entered trap
882
  constant hpmcnt_event_illegal_c : natural := 14; -- Illegal instruction exception
883 42 zero_gravi
  --
884 45 zero_gravi
  constant hpmcnt_event_size_c    : natural := 15; -- length of this list
885 42 zero_gravi
 
886 39 zero_gravi
  -- Clock Generator ------------------------------------------------------------------------
887 2 zero_gravi
  -- -------------------------------------------------------------------------------------------
888
  constant clk_div2_c    : natural := 0;
889
  constant clk_div4_c    : natural := 1;
890
  constant clk_div8_c    : natural := 2;
891
  constant clk_div64_c   : natural := 3;
892
  constant clk_div128_c  : natural := 4;
893
  constant clk_div1024_c : natural := 5;
894
  constant clk_div2048_c : natural := 6;
895
  constant clk_div4096_c : natural := 7;
896
 
897
  -- Component: NEORV32 Processor Top Entity ------------------------------------------------
898
  -- -------------------------------------------------------------------------------------------
899
  component neorv32_top
900
    generic (
901
      -- General --
902 12 zero_gravi
      CLOCK_FREQUENCY              : natural := 0;      -- clock frequency of clk_i in Hz
903 44 zero_gravi
      BOOTLOADER_EN                : boolean := true;   -- implement processor-internal bootloader?
904 12 zero_gravi
      USER_CODE                    : std_ulogic_vector(31 downto 0) := x"00000000"; -- custom user code
905 49 zero_gravi
      HW_THREAD_ID                 : natural := 0;      -- hardware thread id (32-bit)
906 59 zero_gravi
      -- On-Chip Debugger (OCD) --
907
      ON_CHIP_DEBUGGER_EN          : boolean := false;  -- implement on-chip debugger
908 2 zero_gravi
      -- RISC-V CPU Extensions --
909 39 zero_gravi
      CPU_EXTENSION_RISCV_A        : boolean := false;  -- implement atomic extension?
910 44 zero_gravi
      CPU_EXTENSION_RISCV_B        : boolean := false;  -- implement bit manipulation extensions?
911 18 zero_gravi
      CPU_EXTENSION_RISCV_C        : boolean := false;  -- implement compressed extension?
912 8 zero_gravi
      CPU_EXTENSION_RISCV_E        : boolean := false;  -- implement embedded RF extension?
913 18 zero_gravi
      CPU_EXTENSION_RISCV_M        : boolean := false;  -- implement muld/div extension?
914
      CPU_EXTENSION_RISCV_U        : boolean := false;  -- implement user mode extension?
915 57 zero_gravi
      CPU_EXTENSION_RISCV_Zfinx    : boolean := false;  -- implement 32-bit floating-point extension (using INT regs!)
916 8 zero_gravi
      CPU_EXTENSION_RISCV_Zicsr    : boolean := true;   -- implement CSR system?
917 39 zero_gravi
      CPU_EXTENSION_RISCV_Zifencei : boolean := false;  -- implement instruction stream sync.?
918 19 zero_gravi
      -- Extension Options --
919 34 zero_gravi
      FAST_MUL_EN                  : boolean := false;  -- use DSPs for M extension's multiplier
920
      FAST_SHIFT_EN                : boolean := false;  -- use barrel shifter for shift operations
921 56 zero_gravi
      TINY_SHIFT_EN                : boolean := false;  -- use tiny (single-bit) shifter for shift operations
922
      CPU_CNT_WIDTH                : natural := 64;     -- total width of CPU cycle and instret counters (0..64)
923 15 zero_gravi
      -- Physical Memory Protection (PMP) --
924 42 zero_gravi
      PMP_NUM_REGIONS              : natural := 0;      -- number of regions (0..64)
925
      PMP_MIN_GRANULARITY          : natural := 64*1024; -- minimal region granularity in bytes, has to be a power of 2, min 8 bytes
926
      -- Hardware Performance Monitors (HPM) --
927 47 zero_gravi
      HPM_NUM_CNTS                 : natural := 0;      -- number of implemented HPM counters (0..29)
928 56 zero_gravi
      HPM_CNT_WIDTH                : natural := 40;     -- total size of HPM counters (1..64)
929 23 zero_gravi
      -- Internal Instruction memory --
930 44 zero_gravi
      MEM_INT_IMEM_EN              : boolean := true;   -- implement processor-internal instruction memory
931 8 zero_gravi
      MEM_INT_IMEM_SIZE            : natural := 16*1024; -- size of processor-internal instruction memory in bytes
932 34 zero_gravi
      MEM_INT_IMEM_ROM             : boolean := false;  -- implement processor-internal instruction memory as ROM
933 23 zero_gravi
      -- Internal Data memory --
934 44 zero_gravi
      MEM_INT_DMEM_EN              : boolean := true;   -- implement processor-internal data memory
935 8 zero_gravi
      MEM_INT_DMEM_SIZE            : natural := 8*1024; -- size of processor-internal data memory in bytes
936 41 zero_gravi
      -- Internal Cache memory --
937 44 zero_gravi
      ICACHE_EN                    : boolean := false;  -- implement instruction cache
938 41 zero_gravi
      ICACHE_NUM_BLOCKS            : natural := 4;      -- i-cache: number of blocks (min 1), has to be a power of 2
939
      ICACHE_BLOCK_SIZE            : natural := 64;     -- i-cache: block size in bytes (min 4), has to be a power of 2
940 45 zero_gravi
      ICACHE_ASSOCIATIVITY         : natural := 1;      -- i-cache: associativity / number of sets (1=direct_mapped), has to be a power of 2
941 23 zero_gravi
      -- External memory interface --
942 44 zero_gravi
      MEM_EXT_EN                   : boolean := false;  -- implement external memory bus interface?
943 57 zero_gravi
      MEM_EXT_TIMEOUT              : natural := 255;    -- cycles after a pending bus access auto-terminates (0 = disabled)
944 2 zero_gravi
      -- Processor peripherals --
945 44 zero_gravi
      IO_GPIO_EN                   : boolean := true;   -- implement general purpose input/output port unit (GPIO)?
946
      IO_MTIME_EN                  : boolean := true;   -- implement machine system timer (MTIME)?
947 50 zero_gravi
      IO_UART0_EN                  : boolean := true;   -- implement primary universal asynchronous receiver/transmitter (UART0)?
948
      IO_UART1_EN                  : boolean := true;   -- implement secondary universal asynchronous receiver/transmitter (UART1)?
949 44 zero_gravi
      IO_SPI_EN                    : boolean := true;   -- implement serial peripheral interface (SPI)?
950
      IO_TWI_EN                    : boolean := true;   -- implement two-wire interface (TWI)?
951
      IO_PWM_EN                    : boolean := true;   -- implement pulse-width modulation unit (PWM)?
952
      IO_WDT_EN                    : boolean := true;   -- implement watch dog timer (WDT)?
953
      IO_TRNG_EN                   : boolean := false;  -- implement true random number generator (TRNG)?
954 47 zero_gravi
      IO_CFS_EN                    : boolean := false;  -- implement custom functions subsystem (CFS)?
955 56 zero_gravi
      IO_CFS_CONFIG                : std_ulogic_vector(31 downto 0) := x"00000000"; -- custom CFS configuration generic
956 52 zero_gravi
      IO_CFS_IN_SIZE               : positive := 32;    -- size of CFS input conduit in bits
957
      IO_CFS_OUT_SIZE              : positive := 32;    -- size of CFS output conduit in bits
958
      IO_NCO_EN                    : boolean := true;   -- implement numerically-controlled oscillator (NCO)?
959
      IO_NEOLED_EN                 : boolean := true    -- implement NeoPixel-compatible smart LED interface (NEOLED)?
960 2 zero_gravi
    );
961
    port (
962
      -- Global control --
963 34 zero_gravi
      clk_i       : in  std_ulogic := '0'; -- global clock, rising edge
964
      rstn_i      : in  std_ulogic := '0'; -- global reset, low-active, async
965 59 zero_gravi
      -- JTAG on-chip debugger interface --
966
      jtag_trst_i : in  std_ulogic := '0'; -- low-active TAP reset (optional)
967
      jtag_tck_i  : in  std_ulogic := '0'; -- serial clock
968
      jtag_tdi_i  : in  std_ulogic := '0'; -- serial data input
969
      jtag_tdo_o  : out std_ulogic;        -- serial data output
970
      jtag_tms_i  : in  std_ulogic := '0'; -- mode select
971 49 zero_gravi
      -- Wishbone bus interface (available if MEM_EXT_EN = true) --
972 57 zero_gravi
      wb_tag_o    : out std_ulogic_vector(02 downto 0); -- request tag
973 34 zero_gravi
      wb_adr_o    : out std_ulogic_vector(31 downto 0); -- address
974
      wb_dat_i    : in  std_ulogic_vector(31 downto 0) := (others => '0'); -- read data
975
      wb_dat_o    : out std_ulogic_vector(31 downto 0); -- write data
976
      wb_we_o     : out std_ulogic; -- read/write
977
      wb_sel_o    : out std_ulogic_vector(03 downto 0); -- byte enable
978
      wb_stb_o    : out std_ulogic; -- strobe
979
      wb_cyc_o    : out std_ulogic; -- valid cycle
980 57 zero_gravi
      wb_lock_o   : out std_ulogic; -- exclusive access request
981 34 zero_gravi
      wb_ack_i    : in  std_ulogic := '0'; -- transfer acknowledge
982
      wb_err_i    : in  std_ulogic := '0'; -- transfer error
983 44 zero_gravi
      -- Advanced memory control signals (available if MEM_EXT_EN = true) --
984 34 zero_gravi
      fence_o     : out std_ulogic; -- indicates an executed FENCE operation
985
      fencei_o    : out std_ulogic; -- indicates an executed FENCEI operation
986 49 zero_gravi
      -- GPIO (available if IO_GPIO_EN = true) --
987 34 zero_gravi
      gpio_o      : out std_ulogic_vector(31 downto 0); -- parallel output
988
      gpio_i      : in  std_ulogic_vector(31 downto 0) := (others => '0'); -- parallel input
989 50 zero_gravi
      -- primary UART0 (available if IO_UART0_EN = true) --
990
      uart0_txd_o : out std_ulogic; -- UART0 send data
991
      uart0_rxd_i : in  std_ulogic := '0'; -- UART0 receive data
992 51 zero_gravi
      uart0_rts_o : out std_ulogic; -- hw flow control: UART0.RX ready to receive ("RTR"), low-active, optional
993
      uart0_cts_i : in  std_ulogic := '0'; -- hw flow control: UART0.TX allowed to transmit, low-active, optional
994 50 zero_gravi
      -- secondary UART1 (available if IO_UART1_EN = true) --
995
      uart1_txd_o : out std_ulogic; -- UART1 send data
996
      uart1_rxd_i : in  std_ulogic := '0'; -- UART1 receive data
997 51 zero_gravi
      uart1_rts_o : out std_ulogic; -- hw flow control: UART1.RX ready to receive ("RTR"), low-active, optional
998
      uart1_cts_i : in  std_ulogic := '0'; -- hw flow control: UART1.TX allowed to transmit, low-active, optional
999 49 zero_gravi
      -- SPI (available if IO_SPI_EN = true) --
1000 34 zero_gravi
      spi_sck_o   : out std_ulogic; -- SPI serial clock
1001
      spi_sdo_o   : out std_ulogic; -- controller data out, peripheral data in
1002
      spi_sdi_i   : in  std_ulogic := '0'; -- controller data in, peripheral data out
1003
      spi_csn_o   : out std_ulogic_vector(07 downto 0); -- SPI CS
1004 49 zero_gravi
      -- TWI (available if IO_TWI_EN = true) --
1005 35 zero_gravi
      twi_sda_io  : inout std_logic; -- twi serial data line
1006
      twi_scl_io  : inout std_logic; -- twi serial clock line
1007 49 zero_gravi
      -- PWM (available if IO_PWM_EN = true) --
1008 40 zero_gravi
      pwm_o       : out std_ulogic_vector(03 downto 0); -- pwm channels
1009 47 zero_gravi
      -- Custom Functions Subsystem IO --
1010 52 zero_gravi
      cfs_in_i    : in  std_ulogic_vector(IO_CFS_IN_SIZE-1  downto 0); -- custom CFS inputs conduit
1011
      cfs_out_o   : out std_ulogic_vector(IO_CFS_OUT_SIZE-1 downto 0); -- custom CFS outputs conduit
1012 49 zero_gravi
      -- NCO output (available if IO_NCO_EN = true) --
1013
      nco_o       : out std_ulogic_vector(02 downto 0); -- numerically-controlled oscillator channels
1014 52 zero_gravi
      -- NeoPixel-compatible smart LED interface (available if IO_NEOLED_EN = true) --
1015
      neoled_o    : out std_ulogic; -- async serial data line
1016 59 zero_gravi
      -- System time --
1017
      mtime_i     : in  std_ulogic_vector(63 downto 0) := (others => '0'); -- current system time from ext. MTIME (if IO_MTIME_EN = false)
1018
      mtime_o     : out std_ulogic_vector(63 downto 0); -- current system time from int. MTIME (if IO_MTIME_EN = true)
1019 2 zero_gravi
      -- Interrupts --
1020 58 zero_gravi
      nm_irq_i    : in  std_ulogic := '0'; -- non-maskable interrupt
1021 50 zero_gravi
      soc_firq_i  : in  std_ulogic_vector(5 downto 0) := (others => '0'); -- fast interrupt channels
1022 44 zero_gravi
      mtime_irq_i : in  std_ulogic := '0'; -- machine timer interrupt, available if IO_MTIME_EN = false
1023 34 zero_gravi
      msw_irq_i   : in  std_ulogic := '0'; -- machine software interrupt
1024
      mext_irq_i  : in  std_ulogic := '0'  -- machine external interrupt
1025 2 zero_gravi
    );
1026
  end component;
1027
 
1028 4 zero_gravi
  -- Component: CPU Top Entity --------------------------------------------------------------
1029
  -- -------------------------------------------------------------------------------------------
1030
  component neorv32_cpu
1031
    generic (
1032
      -- General --
1033 49 zero_gravi
      HW_THREAD_ID                 : natural := 0;     -- hardware thread id (32-bit)
1034
      CPU_BOOT_ADDR                : std_ulogic_vector(31 downto 0) := x"00000000"; -- cpu boot address
1035 59 zero_gravi
      CPU_DEBUG_ADDR               : std_ulogic_vector(31 downto 0) := x"00000000"; -- cpu debug mode start address
1036 4 zero_gravi
      -- RISC-V CPU Extensions --
1037 39 zero_gravi
      CPU_EXTENSION_RISCV_A        : boolean := false; -- implement atomic extension?
1038 44 zero_gravi
      CPU_EXTENSION_RISCV_B        : boolean := false; -- implement bit manipulation extensions?
1039 12 zero_gravi
      CPU_EXTENSION_RISCV_C        : boolean := false; -- implement compressed extension?
1040
      CPU_EXTENSION_RISCV_E        : boolean := false; -- implement embedded RF extension?
1041
      CPU_EXTENSION_RISCV_M        : boolean := false; -- implement muld/div extension?
1042 15 zero_gravi
      CPU_EXTENSION_RISCV_U        : boolean := false; -- implement user mode extension?
1043 53 zero_gravi
      CPU_EXTENSION_RISCV_Zfinx    : boolean := false; -- implement 32-bit floating-point extension (using INT reg!)
1044 12 zero_gravi
      CPU_EXTENSION_RISCV_Zicsr    : boolean := true;  -- implement CSR system?
1045 49 zero_gravi
      CPU_EXTENSION_RISCV_Zifencei : boolean := false; -- implement instruction stream sync.?
1046 59 zero_gravi
      CPU_EXTENSION_RISCV_DEBUG    : boolean := false; -- implement CPU debug mode?
1047 19 zero_gravi
      -- Extension Options --
1048
      FAST_MUL_EN                  : boolean := false; -- use DSPs for M extension's multiplier
1049 34 zero_gravi
      FAST_SHIFT_EN                : boolean := false; -- use barrel shifter for shift operations
1050 56 zero_gravi
      TINY_SHIFT_EN                : boolean := false; -- use tiny (single-bit) shifter for shift operations
1051
      CPU_CNT_WIDTH                : natural := 64;    -- total width of CPU cycle and instret counters (0..64)
1052 15 zero_gravi
      -- Physical Memory Protection (PMP) --
1053 52 zero_gravi
      PMP_NUM_REGIONS              : natural := 0;     -- number of regions (0..64)
1054 42 zero_gravi
      PMP_MIN_GRANULARITY          : natural := 64*1024; -- minimal region granularity in bytes, has to be a power of 2, min 8 bytes
1055
      -- Hardware Performance Monitors (HPM) --
1056 56 zero_gravi
      HPM_NUM_CNTS                 : natural := 0;     -- number of implemented HPM counters (0..29)
1057
      HPM_CNT_WIDTH                : natural := 40     -- total size of HPM counters (1..64)
1058 4 zero_gravi
    );
1059
    port (
1060
      -- global control --
1061 14 zero_gravi
      clk_i          : in  std_ulogic := '0'; -- global clock, rising edge
1062
      rstn_i         : in  std_ulogic := '0'; -- global reset, low-active, async
1063 47 zero_gravi
      sleep_o        : out std_ulogic; -- cpu is in sleep mode when set
1064 12 zero_gravi
      -- instruction bus interface --
1065
      i_bus_addr_o   : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
1066 14 zero_gravi
      i_bus_rdata_i  : in  std_ulogic_vector(data_width_c-1 downto 0) := (others => '0'); -- bus read data
1067 12 zero_gravi
      i_bus_wdata_o  : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
1068
      i_bus_ben_o    : out std_ulogic_vector(03 downto 0); -- byte enable
1069
      i_bus_we_o     : out std_ulogic; -- write enable
1070
      i_bus_re_o     : out std_ulogic; -- read enable
1071 57 zero_gravi
      i_bus_lock_o   : out std_ulogic; -- exclusive access request
1072 14 zero_gravi
      i_bus_ack_i    : in  std_ulogic := '0'; -- bus transfer acknowledge
1073
      i_bus_err_i    : in  std_ulogic := '0'; -- bus transfer error
1074 12 zero_gravi
      i_bus_fence_o  : out std_ulogic; -- executed FENCEI operation
1075 35 zero_gravi
      i_bus_priv_o   : out std_ulogic_vector(1 downto 0); -- privilege level
1076 12 zero_gravi
      -- data bus interface --
1077
      d_bus_addr_o   : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
1078 14 zero_gravi
      d_bus_rdata_i  : in  std_ulogic_vector(data_width_c-1 downto 0) := (others => '0'); -- bus read data
1079 12 zero_gravi
      d_bus_wdata_o  : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
1080
      d_bus_ben_o    : out std_ulogic_vector(03 downto 0); -- byte enable
1081
      d_bus_we_o     : out std_ulogic; -- write enable
1082
      d_bus_re_o     : out std_ulogic; -- read enable
1083 57 zero_gravi
      d_bus_lock_o   : out std_ulogic; -- exclusive access request
1084 14 zero_gravi
      d_bus_ack_i    : in  std_ulogic := '0'; -- bus transfer acknowledge
1085
      d_bus_err_i    : in  std_ulogic := '0'; -- bus transfer error
1086 12 zero_gravi
      d_bus_fence_o  : out std_ulogic; -- executed FENCE operation
1087 35 zero_gravi
      d_bus_priv_o   : out std_ulogic_vector(1 downto 0); -- privilege level
1088 11 zero_gravi
      -- system time input from MTIME --
1089 14 zero_gravi
      time_i         : in  std_ulogic_vector(63 downto 0) := (others => '0'); -- current system time
1090 58 zero_gravi
      -- non-maskable interrupt --
1091
      nm_irq_i       : in  std_ulogic := '0'; -- NMI
1092 14 zero_gravi
      -- interrupts (risc-v compliant) --
1093
      msw_irq_i      : in  std_ulogic := '0'; -- machine software interrupt
1094
      mext_irq_i     : in  std_ulogic := '0'; -- machine external interrupt
1095
      mtime_irq_i    : in  std_ulogic := '0'; -- machine timer interrupt
1096
      -- fast interrupts (custom) --
1097 48 zero_gravi
      firq_i         : in  std_ulogic_vector(15 downto 0) := (others => '0');
1098 59 zero_gravi
      firq_ack_o     : out std_ulogic_vector(15 downto 0);
1099
      -- debug mode (halt) request --
1100
      db_halt_req_i  : in  std_ulogic := '0'
1101 4 zero_gravi
    );
1102
  end component;
1103
 
1104 2 zero_gravi
  -- Component: CPU Control -----------------------------------------------------------------
1105
  -- -------------------------------------------------------------------------------------------
1106
  component neorv32_cpu_control
1107
    generic (
1108
      -- General --
1109 49 zero_gravi
      HW_THREAD_ID                 : natural := 0;     -- hardware thread id (32-bit)
1110 59 zero_gravi
      CPU_BOOT_ADDR                : std_ulogic_vector(31 downto 0) := x"00000000"; -- cpu boot address
1111
      CPU_DEBUG_ADDR               : std_ulogic_vector(31 downto 0) := x"00000000"; -- cpu debug mode start address
1112 2 zero_gravi
      -- RISC-V CPU Extensions --
1113 39 zero_gravi
      CPU_EXTENSION_RISCV_A        : boolean := false; -- implement atomic extension?
1114 44 zero_gravi
      CPU_EXTENSION_RISCV_B        : boolean := false; -- implement bit manipulation extensions?
1115 12 zero_gravi
      CPU_EXTENSION_RISCV_C        : boolean := false; -- implement compressed extension?
1116
      CPU_EXTENSION_RISCV_E        : boolean := false; -- implement embedded RF extension?
1117
      CPU_EXTENSION_RISCV_M        : boolean := false; -- implement muld/div extension?
1118 15 zero_gravi
      CPU_EXTENSION_RISCV_U        : boolean := false; -- implement user mode extension?
1119 53 zero_gravi
      CPU_EXTENSION_RISCV_Zfinx    : boolean := false; -- implement 32-bit floating-point extension (using INT reg!)
1120 12 zero_gravi
      CPU_EXTENSION_RISCV_Zicsr    : boolean := true;  -- implement CSR system?
1121 49 zero_gravi
      CPU_EXTENSION_RISCV_Zifencei : boolean := false; -- implement instruction stream sync.?
1122 59 zero_gravi
      CPU_EXTENSION_RISCV_DEBUG    : boolean := false; -- implement CPU debug mode?
1123 56 zero_gravi
      -- Extension Options --
1124
      CPU_CNT_WIDTH                : natural := 64; -- total width of CPU cycle and instret counters (0..64)
1125 15 zero_gravi
      -- Physical memory protection (PMP) --
1126 52 zero_gravi
      PMP_NUM_REGIONS              : natural := 0;     -- number of regions (0..64)
1127 42 zero_gravi
      PMP_MIN_GRANULARITY          : natural := 64*1024; -- minimal region granularity in bytes, has to be a power of 2, min 8 bytes
1128
      -- Hardware Performance Monitors (HPM) --
1129 56 zero_gravi
      HPM_NUM_CNTS                 : natural := 0;     -- number of implemented HPM counters (0..29)
1130
      HPM_CNT_WIDTH                : natural := 40     -- total size of HPM counters (1..64)
1131 2 zero_gravi
    );
1132
    port (
1133
      -- global control --
1134
      clk_i         : in  std_ulogic; -- global clock, rising edge
1135
      rstn_i        : in  std_ulogic; -- global reset, low-active, async
1136
      ctrl_o        : out std_ulogic_vector(ctrl_width_c-1 downto 0); -- main control bus
1137
      -- status input --
1138
      alu_wait_i    : in  std_ulogic; -- wait for ALU
1139 12 zero_gravi
      bus_i_wait_i  : in  std_ulogic; -- wait for bus
1140
      bus_d_wait_i  : in  std_ulogic; -- wait for bus
1141 57 zero_gravi
      excl_state_i  : in  std_ulogic; -- atomic/exclusive access lock status
1142 2 zero_gravi
      -- data input --
1143
      instr_i       : in  std_ulogic_vector(data_width_c-1 downto 0); -- instruction
1144
      cmp_i         : in  std_ulogic_vector(1 downto 0); -- comparator status
1145 36 zero_gravi
      alu_add_i     : in  std_ulogic_vector(data_width_c-1 downto 0); -- ALU address result
1146 52 zero_gravi
      rs1_i         : in  std_ulogic_vector(data_width_c-1 downto 0); -- rf source 1
1147 2 zero_gravi
      -- data output --
1148
      imm_o         : out std_ulogic_vector(data_width_c-1 downto 0); -- immediate
1149 6 zero_gravi
      fetch_pc_o    : out std_ulogic_vector(data_width_c-1 downto 0); -- PC for instruction fetch
1150
      curr_pc_o     : out std_ulogic_vector(data_width_c-1 downto 0); -- current PC (corresponding to current instruction)
1151 2 zero_gravi
      csr_rdata_o   : out std_ulogic_vector(data_width_c-1 downto 0); -- CSR read data
1152 52 zero_gravi
      -- FPU interface --
1153
      fpu_rm_o      : out std_ulogic_vector(02 downto 0); -- rounding mode
1154
      fpu_flags_i   : in  std_ulogic_vector(04 downto 0); -- exception flags
1155 59 zero_gravi
      -- debug mode (halt) request --
1156
      db_halt_req_i : in  std_ulogic;
1157 58 zero_gravi
      -- non-maskable interrupt --
1158
      nm_irq_i      : in  std_ulogic;
1159 14 zero_gravi
      -- interrupts (risc-v compliant) --
1160
      msw_irq_i     : in  std_ulogic; -- machine software interrupt
1161
      mext_irq_i    : in  std_ulogic; -- machine external interrupt
1162 2 zero_gravi
      mtime_irq_i   : in  std_ulogic; -- machine timer interrupt
1163 14 zero_gravi
      -- fast interrupts (custom) --
1164 48 zero_gravi
      firq_i        : in  std_ulogic_vector(15 downto 0);
1165
      firq_ack_o    : out std_ulogic_vector(15 downto 0);
1166 11 zero_gravi
      -- system time input from MTIME --
1167
      time_i        : in  std_ulogic_vector(63 downto 0); -- current system time
1168 15 zero_gravi
      -- physical memory protection --
1169
      pmp_addr_o    : out pmp_addr_if_t; -- addresses
1170
      pmp_ctrl_o    : out pmp_ctrl_if_t; -- configs
1171 2 zero_gravi
      -- bus access exceptions --
1172
      mar_i         : in  std_ulogic_vector(data_width_c-1 downto 0); -- memory address register
1173
      ma_instr_i    : in  std_ulogic; -- misaligned instruction address
1174
      ma_load_i     : in  std_ulogic; -- misaligned load data address
1175
      ma_store_i    : in  std_ulogic; -- misaligned store data address
1176
      be_instr_i    : in  std_ulogic; -- bus error on instruction access
1177
      be_load_i     : in  std_ulogic; -- bus error on load data access
1178 12 zero_gravi
      be_store_i    : in  std_ulogic  -- bus error on store data access
1179 2 zero_gravi
    );
1180
  end component;
1181
 
1182
  -- Component: CPU Register File -----------------------------------------------------------
1183
  -- -------------------------------------------------------------------------------------------
1184
  component neorv32_cpu_regfile
1185
    generic (
1186
      CPU_EXTENSION_RISCV_E : boolean := false -- implement embedded RF extension?
1187
    );
1188
    port (
1189
      -- global control --
1190
      clk_i  : in  std_ulogic; -- global clock, rising edge
1191
      ctrl_i : in  std_ulogic_vector(ctrl_width_c-1 downto 0); -- main control bus
1192
      -- data input --
1193
      mem_i  : in  std_ulogic_vector(data_width_c-1 downto 0); -- memory read data
1194
      alu_i  : in  std_ulogic_vector(data_width_c-1 downto 0); -- ALU result
1195
      -- data output --
1196
      rs1_o  : out std_ulogic_vector(data_width_c-1 downto 0); -- operand 1
1197 47 zero_gravi
      rs2_o  : out std_ulogic_vector(data_width_c-1 downto 0); -- operand 2
1198
      cmp_o  : out std_ulogic_vector(1 downto 0) -- comparator status
1199 2 zero_gravi
    );
1200
  end component;
1201
 
1202
  -- Component: CPU ALU ---------------------------------------------------------------------
1203
  -- -------------------------------------------------------------------------------------------
1204
  component neorv32_cpu_alu
1205 11 zero_gravi
    generic (
1206 56 zero_gravi
      CPU_EXTENSION_RISCV_M : boolean := true;  -- implement muld/div extension?
1207
      FAST_SHIFT_EN         : boolean := false; -- use barrel shifter for shift operations
1208
      TINY_SHIFT_EN         : boolean := false  -- use tiny (single-bit) shifter for shift operations
1209 11 zero_gravi
    );
1210 2 zero_gravi
    port (
1211
      -- global control --
1212
      clk_i       : in  std_ulogic; -- global clock, rising edge
1213
      rstn_i      : in  std_ulogic; -- global reset, low-active, async
1214
      ctrl_i      : in  std_ulogic_vector(ctrl_width_c-1 downto 0); -- main control bus
1215
      -- data input --
1216
      rs1_i       : in  std_ulogic_vector(data_width_c-1 downto 0); -- rf source 1
1217
      rs2_i       : in  std_ulogic_vector(data_width_c-1 downto 0); -- rf source 2
1218
      pc2_i       : in  std_ulogic_vector(data_width_c-1 downto 0); -- delayed PC
1219
      imm_i       : in  std_ulogic_vector(data_width_c-1 downto 0); -- immediate
1220
      -- data output --
1221
      res_o       : out std_ulogic_vector(data_width_c-1 downto 0); -- ALU result
1222 36 zero_gravi
      add_o       : out std_ulogic_vector(data_width_c-1 downto 0); -- address computation result
1223 2 zero_gravi
      -- co-processor interface --
1224 49 zero_gravi
      cp_start_o  : out std_ulogic_vector(7 downto 0); -- trigger co-processor i
1225
      cp_valid_i  : in  std_ulogic_vector(7 downto 0); -- co-processor i done
1226
      cp_result_i : in  cp_data_if_t; -- co-processor result
1227 2 zero_gravi
      -- status --
1228
      wait_o      : out std_ulogic -- busy due to iterative processing units
1229
    );
1230
  end component;
1231
 
1232 44 zero_gravi
  -- Component: CPU Co-Processor MULDIV ('M' extension) -------------------------------------
1233 2 zero_gravi
  -- -------------------------------------------------------------------------------------------
1234
  component neorv32_cpu_cp_muldiv
1235 19 zero_gravi
    generic (
1236
      FAST_MUL_EN : boolean := false -- use DSPs for faster multiplication
1237
    );
1238 2 zero_gravi
    port (
1239
      -- global control --
1240
      clk_i   : in  std_ulogic; -- global clock, rising edge
1241
      rstn_i  : in  std_ulogic; -- global reset, low-active, async
1242
      ctrl_i  : in  std_ulogic_vector(ctrl_width_c-1 downto 0); -- main control bus
1243 36 zero_gravi
      start_i : in  std_ulogic; -- trigger operation
1244 2 zero_gravi
      -- data input --
1245
      rs1_i   : in  std_ulogic_vector(data_width_c-1 downto 0); -- rf source 1
1246
      rs2_i   : in  std_ulogic_vector(data_width_c-1 downto 0); -- rf source 2
1247
      -- result and status --
1248
      res_o   : out std_ulogic_vector(data_width_c-1 downto 0); -- operation result
1249
      valid_o : out std_ulogic -- data output valid
1250
    );
1251
  end component;
1252
 
1253 44 zero_gravi
  -- Component: CPU Co-Processor Bit Manipulation ('B' extension) ---------------------------
1254
  -- -------------------------------------------------------------------------------------------
1255
  component neorv32_cpu_cp_bitmanip
1256
    port (
1257
      -- global control --
1258
      clk_i   : in  std_ulogic; -- global clock, rising edge
1259
      rstn_i  : in  std_ulogic; -- global reset, low-active, async
1260
      ctrl_i  : in  std_ulogic_vector(ctrl_width_c-1 downto 0); -- main control bus
1261
      start_i : in  std_ulogic; -- trigger operation
1262
      -- data input --
1263
      cmp_i   : in  std_ulogic_vector(1 downto 0); -- comparator status
1264
      rs1_i   : in  std_ulogic_vector(data_width_c-1 downto 0); -- rf source 1
1265
      rs2_i   : in  std_ulogic_vector(data_width_c-1 downto 0); -- rf source 2
1266
      -- result and status --
1267
      res_o   : out std_ulogic_vector(data_width_c-1 downto 0); -- operation result
1268
      valid_o : out std_ulogic -- data output valid
1269
    );
1270
  end component;
1271
 
1272 53 zero_gravi
  -- Component: CPU Co-Processor 32-bit FPU ('Zfinx' extension) -----------------------------
1273 52 zero_gravi
  -- -------------------------------------------------------------------------------------------
1274
  component neorv32_cpu_cp_fpu
1275
    port (
1276
      -- global control --
1277 53 zero_gravi
      clk_i    : in  std_ulogic; -- global clock, rising edge
1278
      rstn_i   : in  std_ulogic; -- global reset, low-active, async
1279
      ctrl_i   : in  std_ulogic_vector(ctrl_width_c-1 downto 0); -- main control bus
1280
      start_i  : in  std_ulogic; -- trigger operation
1281 52 zero_gravi
      -- data input --
1282 53 zero_gravi
      frm_i    : in  std_ulogic_vector(2 downto 0); -- rounding mode
1283 56 zero_gravi
      cmp_i    : in  std_ulogic_vector(1 downto 0); -- comparator status
1284 53 zero_gravi
      rs1_i    : in  std_ulogic_vector(data_width_c-1 downto 0); -- rf source 1
1285
      rs2_i    : in  std_ulogic_vector(data_width_c-1 downto 0); -- rf source 2
1286 52 zero_gravi
      -- result and status --
1287 53 zero_gravi
      res_o    : out std_ulogic_vector(data_width_c-1 downto 0); -- operation result
1288
      fflags_o : out std_ulogic_vector(4 downto 0); -- exception flags
1289
      valid_o  : out std_ulogic -- data output valid
1290 52 zero_gravi
    );
1291
  end component;
1292
 
1293 2 zero_gravi
  -- Component: CPU Bus Interface -----------------------------------------------------------
1294
  -- -------------------------------------------------------------------------------------------
1295
  component neorv32_cpu_bus
1296
    generic (
1297 57 zero_gravi
      CPU_EXTENSION_RISCV_A : boolean := false;  -- implement atomic extension?
1298
      CPU_EXTENSION_RISCV_C : boolean := true;   -- implement compressed extension?
1299 15 zero_gravi
      -- Physical memory protection (PMP) --
1300 57 zero_gravi
      PMP_NUM_REGIONS       : natural := 0;      -- number of regions (0..64)
1301
      PMP_MIN_GRANULARITY   : natural := 64*1024 -- minimal region granularity in bytes, has to be a power of 2, min 8 bytes
1302 2 zero_gravi
    );
1303
    port (
1304
      -- global control --
1305 12 zero_gravi
      clk_i          : in  std_ulogic; -- global clock, rising edge
1306 38 zero_gravi
      rstn_i      : in  std_ulogic := '0'; -- global reset, low-active, async
1307 12 zero_gravi
      ctrl_i         : in  std_ulogic_vector(ctrl_width_c-1 downto 0); -- main control bus
1308
      -- cpu instruction fetch interface --
1309
      fetch_pc_i     : in  std_ulogic_vector(data_width_c-1 downto 0); -- PC for instruction fetch
1310
      instr_o        : out std_ulogic_vector(data_width_c-1 downto 0); -- instruction
1311
      i_wait_o       : out std_ulogic; -- wait for fetch to complete
1312
      --
1313
      ma_instr_o     : out std_ulogic; -- misaligned instruction address
1314
      be_instr_o     : out std_ulogic; -- bus error on instruction access
1315
      -- cpu data access interface --
1316
      addr_i         : in  std_ulogic_vector(data_width_c-1 downto 0); -- ALU result -> access address
1317
      wdata_i        : in  std_ulogic_vector(data_width_c-1 downto 0); -- write data
1318
      rdata_o        : out std_ulogic_vector(data_width_c-1 downto 0); -- read data
1319
      mar_o          : out std_ulogic_vector(data_width_c-1 downto 0); -- current memory address register
1320
      d_wait_o       : out std_ulogic; -- wait for access to complete
1321
      --
1322 57 zero_gravi
      excl_state_o   : out std_ulogic; -- atomic/exclusive access status
1323 12 zero_gravi
      ma_load_o      : out std_ulogic; -- misaligned load data address
1324
      ma_store_o     : out std_ulogic; -- misaligned store data address
1325
      be_load_o      : out std_ulogic; -- bus error on load data access
1326
      be_store_o     : out std_ulogic; -- bus error on store data access
1327 15 zero_gravi
      -- physical memory protection --
1328
      pmp_addr_i     : in  pmp_addr_if_t; -- addresses
1329
      pmp_ctrl_i     : in  pmp_ctrl_if_t; -- configs
1330 12 zero_gravi
      -- instruction bus --
1331
      i_bus_addr_o   : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
1332
      i_bus_rdata_i  : in  std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
1333
      i_bus_wdata_o  : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
1334
      i_bus_ben_o    : out std_ulogic_vector(03 downto 0); -- byte enable
1335
      i_bus_we_o     : out std_ulogic; -- write enable
1336
      i_bus_re_o     : out std_ulogic; -- read enable
1337 57 zero_gravi
      i_bus_lock_o   : out std_ulogic; -- exclusive access request
1338 12 zero_gravi
      i_bus_ack_i    : in  std_ulogic; -- bus transfer acknowledge
1339
      i_bus_err_i    : in  std_ulogic; -- bus transfer error
1340
      i_bus_fence_o  : out std_ulogic; -- fence operation
1341
      -- data bus --
1342
      d_bus_addr_o   : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
1343
      d_bus_rdata_i  : in  std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
1344
      d_bus_wdata_o  : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
1345
      d_bus_ben_o    : out std_ulogic_vector(03 downto 0); -- byte enable
1346
      d_bus_we_o     : out std_ulogic; -- write enable
1347
      d_bus_re_o     : out std_ulogic; -- read enable
1348 57 zero_gravi
      d_bus_lock_o   : out std_ulogic; -- exclusive access request
1349 12 zero_gravi
      d_bus_ack_i    : in  std_ulogic; -- bus transfer acknowledge
1350
      d_bus_err_i    : in  std_ulogic; -- bus transfer error
1351 57 zero_gravi
      d_bus_fence_o  : out std_ulogic  -- fence operation
1352 2 zero_gravi
    );
1353
  end component;
1354
 
1355 57 zero_gravi
  -- Component: Bus Keeper ------------------------------------------------------------------
1356
  -- -------------------------------------------------------------------------------------------
1357
  component neorv32_bus_keeper is
1358
    generic (
1359 59 zero_gravi
       -- External memory interface --
1360
      MEM_EXT_EN        : boolean := false;  -- implement external memory bus interface?
1361 57 zero_gravi
      -- Internal instruction memory --
1362
      MEM_INT_IMEM_EN   : boolean := true;   -- implement processor-internal instruction memory
1363
      MEM_INT_IMEM_SIZE : natural := 8*1024; -- size of processor-internal instruction memory in bytes
1364
      -- Internal data memory --
1365
      MEM_INT_DMEM_EN   : boolean := true;   -- implement processor-internal data memory
1366
      MEM_INT_DMEM_SIZE : natural := 8*1024  -- size of processor-internal data memory in bytes
1367
    );
1368
    port (
1369
      -- host access --
1370
      clk_i  : in  std_ulogic; -- global clock line
1371
      rstn_i : in  std_ulogic; -- global reset line, low-active
1372
      addr_i : in  std_ulogic_vector(31 downto 0); -- address
1373
      rden_i : in  std_ulogic; -- read enable
1374
      wren_i : in  std_ulogic; -- write enable
1375
      ack_i  : in  std_ulogic; -- transfer acknowledge from bus system
1376
      err_i  : in  std_ulogic; -- transfer error from bus system
1377
      err_o  : out std_ulogic  -- bus error
1378
    );
1379
  end component;
1380
 
1381 45 zero_gravi
  -- Component: CPU Instruction Cache -------------------------------------------------------
1382 41 zero_gravi
  -- -------------------------------------------------------------------------------------------
1383 45 zero_gravi
  component neorv32_icache
1384 41 zero_gravi
    generic (
1385 47 zero_gravi
      ICACHE_NUM_BLOCKS : natural := 4;  -- number of blocks (min 1), has to be a power of 2
1386
      ICACHE_BLOCK_SIZE : natural := 16; -- block size in bytes (min 4), has to be a power of 2
1387
      ICACHE_NUM_SETS   : natural := 1   -- associativity / number of sets (1=direct_mapped), has to be a power of 2
1388 41 zero_gravi
    );
1389
    port (
1390
      -- global control --
1391
      clk_i         : in  std_ulogic; -- global clock, rising edge
1392
      rstn_i        : in  std_ulogic; -- global reset, low-active, async
1393
      clear_i       : in  std_ulogic; -- cache clear
1394
      -- host controller interface --
1395
      host_addr_i   : in  std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
1396
      host_rdata_o  : out std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
1397
      host_wdata_i  : in  std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
1398
      host_ben_i    : in  std_ulogic_vector(03 downto 0); -- byte enable
1399
      host_we_i     : in  std_ulogic; -- write enable
1400
      host_re_i     : in  std_ulogic; -- read enable
1401
      host_ack_o    : out std_ulogic; -- bus transfer acknowledge
1402
      host_err_o    : out std_ulogic; -- bus transfer error
1403
      -- peripheral bus interface --
1404
      bus_addr_o    : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
1405
      bus_rdata_i   : in  std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
1406
      bus_wdata_o   : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
1407
      bus_ben_o     : out std_ulogic_vector(03 downto 0); -- byte enable
1408
      bus_we_o      : out std_ulogic; -- write enable
1409
      bus_re_o      : out std_ulogic; -- read enable
1410
      bus_ack_i     : in  std_ulogic; -- bus transfer acknowledge
1411
      bus_err_i     : in  std_ulogic  -- bus transfer error
1412
    );
1413
  end component;
1414
 
1415 12 zero_gravi
  -- Component: CPU Bus Switch --------------------------------------------------------------
1416
  -- -------------------------------------------------------------------------------------------
1417
  component neorv32_busswitch
1418
    generic (
1419
      PORT_CA_READ_ONLY : boolean := false; -- set if controller port A is read-only
1420
      PORT_CB_READ_ONLY : boolean := false  -- set if controller port B is read-only
1421
    );
1422
    port (
1423
      -- global control --
1424
      clk_i           : in  std_ulogic; -- global clock, rising edge
1425
      rstn_i          : in  std_ulogic; -- global reset, low-active, async
1426
      -- controller interface a --
1427
      ca_bus_addr_i   : in  std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
1428
      ca_bus_rdata_o  : out std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
1429
      ca_bus_wdata_i  : in  std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
1430
      ca_bus_ben_i    : in  std_ulogic_vector(03 downto 0); -- byte enable
1431
      ca_bus_we_i     : in  std_ulogic; -- write enable
1432
      ca_bus_re_i     : in  std_ulogic; -- read enable
1433 57 zero_gravi
      ca_bus_lock_i   : in  std_ulogic; -- exclusive access request
1434 12 zero_gravi
      ca_bus_ack_o    : out std_ulogic; -- bus transfer acknowledge
1435
      ca_bus_err_o    : out std_ulogic; -- bus transfer error
1436
      -- controller interface b --
1437
      cb_bus_addr_i   : in  std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
1438
      cb_bus_rdata_o  : out std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
1439
      cb_bus_wdata_i  : in  std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
1440
      cb_bus_ben_i    : in  std_ulogic_vector(03 downto 0); -- byte enable
1441
      cb_bus_we_i     : in  std_ulogic; -- write enable
1442
      cb_bus_re_i     : in  std_ulogic; -- read enable
1443 57 zero_gravi
      cb_bus_lock_i   : in  std_ulogic; -- exclusive access request
1444 12 zero_gravi
      cb_bus_ack_o    : out std_ulogic; -- bus transfer acknowledge
1445
      cb_bus_err_o    : out std_ulogic; -- bus transfer error
1446
      -- peripheral bus --
1447 36 zero_gravi
      p_bus_src_o     : out std_ulogic; -- access source: 0 = A, 1 = B
1448 12 zero_gravi
      p_bus_addr_o    : out std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
1449
      p_bus_rdata_i   : in  std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
1450
      p_bus_wdata_o   : out std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
1451
      p_bus_ben_o     : out std_ulogic_vector(03 downto 0); -- byte enable
1452
      p_bus_we_o      : out std_ulogic; -- write enable
1453
      p_bus_re_o      : out std_ulogic; -- read enable
1454 57 zero_gravi
      p_bus_lock_o    : out std_ulogic; -- exclusive access request
1455 12 zero_gravi
      p_bus_ack_i     : in  std_ulogic; -- bus transfer acknowledge
1456
      p_bus_err_i     : in  std_ulogic  -- bus transfer error
1457
    );
1458
  end component;
1459
 
1460 2 zero_gravi
  -- Component: CPU Compressed Instructions Decompressor ------------------------------------
1461
  -- -------------------------------------------------------------------------------------------
1462
  component neorv32_cpu_decompressor
1463
    port (
1464
      -- instruction input --
1465
      ci_instr16_i : in  std_ulogic_vector(15 downto 0); -- compressed instruction input
1466
      -- instruction output --
1467
      ci_illegal_o : out std_ulogic; -- is an illegal compressed instruction
1468
      ci_instr32_o : out std_ulogic_vector(31 downto 0)  -- 32-bit decompressed instruction
1469
    );
1470
  end component;
1471
 
1472
  -- Component: Processor-internal instruction memory (IMEM) --------------------------------
1473
  -- -------------------------------------------------------------------------------------------
1474
  component neorv32_imem
1475
    generic (
1476
      IMEM_BASE      : std_ulogic_vector(31 downto 0) := x"00000000"; -- memory base address
1477
      IMEM_SIZE      : natural := 4*1024; -- processor-internal instruction memory size in bytes
1478
      IMEM_AS_ROM    : boolean := false;  -- implement IMEM as read-only memory?
1479 44 zero_gravi
      BOOTLOADER_EN  : boolean := true    -- implement and use bootloader?
1480 2 zero_gravi
    );
1481
    port (
1482
      clk_i  : in  std_ulogic; -- global clock line
1483
      rden_i : in  std_ulogic; -- read enable
1484
      wren_i : in  std_ulogic; -- write enable
1485
      ben_i  : in  std_ulogic_vector(03 downto 0); -- byte write enable
1486
      addr_i : in  std_ulogic_vector(31 downto 0); -- address
1487
      data_i : in  std_ulogic_vector(31 downto 0); -- data in
1488
      data_o : out std_ulogic_vector(31 downto 0); -- data out
1489
      ack_o  : out std_ulogic -- transfer acknowledge
1490
    );
1491
  end component;
1492
 
1493
  -- Component: Processor-internal data memory (DMEM) ---------------------------------------
1494
  -- -------------------------------------------------------------------------------------------
1495
  component neorv32_dmem
1496
    generic (
1497
      DMEM_BASE : std_ulogic_vector(31 downto 0) := x"80000000"; -- memory base address
1498
      DMEM_SIZE : natural := 4*1024  -- processor-internal instruction memory size in bytes
1499
    );
1500
    port (
1501
      clk_i  : in  std_ulogic; -- global clock line
1502
      rden_i : in  std_ulogic; -- read enable
1503
      wren_i : in  std_ulogic; -- write enable
1504
      ben_i  : in  std_ulogic_vector(03 downto 0); -- byte write enable
1505
      addr_i : in  std_ulogic_vector(31 downto 0); -- address
1506
      data_i : in  std_ulogic_vector(31 downto 0); -- data in
1507
      data_o : out std_ulogic_vector(31 downto 0); -- data out
1508
      ack_o  : out std_ulogic -- transfer acknowledge
1509
    );
1510
  end component;
1511
 
1512
  -- Component: Processor-internal bootloader ROM (BOOTROM) ---------------------------------
1513
  -- -------------------------------------------------------------------------------------------
1514
  component neorv32_boot_rom
1515 23 zero_gravi
    generic (
1516
      BOOTROM_BASE : std_ulogic_vector(31 downto 0) := x"FFFF0000"; -- boot ROM base address
1517
      BOOTROM_SIZE : natural := 4*1024  -- processor-internal boot ROM memory size in bytes
1518
    );
1519 2 zero_gravi
    port (
1520
      clk_i  : in  std_ulogic; -- global clock line
1521
      rden_i : in  std_ulogic; -- read enable
1522
      addr_i : in  std_ulogic_vector(31 downto 0); -- address
1523
      data_o : out std_ulogic_vector(31 downto 0); -- data out
1524
      ack_o  : out std_ulogic -- transfer acknowledge
1525
    );
1526
  end component;
1527
 
1528
  -- Component: Machine System Timer (mtime) ------------------------------------------------
1529
  -- -------------------------------------------------------------------------------------------
1530
  component neorv32_mtime
1531
    port (
1532
      -- host access --
1533
      clk_i     : in  std_ulogic; -- global clock line
1534 4 zero_gravi
      rstn_i    : in  std_ulogic := '0'; -- global reset, low-active, async
1535 2 zero_gravi
      addr_i    : in  std_ulogic_vector(31 downto 0); -- address
1536
      rden_i    : in  std_ulogic; -- read enable
1537
      wren_i    : in  std_ulogic; -- write enable
1538
      data_i    : in  std_ulogic_vector(31 downto 0); -- data in
1539
      data_o    : out std_ulogic_vector(31 downto 0); -- data out
1540
      ack_o     : out std_ulogic; -- transfer acknowledge
1541 11 zero_gravi
      -- time output for CPU --
1542
      time_o    : out std_ulogic_vector(63 downto 0); -- current system time
1543 2 zero_gravi
      -- interrupt --
1544
      irq_o     : out std_ulogic  -- interrupt request
1545
    );
1546
  end component;
1547
 
1548
  -- Component: General Purpose Input/Output Port (GPIO) ------------------------------------
1549
  -- -------------------------------------------------------------------------------------------
1550
  component neorv32_gpio
1551
    port (
1552
      -- host access --
1553
      clk_i  : in  std_ulogic; -- global clock line
1554
      addr_i : in  std_ulogic_vector(31 downto 0); -- address
1555
      rden_i : in  std_ulogic; -- read enable
1556
      wren_i : in  std_ulogic; -- write enable
1557
      data_i : in  std_ulogic_vector(31 downto 0); -- data in
1558
      data_o : out std_ulogic_vector(31 downto 0); -- data out
1559
      ack_o  : out std_ulogic; -- transfer acknowledge
1560
      -- parallel io --
1561 22 zero_gravi
      gpio_o : out std_ulogic_vector(31 downto 0);
1562
      gpio_i : in  std_ulogic_vector(31 downto 0);
1563 2 zero_gravi
      -- interrupt --
1564
      irq_o  : out std_ulogic
1565
    );
1566
  end component;
1567
 
1568
  -- Component: Watchdog Timer (WDT) --------------------------------------------------------
1569
  -- -------------------------------------------------------------------------------------------
1570
  component neorv32_wdt
1571
    port (
1572
      -- host access --
1573
      clk_i       : in  std_ulogic; -- global clock line
1574
      rstn_i      : in  std_ulogic; -- global reset line, low-active
1575
      rden_i      : in  std_ulogic; -- read enable
1576
      wren_i      : in  std_ulogic; -- write enable
1577
      addr_i      : in  std_ulogic_vector(31 downto 0); -- address
1578
      data_i      : in  std_ulogic_vector(31 downto 0); -- data in
1579
      data_o      : out std_ulogic_vector(31 downto 0); -- data out
1580
      ack_o       : out std_ulogic; -- transfer acknowledge
1581
      -- clock generator --
1582
      clkgen_en_o : out std_ulogic; -- enable clock generator
1583
      clkgen_i    : in  std_ulogic_vector(07 downto 0);
1584
      -- timeout event --
1585
      irq_o       : out std_ulogic; -- timeout IRQ
1586
      rstn_o      : out std_ulogic  -- timeout reset, low_active, use it as async!
1587
    );
1588
  end component;
1589
 
1590
  -- Component: Universal Asynchronous Receiver and Transmitter (UART) ----------------------
1591
  -- -------------------------------------------------------------------------------------------
1592
  component neorv32_uart
1593 50 zero_gravi
    generic (
1594
      UART_PRIMARY : boolean := true -- true = primary UART (UART0), false = secondary UART (UART1)
1595
    );
1596 2 zero_gravi
    port (
1597
      -- host access --
1598
      clk_i       : in  std_ulogic; -- global clock line
1599
      addr_i      : in  std_ulogic_vector(31 downto 0); -- address
1600
      rden_i      : in  std_ulogic; -- read enable
1601
      wren_i      : in  std_ulogic; -- write enable
1602
      data_i      : in  std_ulogic_vector(31 downto 0); -- data in
1603
      data_o      : out std_ulogic_vector(31 downto 0); -- data out
1604
      ack_o       : out std_ulogic; -- transfer acknowledge
1605
      -- clock generator --
1606
      clkgen_en_o : out std_ulogic; -- enable clock generator
1607
      clkgen_i    : in  std_ulogic_vector(07 downto 0);
1608
      -- com lines --
1609
      uart_txd_o  : out std_ulogic;
1610
      uart_rxd_i  : in  std_ulogic;
1611 51 zero_gravi
      -- hardware flow control --
1612
      uart_rts_o  : out std_ulogic; -- UART.RX ready to receive ("RTR"), low-active, optional
1613
      uart_cts_i  : in  std_ulogic; -- UART.TX allowed to transmit, low-active, optional
1614 2 zero_gravi
      -- interrupts --
1615 48 zero_gravi
      irq_rxd_o   : out std_ulogic; -- uart data received interrupt
1616
      irq_txd_o   : out std_ulogic  -- uart transmission done interrupt
1617 2 zero_gravi
    );
1618
  end component;
1619
 
1620
  -- Component: Serial Peripheral Interface (SPI) -------------------------------------------
1621
  -- -------------------------------------------------------------------------------------------
1622
  component neorv32_spi
1623
    port (
1624
      -- host access --
1625
      clk_i       : in  std_ulogic; -- global clock line
1626
      addr_i      : in  std_ulogic_vector(31 downto 0); -- address
1627
      rden_i      : in  std_ulogic; -- read enable
1628
      wren_i      : in  std_ulogic; -- write enable
1629
      data_i      : in  std_ulogic_vector(31 downto 0); -- data in
1630
      data_o      : out std_ulogic_vector(31 downto 0); -- data out
1631
      ack_o       : out std_ulogic; -- transfer acknowledge
1632
      -- clock generator --
1633
      clkgen_en_o : out std_ulogic; -- enable clock generator
1634
      clkgen_i    : in  std_ulogic_vector(07 downto 0);
1635
      -- com lines --
1636 6 zero_gravi
      spi_sck_o   : out std_ulogic; -- SPI serial clock
1637
      spi_sdo_o   : out std_ulogic; -- controller data out, peripheral data in
1638
      spi_sdi_i   : in  std_ulogic; -- controller data in, peripheral data out
1639 2 zero_gravi
      spi_csn_o   : out std_ulogic_vector(07 downto 0); -- SPI CS
1640
      -- interrupt --
1641 48 zero_gravi
      irq_o       : out std_ulogic -- transmission done interrupt
1642 2 zero_gravi
    );
1643
  end component;
1644
 
1645
  -- Component: Two-Wire Interface (TWI) ----------------------------------------------------
1646
  -- -------------------------------------------------------------------------------------------
1647
  component neorv32_twi
1648
    port (
1649
      -- host access --
1650
      clk_i       : in  std_ulogic; -- global clock line
1651
      addr_i      : in  std_ulogic_vector(31 downto 0); -- address
1652
      rden_i      : in  std_ulogic; -- read enable
1653
      wren_i      : in  std_ulogic; -- write enable
1654
      data_i      : in  std_ulogic_vector(31 downto 0); -- data in
1655
      data_o      : out std_ulogic_vector(31 downto 0); -- data out
1656
      ack_o       : out std_ulogic; -- transfer acknowledge
1657
      -- clock generator --
1658
      clkgen_en_o : out std_ulogic; -- enable clock generator
1659
      clkgen_i    : in  std_ulogic_vector(07 downto 0);
1660
      -- com lines --
1661
      twi_sda_io  : inout std_logic; -- serial data line
1662
      twi_scl_io  : inout std_logic; -- serial clock line
1663
      -- interrupt --
1664 48 zero_gravi
      irq_o       : out std_ulogic -- transfer done IRQ
1665 2 zero_gravi
    );
1666
  end component;
1667
 
1668
  -- Component: Pulse-Width Modulation Controller (PWM) -------------------------------------
1669
  -- -------------------------------------------------------------------------------------------
1670
  component neorv32_pwm
1671
    port (
1672
      -- host access --
1673
      clk_i       : in  std_ulogic; -- global clock line
1674
      addr_i      : in  std_ulogic_vector(31 downto 0); -- address
1675
      rden_i      : in  std_ulogic; -- read enable
1676
      wren_i      : in  std_ulogic; -- write enable
1677
      data_i      : in  std_ulogic_vector(31 downto 0); -- data in
1678
      data_o      : out std_ulogic_vector(31 downto 0); -- data out
1679
      ack_o       : out std_ulogic; -- transfer acknowledge
1680
      -- clock generator --
1681
      clkgen_en_o : out std_ulogic; -- enable clock generator
1682
      clkgen_i    : in  std_ulogic_vector(07 downto 0);
1683
      -- pwm output channels --
1684
      pwm_o       : out std_ulogic_vector(03 downto 0)
1685
    );
1686
  end component;
1687
 
1688
  -- Component: True Random Number Generator (TRNG) -----------------------------------------
1689
  -- -------------------------------------------------------------------------------------------
1690
  component neorv32_trng
1691
    port (
1692
      -- host access --
1693
      clk_i  : in  std_ulogic; -- global clock line
1694
      addr_i : in  std_ulogic_vector(31 downto 0); -- address
1695
      rden_i : in  std_ulogic; -- read enable
1696
      wren_i : in  std_ulogic; -- write enable
1697
      data_i : in  std_ulogic_vector(31 downto 0); -- data in
1698
      data_o : out std_ulogic_vector(31 downto 0); -- data out
1699
      ack_o  : out std_ulogic  -- transfer acknowledge
1700
    );
1701
  end component;
1702
 
1703
  -- Component: Wishbone Bus Gateway (WISHBONE) ---------------------------------------------
1704
  -- -------------------------------------------------------------------------------------------
1705
  component neorv32_wishbone
1706
    generic (
1707 35 zero_gravi
      WB_PIPELINED_MODE : boolean := false; -- false: classic/standard wishbone mode, true: pipelined wishbone mode
1708 23 zero_gravi
      -- Internal instruction memory --
1709 44 zero_gravi
      MEM_INT_IMEM_EN   : boolean := true;   -- implement processor-internal instruction memory
1710 35 zero_gravi
      MEM_INT_IMEM_SIZE : natural := 8*1024; -- size of processor-internal instruction memory in bytes
1711 23 zero_gravi
      -- Internal data memory --
1712 44 zero_gravi
      MEM_INT_DMEM_EN   : boolean := true;   -- implement processor-internal data memory
1713 57 zero_gravi
      MEM_INT_DMEM_SIZE : natural := 4*1024; -- size of processor-internal data memory in bytes
1714
      -- Bus Timeout --
1715
      BUS_TIMEOUT       : natural := 63      -- cycles after an UNACKNOWLEDGED bus access triggers a bus fault exception
1716 2 zero_gravi
    );
1717
    port (
1718
      -- global control --
1719 57 zero_gravi
      clk_i     : in  std_ulogic; -- global clock line
1720
      rstn_i    : in  std_ulogic; -- global reset line, low-active
1721 2 zero_gravi
      -- host access --
1722 57 zero_gravi
      src_i     : in  std_ulogic; -- access type (0: data, 1:instruction)
1723
      addr_i    : in  std_ulogic_vector(31 downto 0); -- address
1724
      rden_i    : in  std_ulogic; -- read enable
1725
      wren_i    : in  std_ulogic; -- write enable
1726
      ben_i     : in  std_ulogic_vector(03 downto 0); -- byte write enable
1727
      data_i    : in  std_ulogic_vector(31 downto 0); -- data in
1728
      data_o    : out std_ulogic_vector(31 downto 0); -- data out
1729
      lock_i    : in  std_ulogic; -- exclusive access request
1730
      ack_o     : out std_ulogic; -- transfer acknowledge
1731
      err_o     : out std_ulogic; -- transfer error
1732
      priv_i    : in  std_ulogic_vector(01 downto 0); -- current CPU privilege level
1733 2 zero_gravi
      -- wishbone interface --
1734 57 zero_gravi
      wb_tag_o  : out std_ulogic_vector(02 downto 0); -- request tag
1735
      wb_adr_o  : out std_ulogic_vector(31 downto 0); -- address
1736
      wb_dat_i  : in  std_ulogic_vector(31 downto 0); -- read data
1737
      wb_dat_o  : out std_ulogic_vector(31 downto 0); -- write data
1738
      wb_we_o   : out std_ulogic; -- read/write
1739
      wb_sel_o  : out std_ulogic_vector(03 downto 0); -- byte enable
1740
      wb_stb_o  : out std_ulogic; -- strobe
1741
      wb_cyc_o  : out std_ulogic; -- valid cycle
1742
      wb_lock_o : out std_ulogic; -- exclusive access request
1743
      wb_ack_i  : in  std_ulogic; -- transfer acknowledge
1744
      wb_err_i  : in  std_ulogic  -- transfer error
1745 2 zero_gravi
    );
1746
  end component;
1747
 
1748 47 zero_gravi
  -- Component: Custom Functions Subsystem (CFS) --------------------------------------------
1749 23 zero_gravi
  -- -------------------------------------------------------------------------------------------
1750 47 zero_gravi
  component neorv32_cfs
1751
    generic (
1752 52 zero_gravi
      CFS_CONFIG   : std_ulogic_vector(31 downto 0); -- custom CFS configuration generic
1753
      CFS_IN_SIZE  : positive := 32;  -- size of CFS input conduit in bits
1754
      CFS_OUT_SIZE : positive := 32   -- size of CFS output conduit in bits
1755 23 zero_gravi
    );
1756 34 zero_gravi
    port (
1757
      -- host access --
1758
      clk_i       : in  std_ulogic; -- global clock line
1759
      rstn_i      : in  std_ulogic; -- global reset line, low-active, use as async
1760
      addr_i      : in  std_ulogic_vector(31 downto 0); -- address
1761
      rden_i      : in  std_ulogic; -- read enable
1762 47 zero_gravi
      wren_i      : in  std_ulogic; -- word write enable
1763 34 zero_gravi
      data_i      : in  std_ulogic_vector(31 downto 0); -- data in
1764
      data_o      : out std_ulogic_vector(31 downto 0); -- data out
1765
      ack_o       : out std_ulogic; -- transfer acknowledge
1766
      -- clock generator --
1767
      clkgen_en_o : out std_ulogic; -- enable clock generator
1768 47 zero_gravi
      clkgen_i    : in  std_ulogic_vector(07 downto 0); -- "clock" inputs
1769
      -- CPU state --
1770
      sleep_i     : in  std_ulogic; -- set if cpu is in sleep mode
1771
      -- interrupt --
1772
      irq_o       : out std_ulogic; -- interrupt request
1773
      irq_ack_i   : in  std_ulogic; -- interrupt acknowledge
1774
      -- custom io (conduit) --
1775 52 zero_gravi
      cfs_in_i    : in  std_ulogic_vector(CFS_IN_SIZE-1 downto 0);  -- custom inputs
1776
      cfs_out_o   : out std_ulogic_vector(CFS_OUT_SIZE-1 downto 0)  -- custom outputs
1777 34 zero_gravi
    );
1778
  end component;
1779
 
1780 49 zero_gravi
  -- Component: Numerically-Controlled Oscillator (NCO) -------------------------------------
1781
  -- -------------------------------------------------------------------------------------------
1782
  component neorv32_nco
1783
    port (
1784
      -- host access --
1785
      clk_i       : in  std_ulogic; -- global clock line
1786
      addr_i      : in  std_ulogic_vector(31 downto 0); -- address
1787
      rden_i      : in  std_ulogic; -- read enable
1788
      wren_i      : in  std_ulogic; -- write enable
1789
      data_i      : in  std_ulogic_vector(31 downto 0); -- data in
1790
      data_o      : out std_ulogic_vector(31 downto 0); -- data out
1791
      ack_o       : out std_ulogic; -- transfer acknowledge
1792
      -- clock generator --
1793
      clkgen_en_o : out std_ulogic; -- enable clock generator
1794
      clkgen_i    : in  std_ulogic_vector(07 downto 0);
1795
      -- NCO output --
1796
      nco_o       : out std_ulogic_vector(02 downto 0)
1797
    );
1798
  end component;
1799
 
1800 52 zero_gravi
  -- Component: Smart LED (WS2811/WS2812) Interface (NEOLED) --------------------------------
1801
  -- -------------------------------------------------------------------------------------------
1802
  component neorv32_neoled
1803
    port (
1804
      -- host access --
1805
      clk_i       : in  std_ulogic; -- global clock line
1806
      addr_i      : in  std_ulogic_vector(31 downto 0); -- address
1807
      rden_i      : in  std_ulogic; -- read enable
1808
      wren_i      : in  std_ulogic; -- write enable
1809
      data_i      : in  std_ulogic_vector(31 downto 0); -- data in
1810
      data_o      : out std_ulogic_vector(31 downto 0); -- data out
1811
      ack_o       : out std_ulogic; -- transfer acknowledge
1812
      -- clock generator --
1813
      clkgen_en_o : out std_ulogic; -- enable clock generator
1814
      clkgen_i    : in  std_ulogic_vector(07 downto 0);
1815
      -- interrupt --
1816
      irq_o       : out std_ulogic; -- interrupt request
1817
      -- NEOLED output --
1818
      neoled_o    : out std_ulogic -- serial async data line
1819
    );
1820
  end component;
1821
 
1822 23 zero_gravi
  -- Component: System Configuration Information Memory (SYSINFO) ---------------------------
1823
  -- -------------------------------------------------------------------------------------------
1824 12 zero_gravi
  component neorv32_sysinfo
1825
    generic (
1826
      -- General --
1827 41 zero_gravi
      CLOCK_FREQUENCY      : natural := 0;      -- clock frequency of clk_i in Hz
1828 44 zero_gravi
      BOOTLOADER_EN        : boolean := true;   -- implement processor-internal bootloader?
1829 41 zero_gravi
      USER_CODE            : std_ulogic_vector(31 downto 0) := x"00000000"; -- custom user code
1830 23 zero_gravi
      -- Internal Instruction memory --
1831 44 zero_gravi
      MEM_INT_IMEM_EN      : boolean := true;   -- implement processor-internal instruction memory
1832 41 zero_gravi
      MEM_INT_IMEM_SIZE    : natural := 8*1024; -- size of processor-internal instruction memory in bytes
1833
      MEM_INT_IMEM_ROM     : boolean := false;  -- implement processor-internal instruction memory as ROM
1834 23 zero_gravi
      -- Internal Data memory --
1835 44 zero_gravi
      MEM_INT_DMEM_EN      : boolean := true;   -- implement processor-internal data memory
1836 41 zero_gravi
      MEM_INT_DMEM_SIZE    : natural := 4*1024; -- size of processor-internal data memory in bytes
1837
      -- Internal Cache memory --
1838 44 zero_gravi
      ICACHE_EN            : boolean := true;   -- implement instruction cache
1839 41 zero_gravi
      ICACHE_NUM_BLOCKS    : natural := 4;      -- i-cache: number of blocks (min 2), has to be a power of 2
1840
      ICACHE_BLOCK_SIZE    : natural := 64;     -- i-cache: block size in bytes (min 4), has to be a power of 2
1841
      ICACHE_ASSOCIATIVITY : natural := 1;      -- i-cache: associativity (min 1), has to be a power 2
1842 23 zero_gravi
      -- External memory interface --
1843 44 zero_gravi
      MEM_EXT_EN           : boolean := false;  -- implement external memory bus interface?
1844 59 zero_gravi
      -- On-Chip Debugger --
1845
      ON_CHIP_DEBUGGER_EN  : boolean := false;  -- implement OCD?
1846 12 zero_gravi
      -- Processor peripherals --
1847 44 zero_gravi
      IO_GPIO_EN           : boolean := true;   -- implement general purpose input/output port unit (GPIO)?
1848
      IO_MTIME_EN          : boolean := true;   -- implement machine system timer (MTIME)?
1849 50 zero_gravi
      IO_UART0_EN          : boolean := true;   -- implement primary universal asynchronous receiver/transmitter (UART0)?
1850
      IO_UART1_EN          : boolean := true;   -- implement secondary universal asynchronous receiver/transmitter (UART1)?
1851 44 zero_gravi
      IO_SPI_EN            : boolean := true;   -- implement serial peripheral interface (SPI)?
1852
      IO_TWI_EN            : boolean := true;   -- implement two-wire interface (TWI)?
1853
      IO_PWM_EN            : boolean := true;   -- implement pulse-width modulation unit (PWM)?
1854
      IO_WDT_EN            : boolean := true;   -- implement watch dog timer (WDT)?
1855
      IO_TRNG_EN           : boolean := true;   -- implement true random number generator (TRNG)?
1856 49 zero_gravi
      IO_CFS_EN            : boolean := true;   -- implement custom functions subsystem (CFS)?
1857 52 zero_gravi
      IO_NCO_EN            : boolean := true;   -- implement numerically-controlled oscillator (NCO)?
1858
      IO_NEOLED_EN         : boolean := true    -- implement NeoPixel-compatible smart LED interface (NEOLED)?
1859 12 zero_gravi
    );
1860
    port (
1861
      -- host access --
1862
      clk_i  : in  std_ulogic; -- global clock line
1863
      addr_i : in  std_ulogic_vector(31 downto 0); -- address
1864
      rden_i : in  std_ulogic; -- read enable
1865
      data_o : out std_ulogic_vector(31 downto 0); -- data out
1866
      ack_o  : out std_ulogic  -- transfer acknowledge
1867
    );
1868
  end component;
1869
 
1870 59 zero_gravi
  -- Component: On-Chip Debugger - Debug Module (DM) ----------------------------------------
1871
  -- -------------------------------------------------------------------------------------------
1872
  component neorv32_debug_dm
1873
    port (
1874
      -- global control --
1875
      clk_i            : in  std_ulogic; -- global clock line
1876
      rstn_i           : in  std_ulogic; -- global reset line, low-active
1877
      -- debug module interface (DMI) --
1878
      dmi_rstn_i       : in  std_ulogic;
1879
      dmi_req_valid_i  : in  std_ulogic;
1880
      dmi_req_ready_o  : out std_ulogic; -- DMI is allowed to make new requests when set
1881
      dmi_req_addr_i   : in  std_ulogic_vector(06 downto 0);
1882
      dmi_req_op_i     : in  std_ulogic; -- 0=read, 1=write
1883
      dmi_req_data_i   : in  std_ulogic_vector(31 downto 0);
1884
      dmi_resp_valid_o : out std_ulogic; -- response valid when set
1885
      dmi_resp_ready_i : in  std_ulogic; -- ready to receive respond
1886
      dmi_resp_data_o  : out std_ulogic_vector(31 downto 0);
1887
      dmi_resp_err_o   : out std_ulogic; -- 0=ok, 1=error
1888
      -- CPU bus access --
1889
      cpu_addr_i       : in  std_ulogic_vector(31 downto 0); -- address
1890
      cpu_rden_i       : in  std_ulogic; -- read enable
1891
      cpu_wren_i       : in  std_ulogic; -- write enable
1892
      cpu_data_i       : in  std_ulogic_vector(31 downto 0); -- data in
1893
      cpu_data_o       : out std_ulogic_vector(31 downto 0); -- data out
1894
      cpu_ack_o        : out std_ulogic; -- transfer acknowledge
1895
      -- CPU control --
1896
      cpu_ndmrstn_o    : out std_ulogic; -- soc reset
1897
      cpu_halt_req_o   : out std_ulogic  -- request hart to halt (enter debug mode)
1898
    );
1899
  end component;
1900
 
1901
  -- Component: On-Chip Debugger - Debug Transport Module (DTM) -----------------------------
1902
  -- -------------------------------------------------------------------------------------------
1903
  component neorv32_debug_dtm
1904
    generic (
1905
      IDCODE_VERSION : std_ulogic_vector(03 downto 0) := x"0"; -- version
1906
      IDCODE_PARTID  : std_ulogic_vector(15 downto 0) := x"cafe"; -- part number
1907
      IDCODE_MANID   : std_ulogic_vector(10 downto 0) := "00000000000" -- manufacturer id
1908
    );
1909
    port (
1910
      -- global control --
1911
      clk_i            : in  std_ulogic; -- global clock line
1912
      rstn_i           : in  std_ulogic; -- global reset line, low-active
1913
      -- jtag connection --
1914
      jtag_trst_i      : in  std_ulogic;
1915
      jtag_tck_i       : in  std_ulogic;
1916
      jtag_tdi_i       : in  std_ulogic;
1917
      jtag_tdo_o       : out std_ulogic;
1918
      jtag_tms_i       : in  std_ulogic;
1919
      -- debug module interface (DMI) --
1920
      dmi_rstn_o       : out std_ulogic;
1921
      dmi_req_valid_o  : out std_ulogic;
1922
      dmi_req_ready_i  : in  std_ulogic; -- DMI is allowed to make new requests when set
1923
      dmi_req_addr_o   : out std_ulogic_vector(06 downto 0);
1924
      dmi_req_op_o     : out std_ulogic; -- 0=read, 1=write
1925
      dmi_req_data_o   : out std_ulogic_vector(31 downto 0);
1926
      dmi_resp_valid_i : in  std_ulogic; -- response valid when set
1927
      dmi_resp_ready_o : out std_ulogic; -- ready to receive respond
1928
      dmi_resp_data_i  : in  std_ulogic_vector(31 downto 0);
1929
      dmi_resp_err_i   : in  std_ulogic -- 0=ok, 1=error
1930
    );
1931
  end component;
1932
 
1933 2 zero_gravi
end neorv32_package;
1934
 
1935
package body neorv32_package is
1936
 
1937 41 zero_gravi
  -- Function: Minimal required number of bits to represent input number --------------------
1938 2 zero_gravi
  -- -------------------------------------------------------------------------------------------
1939
  function index_size_f(input : natural) return natural is
1940
  begin
1941
    for i in 0 to natural'high loop
1942
      if (2**i >= input) then
1943
        return i;
1944
      end if;
1945
    end loop; -- i
1946
    return 0;
1947
  end function index_size_f;
1948
 
1949
  -- Function: Conditional select natural ---------------------------------------------------
1950
  -- -------------------------------------------------------------------------------------------
1951
  function cond_sel_natural_f(cond : boolean; val_t : natural; val_f : natural) return natural is
1952
  begin
1953
    if (cond = true) then
1954
      return val_t;
1955
    else
1956
      return val_f;
1957
    end if;
1958
  end function cond_sel_natural_f;
1959
 
1960 56 zero_gravi
  -- Function: Conditional select integer ---------------------------------------------------
1961
  -- -------------------------------------------------------------------------------------------
1962
  function cond_sel_int_f(cond : boolean; val_t : integer; val_f : integer) return integer is
1963
  begin
1964
    if (cond = true) then
1965
      return val_t;
1966
    else
1967
      return val_f;
1968
    end if;
1969
  end function cond_sel_int_f;
1970
 
1971 2 zero_gravi
  -- Function: Conditional select std_ulogic_vector -----------------------------------------
1972
  -- -------------------------------------------------------------------------------------------
1973
  function cond_sel_stdulogicvector_f(cond : boolean; val_t : std_ulogic_vector; val_f : std_ulogic_vector) return std_ulogic_vector is
1974
  begin
1975
    if (cond = true) then
1976
      return val_t;
1977
    else
1978
      return val_f;
1979
    end if;
1980
  end function cond_sel_stdulogicvector_f;
1981
 
1982 56 zero_gravi
  -- Function: Conditional select std_ulogic ------------------------------------------------
1983
  -- -------------------------------------------------------------------------------------------
1984
  function cond_sel_stdulogic_f(cond : boolean; val_t : std_ulogic; val_f : std_ulogic) return std_ulogic is
1985
  begin
1986
    if (cond = true) then
1987
      return val_t;
1988
    else
1989
      return val_f;
1990
    end if;
1991
  end function cond_sel_stdulogic_f;
1992
 
1993 50 zero_gravi
  -- Function: Conditional select string ----------------------------------------------------
1994 2 zero_gravi
  -- -------------------------------------------------------------------------------------------
1995 50 zero_gravi
  function cond_sel_string_f(cond : boolean; val_t : string; val_f : string) return string is
1996
  begin
1997
    if (cond = true) then
1998
      return val_t;
1999
    else
2000
      return val_f;
2001
    end if;
2002
  end function cond_sel_string_f;
2003
 
2004
  -- Function: Convert bool to std_ulogic ---------------------------------------------------
2005
  -- -------------------------------------------------------------------------------------------
2006 2 zero_gravi
  function bool_to_ulogic_f(cond : boolean) return std_ulogic is
2007
  begin
2008
    if (cond = true) then
2009
      return '1';
2010
    else
2011
      return '0';
2012
    end if;
2013
  end function bool_to_ulogic_f;
2014
 
2015
  -- Function: OR all bits ------------------------------------------------------------------
2016
  -- -------------------------------------------------------------------------------------------
2017
  function or_all_f(a : std_ulogic_vector) return std_ulogic is
2018
    variable tmp_v : std_ulogic;
2019
  begin
2020 56 zero_gravi
    tmp_v := '0';
2021 15 zero_gravi
    if (a'low < a'high) then -- not null range?
2022 56 zero_gravi
      for i in a'low to a'high loop
2023 15 zero_gravi
        tmp_v := tmp_v or a(i);
2024
      end loop; -- i
2025
    end if;
2026 2 zero_gravi
    return tmp_v;
2027
  end function or_all_f;
2028
 
2029
  -- Function: AND all bits -----------------------------------------------------------------
2030
  -- -------------------------------------------------------------------------------------------
2031
  function and_all_f(a : std_ulogic_vector) return std_ulogic is
2032
    variable tmp_v : std_ulogic;
2033
  begin
2034 56 zero_gravi
    tmp_v := '1';
2035 15 zero_gravi
    if (a'low < a'high) then -- not null range?
2036 56 zero_gravi
      for i in a'low to a'high loop
2037 15 zero_gravi
        tmp_v := tmp_v and a(i);
2038
      end loop; -- i
2039
    end if;
2040 2 zero_gravi
    return tmp_v;
2041
  end function and_all_f;
2042
 
2043
  -- Function: XOR all bits -----------------------------------------------------------------
2044
  -- -------------------------------------------------------------------------------------------
2045
  function xor_all_f(a : std_ulogic_vector) return std_ulogic is
2046
    variable tmp_v : std_ulogic;
2047
  begin
2048 56 zero_gravi
    tmp_v := '0';
2049 15 zero_gravi
    if (a'low < a'high) then -- not null range?
2050 56 zero_gravi
      for i in a'low to a'high loop
2051 15 zero_gravi
        tmp_v := tmp_v xor a(i);
2052
      end loop; -- i
2053
    end if;
2054 2 zero_gravi
    return tmp_v;
2055
  end function xor_all_f;
2056
 
2057
  -- Function: XNOR all bits ----------------------------------------------------------------
2058
  -- -------------------------------------------------------------------------------------------
2059
  function xnor_all_f(a : std_ulogic_vector) return std_ulogic is
2060
    variable tmp_v : std_ulogic;
2061
  begin
2062 56 zero_gravi
    tmp_v := '1';
2063 15 zero_gravi
    if (a'low < a'high) then -- not null range?
2064 56 zero_gravi
      for i in a'low to a'high loop
2065 15 zero_gravi
        tmp_v := tmp_v xnor a(i);
2066
      end loop; -- i
2067
    end if;
2068 2 zero_gravi
    return tmp_v;
2069
  end function xnor_all_f;
2070
 
2071 40 zero_gravi
  -- Function: Convert std_ulogic_vector to hex char ----------------------------------------
2072 6 zero_gravi
  -- -------------------------------------------------------------------------------------------
2073
  function to_hexchar_f(input : std_ulogic_vector(3 downto 0)) return character is
2074
    variable output_v : character;
2075
  begin
2076
    case input is
2077 7 zero_gravi
      when x"0"   => output_v := '0';
2078
      when x"1"   => output_v := '1';
2079
      when x"2"   => output_v := '2';
2080
      when x"3"   => output_v := '3';
2081
      when x"4"   => output_v := '4';
2082
      when x"5"   => output_v := '5';
2083
      when x"6"   => output_v := '6';
2084
      when x"7"   => output_v := '7';
2085
      when x"8"   => output_v := '8';
2086
      when x"9"   => output_v := '9';
2087
      when x"a"   => output_v := 'a';
2088
      when x"b"   => output_v := 'b';
2089
      when x"c"   => output_v := 'c';
2090
      when x"d"   => output_v := 'd';
2091
      when x"e"   => output_v := 'e';
2092
      when x"f"   => output_v := 'f';
2093 6 zero_gravi
      when others => output_v := '?';
2094
    end case;
2095
    return output_v;
2096
  end function to_hexchar_f;
2097
 
2098 40 zero_gravi
  -- Function: Convert hex char to std_ulogic_vector ----------------------------------------
2099
  -- -------------------------------------------------------------------------------------------
2100
  function hexchar_to_stdulogicvector_f(input : character) return std_ulogic_vector is
2101
    variable hex_value_v : std_ulogic_vector(3 downto 0);
2102
  begin
2103
    case input is
2104
      when '0'       => hex_value_v := x"0";
2105
      when '1'       => hex_value_v := x"1";
2106
      when '2'       => hex_value_v := x"2";
2107
      when '3'       => hex_value_v := x"3";
2108
      when '4'       => hex_value_v := x"4";
2109
      when '5'       => hex_value_v := x"5";
2110
      when '6'       => hex_value_v := x"6";
2111
      when '7'       => hex_value_v := x"7";
2112
      when '8'       => hex_value_v := x"8";
2113
      when '9'       => hex_value_v := x"9";
2114
      when 'a' | 'A' => hex_value_v := x"a";
2115
      when 'b' | 'B' => hex_value_v := x"b";
2116
      when 'c' | 'C' => hex_value_v := x"c";
2117
      when 'd' | 'D' => hex_value_v := x"d";
2118
      when 'e' | 'E' => hex_value_v := x"e";
2119
      when 'f' | 'F' => hex_value_v := x"f";
2120
      when others    => hex_value_v := (others => 'X');
2121
    end case;
2122
    return hex_value_v;
2123
  end function hexchar_to_stdulogicvector_f;
2124
 
2125 32 zero_gravi
  -- Function: Bit reversal -----------------------------------------------------------------
2126
  -- -------------------------------------------------------------------------------------------
2127
  function bit_rev_f(input : std_ulogic_vector) return std_ulogic_vector is
2128
    variable output_v : std_ulogic_vector(input'range);
2129
  begin
2130
    for i in 0 to input'length-1 loop
2131
      output_v(input'length-i-1) := input(i);
2132
    end loop; -- i
2133
    return output_v;
2134
  end function bit_rev_f;
2135
 
2136 36 zero_gravi
  -- Function: Test if input number is a power of two ---------------------------------------
2137
  -- -------------------------------------------------------------------------------------------
2138
  function is_power_of_two_f(input : natural) return boolean is
2139
  begin
2140 38 zero_gravi
    if (input = 1) then -- 2^0
2141 36 zero_gravi
      return true;
2142 38 zero_gravi
    elsif ((input / 2) /= 0) and ((input mod 2) = 0) then
2143
      return true;
2144 36 zero_gravi
    else
2145
      return false;
2146
    end if;
2147
  end function is_power_of_two_f;
2148
 
2149 40 zero_gravi
  -- Function: Swap all bytes of a 32-bit word (endianness conversion) ----------------------
2150
  -- -------------------------------------------------------------------------------------------
2151
  function bswap32_f(input : std_ulogic_vector) return std_ulogic_vector is
2152
    variable output_v : std_ulogic_vector(input'range);
2153
  begin
2154
    output_v(07 downto 00) := input(31 downto 24);
2155
    output_v(15 downto 08) := input(23 downto 16);
2156
    output_v(23 downto 16) := input(15 downto 08);
2157
    output_v(31 downto 24) := input(07 downto 00);
2158
    return output_v;
2159
  end function bswap32_f;
2160
 
2161 2 zero_gravi
end neorv32_package;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.