From 567a829fdd3e032247b02dbcffe9e411629efaea Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Fri, 14 Jul 2023 22:02:28 +0200 Subject: [PATCH 01/31] rework internal bus system -> central gateway to schedule accesses to the main address space region (IMEM, DMEM, XIP, BOOTROM, IO, External) --- rtl/core/neorv32_bus_keeper.vhd | 124 -------- rtl/core/neorv32_busswitch.vhd | 225 -------------- rtl/core/neorv32_intercon.vhd | 530 ++++++++++++++++++++++++++++++++ 3 files changed, 530 insertions(+), 349 deletions(-) delete mode 100644 rtl/core/neorv32_bus_keeper.vhd delete mode 100644 rtl/core/neorv32_busswitch.vhd create mode 100644 rtl/core/neorv32_intercon.vhd diff --git a/rtl/core/neorv32_bus_keeper.vhd b/rtl/core/neorv32_bus_keeper.vhd deleted file mode 100644 index 09a1c753e..000000000 --- a/rtl/core/neorv32_bus_keeper.vhd +++ /dev/null @@ -1,124 +0,0 @@ --- ################################################################################################# --- # << NEORV32 - Bus Keeper (BUSKEEPER) >> # --- # ********************************************************************************************* # --- # This unit monitors the processor-internal bus. If the accessed module does not respond within # --- # the defined number of cycles (VHDL package: max_proc_int_response_time_c) or issues an ERROR # --- # condition, the BUS KEEPER asserts the error signal to inform the CPU. # --- # ********************************************************************************************* # --- # BSD 3-Clause License # --- # # --- # Copyright (c) 2023, Stephan Nolting. All rights reserved. # --- # # --- # Redistribution and use in source and binary forms, with or without modification, are # --- # permitted provided that the following conditions are met: # --- # # --- # 1. Redistributions of source code must retain the above copyright notice, this list of # --- # conditions and the following disclaimer. # --- # # --- # 2. Redistributions in binary form must reproduce the above copyright notice, this list of # --- # conditions and the following disclaimer in the documentation and/or other materials # --- # provided with the distribution. # --- # # --- # 3. Neither the name of the copyright holder nor the names of its contributors may be used to # --- # endorse or promote products derived from this software without specific prior written # --- # permission. # --- # # --- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS # --- # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # --- # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # --- # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # --- # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # --- # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED # --- # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # --- # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # --- # OF THE POSSIBILITY OF SUCH DAMAGE. # --- # ********************************************************************************************* # --- # The NEORV32 Processor - https://github.com/stnolting/neorv32 (c) Stephan Nolting # --- ################################################################################################# - -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; - -library neorv32; -use neorv32.neorv32_package.all; - -entity neorv32_bus_keeper is - port ( - clk_i : in std_ulogic; -- global clock line - rstn_i : in std_ulogic; -- global reset, low-active, async - bus_req_i : in bus_req_t; -- monitor request bus - bus_rsp_i : in bus_rsp_t; -- monitor response bus - bus_err_o : out std_ulogic; -- signal bus error to CPU - bus_tmo_i : in std_ulogic; -- transfer timeout (external interface) - bus_ext_i : in std_ulogic; -- external bus access - bus_xip_i : in std_ulogic -- pending XIP access - ); -end neorv32_bus_keeper; - -architecture neorv32_bus_keeper_rtl of neorv32_bus_keeper is - - -- timeout counter size -- - constant cnt_width_c : natural := index_size_f(max_proc_int_response_time_c); - - -- controller -- - type ctrl_t is record - pending : std_ulogic; - timeout : std_ulogic_vector(cnt_width_c-1 downto 0); - bus_err : std_ulogic; - ignore : std_ulogic; - end record; - signal ctrl : ctrl_t; - -begin - - -- Sanity Check -------------------------------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - assert not (max_proc_int_response_time_c < 2) - report "NEORV32 PROCESSOR CONFIG ERROR! Processor-internal bus timeout has to >= 2." severity error; - - - -- Monitor -------------------------------------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - keeper_control: process(rstn_i, clk_i) - begin - if (rstn_i = '0') then - ctrl.pending <= '0'; - ctrl.bus_err <= '0'; - ctrl.timeout <= (others => '0'); - ctrl.ignore <= '0'; - elsif rising_edge(clk_i) then - -- defaults -- - ctrl.bus_err <= '0'; - -- bus idle -- - if (ctrl.pending = '0') then - ctrl.timeout <= std_ulogic_vector(to_unsigned(max_proc_int_response_time_c-1, cnt_width_c)); - ctrl.ignore <= '0'; - if (bus_req_i.re = '1') or (bus_req_i.we = '1') then - ctrl.pending <= '1'; - end if; - -- bus access pending -- - else - -- countdown timer -- - ctrl.timeout <= std_ulogic_vector(unsigned(ctrl.timeout) - 1); - -- bus keeper shall ignore internal timeout during this access (because it's "external") -- - ctrl.ignore <= ctrl.ignore or (bus_ext_i or bus_xip_i); - -- response check -- - if (bus_rsp_i.err = '1') or -- error termination by bus system - (bus_tmo_i = '1') or -- EXTERNAL access timeout - ((or_reduce_f(ctrl.timeout) = '0') and (ctrl.ignore = '0')) then -- INTERNAL access timeout - ctrl.bus_err <= '1'; - ctrl.pending <= '0'; - elsif (bus_rsp_i.ack = '1') then -- normal termination by bus system - ctrl.bus_err <= '0'; - ctrl.pending <= '0'; - end if; - end if; - end if; - end process keeper_control; - - -- signal bus error to CPU -- - bus_err_o <= ctrl.bus_err; - - -end neorv32_bus_keeper_rtl; diff --git a/rtl/core/neorv32_busswitch.vhd b/rtl/core/neorv32_busswitch.vhd deleted file mode 100644 index f2eecc66b..000000000 --- a/rtl/core/neorv32_busswitch.vhd +++ /dev/null @@ -1,225 +0,0 @@ --- ################################################################################################# --- # << NEORV32 - Bus Switch >> # --- # ********************************************************************************************* # --- # Allows to access a single peripheral bus ("p_bus") by two controller ports. Controller port A # --- # ("ca_bus") has priority over controller port B ("cb_bus"). # --- # ********************************************************************************************* # --- # BSD 3-Clause License # --- # # --- # Copyright (c) 2023, Stephan Nolting. All rights reserved. # --- # # --- # Redistribution and use in source and binary forms, with or without modification, are # --- # permitted provided that the following conditions are met: # --- # # --- # 1. Redistributions of source code must retain the above copyright notice, this list of # --- # conditions and the following disclaimer. # --- # # --- # 2. Redistributions in binary form must reproduce the above copyright notice, this list of # --- # conditions and the following disclaimer in the documentation and/or other materials # --- # provided with the distribution. # --- # # --- # 3. Neither the name of the copyright holder nor the names of its contributors may be used to # --- # endorse or promote products derived from this software without specific prior written # --- # permission. # --- # # --- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS # --- # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # --- # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # --- # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # --- # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # --- # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED # --- # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # --- # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # --- # OF THE POSSIBILITY OF SUCH DAMAGE. # --- # ********************************************************************************************* # --- # The NEORV32 Processor - https://github.com/stnolting/neorv32 (c) Stephan Nolting # --- ################################################################################################# - -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; - -library neorv32; -use neorv32.neorv32_package.all; - -entity neorv32_busswitch is - generic ( - PORT_A_READ_ONLY : boolean; -- set if port A is read-only - PORT_B_READ_ONLY : boolean -- set if port B is read-only - ); - port ( - clk_i : in std_ulogic; -- global clock, rising edge - rstn_i : in std_ulogic; -- global reset, low-active, async - a_req_i : in bus_req_t; -- host port A: request bus - a_rsp_o : out bus_rsp_t; -- host port A: response bus - b_req_i : in bus_req_t; -- host port B: request bus - b_rsp_o : out bus_rsp_t; -- host port B: response bus - x_req_o : out bus_req_t; -- device port request bus - x_rsp_i : in bus_rsp_t -- device port response bus - ); -end neorv32_busswitch; - -architecture neorv32_busswitch_rtl of neorv32_busswitch is - - -- access requests -- - signal a_rd_req_buf, a_wr_req_buf : std_ulogic; - signal b_rd_req_buf, b_wr_req_buf : std_ulogic; - signal a_req_current, a_req_pending : std_ulogic; - signal b_req_current, b_req_pending : std_ulogic; - - -- internal bus lines -- - signal a_bus_ack, b_bus_ack : std_ulogic; - signal a_bus_err, b_bus_err : std_ulogic; - signal x_bus_we, x_bus_re : std_ulogic; - - -- access arbiter -- - type arbiter_state_t is (IDLE, A_BUSY, A_RETIRE, B_BUSY, B_RETIRE); - type arbiter_t is record - state : arbiter_state_t; - state_nxt : arbiter_state_t; - bus_sel : std_ulogic; - re_trig : std_ulogic; - we_trig : std_ulogic; - end record; - signal arbiter : arbiter_t; - -begin - - -- Access Arbiter ------------------------------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - arbiter_sync: process(rstn_i, clk_i) - begin - if (rstn_i = '0') then - arbiter.state <= IDLE; - a_rd_req_buf <= '0'; - a_wr_req_buf <= '0'; - b_rd_req_buf <= '0'; - b_wr_req_buf <= '0'; - elsif rising_edge(clk_i) then - arbiter.state <= arbiter.state_nxt; - -- port A requests -- - a_rd_req_buf <= (a_rd_req_buf or a_req_i.re) and (not (a_bus_err or a_bus_ack)); - a_wr_req_buf <= (a_wr_req_buf or a_req_i.we) and (not (a_bus_err or a_bus_ack)) and bool_to_ulogic_f(PORT_A_READ_ONLY = false); - -- port B requests -- - b_rd_req_buf <= (b_rd_req_buf or b_req_i.re) and (not (b_bus_err or b_bus_ack)); - b_wr_req_buf <= (b_wr_req_buf or b_req_i.we) and (not (b_bus_err or b_bus_ack)) and bool_to_ulogic_f(PORT_B_READ_ONLY = false); - end if; - end process arbiter_sync; - - -- any current requests? -- - a_req_current <= (a_req_i.re or a_req_i.we) when (PORT_A_READ_ONLY = false) else a_req_i.re; - b_req_current <= (b_req_i.re or b_req_i.we) when (PORT_B_READ_ONLY = false) else b_req_i.re; - - -- any pending requests? -- - a_req_pending <= (a_rd_req_buf or a_wr_req_buf) when (PORT_A_READ_ONLY = false) else a_rd_req_buf; - b_req_pending <= (b_rd_req_buf or b_wr_req_buf) when (PORT_B_READ_ONLY = false) else b_rd_req_buf; - - -- FSM -- - arbiter_comb: process(arbiter, a_req_current, b_req_current, a_req_pending, b_req_pending, - a_rd_req_buf, a_wr_req_buf, b_rd_req_buf, b_wr_req_buf, x_rsp_i) - begin - -- arbiter defaults -- - arbiter.state_nxt <= arbiter.state; - arbiter.bus_sel <= '0'; - arbiter.we_trig <= '0'; - arbiter.re_trig <= '0'; - - -- state machine -- - case arbiter.state is - - when IDLE => -- wait for requests - -- ------------------------------------------------------------ - if (a_req_current = '1') then -- current request from port A? - arbiter.bus_sel <= '0'; - arbiter.state_nxt <= A_BUSY; - elsif (a_req_pending = '1') then -- pending request from port A? - arbiter.bus_sel <= '0'; - arbiter.state_nxt <= A_RETIRE; - elsif (b_req_current = '1') then -- pending request from port B? - arbiter.bus_sel <= '1'; - arbiter.state_nxt <= B_BUSY; - elsif (b_req_pending = '1') then -- current request from port B? - arbiter.bus_sel <= '1'; - arbiter.state_nxt <= B_RETIRE; - end if; - - when A_BUSY => -- port A pending access - -- ------------------------------------------------------------ - arbiter.bus_sel <= '0'; -- access from port A - if (x_rsp_i.err = '1') or (x_rsp_i.ack = '1') then --- [COMMENT NOTE] Direct return to IDLE to further promote port A access requests. --- if (b_req_pending = '1') or (b_req_current = '1') then -- any request from B? --- arbiter.state_nxt <= B_RETIRE; --- else - arbiter.state_nxt <= IDLE; --- end if; - end if; - - when A_RETIRE => -- retire port A pending access - -- ------------------------------------------------------------ - arbiter.bus_sel <= '0'; -- access from port A - arbiter.we_trig <= a_wr_req_buf; - arbiter.re_trig <= a_rd_req_buf; - arbiter.state_nxt <= A_BUSY; - - when B_BUSY => -- port B pending access - -- ------------------------------------------------------------ - arbiter.bus_sel <= '1'; -- access from port B - if (x_rsp_i.err = '1') or (x_rsp_i.ack = '1') then - if (a_req_pending = '1') or (a_req_current = '1') then -- any request from A? - arbiter.state_nxt <= A_RETIRE; - else - arbiter.state_nxt <= IDLE; - end if; - end if; - - when B_RETIRE => -- retire port B pending access - -- ------------------------------------------------------------ - arbiter.bus_sel <= '1'; -- access from port B - arbiter.we_trig <= b_wr_req_buf; - arbiter.re_trig <= b_rd_req_buf; - arbiter.state_nxt <= B_BUSY; - - when others => -- undefined - -- ------------------------------------------------------------ - arbiter.state_nxt <= IDLE; - - end case; - end process arbiter_comb; - - - -- Peripheral Bus Switch ------------------------------------------------------------------ - -- ------------------------------------------------------------------------------------------- - x_req_o.addr <= a_req_i.addr when (arbiter.bus_sel = '0') else b_req_i.addr; - - x_req_o.data <= b_req_i.data when (PORT_A_READ_ONLY = true) else - a_req_i.data when (PORT_B_READ_ONLY = true) else - a_req_i.data when (arbiter.bus_sel = '0') else b_req_i.data; - - x_req_o.ben <= b_req_i.ben when (PORT_A_READ_ONLY = true) else - a_req_i.ben when (PORT_B_READ_ONLY = true) else - a_req_i.ben when (arbiter.bus_sel = '0') else b_req_i.ben; - - x_req_o.priv <= a_req_i.priv when (arbiter.bus_sel = '0') else b_req_i.priv; - x_req_o.src <= a_req_i.src when (arbiter.bus_sel = '0') else b_req_i.src; - - x_bus_we <= a_req_i.we when (arbiter.bus_sel = '0') else b_req_i.we; - x_bus_re <= a_req_i.re when (arbiter.bus_sel = '0') else b_req_i.re; - x_req_o.we <= x_bus_we or arbiter.we_trig; - x_req_o.re <= x_bus_re or arbiter.re_trig; - - a_rsp_o.data <= x_rsp_i.data; - b_rsp_o.data <= x_rsp_i.data; - - a_bus_ack <= x_rsp_i.ack when (arbiter.bus_sel = '0') else '0'; - b_bus_ack <= x_rsp_i.ack when (arbiter.bus_sel = '1') else '0'; - a_rsp_o.ack <= a_bus_ack; - b_rsp_o.ack <= b_bus_ack; - - a_bus_err <= x_rsp_i.err when (arbiter.bus_sel = '0') else '0'; - b_bus_err <= x_rsp_i.err when (arbiter.bus_sel = '1') else '0'; - a_rsp_o.err <= a_bus_err; - b_rsp_o.err <= b_bus_err; - - -end neorv32_busswitch_rtl; diff --git a/rtl/core/neorv32_intercon.vhd b/rtl/core/neorv32_intercon.vhd new file mode 100644 index 000000000..9d1f6bc0a --- /dev/null +++ b/rtl/core/neorv32_intercon.vhd @@ -0,0 +1,530 @@ +-- ################################################################################################# +-- # << NEORV32 - 2-to-1 Bus Switch >> # +-- # ********************************************************************************************* # +-- # Allows to access a single bus ("p_bus") by two controller ports. Controller port A ("ca_bus") # +--# has priority over controller port B ("cb_bus"). # +-- # ********************************************************************************************* # +-- # BSD 3-Clause License # +-- # # +-- # Copyright (c) 2023, Stephan Nolting. All rights reserved. # +-- # # +-- # Redistribution and use in source and binary forms, with or without modification, are # +-- # permitted provided that the following conditions are met: # +-- # # +-- # 1. Redistributions of source code must retain the above copyright notice, this list of # +-- # conditions and the following disclaimer. # +-- # # +-- # 2. Redistributions in binary form must reproduce the above copyright notice, this list of # +-- # conditions and the following disclaimer in the documentation and/or other materials # +-- # provided with the distribution. # +-- # # +-- # 3. Neither the name of the copyright holder nor the names of its contributors may be used to # +-- # endorse or promote products derived from this software without specific prior written # +-- # permission. # +-- # # +-- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS # +-- # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # +-- # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # +-- # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # +-- # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # +-- # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED # +-- # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # +-- # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # +-- # OF THE POSSIBILITY OF SUCH DAMAGE. # +-- # ********************************************************************************************* # +-- # The NEORV32 Processor - https://github.com/stnolting/neorv32 (c) Stephan Nolting # +-- ################################################################################################# + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library neorv32; +use neorv32.neorv32_package.all; + +entity neorv32_busswitch is + generic ( + PORT_A_READ_ONLY : boolean; -- set if port A is read-only + PORT_B_READ_ONLY : boolean -- set if port B is read-only + ); + port ( + clk_i : in std_ulogic; -- global clock, rising edge + rstn_i : in std_ulogic; -- global reset, low-active, async + a_req_i : in bus_req_t; -- host port A: request bus + a_rsp_o : out bus_rsp_t; -- host port A: response bus + b_req_i : in bus_req_t; -- host port B: request bus + b_rsp_o : out bus_rsp_t; -- host port B: response bus + x_req_o : out bus_req_t; -- device port request bus + x_rsp_i : in bus_rsp_t -- device port response bus + ); +end neorv32_busswitch; + +architecture neorv32_busswitch_rtl of neorv32_busswitch is + + -- access requests -- + signal a_rd_req_buf, a_wr_req_buf : std_ulogic; + signal b_rd_req_buf, b_wr_req_buf : std_ulogic; + signal a_req_current, a_req_pending : std_ulogic; + signal b_req_current, b_req_pending : std_ulogic; + + -- internal bus lines -- + signal a_bus_ack, b_bus_ack : std_ulogic; + signal a_bus_err, b_bus_err : std_ulogic; + signal x_bus_we, x_bus_re : std_ulogic; + + -- access arbiter -- + type arbiter_state_t is (IDLE, A_BUSY, A_RETIRE, B_BUSY, B_RETIRE); + type arbiter_t is record + state : arbiter_state_t; + state_nxt : arbiter_state_t; + bus_sel : std_ulogic; + re_trig : std_ulogic; + we_trig : std_ulogic; + end record; + signal arbiter : arbiter_t; + +begin + + -- Access Arbiter ------------------------------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + arbiter_sync: process(rstn_i, clk_i) + begin + if (rstn_i = '0') then + arbiter.state <= IDLE; + a_rd_req_buf <= '0'; + a_wr_req_buf <= '0'; + b_rd_req_buf <= '0'; + b_wr_req_buf <= '0'; + elsif rising_edge(clk_i) then + arbiter.state <= arbiter.state_nxt; + -- port A requests -- + a_rd_req_buf <= (a_rd_req_buf or a_req_i.re) and (not (a_bus_err or a_bus_ack)); + a_wr_req_buf <= (a_wr_req_buf or a_req_i.we) and (not (a_bus_err or a_bus_ack)) and bool_to_ulogic_f(PORT_A_READ_ONLY = false); + -- port B requests -- + b_rd_req_buf <= (b_rd_req_buf or b_req_i.re) and (not (b_bus_err or b_bus_ack)); + b_wr_req_buf <= (b_wr_req_buf or b_req_i.we) and (not (b_bus_err or b_bus_ack)) and bool_to_ulogic_f(PORT_B_READ_ONLY = false); + end if; + end process arbiter_sync; + + -- any current requests? -- + a_req_current <= (a_req_i.re or a_req_i.we) when (PORT_A_READ_ONLY = false) else a_req_i.re; + b_req_current <= (b_req_i.re or b_req_i.we) when (PORT_B_READ_ONLY = false) else b_req_i.re; + + -- any pending requests? -- + a_req_pending <= (a_rd_req_buf or a_wr_req_buf) when (PORT_A_READ_ONLY = false) else a_rd_req_buf; + b_req_pending <= (b_rd_req_buf or b_wr_req_buf) when (PORT_B_READ_ONLY = false) else b_rd_req_buf; + + -- FSM -- + arbiter_comb: process(arbiter, a_req_current, b_req_current, a_req_pending, b_req_pending, + a_rd_req_buf, a_wr_req_buf, b_rd_req_buf, b_wr_req_buf, x_rsp_i) + begin + -- arbiter defaults -- + arbiter.state_nxt <= arbiter.state; + arbiter.bus_sel <= '0'; + arbiter.we_trig <= '0'; + arbiter.re_trig <= '0'; + + -- state machine -- + case arbiter.state is + + when IDLE => -- wait for requests + -- ------------------------------------------------------------ + if (a_req_current = '1') then -- current request from port A? + arbiter.bus_sel <= '0'; + arbiter.state_nxt <= A_BUSY; + elsif (a_req_pending = '1') then -- pending request from port A? + arbiter.bus_sel <= '0'; + arbiter.state_nxt <= A_RETIRE; + elsif (b_req_current = '1') then -- pending request from port B? + arbiter.bus_sel <= '1'; + arbiter.state_nxt <= B_BUSY; + elsif (b_req_pending = '1') then -- current request from port B? + arbiter.bus_sel <= '1'; + arbiter.state_nxt <= B_RETIRE; + end if; + + when A_BUSY => -- port A pending access + -- ------------------------------------------------------------ + arbiter.bus_sel <= '0'; -- access from port A + if (x_rsp_i.err = '1') or (x_rsp_i.ack = '1') then +-- [NOTE] Directly return to IDLE state to further promote port A access requests. +-- if (b_req_pending = '1') or (b_req_current = '1') then -- any request from B? +-- arbiter.state_nxt <= B_RETIRE; +-- else + arbiter.state_nxt <= IDLE; +-- end if; + end if; + + when A_RETIRE => -- retire port A pending access + -- ------------------------------------------------------------ + arbiter.bus_sel <= '0'; -- access from port A + arbiter.we_trig <= a_wr_req_buf; + arbiter.re_trig <= a_rd_req_buf; + arbiter.state_nxt <= A_BUSY; + + when B_BUSY => -- port B pending access + -- ------------------------------------------------------------ + arbiter.bus_sel <= '1'; -- access from port B + if (x_rsp_i.err = '1') or (x_rsp_i.ack = '1') then + if (a_req_pending = '1') or (a_req_current = '1') then -- any request from A? + arbiter.state_nxt <= A_RETIRE; + else + arbiter.state_nxt <= IDLE; + end if; + end if; + + when B_RETIRE => -- retire port B pending access + -- ------------------------------------------------------------ + arbiter.bus_sel <= '1'; -- access from port B + arbiter.we_trig <= b_wr_req_buf; + arbiter.re_trig <= b_rd_req_buf; + arbiter.state_nxt <= B_BUSY; + + when others => -- undefined + -- ------------------------------------------------------------ + arbiter.state_nxt <= IDLE; + + end case; + end process arbiter_comb; + + + -- Peripheral Bus Switch ------------------------------------------------------------------ + -- ------------------------------------------------------------------------------------------- + x_req_o.addr <= a_req_i.addr when (arbiter.bus_sel = '0') else b_req_i.addr; + + x_req_o.data <= b_req_i.data when (PORT_A_READ_ONLY = true) else + a_req_i.data when (PORT_B_READ_ONLY = true) else + a_req_i.data when (arbiter.bus_sel = '0') else b_req_i.data; + + x_req_o.ben <= b_req_i.ben when (PORT_A_READ_ONLY = true) else + a_req_i.ben when (PORT_B_READ_ONLY = true) else + a_req_i.ben when (arbiter.bus_sel = '0') else b_req_i.ben; + + x_req_o.priv <= a_req_i.priv when (arbiter.bus_sel = '0') else b_req_i.priv; + x_req_o.src <= a_req_i.src when (arbiter.bus_sel = '0') else b_req_i.src; + + x_bus_we <= a_req_i.we when (arbiter.bus_sel = '0') else b_req_i.we; + x_bus_re <= a_req_i.re when (arbiter.bus_sel = '0') else b_req_i.re; + x_req_o.we <= x_bus_we or arbiter.we_trig; + x_req_o.re <= x_bus_re or arbiter.re_trig; + + a_rsp_o.data <= x_rsp_i.data; + b_rsp_o.data <= x_rsp_i.data; + + a_bus_ack <= x_rsp_i.ack when (arbiter.bus_sel = '0') else '0'; + b_bus_ack <= x_rsp_i.ack when (arbiter.bus_sel = '1') else '0'; + a_rsp_o.ack <= a_bus_ack; + b_rsp_o.ack <= b_bus_ack; + + a_bus_err <= x_rsp_i.err when (arbiter.bus_sel = '0') else '0'; + b_bus_err <= x_rsp_i.err when (arbiter.bus_sel = '1') else '0'; + a_rsp_o.err <= a_bus_err; + b_rsp_o.err <= b_bus_err; + + +end neorv32_busswitch_rtl; + + +-- ############################################################################################################################ +-- ############################################################################################################################ + + +-- ################################################################################################# +-- # << NEORV32 - Processor Interconnect >> # +-- # ********************************************************************************************* # +-- # Bus gateway to distribute the core's access to the processor's main memory sections: # +-- # -> IMEM - internal instruction memory [optional] # +-- # -> DMEM - internal data memory [optional] # +-- # -> XIP - memory-mapped XIP flash [optional] # +-- # -> BOOT - internal bootloader ROM [optional] # +-- # -> IO - internal IO devices [mandatory] # +-- # All accesses that do not match any of these sections are redirected to the "external" port. # +-- # The gateway-internal bus monitor ensures that all processor-internal accesses are completed # +-- # within a fixed time window. # +-- # ********************************************************************************************* # +-- # BSD 3-Clause License # +-- # # +-- # Copyright (c) 2023, Stephan Nolting. All rights reserved. # +-- # # +-- # Redistribution and use in source and binary forms, with or without modification, are # +-- # permitted provided that the following conditions are met: # +-- # # +-- # 1. Redistributions of source code must retain the above copyright notice, this list of # +-- # conditions and the following disclaimer. # +-- # # +-- # 2. Redistributions in binary form must reproduce the above copyright notice, this list of # +-- # conditions and the following disclaimer in the documentation and/or other materials # +-- # provided with the distribution. # +-- # # +-- # 3. Neither the name of the copyright holder nor the names of its contributors may be used to # +-- # endorse or promote products derived from this software without specific prior written # +-- # permission. # +-- # # +-- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS # +-- # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # +-- # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # +-- # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # +-- # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # +-- # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED # +-- # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # +-- # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # +-- # OF THE POSSIBILITY OF SUCH DAMAGE. # +-- # ********************************************************************************************* # +-- # The NEORV32 Processor - https://github.com/stnolting/neorv32 (c) Stephan Nolting # +-- ################################################################################################# + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library neorv32; +use neorv32.neorv32_package.all; + +entity neorv32_gateway is + generic ( + TIMEOUT : positive; -- internal bus timeout cycles + -- IMEM port -- + IMEM_ENABLE : boolean; + IMEM_BASE : std_ulogic_vector(31 downto 0); + IMEM_SIZE : positive; + -- DMEM port -- + DMEM_ENABLE : boolean; + DMEM_BASE : std_ulogic_vector(31 downto 0); + DMEM_SIZE : positive; + -- XIP port -- + XIP_ENABLE : boolean; + XIP_BASE : std_ulogic_vector(31 downto 0); + XIP_SIZE : positive; + -- BOOT ROM port -- + BOOT_ENABLE : boolean; + BOOT_BASE : std_ulogic_vector(31 downto 0); + BOOT_SIZE : positive; + -- IO port -- + IO_ENABLE : boolean; + IO_REQ_REG : boolean; + IO_RSP_REG : boolean; + IO_BASE : std_ulogic_vector(31 downto 0); + IO_SIZE : positive; + -- EXTERNAL port -- + EXT_ENABLE : boolean + ); + port ( + -- global control -- + clk_i : in std_ulogic; -- global clock, rising edge + rstn_i : in std_ulogic; -- global reset, low-active, async + -- host port -- + main_req_i : in bus_req_t; -- host request + main_rsp_o : out bus_rsp_t; -- host response + -- section ports -- + imem_req_o : out bus_req_t; + imem_rsp_i : in bus_rsp_t; + dmem_req_o : out bus_req_t; + dmem_rsp_i : in bus_rsp_t; + xip_req_o : out bus_req_t; + xip_rsp_i : in bus_rsp_t; + boot_req_o : out bus_req_t; + boot_rsp_i : in bus_rsp_t; + io_req_o : out bus_req_t; + io_rsp_i : in bus_rsp_t; + ext_req_o : out bus_req_t; + ext_rsp_i : in bus_rsp_t + ); +end neorv32_gateway; + +architecture neorv32_gateway_rtl of neorv32_gateway is + + -- port select -- + constant port_imem_c : natural := 0; + constant port_dmem_c : natural := 1; + constant port_xip_c : natural := 2; + constant port_boot_c : natural := 3; + constant port_io_c : natural := 4; + constant port_ext_c : natural := 5; + signal port_en : std_ulogic_vector(5 downto 0); + + -- IO buffer stage -- + signal io_req : bus_req_t; + signal io_rsp : bus_rsp_t; + + -- response summary -- + signal int_rsp : bus_rsp_t; + + -- bus monitor -- + type keeper_t is record + busy : std_ulogic; + cnt : std_ulogic_vector(index_size_f(TIMEOUT) downto 0); + err : std_ulogic; + halt : std_ulogic; + end record; + signal keeper : keeper_t; + +begin + + -- Sanity Checks -------------------------------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + assert false report + "NEORV32 PROCESSOR CONFIG NOTE: Processor-internal bus timeout after " & integer'image(TIMEOUT) & " cycles." severity note; + + + -- Address Section Decoder ---------------------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + port_en(port_imem_c) <= '1' when (main_req_i.addr(31 downto index_size_f(IMEM_SIZE)) = IMEM_BASE(31 downto index_size_f(IMEM_SIZE))) and (IMEM_ENABLE = true) else '0'; + port_en(port_dmem_c) <= '1' when (main_req_i.addr(31 downto index_size_f(DMEM_SIZE)) = DMEM_BASE(31 downto index_size_f(DMEM_SIZE))) and (DMEM_ENABLE = true) else '0'; + port_en(port_xip_c) <= '1' when (main_req_i.addr(31 downto index_size_f(XIP_SIZE)) = XIP_BASE( 31 downto index_size_f(XIP_SIZE))) and (XIP_ENABLE = true) else '0'; + port_en(port_boot_c) <= '1' when (main_req_i.addr(31 downto index_size_f(BOOT_SIZE)) = BOOT_BASE(31 downto index_size_f(BOOT_SIZE))) and (BOOT_ENABLE = true) else '0'; + port_en(port_io_c) <= '1' when (main_req_i.addr(31 downto index_size_f(IO_SIZE)) = IO_BASE( 31 downto index_size_f(IO_SIZE))) and (IO_ENABLE = true) else '0'; + + -- accesses to the "void" (= no section is matched) are redirected to the external bus interface -- + port_en(port_ext_c) <= '1' when (port_en(port_imem_c) = '0') and + (port_en(port_dmem_c) = '0') and + (port_en(port_xip_c) = '0') and + (port_en(port_boot_c) = '0') and + (port_en(port_io_c) = '0') and (EXT_ENABLE = true) else '0'; + + + -- Bus Request ---------------------------------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + request: process(main_req_i, port_en) + begin + imem_req_o <= main_req_i; + imem_req_o.we <= main_req_i.we and port_en(port_imem_c); + imem_req_o.re <= main_req_i.re and port_en(port_imem_c); + -- + dmem_req_o <= main_req_i; + dmem_req_o.we <= main_req_i.we and port_en(port_dmem_c); + dmem_req_o.re <= main_req_i.re and port_en(port_dmem_c); + -- + xip_req_o <= main_req_i; + xip_req_o.we <= main_req_i.we and port_en(port_xip_c); + xip_req_o.re <= main_req_i.re and port_en(port_xip_c); + -- + boot_req_o <= main_req_i; + boot_req_o.we <= main_req_i.we and port_en(port_boot_c); + boot_req_o.re <= main_req_i.re and port_en(port_boot_c); + -- + io_req <= main_req_i; + io_req.we <= main_req_i.we and port_en(port_io_c); + io_req.re <= main_req_i.re and port_en(port_io_c); + -- + ext_req_o <= main_req_i; + ext_req_o.we <= main_req_i.we and port_en(port_ext_c); + ext_req_o.re <= main_req_i.re and port_en(port_ext_c); + end process request; + + + -- IO Port Register Stages ---------------------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + io_req_buffer_true: + if (IO_REQ_REG = true) generate + io_req_buffer: process(rstn_i, clk_i) + begin + if (rstn_i = '0') then + io_req_o <= req_terminate_c; + elsif rising_edge(clk_i) then + io_req_o <= io_req; + end if; + end process io_req_buffer; + end generate; + + io_req_buffer_false: + if (IO_REQ_REG = false) generate + io_req_o <= io_req; + end generate; + + + io_rsp_buffer_true: + if (IO_RSP_REG = true) generate + io_rsp_buffer: process(rstn_i, clk_i) + begin + if (rstn_i = '0') then + io_rsp <= rsp_terminate_c; + elsif rising_edge(clk_i) then + io_rsp <= io_rsp_i; + end if; + end process io_rsp_buffer; + end generate; + + io_rsp_buffer_false: + if (IO_RSP_REG = false) generate + io_rsp <= io_rsp_i; + end generate; + + + -- Bus Response --------------------------------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + response: process(imem_rsp_i, dmem_rsp_i, boot_rsp_i, xip_rsp_i, io_rsp, ext_rsp_i) + variable tmp_v : bus_rsp_t; + begin + tmp_v := rsp_terminate_c; -- start will all-zero + if (IMEM_ENABLE = true) then + tmp_v.data := tmp_v.data or imem_rsp_i.data; + tmp_v.ack := tmp_v.ack or imem_rsp_i.ack; + tmp_v.err := tmp_v.err or imem_rsp_i.err; + end if; + if (DMEM_ENABLE = true) then + tmp_v.data := tmp_v.data or dmem_rsp_i.data; + tmp_v.ack := tmp_v.ack or dmem_rsp_i.ack; + tmp_v.err := tmp_v.err or dmem_rsp_i.err; + end if; + if (XIP_ENABLE = true) then + tmp_v.data := tmp_v.data or xip_rsp_i.data; + tmp_v.ack := tmp_v.ack or xip_rsp_i.ack; + tmp_v.err := tmp_v.err or xip_rsp_i.err; + end if; + if (BOOT_ENABLE = true) then + tmp_v.data := tmp_v.data or boot_rsp_i.data; + tmp_v.ack := tmp_v.ack or boot_rsp_i.ack; + tmp_v.err := tmp_v.err or boot_rsp_i.err; + end if; + if (IO_ENABLE = true) then + tmp_v.data := tmp_v.data or io_rsp.data; + tmp_v.ack := tmp_v.ack or io_rsp.ack; + tmp_v.err := tmp_v.err or io_rsp.err; + end if; + if (EXT_ENABLE = true) then + tmp_v.data := tmp_v.data or ext_rsp_i.data; + tmp_v.ack := tmp_v.ack or ext_rsp_i.ack; + tmp_v.err := tmp_v.err or ext_rsp_i.err; + end if; + int_rsp <= tmp_v; + end process response; + + -- host response -- + main_rsp_o.data <= int_rsp.data; + main_rsp_o.ack <= int_rsp.ack; + main_rsp_o.err <= keeper.err; + + + -- Bus Monitor (aka "the KEEPER") --------------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + bus_monitor: process(rstn_i, clk_i) + begin + if (rstn_i = '0') then + keeper.busy <= '0'; + keeper.cnt <= (others => '0'); + keeper.err <= '0'; + keeper.halt <= '0'; + elsif rising_edge(clk_i) then + -- defaults -- + keeper.err <= '0'; + keeper.halt <= port_en(port_xip_c) or port_en(port_ext_c); -- no timeout if XIP or EXTERNAL access + -- fsm -- + if (keeper.busy = '0') then -- bus idle + keeper.cnt <= std_ulogic_vector(to_unsigned(TIMEOUT, keeper.cnt'length)); + if (main_req_i.re = '1') or (main_req_i.we = '1') then + keeper.busy <= '1'; + end if; + else -- bus access in progress + keeper.cnt <= std_ulogic_vector(unsigned(keeper.cnt) - 1); + if (int_rsp.ack = '1') then -- normal access termination + keeper.busy <= '0'; + elsif (int_rsp.err = '1') or ((or_reduce_f(keeper.cnt) = '0') and (keeper.halt = '0')) then -- bus error or timeout + keeper.err <= '1'; + keeper.busy <= '0'; + end if; + end if; + end if; + end process bus_monitor; + + +end neorv32_gateway_rtl; From b3fa85b2fa202c3287d27a9096315bcd8049bd06 Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Fri, 14 Jul 2023 22:03:07 +0200 Subject: [PATCH 02/31] remove local address decoding from internal memories --- rtl/core/mem/neorv32_dmem.default.vhd | 26 ++++++++----------- rtl/core/mem/neorv32_dmem.legacy.vhd | 20 +++++---------- rtl/core/mem/neorv32_imem.default.vhd | 32 ++++++++++------------- rtl/core/mem/neorv32_imem.legacy.vhd | 26 ++++++++----------- rtl/core/neorv32_boot_rom.vhd | 37 ++++++++------------------- rtl/core/neorv32_dmem.entity.vhd | 1 - rtl/core/neorv32_imem.entity.vhd | 1 - 7 files changed, 51 insertions(+), 92 deletions(-) diff --git a/rtl/core/mem/neorv32_dmem.default.vhd b/rtl/core/mem/neorv32_dmem.default.vhd index 604456eb9..f08b7b9d9 100644 --- a/rtl/core/mem/neorv32_dmem.default.vhd +++ b/rtl/core/mem/neorv32_dmem.default.vhd @@ -41,15 +41,10 @@ use neorv32.neorv32_package.all; architecture neorv32_dmem_rtl of neorv32_dmem is - -- IO space: module base address -- - constant hi_abb_c : natural := 31; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(DMEM_SIZE); -- low address boundary bit - -- local signals -- - signal acc_en : std_ulogic; - signal rdata : std_ulogic_vector(31 downto 0); - signal rden : std_ulogic; - signal addr : std_ulogic_vector(index_size_f(DMEM_SIZE/4)-1 downto 0); + signal rdata : std_ulogic_vector(31 downto 0); + signal rden : std_ulogic; + signal addr : std_ulogic_vector(index_size_f(DMEM_SIZE/4)-1 downto 0); -- -------------------------------------------------------------------------------------------------------------- -- -- The memory (RAM) is built from 4 individual byte-wide memories b0..b3, since some synthesis tools have -- @@ -80,8 +75,7 @@ begin -- Access Control ------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = DMEM_BASE(hi_abb_c downto lo_abb_c)) else '0'; - addr <= bus_req_i.addr(index_size_f(DMEM_SIZE/4)+1 downto 2); -- word aligned + addr <= bus_req_i.addr(index_size_f(DMEM_SIZE/4)+1 downto 2); -- word aligned -- Memory Access -------------------------------------------------------------------------- @@ -89,16 +83,16 @@ begin mem_access: process(clk_i) begin if rising_edge(clk_i) then - if (acc_en = '1') and (bus_req_i.we = '1') and (bus_req_i.ben(0) = '1') then -- byte 0 + if (bus_req_i.we = '1') and (bus_req_i.ben(0) = '1') then -- byte 0 mem_ram_b0(to_integer(unsigned(addr))) <= bus_req_i.data(07 downto 00); end if; - if (acc_en = '1') and (bus_req_i.we = '1') and (bus_req_i.ben(1) = '1') then -- byte 1 + if (bus_req_i.we = '1') and (bus_req_i.ben(1) = '1') then -- byte 1 mem_ram_b1(to_integer(unsigned(addr))) <= bus_req_i.data(15 downto 08); end if; - if (acc_en = '1') and (bus_req_i.we = '1') and (bus_req_i.ben(2) = '1') then -- byte 2 + if (bus_req_i.we = '1') and (bus_req_i.ben(2) = '1') then -- byte 2 mem_ram_b2(to_integer(unsigned(addr))) <= bus_req_i.data(23 downto 16); end if; - if (acc_en = '1') and (bus_req_i.we = '1') and (bus_req_i.ben(3) = '1') then -- byte 3 + if (bus_req_i.we = '1') and (bus_req_i.ben(3) = '1') then -- byte 3 mem_ram_b3(to_integer(unsigned(addr))) <= bus_req_i.data(31 downto 24); end if; mem_ram_b0_rd <= mem_ram_b0(to_integer(unsigned(addr))); @@ -114,8 +108,8 @@ begin bus_feedback: process(clk_i) begin if rising_edge(clk_i) then - rden <= acc_en and bus_req_i.re; - bus_rsp_o.ack <= acc_en and (bus_req_i.re or bus_req_i.we); + rden <= bus_req_i.re; + bus_rsp_o.ack <= bus_req_i.re or bus_req_i.we; end if; end process bus_feedback; diff --git a/rtl/core/mem/neorv32_dmem.legacy.vhd b/rtl/core/mem/neorv32_dmem.legacy.vhd index 990fbdbb9..fb105df30 100644 --- a/rtl/core/mem/neorv32_dmem.legacy.vhd +++ b/rtl/core/mem/neorv32_dmem.legacy.vhd @@ -41,12 +41,7 @@ use neorv32.neorv32_package.all; architecture neorv32_dmem_rtl of neorv32_dmem is - -- IO space: module base address -- - constant hi_abb_c : natural := 31; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(DMEM_SIZE); -- low address boundary bit - -- local signals -- - signal acc_en : std_ulogic; signal rdata : std_ulogic_vector(31 downto 0); signal rden : std_ulogic; signal addr : std_ulogic_vector(index_size_f(DMEM_SIZE/4)-1 downto 0); @@ -81,8 +76,7 @@ begin -- Access Control ------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = DMEM_BASE(hi_abb_c downto lo_abb_c)) else '0'; - addr <= bus_req_i.addr(index_size_f(DMEM_SIZE/4)+1 downto 2); -- word aligned + addr <= bus_req_i.addr(index_size_f(DMEM_SIZE/4)+1 downto 2); -- word aligned -- Memory Access -------------------------------------------------------------------------- @@ -91,16 +85,16 @@ begin begin if rising_edge(clk_i) then addr_ff <= addr; - if (acc_en = '1') and (bus_req_i.we = '1') and (bus_req_i.ben(0) = '1') then -- byte 0 + if (bus_req_i.we = '1') and (bus_req_i.ben(0) = '1') then -- byte 0 mem_ram_b0(to_integer(unsigned(addr))) <= bus_req_i.data(07 downto 00); end if; - if (acc_en = '1') and (bus_req_i.we = '1') and (bus_req_i.ben(1) = '1') then -- byte 1 + if (bus_req_i.we = '1') and (bus_req_i.ben(1) = '1') then -- byte 1 mem_ram_b1(to_integer(unsigned(addr))) <= bus_req_i.data(15 downto 08); end if; - if (acc_en = '1') and (bus_req_i.we = '1') and (bus_req_i.ben(2) = '1') then -- byte 2 + if (bus_req_i.we = '1') and (bus_req_i.ben(2) = '1') then -- byte 2 mem_ram_b2(to_integer(unsigned(addr))) <= bus_req_i.data(23 downto 16); end if; - if (acc_en = '1') and (bus_req_i.we = '1') and (bus_req_i.ben(3) = '1') then -- byte 3 + if (bus_req_i.we = '1') and (bus_req_i.ben(3) = '1') then -- byte 3 mem_ram_b3(to_integer(unsigned(addr))) <= bus_req_i.data(31 downto 24); end if; end if; @@ -118,8 +112,8 @@ begin bus_feedback: process(clk_i) begin if rising_edge(clk_i) then - rden <= acc_en and bus_req_i.re; - bus_rsp_o.ack <= acc_en and (bus_req_i.re or bus_req_i.we); + rden <= bus_req_i.re; + bus_rsp_o.ack <= bus_req_i.re or bus_req_i.we; end if; end process bus_feedback; diff --git a/rtl/core/mem/neorv32_imem.default.vhd b/rtl/core/mem/neorv32_imem.default.vhd index 4d35dec10..eafcb6a42 100644 --- a/rtl/core/mem/neorv32_imem.default.vhd +++ b/rtl/core/mem/neorv32_imem.default.vhd @@ -45,15 +45,10 @@ use neorv32.neorv32_application_image.all; -- this file is generated by the imag architecture neorv32_imem_rtl of neorv32_imem is - -- IO space: module base address -- - constant hi_abb_c : natural := 31; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(IMEM_SIZE); -- low address boundary bit - -- local signals -- - signal acc_en : std_ulogic; - signal rdata : std_ulogic_vector(31 downto 0); - signal rden : std_ulogic; - signal addr : std_ulogic_vector(index_size_f(IMEM_SIZE/4)-1 downto 0); + signal rdata : std_ulogic_vector(31 downto 0); + signal rden : std_ulogic; + signal addr : std_ulogic_vector(index_size_f(IMEM_SIZE/4)-1 downto 0); -- --------------------------- -- -- IMEM as pre-initialized ROM -- @@ -105,8 +100,7 @@ begin -- Access Control ------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = IMEM_BASE(hi_abb_c downto lo_abb_c)) else '0'; - addr <= bus_req_i.addr(index_size_f(IMEM_SIZE/4)+1 downto 2); -- word aligned + addr <= bus_req_i.addr(index_size_f(IMEM_SIZE/4)+1 downto 2); -- word aligned -- Implement IMEM as pre-initialized ROM -------------------------------------------------- @@ -116,7 +110,7 @@ begin mem_access: process(clk_i) begin if rising_edge(clk_i) then - if (acc_en = '1') then -- reduce switching activity when not accessed + if (bus_req_i.re = '1') then mem_rom_rd <= mem_rom(to_integer(unsigned(addr))); end if; end if; @@ -133,16 +127,16 @@ begin mem_access: process(clk_i) begin if rising_edge(clk_i) then - if (acc_en = '1') and (bus_req_i.we = '1') and (bus_req_i.ben(0) = '1') then -- byte 0 + if (bus_req_i.we = '1') and (bus_req_i.ben(0) = '1') then -- byte 0 mem_ram_b0(to_integer(unsigned(addr))) <= bus_req_i.data(07 downto 00); end if; - if (acc_en = '1') and (bus_req_i.we = '1') and (bus_req_i.ben(1) = '1') then -- byte 1 + if (bus_req_i.we = '1') and (bus_req_i.ben(1) = '1') then -- byte 1 mem_ram_b1(to_integer(unsigned(addr))) <= bus_req_i.data(15 downto 08); end if; - if (acc_en = '1') and (bus_req_i.we = '1') and (bus_req_i.ben(2) = '1') then -- byte 2 + if (bus_req_i.we = '1') and (bus_req_i.ben(2) = '1') then -- byte 2 mem_ram_b2(to_integer(unsigned(addr))) <= bus_req_i.data(23 downto 16); end if; - if (acc_en = '1') and (bus_req_i.we = '1') and (bus_req_i.ben(3) = '1') then -- byte 3 + if (bus_req_i.we = '1') and (bus_req_i.ben(3) = '1') then -- byte 3 mem_ram_b3(to_integer(unsigned(addr))) <= bus_req_i.data(31 downto 24); end if; mem_b0_rd <= mem_ram_b0(to_integer(unsigned(addr))); @@ -161,12 +155,12 @@ begin bus_feedback: process(clk_i) begin if rising_edge(clk_i) then - rden <= acc_en and bus_req_i.re; + rden <= bus_req_i.re; if (IMEM_AS_IROM = true) then - bus_rsp_o.ack <= acc_en and bus_req_i.re; - bus_rsp_o.err <= acc_en and bus_req_i.we; + bus_rsp_o.ack <= bus_req_i.re; + bus_rsp_o.err <= bus_req_i.we; else - bus_rsp_o.ack <= acc_en and (bus_req_i.re or bus_req_i.we); + bus_rsp_o.ack <= bus_req_i.re or bus_req_i.we; bus_rsp_o.err <= '0'; end if; end if; diff --git a/rtl/core/mem/neorv32_imem.legacy.vhd b/rtl/core/mem/neorv32_imem.legacy.vhd index 295977ebd..12ca8cd52 100644 --- a/rtl/core/mem/neorv32_imem.legacy.vhd +++ b/rtl/core/mem/neorv32_imem.legacy.vhd @@ -45,12 +45,7 @@ use neorv32.neorv32_application_image.all; -- this file is generated by the imag architecture neorv32_imem_rtl of neorv32_imem is - -- IO space: module base address -- - constant hi_abb_c : natural := 31; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(IMEM_SIZE); -- low address boundary bit - -- local signals -- - signal acc_en : std_ulogic; signal rdata : std_ulogic_vector(31 downto 0); signal rden : std_ulogic; signal addr : std_ulogic_vector(index_size_f(IMEM_SIZE/4)-1 downto 0); @@ -106,8 +101,7 @@ begin -- Access Control ------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = IMEM_BASE(hi_abb_c downto lo_abb_c)) else '0'; - addr <= bus_req_i.addr(index_size_f(IMEM_SIZE/4)+1 downto 2); -- word aligned + addr <= bus_req_i.addr(index_size_f(IMEM_SIZE/4)+1 downto 2); -- word aligned -- Implement IMEM as pre-initialized ROM -------------------------------------------------- @@ -117,7 +111,7 @@ begin mem_access: process(clk_i) begin if rising_edge(clk_i) then - if (acc_en = '1') then -- reduce switching activity when not accessed + if (bus_req_i.re = '1') then -- reduce switching activity when not accessed mem_rom_rd <= mem_rom(to_integer(unsigned(addr))); end if; end if; @@ -135,16 +129,16 @@ begin begin if rising_edge(clk_i) then addr_ff <= addr; - if (acc_en = '1') and (bus_req_i.we = '1') and (bus_req_i.ben(0) = '1') then -- byte 0 + if (bus_req_i.we = '1') and (bus_req_i.ben(0) = '1') then -- byte 0 mem_ram_b0(to_integer(unsigned(addr))) <= bus_req_i.data(07 downto 00); end if; - if (acc_en = '1') and (bus_req_i.we = '1') and (bus_req_i.ben(1) = '1') then -- byte 1 + if (bus_req_i.we = '1') and (bus_req_i.ben(1) = '1') then -- byte 1 mem_ram_b1(to_integer(unsigned(addr))) <= bus_req_i.data(15 downto 08); end if; - if (acc_en = '1') and (bus_req_i.we = '1') and (bus_req_i.ben(2) = '1') then -- byte 2 + if (bus_req_i.we = '1') and (bus_req_i.ben(2) = '1') then -- byte 2 mem_ram_b2(to_integer(unsigned(addr))) <= bus_req_i.data(23 downto 16); end if; - if (acc_en = '1') and (bus_req_i.we = '1') and (bus_req_i.ben(3) = '1') then -- byte 3 + if (bus_req_i.we = '1') and (bus_req_i.ben(3) = '1') then -- byte 3 mem_ram_b3(to_integer(unsigned(addr))) <= bus_req_i.data(31 downto 24); end if; end if; @@ -164,12 +158,12 @@ begin bus_feedback: process(clk_i) begin if rising_edge(clk_i) then - rden <= acc_en and bus_req_i.re; + rden <= bus_req_i.re; if (IMEM_AS_IROM = true) then - bus_rsp_o.ack <= acc_en and bus_req_i.re; - bus_rsp_o.err <= acc_en and bus_req_i.we; + bus_rsp_o.ack <= bus_req_i.re; + bus_rsp_o.err <= bus_req_i.we; else - bus_rsp_o.ack <= acc_en and (bus_req_i.re or bus_req_i.we); + bus_rsp_o.ack <= bus_req_i.re or bus_req_i.we; bus_rsp_o.err <= '0'; end if; end if; diff --git a/rtl/core/neorv32_boot_rom.vhd b/rtl/core/neorv32_boot_rom.vhd index e15919e60..a624b2d94 100644 --- a/rtl/core/neorv32_boot_rom.vhd +++ b/rtl/core/neorv32_boot_rom.vhd @@ -41,9 +41,6 @@ use neorv32.neorv32_package.all; use neorv32.neorv32_bootloader_image.all; -- this file is generated by the image generator entity neorv32_boot_rom is - generic ( - BOOTROM_BASE : std_ulogic_vector(31 downto 0) -- boot ROM base address - ); port ( clk_i : in std_ulogic; -- global clock line bus_req_i : in bus_req_t; -- bus request @@ -57,16 +54,10 @@ architecture neorv32_boot_rom_rtl of neorv32_boot_rom is constant boot_rom_size_index_c : natural := index_size_f((bootloader_init_image'length)); -- address with (32-bit entries) constant boot_rom_size_c : natural := (2**boot_rom_size_index_c)*4; -- size in bytes - -- IO space: module base address -- - constant hi_abb_c : natural := 31; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(boot_rom_max_size_c); -- low address boundary bit - -- local signals -- - signal acc_en : std_ulogic; - signal rden : std_ulogic; - signal wren : std_ulogic; - signal rdata : std_ulogic_vector(31 downto 0); - signal addr : std_ulogic_vector(boot_rom_size_index_c-1 downto 0); + signal rden : std_ulogic; + signal wren : std_ulogic; + signal rdata : std_ulogic_vector(31 downto 0); -- ROM - initialized with executable code -- constant mem_rom : mem32_t(0 to boot_rom_size_c/4-1) := mem32_init_f(bootloader_init_image, boot_rom_size_c/4); @@ -75,17 +66,11 @@ begin -- Sanity Checks -------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - assert false report "NEORV32 PROCESSOR CONFIG NOTE: Implementing internal bootloader ROM (" & - natural'image(boot_rom_size_c) & " bytes)." severity note; - - assert not (boot_rom_size_c > boot_rom_max_size_c) report "NEORV32 PROCESSOR CONFIG ERROR! Boot ROM size out of range! Max " & - natural'image(boot_rom_max_size_c) & " bytes." severity error; + assert false report + "NEORV32 PROCESSOR CONFIG NOTE: Implementing internal bootloader ROM (" & natural'image(boot_rom_size_c) & " bytes)." severity note; - - -- Access Control ------------------------------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = BOOTROM_BASE(hi_abb_c downto lo_abb_c)) else '0'; - addr <= bus_req_i.addr(boot_rom_size_index_c+1 downto 2); -- word aligned + assert not (boot_rom_size_c > boot_rom_max_size_c) report + "NEORV32 PROCESSOR CONFIG ERROR! Boot ROM size out of range! Max " & natural'image(boot_rom_max_size_c) & " bytes." severity error; -- Memory Access -------------------------------------------------------------------------- @@ -93,10 +78,10 @@ begin mem_file_access: process(clk_i) begin if rising_edge(clk_i) then - rden <= acc_en and bus_req_i.re; - wren <= acc_en and bus_req_i.we; - if (acc_en = '1') then -- reduce switching activity when not accessed - rdata <= mem_rom(to_integer(unsigned(addr))); + rden <= bus_req_i.re; + wren <= bus_req_i.we; + if (bus_req_i.re = '1') then -- reduce switching activity when not accessed + rdata <= mem_rom(to_integer(unsigned(bus_req_i.addr(boot_rom_size_index_c+1 downto 2)))); end if; end if; end process mem_file_access; diff --git a/rtl/core/neorv32_dmem.entity.vhd b/rtl/core/neorv32_dmem.entity.vhd index 8eb6993af..8e064ed00 100644 --- a/rtl/core/neorv32_dmem.entity.vhd +++ b/rtl/core/neorv32_dmem.entity.vhd @@ -41,7 +41,6 @@ use neorv32.neorv32_package.all; entity neorv32_dmem is generic ( - DMEM_BASE : std_ulogic_vector(31 downto 0); -- memory base address DMEM_SIZE : natural -- processor-internal instruction memory size in bytes ); port ( diff --git a/rtl/core/neorv32_imem.entity.vhd b/rtl/core/neorv32_imem.entity.vhd index dc82f32a2..6e9e63e4f 100644 --- a/rtl/core/neorv32_imem.entity.vhd +++ b/rtl/core/neorv32_imem.entity.vhd @@ -41,7 +41,6 @@ use neorv32.neorv32_package.all; entity neorv32_imem is generic ( - IMEM_BASE : std_ulogic_vector(31 downto 0); -- memory base address IMEM_SIZE : natural; -- processor-internal instruction memory size in bytes IMEM_AS_IROM : boolean -- implement IMEM as pre-initialized read-only memory? ); From 32bfbe7188c4d44a368a2b9722d98568e07e7aa5 Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Fri, 14 Jul 2023 22:03:24 +0200 Subject: [PATCH 03/31] clean-up wishbone access logic --- rtl/core/neorv32_wishbone.vhd | 112 +++++++++++----------------------- 1 file changed, 35 insertions(+), 77 deletions(-) diff --git a/rtl/core/neorv32_wishbone.vhd b/rtl/core/neorv32_wishbone.vhd index 39bc5a341..a4bdf54e3 100644 --- a/rtl/core/neorv32_wishbone.vhd +++ b/rtl/core/neorv32_wishbone.vhd @@ -1,11 +1,8 @@ -- ################################################################################################# -- # << NEORV32 - External Bus Interface (WISHBONE) >> # -- # ********************************************************************************************* # --- # All bus accesses from the CPU, which do not target the internal IO region / the internal # --- # bootloader / the OCD system / the internal instruction or data memories (if implemented), are # --- # delegated via this Wishbone gateway to the external bus interface. Wishbone accesses can have # --- # a response latency of up to BUS_TIMEOUT - 1 cycles or an infinity response time if # --- # BUS_TIMEOUT = 0 (not recommended!) # +-- # Wishbone accesses can have a response latency of up to BUS_TIMEOUT - 1 cycles or an infinite # +-- # response time if BUS_TIMEOUT = 0 (not recommended!). # -- # # -- # The Wishbone gateway registers all outgoing signals. These signals will remain stable (gated) # -- # if there is no active Wishbone access. By default, also the incoming signals are registered, # @@ -51,39 +48,29 @@ use neorv32.neorv32_package.all; entity neorv32_wishbone is generic ( - -- Internal instruction memory -- - MEM_INT_IMEM_EN : boolean; -- implement processor-internal instruction memory - MEM_INT_IMEM_SIZE : natural; -- size of processor-internal instruction memory in bytes - -- Internal data memory -- - MEM_INT_DMEM_EN : boolean; -- implement processor-internal data memory - MEM_INT_DMEM_SIZE : natural; -- size of processor-internal data memory in bytes - -- Interface Configuration -- - BUS_TIMEOUT : natural; -- cycles after an UNACKNOWLEDGED bus access triggers a bus fault exception - PIPE_MODE : boolean; -- protocol: false=classic/standard wishbone mode, true=pipelined wishbone mode - BIG_ENDIAN : boolean; -- byte order: true=big-endian, false=little-endian - ASYNC_RX : boolean; -- use register buffer for RX data when false - ASYNC_TX : boolean -- use register buffer for TX data when false + -- Wishbone Interface Configuration -- + BUS_TIMEOUT : natural; -- cycles after an UNACKNOWLEDGED bus access triggers a bus fault exception + PIPE_MODE : boolean; -- protocol: false=classic/standard wishbone mode, true=pipelined wishbone mode + BIG_ENDIAN : boolean; -- byte order: true=big-endian, false=little-endian + ASYNC_RX : boolean; -- use register buffer for RX data when false + ASYNC_TX : boolean -- use register buffer for TX data when false ); port ( - clk_i : in std_ulogic; -- global clock line - rstn_i : in std_ulogic; -- global reset line, low-active - bus_req_i : in bus_req_t; -- bus request - bus_rsp_o : out bus_rsp_t; -- bus response - tmo_o : out std_ulogic; -- transfer timeout - ext_o : out std_ulogic; -- active external access - xip_en_i : in std_ulogic; -- XIP module enabled - xip_page_i : in std_ulogic_vector(03 downto 0); -- XIP memory page + clk_i : in std_ulogic; -- global clock line + rstn_i : in std_ulogic; -- global reset line, low-active + bus_req_i : in bus_req_t; -- bus request + bus_rsp_o : out bus_rsp_t; -- bus response -- - wb_tag_o : out std_ulogic_vector(02 downto 0); -- request tag - wb_adr_o : out std_ulogic_vector(31 downto 0); -- address - wb_dat_i : in std_ulogic_vector(31 downto 0); -- read data - wb_dat_o : out std_ulogic_vector(31 downto 0); -- write data - wb_we_o : out std_ulogic; -- read/write - wb_sel_o : out std_ulogic_vector(03 downto 0); -- byte enable - wb_stb_o : out std_ulogic; -- strobe - wb_cyc_o : out std_ulogic; -- valid cycle - wb_ack_i : in std_ulogic; -- transfer acknowledge - wb_err_i : in std_ulogic -- transfer error + wb_tag_o : out std_ulogic_vector(02 downto 0); -- request tag + wb_adr_o : out std_ulogic_vector(31 downto 0); -- address + wb_dat_i : in std_ulogic_vector(31 downto 0); -- read data + wb_dat_o : out std_ulogic_vector(31 downto 0); -- write data + wb_we_o : out std_ulogic; -- read/write + wb_sel_o : out std_ulogic_vector(03 downto 0); -- byte enable + wb_stb_o : out std_ulogic; -- strobe + wb_cyc_o : out std_ulogic; -- valid cycle + wb_ack_i : in std_ulogic; -- transfer acknowledge + wb_err_i : in std_ulogic -- transfer error ); end neorv32_wishbone; @@ -92,13 +79,6 @@ architecture neorv32_wishbone_rtl of neorv32_wishbone is -- timeout enable -- constant timeout_en_c : boolean := boolean(BUS_TIMEOUT /= 0); -- timeout enabled if BUS_TIMEOUT > 0 - -- access control -- - signal int_imem_acc : std_ulogic; - signal int_dmem_acc : std_ulogic; - signal int_btio_acc : std_ulogic; - signal xip_acc : std_ulogic; - signal xbus_access : std_ulogic; - -- bus arbiter type ctrl_t is record state : std_ulogic; @@ -110,7 +90,6 @@ architecture neorv32_wishbone_rtl of neorv32_wishbone is sel : std_ulogic_vector(03 downto 0); ack : std_ulogic; err : std_ulogic; - tmo : std_ulogic; timeout : std_ulogic_vector(index_size_f(BUS_TIMEOUT) downto 0); src : std_ulogic; priv : std_ulogic; @@ -126,6 +105,7 @@ architecture neorv32_wishbone_rtl of neorv32_wishbone is -- async RX gating -- signal ack_gated : std_ulogic; + signal err_gated : std_ulogic; signal rdata_gated : std_ulogic_vector(31 downto 0); begin @@ -142,21 +122,8 @@ begin severity note; -- zero timeout warning -- - assert not (BUS_TIMEOUT = 0) - report "NEORV32 PROCESSOR CONFIG WARNING! Ext. Bus Interface - NO auto-timeout defined; can cause permanent CPU stall!" severity warning; - - - -- Access Control ------------------------------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - -- access to processor-internal IMEM or DMEM? -- - int_imem_acc <= '1' when (bus_req_i.addr(31 downto index_size_f(MEM_INT_IMEM_SIZE)) = imem_base_c(31 downto index_size_f(MEM_INT_IMEM_SIZE))) and (MEM_INT_IMEM_EN = true) else '0'; - int_dmem_acc <= '1' when (bus_req_i.addr(31 downto index_size_f(MEM_INT_DMEM_SIZE)) = dmem_base_c(31 downto index_size_f(MEM_INT_DMEM_SIZE))) and (MEM_INT_DMEM_EN = true) else '0'; - -- access to processor-internal BOOTROM or IO/peripheral devices? -- - int_btio_acc <= '1' when (bus_req_i.addr(31 downto 16) = boot_rom_base_c(31 downto 16)) else '0'; - -- XIP access? -- - xip_acc <= '1' when (xip_en_i = '1') and (bus_req_i.addr(31 downto 28) = xip_page_i) else '0'; - -- actual external bus access? -- - xbus_access <= (not int_imem_acc) and (not int_dmem_acc) and (not int_btio_acc) and (not xip_acc); + assert not (BUS_TIMEOUT = 0) report + "NEORV32 PROCESSOR CONFIG WARNING! Ext. Bus Interface - NO auto-timeout defined; can cause permanent CPU stall!" severity warning; -- Bus Arbiter ----------------------------------------------------------------------------- @@ -174,7 +141,6 @@ begin ctrl.timeout <= (others => '0'); ctrl.ack <= '0'; ctrl.err <= '0'; - ctrl.tmo <= '0'; ctrl.src <= '0'; ctrl.priv <= '0'; elsif rising_edge(clk_i) then @@ -183,13 +149,12 @@ begin ctrl.rdat <= (others => '0'); -- required for internal output gating ctrl.ack <= '0'; ctrl.err <= '0'; - ctrl.tmo <= '0'; ctrl.timeout <= std_ulogic_vector(to_unsigned(BUS_TIMEOUT, index_size_f(BUS_TIMEOUT)+1)); -- state machine -- if (ctrl.state = '0') then -- IDLE, waiting for host request -- ------------------------------------------------------------ - if (xbus_access = '1') and ((bus_req_i.we or bus_req_i.re) = '1') then -- valid external request + if (bus_req_i.we = '1') or (bus_req_i.re = '1') then -- request -- buffer (and gate) all outgoing signals -- ctrl.we <= bus_req_i.we; ctrl.adr <= bus_req_i.addr; @@ -203,15 +168,12 @@ begin else -- BUSY, transfer in progress -- ------------------------------------------------------------ ctrl.rdat <= wb_dat_i; - if (wb_err_i = '1') then -- abnormal bus termination - ctrl.err <= '1'; - ctrl.state <= '0'; - elsif (timeout_en_c = true) and (or_reduce_f(ctrl.timeout) = '0') then -- enabled timeout - ctrl.tmo <= '1'; - ctrl.state <= '0'; - elsif (wb_ack_i = '1') then -- normal bus termination + if (wb_ack_i = '1') then -- normal bus termination ctrl.ack <= '1'; ctrl.state <= '0'; + elsif (wb_err_i = '1') or ((timeout_en_c = true) and (or_reduce_f(ctrl.timeout) = '0')) then -- bus error or timeout + ctrl.err <= '1'; + ctrl.state <= '0'; end if; -- timeout counter -- if (timeout_en_c = true) then @@ -221,31 +183,27 @@ begin end if; end process bus_arbiter; - -- active external access -- - ext_o <= ctrl.state; - -- endianness conversion -- end_wdata <= bswap32_f(bus_req_i.data) when (BIG_ENDIAN = true) else bus_req_i.data; end_byteen <= bit_rev_f(bus_req_i.ben) when (BIG_ENDIAN = true) else bus_req_i.ben; - -- host access -- ack_gated <= wb_ack_i when (ctrl.state = '1') else '0'; -- CPU ACK gate for "async" RX + err_gated <= wb_err_i when (ctrl.state = '1') else '0'; -- CPU ERR gate for "async" RX rdata_gated <= wb_dat_i when (ctrl.state = '1') else (others => '0'); -- CPU read data gate for "async" RX - rdata <= ctrl.rdat when (ASYNC_RX = false) else rdata_gated; + rdata <= ctrl.rdat when (ASYNC_RX = false) else rdata_gated; bus_rsp_o.data <= rdata when (BIG_ENDIAN = false) else bswap32_f(rdata); -- endianness conversion bus_rsp_o.ack <= ctrl.ack when (ASYNC_RX = false) else ack_gated; - bus_rsp_o.err <= ctrl.err; - tmo_o <= ctrl.tmo; + bus_rsp_o.err <= ctrl.err when (ASYNC_RX = false) else err_gated; -- wishbone interface -- wb_tag_o(0) <= bus_req_i.priv when (ASYNC_TX = true) else ctrl.priv; -- 0 = unprivileged (U-mode), 1 = privileged (M-mode) wb_tag_o(1) <= '0'; -- 0 = secure, 1 = non-secure wb_tag_o(2) <= bus_req_i.src when (ASYNC_TX = true) else ctrl.src; -- 0 = data access, 1 = instruction access - stb_int <= (xbus_access and (bus_req_i.we or bus_req_i.re)) when (ASYNC_TX = true) else (ctrl.state and (not ctrl.state_ff)); - cyc_int <= ((xbus_access and (bus_req_i.we or bus_req_i.re)) or ctrl.state) when (ASYNC_TX = true) else ctrl.state; + stb_int <= (bus_req_i.we or bus_req_i.re) when (ASYNC_TX = true) else (ctrl.state and (not ctrl.state_ff)); + cyc_int <= ((bus_req_i.we or bus_req_i.re) or ctrl.state) when (ASYNC_TX = true) else ctrl.state; wb_adr_o <= bus_req_i.addr when (ASYNC_TX = true) else ctrl.adr; wb_dat_o <= bus_req_i.data when (ASYNC_TX = true) else ctrl.wdat; From 2c97996ed9b7f5da914db21f2171749eb5adfceb Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Fri, 14 Jul 2023 22:03:45 +0200 Subject: [PATCH 04/31] hardwire XIP page to 0xE000_0000 --- rtl/core/neorv32_xip.vhd | 45 +++++++++++++++------------------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/rtl/core/neorv32_xip.vhd b/rtl/core/neorv32_xip.vhd index addf24c83..ad44a0901 100644 --- a/rtl/core/neorv32_xip.vhd +++ b/rtl/core/neorv32_xip.vhd @@ -53,9 +53,6 @@ entity neorv32_xip is bus_rsp_o : out bus_rsp_t; -- bus response xip_req_i : in bus_req_t; -- XIP request xip_rsp_o : out bus_rsp_t; -- XIP response - xip_en_o : out std_ulogic; -- XIP enable - xip_acc_o : out std_ulogic; -- pending XIP access - xip_page_o : out std_ulogic_vector(3 downto 0); -- XIP page clkgen_en_o : out std_ulogic; -- enable clock generator clkgen_i : in std_ulogic_vector(7 downto 0); spi_csn_o : out std_ulogic; -- chip-select, low-active @@ -91,16 +88,14 @@ architecture neorv32_xip_rtl of neorv32_xip is constant ctrl_xip_abytes1_c : natural := 12; -- r/w: XIP number of address bytes (0=1,1=2,2=3,3=4) - bit 1 constant ctrl_rd_cmd0_c : natural := 13; -- r/w: SPI flash read command - bit 0 constant ctrl_rd_cmd7_c : natural := 20; -- r/w: SPI flash read command - bit 7 - constant ctrl_page0_c : natural := 21; -- r/w: XIP memory page - bit 0 - constant ctrl_page3_c : natural := 24; -- r/w: XIP memory page - bit 3 - constant ctrl_spi_csen_c : natural := 25; -- r/w: SPI chip-select enabled - constant ctrl_highspeed_c : natural := 26; -- r/w: SPI high-speed mode enable (ignoring ctrl_spi_prsc) - constant ctrl_burst_en_c : natural := 27; -- r/w: XIP burst mode enable + constant ctrl_spi_csen_c : natural := 21; -- r/w: SPI chip-select enabled + constant ctrl_highspeed_c : natural := 22; -- r/w: SPI high-speed mode enable (ignoring ctrl_spi_prsc) + constant ctrl_burst_en_c : natural := 23; -- r/w: XIP burst mode enable -- constant ctrl_phy_busy_c : natural := 30; -- r/-: SPI PHY is busy when set constant ctrl_xip_busy_c : natural := 31; -- r/-: XIP access in progress -- - signal ctrl : std_ulogic_vector(27 downto 0); + signal ctrl : std_ulogic_vector(23 downto 0); -- Direct SPI access registers -- signal spi_data_lo : std_ulogic_vector(31 downto 0); @@ -117,6 +112,7 @@ architecture neorv32_xip_rtl of neorv32_xip is state_nxt : arbiter_state_t; addr : std_ulogic_vector(31 downto 0); addr_lookahead : std_ulogic_vector(31 downto 0); + xip_acc_err : std_ulogic; busy : std_ulogic; tmo_cnt : std_ulogic_vector(04 downto 0); -- timeout counter for auto CS de-assert (burst mode only) end record; @@ -193,7 +189,6 @@ begin ctrl(ctrl_xip_enable_c) <= bus_req_i.data(ctrl_xip_enable_c); ctrl(ctrl_xip_abytes1_c downto ctrl_xip_abytes0_c) <= bus_req_i.data(ctrl_xip_abytes1_c downto ctrl_xip_abytes0_c); ctrl(ctrl_rd_cmd7_c downto ctrl_rd_cmd0_c) <= bus_req_i.data(ctrl_rd_cmd7_c downto ctrl_rd_cmd0_c); - ctrl(ctrl_page3_c downto ctrl_page0_c) <= bus_req_i.data(ctrl_page3_c downto ctrl_page0_c); ctrl(ctrl_spi_csen_c) <= bus_req_i.data(ctrl_spi_csen_c); ctrl(ctrl_highspeed_c) <= bus_req_i.data(ctrl_highspeed_c); ctrl(ctrl_burst_en_c) <= bus_req_i.data(ctrl_burst_en_c); @@ -211,12 +206,6 @@ begin end if; end process ctrl_write_access; - -- XIP enabled -- - xip_en_o <= ctrl(ctrl_enable_c); - - -- XIP page output -- - xip_page_o <= ctrl(ctrl_page3_c downto ctrl_page0_c); - -- Control Read Access -------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- @@ -236,7 +225,6 @@ begin bus_rsp_o.data(ctrl_xip_enable_c) <= ctrl(ctrl_xip_enable_c); bus_rsp_o.data(ctrl_xip_abytes1_c downto ctrl_xip_abytes0_c) <= ctrl(ctrl_xip_abytes1_c downto ctrl_xip_abytes0_c); bus_rsp_o.data(ctrl_rd_cmd7_c downto ctrl_rd_cmd0_c) <= ctrl(ctrl_rd_cmd7_c downto ctrl_rd_cmd0_c); - bus_rsp_o.data(ctrl_page3_c downto ctrl_page0_c) <= ctrl(ctrl_page3_c downto ctrl_page0_c); bus_rsp_o.data(ctrl_spi_csen_c) <= ctrl(ctrl_spi_csen_c); bus_rsp_o.data(ctrl_highspeed_c) <= ctrl(ctrl_highspeed_c); bus_rsp_o.data(ctrl_burst_en_c) <= ctrl(ctrl_burst_en_c); @@ -285,10 +273,16 @@ begin arbiter.state <= arbiter.state_nxt; end if; -- address look-ahead -- - if (xip_req_i.re = '1') and (xip_req_i.addr(31 downto 28) = ctrl(ctrl_page3_c downto ctrl_page0_c)) then + if (xip_req_i.re = '1') then arbiter.addr <= xip_req_i.addr; -- buffer address (reducing fan-out on CPU's address net) end if; arbiter.addr_lookahead <= std_ulogic_vector(unsigned(arbiter.addr) + 4); -- prefetch address of *next* linear access + -- XIP access error? -- + if (arbiter.state = S_DIRECT) then + arbiter.xip_acc_err <= xip_req_i.re or xip_req_i.we; + else + arbiter.xip_acc_err <= '0'; + end if; -- pending flash access timeout -- if (ctrl(ctrl_enable_c) = '0') or (ctrl(ctrl_xip_enable_c) = '0') or (arbiter.state = S_BUSY) then -- sync reset arbiter.tmo_cnt <= (others => '0'); @@ -308,7 +302,7 @@ begin -- bus interface defaults -- xip_rsp_o.data <= (others => '0'); xip_rsp_o.ack <= '0'; - xip_rsp_o.err <= '0'; + xip_rsp_o.err <= arbiter.xip_acc_err; -- SPI PHY interface defaults -- phy_if.start <= '0'; @@ -327,12 +321,10 @@ begin when S_IDLE => -- wait for new bus request -- ------------------------------------------------------------ - if (xip_req_i.addr(31 downto 28) = ctrl(ctrl_page3_c downto ctrl_page0_c)) then - if (xip_req_i.re = '1') then - arbiter.state_nxt <= S_CHECK; - elsif (xip_req_i.we = '1') then - arbiter.state_nxt <= S_ERROR; - end if; + if (xip_req_i.re = '1') then + arbiter.state_nxt <= S_CHECK; + elsif (xip_req_i.we = '1') then + arbiter.state_nxt <= S_ERROR; end if; when S_CHECK => -- check if we can resume flash access @@ -374,9 +366,6 @@ begin -- arbiter status -- arbiter.busy <= '1' when (arbiter.state = S_TRIG) or (arbiter.state = S_BUSY) else '0'; -- actual XIP access in progress - -- status output -- - xip_acc_o <= arbiter.busy; - -- SPI Clock Generator -------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- From 8516fff0fe74ac5bda1bfa1fa26414c21808067a Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Fri, 14 Jul 2023 22:04:52 +0200 Subject: [PATCH 05/31] :warning: update bus infrastructure experimental! --- rtl/core/neorv32_package.vhd | 4 +- rtl/core/neorv32_top.vhd | 2091 +++++++++++++++++----------------- 2 files changed, 1050 insertions(+), 1045 deletions(-) diff --git a/rtl/core/neorv32_package.vhd b/rtl/core/neorv32_package.vhd index 78ca4b047..7e078e54b 100644 --- a/rtl/core/neorv32_package.vhd +++ b/rtl/core/neorv32_package.vhd @@ -53,14 +53,14 @@ package neorv32_package is -- "response time window" for processor-internal modules -- -- = cycles after which an *unacknowledged* internal bus access will timeout and trigger a bus fault exception - constant max_proc_int_response_time_c : natural := 15; -- default = 15 (min 2) + constant max_proc_int_response_time_c : natural := 15; -- default = 15 -- log2 of co-processor timeout cycles -- constant cp_timeout_c : natural := 7; -- default = 7 (= 128 cycles) -- Architecture Constants ----------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01080602"; -- hardware version + constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01080603"; -- hardware version constant archid_c : natural := 19; -- official RISC-V architecture ID constant XLEN : natural := 32; -- native data path width, do not change! diff --git a/rtl/core/neorv32_top.vhd b/rtl/core/neorv32_top.vhd index 0b00943e3..1b50dbac4 100644 --- a/rtl/core/neorv32_top.vhd +++ b/rtl/core/neorv32_top.vhd @@ -291,11 +291,6 @@ architecture neorv32_top_rtl of neorv32_top is signal dci_ndmrstn : std_ulogic; signal dci_halt_req : std_ulogic; - -- internal bus system -- - type device_ids_t is (DEV_IMEM, DEV_DMEM, DEV_BOOTROM, DEV_WISHBONE, DEV_GPIO, DEV_MTIME, DEV_UART0, DEV_UART1, - DEV_SPI, DEV_TWI, DEV_PWM, DEV_WDT, DEV_TRNG, DEV_CFS, DEV_NEOLED, DEV_SYSINFO, DEV_OCD, - DEV_XIRQ, DEV_GPTMR, DEV_XIP_CT, DEV_XIP_ACC, DEV_ONEWIRE, DEV_SDI, DEV_DMA, DEV_SLINK, DEV_CRC); - -- core complex -- signal cpu_i_req, cpu_d_req : bus_req_t; -- CPU core signal cpu_i_rsp, cpu_d_rsp : bus_rsp_t; -- CPU core @@ -308,13 +303,15 @@ architecture neorv32_top_rtl of neorv32_top is signal main_req, dma_req : bus_req_t; -- core complex (CPU + caches + DMA) signal main_rsp, dma_rsp : bus_rsp_t; -- core complex (CPU + caches + DMA) - -- SoC bus -- - type response_bus_t is array (device_ids_t) of bus_rsp_t; - signal soc_req : bus_req_t; -- SoC request bus - signal soc_rsp : bus_rsp_t; -- SoC response bus - signal io_req : bus_req_t; -- request bus for internal IO/Peripheral devices only - signal rsp_bus : response_bus_t; -- global response bus - signal bus_error : std_ulogic; -- global bus error signal + -- main sections -- + signal imem_req, dmem_req, xip_req, boot_req, io_req, xbus_req : bus_req_t; + signal imem_rsp, dmem_rsp, xip_rsp, boot_rsp, io_rsp, xbus_rsp : bus_rsp_t; + + -- IO bus -- + type io_devices_t is (IODEV_GPIO, IODEV_MTIME, IODEV_UART0, IODEV_UART1, IODEV_SPI, IODEV_TWI, IODEV_PWM, IODEV_WDT, IODEV_TRNG, IODEV_CFS, IODEV_NEOLED, + IODEV_SYSINFO, IODEV_OCD, IODEV_XIRQ, IODEV_GPTMR, IODEV_XIP, IODEV_ONEWIRE, IODEV_SDI, IODEV_DMA, IODEV_SLINK, IODEV_CRC); + type io_rsp_bus_t is array (io_devices_t) of bus_rsp_t; + signal io_dev_rsp : io_rsp_bus_t; -- IRQs -- signal cpu_firq : std_ulogic_vector(15 downto 0); @@ -324,301 +321,307 @@ architecture neorv32_top_rtl of neorv32_top is signal firq : irq_t; -- misc -- - signal io_acc : std_ulogic; - signal ext_timeout : std_ulogic; - signal ext_access : std_ulogic; - signal xip_access : std_ulogic; - signal xip_enable : std_ulogic; - signal xip_page : std_ulogic_vector(3 downto 0); - signal mtime_irq : std_ulogic; + signal mtime_irq : std_ulogic; begin - -- Sanity Checks -------------------------------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - assert false report - "NEORV32 PROCESSOR CONFIGURATION: " & - cond_sel_string_f(MEM_INT_IMEM_EN, "IMEM ", "") & - cond_sel_string_f(MEM_INT_DMEM_EN, "DMEM ", "") & - cond_sel_string_f(INT_BOOTLOADER_EN, "BOOTROM ", "") & - cond_sel_string_f(ICACHE_EN, "I-CACHE ", "") & - cond_sel_string_f(DCACHE_EN, "D-CACHE ", "") & - cond_sel_string_f(MEM_EXT_EN, "WISHBONE ", "") & - cond_sel_string_f(ON_CHIP_DEBUGGER_EN, "OCD ", "") & - "+ " & - cond_sel_string_f(boolean(IO_GPIO_NUM > 0), "GPIO ", "") & - cond_sel_string_f(IO_MTIME_EN, "MTIME ", "") & - cond_sel_string_f(IO_UART0_EN, "UART0 ", "") & - cond_sel_string_f(IO_UART1_EN, "UART1 ", "") & - cond_sel_string_f(IO_SPI_EN, "SPI ", "") & - cond_sel_string_f(IO_SDI_EN, "SDI ", "") & - cond_sel_string_f(IO_TWI_EN, "TWI ", "") & - cond_sel_string_f(boolean(IO_PWM_NUM_CH > 0), "PWM ", "") & - cond_sel_string_f(IO_WDT_EN, "WDT ", "") & - cond_sel_string_f(IO_TRNG_EN, "TRNG ", "") & - cond_sel_string_f(IO_CFS_EN, "CFS ", "") & - cond_sel_string_f(IO_NEOLED_EN, "NEOLED ", "") & - cond_sel_string_f(boolean(XIRQ_NUM_CH > 0), "XIRQ ", "") & - cond_sel_string_f(IO_GPTMR_EN, "GPTMR ", "") & - cond_sel_string_f(IO_XIP_EN, "XIP ", "") & - cond_sel_string_f(IO_ONEWIRE_EN, "ONEWIRE ", "") & - cond_sel_string_f(IO_DMA_EN, "DMA ", "") & - cond_sel_string_f(IO_SLINK_EN, "SLINK ", "") & - cond_sel_string_f(IO_CRC_EN, "CRC ", "") & - "" - severity note; - - -- boot configuration -- - assert not (INT_BOOTLOADER_EN = true) report - "NEORV32 PROCESSOR CONFIG NOTE: Boot configuration: Indirect boot via bootloader (processor-internal BOOTROM)." severity note; - assert not ((INT_BOOTLOADER_EN = false) and (MEM_INT_IMEM_EN = true)) report - "NEORV32 PROCESSOR CONFIG NOTE: Boot configuration = direct boot from memory (processor-internal IMEM)." severity note; - assert not ((INT_BOOTLOADER_EN = false) and (MEM_INT_IMEM_EN = false)) report - "NEORV32 PROCESSOR CONFIG NOTE: Boot configuration = direct boot from memory (processor-external memory)." severity note; - - -- memory layout -- - assert not (ispace_base_c /= x"00000000") report - "NEORV32 PROCESSOR CONFIG WARNING! Non-default base address for INSTRUCTION ADDRESS SPACE. Make sure this is sync with the software framework." severity warning; - assert not (dspace_base_c /= x"80000000") report - "NEORV32 PROCESSOR CONFIG WARNING! Non-default base address for DATA ADDRESS SPACE. Make sure this is sync with the software framework." severity warning; - - -- on-chip debugger -- - assert not (ON_CHIP_DEBUGGER_EN = true) report - "NEORV32 PROCESSOR CONFIG NOTE: Implementing on-chip debugger (OCD)." severity note; - - -- caches -- - assert not ((ICACHE_EN = true) and (CPU_EXTENSION_RISCV_Zifencei = false)) report - "NEORV32 CPU CONFIG WARNING! ISA extension is required to perform i-cache memory sync operations." severity warning; - - --- **************************************************************************************************************************** --- Clock and Reset --- **************************************************************************************************************************** - - -- Reset Generator ------------------------------------------------------------------------ - -- ------------------------------------------------------------------------------------------- - reset_generator: process(rstn_i, clk_i) - begin - if (rstn_i = '0') then - rstn_ext_sreg <= (others => '0'); - rstn_int_sreg <= (others => '0'); - rstn_ext <= '0'; - rstn_int <= '0'; - elsif falling_edge(clk_i) then -- inverted clock to release reset _before_ all FFs trigger (rising edge) - -- external reset -- - rstn_ext_sreg <= rstn_ext_sreg(rstn_ext_sreg'left-1 downto 0) & '1'; -- active for at least clock cycles - -- internal reset -- - if (rstn_wdt = '0') or (dci_ndmrstn = '0') then -- sync reset sources + -- ************************************************************************************************************************** + -- Sanity Checks + -- ************************************************************************************************************************** + sanity_checks: + if (true) generate + + assert false report + "NEORV32 PROCESSOR CONFIGURATION: " & + cond_sel_string_f(MEM_INT_IMEM_EN, "IMEM ", "") & + cond_sel_string_f(MEM_INT_DMEM_EN, "DMEM ", "") & + cond_sel_string_f(INT_BOOTLOADER_EN, "BOOTROM ", "") & + cond_sel_string_f(ICACHE_EN, "I-CACHE ", "") & + cond_sel_string_f(DCACHE_EN, "D-CACHE ", "") & + cond_sel_string_f(MEM_EXT_EN, "WISHBONE ", "") & + cond_sel_string_f(ON_CHIP_DEBUGGER_EN, "OCD ", "") & + "+ " & + cond_sel_string_f(boolean(IO_GPIO_NUM > 0), "GPIO ", "") & + cond_sel_string_f(IO_MTIME_EN, "MTIME ", "") & + cond_sel_string_f(IO_UART0_EN, "UART0 ", "") & + cond_sel_string_f(IO_UART1_EN, "UART1 ", "") & + cond_sel_string_f(IO_SPI_EN, "SPI ", "") & + cond_sel_string_f(IO_SDI_EN, "SDI ", "") & + cond_sel_string_f(IO_TWI_EN, "TWI ", "") & + cond_sel_string_f(boolean(IO_PWM_NUM_CH > 0), "PWM ", "") & + cond_sel_string_f(IO_WDT_EN, "WDT ", "") & + cond_sel_string_f(IO_TRNG_EN, "TRNG ", "") & + cond_sel_string_f(IO_CFS_EN, "CFS ", "") & + cond_sel_string_f(IO_NEOLED_EN, "NEOLED ", "") & + cond_sel_string_f(boolean(XIRQ_NUM_CH > 0), "XIRQ ", "") & + cond_sel_string_f(IO_GPTMR_EN, "GPTMR ", "") & + cond_sel_string_f(IO_XIP_EN, "XIP ", "") & + cond_sel_string_f(IO_ONEWIRE_EN, "ONEWIRE ", "") & + cond_sel_string_f(IO_DMA_EN, "DMA ", "") & + cond_sel_string_f(IO_SLINK_EN, "SLINK ", "") & + cond_sel_string_f(IO_CRC_EN, "CRC ", "") & + "" + severity note; + + -- boot configuration -- + assert not (INT_BOOTLOADER_EN = true) report + "NEORV32 PROCESSOR CONFIG NOTE: Boot configuration: Indirect boot via bootloader (processor-internal BOOTROM)." severity note; + assert not ((INT_BOOTLOADER_EN = false) and (MEM_INT_IMEM_EN = true)) report + "NEORV32 PROCESSOR CONFIG NOTE: Boot configuration = direct boot from memory (processor-internal IMEM)." severity note; + assert not ((INT_BOOTLOADER_EN = false) and (MEM_INT_IMEM_EN = false)) report + "NEORV32 PROCESSOR CONFIG NOTE: Boot configuration = direct boot from memory (processor-external memory)." severity note; + + -- memory layout -- + assert not (ispace_base_c /= x"00000000") report + "NEORV32 PROCESSOR CONFIG WARNING! Non-default base address for INSTRUCTION ADDRESS SPACE. Make sure this is sync with the software framework." severity warning; + assert not (dspace_base_c /= x"80000000") report + "NEORV32 PROCESSOR CONFIG WARNING! Non-default base address for DATA ADDRESS SPACE. Make sure this is sync with the software framework." severity warning; + + -- on-chip debugger -- + assert not (ON_CHIP_DEBUGGER_EN = true) report + "NEORV32 PROCESSOR CONFIG NOTE: Implementing on-chip debugger (OCD)." severity note; + + -- caches -- + assert not ((ICACHE_EN = true) and (CPU_EXTENSION_RISCV_Zifencei = false)) report + "NEORV32 CPU CONFIG WARNING! ISA extension is required to perform i-cache memory sync operations." severity warning; + + end generate; -- /sanity_checks + + + -- ************************************************************************************************************************** + -- Clock and Reset Generators + -- ************************************************************************************************************************** + generators_inst: + if (true) generate + + -- Reset Generator ------------------------------------------------------------------------ + -- ------------------------------------------------------------------------------------------- + reset_generator: process(rstn_i, clk_i) + begin + if (rstn_i = '0') then + rstn_ext_sreg <= (others => '0'); rstn_int_sreg <= (others => '0'); - else - rstn_int_sreg <= rstn_int_sreg(rstn_int_sreg'left-1 downto 0) & '1'; -- active for at least clock cycles + rstn_ext <= '0'; + rstn_int <= '0'; + elsif falling_edge(clk_i) then -- inverted clock to release reset _before_ all FFs trigger (rising edge) + -- external reset -- + rstn_ext_sreg <= rstn_ext_sreg(rstn_ext_sreg'left-1 downto 0) & '1'; -- active for at least clock cycles + -- internal reset -- + if (rstn_wdt = '0') or (dci_ndmrstn = '0') then -- sync reset sources + rstn_int_sreg <= (others => '0'); + else + rstn_int_sreg <= rstn_int_sreg(rstn_int_sreg'left-1 downto 0) & '1'; -- active for at least clock cycles + end if; + -- reset nets -- + rstn_ext <= and_reduce_f(rstn_ext_sreg); -- external reset (via reset pin) + rstn_int <= and_reduce_f(rstn_int_sreg); -- internal reset (via reset pin, WDT or OCD) end if; - -- reset nets -- - rstn_ext <= and_reduce_f(rstn_ext_sreg); -- external reset (via reset pin) - rstn_int <= and_reduce_f(rstn_int_sreg); -- internal reset (via reset pin, WDT or OCD) - end if; - end process reset_generator; - - - -- Clock Generator ------------------------------------------------------------------------ - -- ------------------------------------------------------------------------------------------- - clock_generator: process(rstn_int, clk_i) - begin - if (rstn_int = '0') then - clk_gen_en_ff <= '0'; - clk_div <= (others => '0'); - clk_div_ff <= (others => '0'); - elsif rising_edge(clk_i) then - clk_gen_en_ff <= clk_gen_en; - if (clk_gen_en_ff = '1') then - clk_div <= std_ulogic_vector(unsigned(clk_div) + 1); - else -- reset if disabled - clk_div <= (others => '0'); + end process reset_generator; + + + -- Clock Generator ------------------------------------------------------------------------ + -- ------------------------------------------------------------------------------------------- + clock_generator: process(rstn_int, clk_i) + begin + if (rstn_int = '0') then + clk_gen_en_ff <= '0'; + clk_div <= (others => '0'); + clk_div_ff <= (others => '0'); + elsif rising_edge(clk_i) then + clk_gen_en_ff <= clk_gen_en; + if (clk_gen_en_ff = '1') then + clk_div <= std_ulogic_vector(unsigned(clk_div) + 1); + else -- reset if disabled + clk_div <= (others => '0'); + end if; + clk_div_ff <= clk_div; end if; - clk_div_ff <= clk_div; - end if; - end process clock_generator; - - -- clock enables: rising edge detectors -- - clk_gen(clk_div2_c) <= clk_div(0) and (not clk_div_ff(0)); -- CLK/2 - clk_gen(clk_div4_c) <= clk_div(1) and (not clk_div_ff(1)); -- CLK/4 - clk_gen(clk_div8_c) <= clk_div(2) and (not clk_div_ff(2)); -- CLK/8 - clk_gen(clk_div64_c) <= clk_div(5) and (not clk_div_ff(5)); -- CLK/64 - clk_gen(clk_div128_c) <= clk_div(6) and (not clk_div_ff(6)); -- CLK/128 - clk_gen(clk_div1024_c) <= clk_div(9) and (not clk_div_ff(9)); -- CLK/1024 - clk_gen(clk_div2048_c) <= clk_div(10) and (not clk_div_ff(10)); -- CLK/2048 - clk_gen(clk_div4096_c) <= clk_div(11) and (not clk_div_ff(11)); -- CLK/4096 - - -- fresh clocks anyone? -- - clk_gen_en <= cg_en.wdt or cg_en.uart0 or cg_en.uart1 or cg_en.spi or cg_en.twi or cg_en.pwm or - cg_en.cfs or cg_en.neoled or cg_en.gptmr or cg_en.xip or cg_en.onewire; - - --- **************************************************************************************************************************** --- Core Complex --- **************************************************************************************************************************** - - -- CPU Core ------------------------------------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_cpu_inst: entity neorv32.neorv32_cpu - generic map ( - -- General -- - HART_ID => HART_ID, - VENDOR_ID => VENDOR_ID, - CPU_BOOT_ADDR => cpu_boot_addr_c, - CPU_DEBUG_PARK_ADDR => dm_park_entry_c, - CPU_DEBUG_EXC_ADDR => dm_exc_entry_c, - -- RISC-V CPU Extensions -- - CPU_EXTENSION_RISCV_B => CPU_EXTENSION_RISCV_B, - CPU_EXTENSION_RISCV_C => CPU_EXTENSION_RISCV_C, - CPU_EXTENSION_RISCV_E => CPU_EXTENSION_RISCV_E, - CPU_EXTENSION_RISCV_M => CPU_EXTENSION_RISCV_M, - CPU_EXTENSION_RISCV_U => CPU_EXTENSION_RISCV_U, - CPU_EXTENSION_RISCV_Zfinx => CPU_EXTENSION_RISCV_Zfinx, - CPU_EXTENSION_RISCV_Zicntr => CPU_EXTENSION_RISCV_Zicntr, - CPU_EXTENSION_RISCV_Zicond => CPU_EXTENSION_RISCV_Zicond, - CPU_EXTENSION_RISCV_Zihpm => CPU_EXTENSION_RISCV_Zihpm, - CPU_EXTENSION_RISCV_Zifencei => CPU_EXTENSION_RISCV_Zifencei, - CPU_EXTENSION_RISCV_Zmmul => CPU_EXTENSION_RISCV_Zmmul, - CPU_EXTENSION_RISCV_Zxcfu => CPU_EXTENSION_RISCV_Zxcfu, - CPU_EXTENSION_RISCV_Sdext => ON_CHIP_DEBUGGER_EN, - CPU_EXTENSION_RISCV_Sdtrig => ON_CHIP_DEBUGGER_EN, - -- Extension Options -- - FAST_MUL_EN => FAST_MUL_EN, - FAST_SHIFT_EN => FAST_SHIFT_EN, - CPU_IPB_ENTRIES => CPU_IPB_ENTRIES, - -- Physical Memory Protection (PMP) -- - PMP_NUM_REGIONS => PMP_NUM_REGIONS, - PMP_MIN_GRANULARITY => PMP_MIN_GRANULARITY, - -- Hardware Performance Monitors (HPM) -- - HPM_NUM_CNTS => HPM_NUM_CNTS, - HPM_CNT_WIDTH => HPM_CNT_WIDTH - ) - port map ( - -- global control -- - clk_i => clk_i, - rstn_i => rstn_int, - sleep_o => cpu_sleep, - debug_o => cpu_debug, - ifence_o => i_fence, - dfence_o => d_fence, - -- interrupts -- - msi_i => msw_irq_i, - mei_i => mext_irq_i, - mti_i => mtime_irq, - firq_i => cpu_firq, - dbi_i => dci_halt_req, - -- instruction bus interface -- - ibus_req_o => cpu_i_req, - ibus_rsp_i => cpu_i_rsp, - -- data bus interface -- - dbus_req_o => cpu_d_req, - dbus_rsp_i => cpu_d_rsp - ); + end process clock_generator; + + -- clock enables: rising edge detectors -- + clk_gen(clk_div2_c) <= clk_div(0) and (not clk_div_ff(0)); -- CLK/2 + clk_gen(clk_div4_c) <= clk_div(1) and (not clk_div_ff(1)); -- CLK/4 + clk_gen(clk_div8_c) <= clk_div(2) and (not clk_div_ff(2)); -- CLK/8 + clk_gen(clk_div64_c) <= clk_div(5) and (not clk_div_ff(5)); -- CLK/64 + clk_gen(clk_div128_c) <= clk_div(6) and (not clk_div_ff(6)); -- CLK/128 + clk_gen(clk_div1024_c) <= clk_div(9) and (not clk_div_ff(9)); -- CLK/1024 + clk_gen(clk_div2048_c) <= clk_div(10) and (not clk_div_ff(10)); -- CLK/2048 + clk_gen(clk_div4096_c) <= clk_div(11) and (not clk_div_ff(11)); -- CLK/4096 + + -- fresh clocks anyone? -- + clk_gen_en <= cg_en.wdt or cg_en.uart0 or cg_en.uart1 or cg_en.spi or cg_en.twi or cg_en.pwm or + cg_en.cfs or cg_en.neoled or cg_en.gptmr or cg_en.xip or cg_en.onewire; + + end generate; -- /generators_inst - -- advanced memory control -- - fence_o <= d_fence; - fencei_o <= i_fence; - - -- fast interrupt requests (FIRQs) -- - cpu_firq(00) <= firq.wdt; -- highest priority - cpu_firq(01) <= firq.cfs; - cpu_firq(02) <= firq.uart0_rx; - cpu_firq(03) <= firq.uart0_tx; - cpu_firq(04) <= firq.uart1_rx; - cpu_firq(05) <= firq.uart1_tx; - cpu_firq(06) <= firq.spi; - cpu_firq(07) <= firq.twi; - cpu_firq(08) <= firq.xirq; - cpu_firq(09) <= firq.neoled; - cpu_firq(10) <= firq.dma; - cpu_firq(11) <= firq.sdi; - cpu_firq(12) <= firq.gptmr; - cpu_firq(13) <= firq.onewire; - cpu_firq(14) <= firq.slink; - cpu_firq(15) <= firq.trng; -- lowest priority - - - -- CPU Instruction Cache ------------------------------------------------------------------ - -- ------------------------------------------------------------------------------------------- - neorv32_icache_inst_true: - if (ICACHE_EN = true) generate - neorv32_icache_inst: entity neorv32.neorv32_icache + + -- ************************************************************************************************************************** + -- Core Complex + -- ************************************************************************************************************************** + core_complex: + if (true) generate + + -- CPU Core ------------------------------------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_cpu_inst: entity neorv32.neorv32_cpu generic map ( - ICACHE_NUM_BLOCKS => ICACHE_NUM_BLOCKS, - ICACHE_BLOCK_SIZE => ICACHE_BLOCK_SIZE, - ICACHE_NUM_SETS => ICACHE_ASSOCIATIVITY + -- General -- + HART_ID => HART_ID, + VENDOR_ID => VENDOR_ID, + CPU_BOOT_ADDR => cpu_boot_addr_c, + CPU_DEBUG_PARK_ADDR => dm_park_entry_c, + CPU_DEBUG_EXC_ADDR => dm_exc_entry_c, + -- RISC-V CPU Extensions -- + CPU_EXTENSION_RISCV_B => CPU_EXTENSION_RISCV_B, + CPU_EXTENSION_RISCV_C => CPU_EXTENSION_RISCV_C, + CPU_EXTENSION_RISCV_E => CPU_EXTENSION_RISCV_E, + CPU_EXTENSION_RISCV_M => CPU_EXTENSION_RISCV_M, + CPU_EXTENSION_RISCV_U => CPU_EXTENSION_RISCV_U, + CPU_EXTENSION_RISCV_Zfinx => CPU_EXTENSION_RISCV_Zfinx, + CPU_EXTENSION_RISCV_Zicntr => CPU_EXTENSION_RISCV_Zicntr, + CPU_EXTENSION_RISCV_Zicond => CPU_EXTENSION_RISCV_Zicond, + CPU_EXTENSION_RISCV_Zihpm => CPU_EXTENSION_RISCV_Zihpm, + CPU_EXTENSION_RISCV_Zifencei => CPU_EXTENSION_RISCV_Zifencei, + CPU_EXTENSION_RISCV_Zmmul => CPU_EXTENSION_RISCV_Zmmul, + CPU_EXTENSION_RISCV_Zxcfu => CPU_EXTENSION_RISCV_Zxcfu, + CPU_EXTENSION_RISCV_Sdext => ON_CHIP_DEBUGGER_EN, + CPU_EXTENSION_RISCV_Sdtrig => ON_CHIP_DEBUGGER_EN, + -- Extension Options -- + FAST_MUL_EN => FAST_MUL_EN, + FAST_SHIFT_EN => FAST_SHIFT_EN, + CPU_IPB_ENTRIES => CPU_IPB_ENTRIES, + -- Physical Memory Protection (PMP) -- + PMP_NUM_REGIONS => PMP_NUM_REGIONS, + PMP_MIN_GRANULARITY => PMP_MIN_GRANULARITY, + -- Hardware Performance Monitors (HPM) -- + HPM_NUM_CNTS => HPM_NUM_CNTS, + HPM_CNT_WIDTH => HPM_CNT_WIDTH ) port map ( - clk_i => clk_i, - rstn_i => rstn_int, - clear_i => i_fence, - cpu_req_i => cpu_i_req, - cpu_rsp_o => cpu_i_rsp, - bus_req_o => icache_req, - bus_rsp_i => icache_rsp + -- global control -- + clk_i => clk_i, + rstn_i => rstn_int, + sleep_o => cpu_sleep, + debug_o => cpu_debug, + ifence_o => i_fence, + dfence_o => d_fence, + -- interrupts -- + msi_i => msw_irq_i, + mei_i => mext_irq_i, + mti_i => mtime_irq, + firq_i => cpu_firq, + dbi_i => dci_halt_req, + -- instruction bus interface -- + ibus_req_o => cpu_i_req, + ibus_rsp_i => cpu_i_rsp, + -- data bus interface -- + dbus_req_o => cpu_d_req, + dbus_rsp_i => cpu_d_rsp ); - end generate; - neorv32_icache_inst_false: - if (ICACHE_EN = false) generate - icache_req <= cpu_i_req; - cpu_i_rsp <= icache_rsp; - end generate; - - - -- CPU Data Cache ------------------------------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_dcache_inst_true: - if (DCACHE_EN = true) generate - neorv32_dcache_inst: entity neorv32.neorv32_dcache + -- advanced memory control -- + fence_o <= d_fence; + fencei_o <= i_fence; + + -- fast interrupt requests (FIRQs) -- + cpu_firq(00) <= firq.wdt; -- highest priority + cpu_firq(01) <= firq.cfs; + cpu_firq(02) <= firq.uart0_rx; + cpu_firq(03) <= firq.uart0_tx; + cpu_firq(04) <= firq.uart1_rx; + cpu_firq(05) <= firq.uart1_tx; + cpu_firq(06) <= firq.spi; + cpu_firq(07) <= firq.twi; + cpu_firq(08) <= firq.xirq; + cpu_firq(09) <= firq.neoled; + cpu_firq(10) <= firq.dma; + cpu_firq(11) <= firq.sdi; + cpu_firq(12) <= firq.gptmr; + cpu_firq(13) <= firq.onewire; + cpu_firq(14) <= firq.slink; + cpu_firq(15) <= firq.trng; -- lowest priority + + + -- CPU Instruction Cache ------------------------------------------------------------------ + -- ------------------------------------------------------------------------------------------- + neorv32_icache_inst_true: + if (ICACHE_EN = true) generate + neorv32_icache_inst: entity neorv32.neorv32_icache + generic map ( + ICACHE_NUM_BLOCKS => ICACHE_NUM_BLOCKS, + ICACHE_BLOCK_SIZE => ICACHE_BLOCK_SIZE, + ICACHE_NUM_SETS => ICACHE_ASSOCIATIVITY + ) + port map ( + clk_i => clk_i, + rstn_i => rstn_int, + clear_i => i_fence, + cpu_req_i => cpu_i_req, + cpu_rsp_o => cpu_i_rsp, + bus_req_o => icache_req, + bus_rsp_i => icache_rsp + ); + end generate; + + neorv32_icache_inst_false: + if (ICACHE_EN = false) generate + icache_req <= cpu_i_req; + cpu_i_rsp <= icache_rsp; + end generate; + + + -- CPU Data Cache ------------------------------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_dcache_inst_true: + if (DCACHE_EN = true) generate + neorv32_dcache_inst: entity neorv32.neorv32_dcache + generic map ( + DCACHE_NUM_BLOCKS => DCACHE_NUM_BLOCKS, + DCACHE_BLOCK_SIZE => DCACHE_BLOCK_SIZE, + DCACHE_UC_PBEGIN => "1111" + ) + port map ( + clk_i => clk_i, + rstn_i => rstn_int, + clear_i => d_fence, + cpu_req_i => cpu_d_req, + cpu_rsp_o => cpu_d_rsp, + bus_req_o => dcache_req, + bus_rsp_i => dcache_rsp + ); + end generate; + + neorv32_dcache_inst_false: + if (DCACHE_EN = false) generate + dcache_req <= cpu_d_req; + cpu_d_rsp <= dcache_rsp; + end generate; + + + -- Core Complex Bus Switch ---------------------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_core_busswitch_inst: entity neorv32.neorv32_busswitch generic map ( - DCACHE_NUM_BLOCKS => DCACHE_NUM_BLOCKS, - DCACHE_BLOCK_SIZE => DCACHE_BLOCK_SIZE, - DCACHE_UC_PBEGIN => "1111" + PORT_A_READ_ONLY => false, + PORT_B_READ_ONLY => true -- i-fetch is read-only ) port map ( - clk_i => clk_i, - rstn_i => rstn_int, - clear_i => d_fence, - cpu_req_i => cpu_d_req, - cpu_rsp_o => cpu_d_rsp, - bus_req_o => dcache_req, - bus_rsp_i => dcache_rsp + clk_i => clk_i, + rstn_i => rstn_int, + a_req_i => dcache_req, + a_rsp_o => dcache_rsp, + b_req_i => icache_req, + b_rsp_o => icache_rsp, + x_req_o => core_req, + x_rsp_i => core_rsp ); - end generate; - neorv32_dcache_inst_false: - if (DCACHE_EN = false) generate - dcache_req <= cpu_d_req; - cpu_d_rsp <= dcache_rsp; - end generate; + end generate; -- /core_complex - -- Core Complex Bus Switch ---------------------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_core_busswitch_inst: entity neorv32.neorv32_busswitch - generic map ( - PORT_A_READ_ONLY => false, - PORT_B_READ_ONLY => true -- i-fetch is read-only - ) - port map ( - clk_i => clk_i, - rstn_i => rstn_int, - a_req_i => dcache_req, - a_rsp_o => dcache_rsp, - b_req_i => icache_req, - b_rsp_o => icache_rsp, - x_req_o => core_req, - x_rsp_i => core_rsp - ); - - --- **************************************************************************************************************************** --- Direct Memory Access Controller (DMA) Complex --- **************************************************************************************************************************** - - -- DMA controller and according bus switch -- + -- ************************************************************************************************************************** + -- Direct Memory Access Controller (DMA) Complex + -- ************************************************************************************************************************** neorv32_dma_complex_true: if (IO_DMA_EN = true) generate @@ -629,7 +632,7 @@ begin clk_i => clk_i, rstn_i => rstn_int, bus_req_i => io_req, - bus_rsp_o => rsp_bus(DEV_DMA), + bus_rsp_o => io_dev_rsp(IODEV_DMA), dma_req_o => dma_req, dma_rsp_i => dma_rsp, firq_i => cpu_firq, @@ -658,786 +661,788 @@ begin neorv32_dma_complex_false: if (IO_DMA_EN = false) generate - rsp_bus(DEV_DMA) <= rsp_terminate_c; - main_req <= core_req; - core_rsp <= main_rsp; - firq.dma <= '0'; + io_dev_rsp(IODEV_DMA) <= rsp_terminate_c; + main_req <= core_req; + core_rsp <= main_rsp; + firq.dma <= '0'; end generate; --- **************************************************************************************************************************** --- Bus System --- **************************************************************************************************************************** - - -- Bus Keeper (BUSKEEPER) ----------------------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_bus_keeper_inst: entity neorv32.neorv32_bus_keeper - port map ( - clk_i => clk_i, - rstn_i => rstn_int, - bus_req_i => soc_req, - bus_rsp_i => soc_rsp, - bus_err_o => bus_error, - bus_tmo_i => ext_timeout, - bus_ext_i => ext_access, - bus_xip_i => xip_access - ); - - -- global bus response --- - bus_response: process(rsp_bus) - variable tmp_v : bus_rsp_t; - begin - tmp_v := rsp_terminate_c; - for i in rsp_bus'range loop -- OR all response signals - tmp_v.data := tmp_v.data or rsp_bus(i).data; - tmp_v.ack := tmp_v.ack or rsp_bus(i).ack; - tmp_v.err := tmp_v.err or rsp_bus(i).err; - end loop; - soc_rsp <= tmp_v; - end process; - - -- central SoC bus -- - soc_req <= main_req; - main_rsp.data <= soc_rsp.data; - main_rsp.ack <= soc_rsp.ack; - main_rsp.err <= bus_error; -- global bus error (buskeeper -> core) - - --- **************************************************************************************************************************** --- Memory System --- **************************************************************************************************************************** - - -- Processor-Internal Instruction Memory (IMEM) ------------------------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_int_imem_inst_true: - if (MEM_INT_IMEM_EN = true) and (MEM_INT_IMEM_SIZE > 0) generate - neorv32_int_imem_inst: entity neorv32.neorv32_imem - generic map ( - IMEM_BASE => imem_base_c, - IMEM_SIZE => MEM_INT_IMEM_SIZE, - IMEM_AS_IROM => not INT_BOOTLOADER_EN - ) - port map ( - clk_i => clk_i, - bus_req_i => soc_req, - bus_rsp_o => rsp_bus(DEV_IMEM) - ); - end generate; - - neorv32_int_imem_inst_false: - if (MEM_INT_IMEM_EN = false) or (MEM_INT_IMEM_SIZE = 0) generate - rsp_bus(DEV_IMEM) <= rsp_terminate_c; - end generate; + -- ************************************************************************************************************************** + -- Bus System - Section Gateway + -- ************************************************************************************************************************** - -- Processor-Internal Data Memory (DMEM) -------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_int_dmem_inst_true: - if (MEM_INT_DMEM_EN = true) and (MEM_INT_DMEM_SIZE > 0) generate - neorv32_int_dmem_inst: entity neorv32.neorv32_dmem + neorv32_gateway_inst: entity neorv32.neorv32_gateway generic map ( - DMEM_BASE => dmem_base_c, - DMEM_SIZE => MEM_INT_DMEM_SIZE - ) - port map ( - clk_i => clk_i, - bus_req_i => soc_req, - bus_rsp_o => rsp_bus(DEV_DMEM) - ); - end generate; - - neorv32_int_dmem_inst_false: - if (MEM_INT_DMEM_EN = false) or (MEM_INT_DMEM_SIZE = 0) generate - rsp_bus(DEV_DMEM) <= rsp_terminate_c; - end generate; - - - -- Processor-Internal Bootloader ROM (BOOTROM) -------------------------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_boot_rom_inst_true: - if (INT_BOOTLOADER_EN = true) generate - neorv32_boot_rom_inst: entity neorv32.neorv32_boot_rom - generic map ( - BOOTROM_BASE => boot_rom_base_c - ) - port map ( - clk_i => clk_i, - bus_req_i => soc_req, - bus_rsp_o => rsp_bus(DEV_BOOTROM) - ); - end generate; - - neorv32_boot_rom_inst_false: - if (INT_BOOTLOADER_EN = false) generate - rsp_bus(DEV_BOOTROM) <= rsp_terminate_c; - end generate; - - - -- External Wishbone Gateway (WISHBONE) --------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_wishbone_inst_true: - if (MEM_EXT_EN = true) generate - neorv32_wishbone_inst: entity neorv32.neorv32_wishbone - generic map ( - -- Internal instruction memory -- - MEM_INT_IMEM_EN => MEM_INT_IMEM_EN, - MEM_INT_IMEM_SIZE => MEM_INT_IMEM_SIZE, - -- Internal data memory -- - MEM_INT_DMEM_EN => MEM_INT_DMEM_EN, - MEM_INT_DMEM_SIZE => MEM_INT_DMEM_SIZE, - -- Interface Configuration -- - BUS_TIMEOUT => MEM_EXT_TIMEOUT, - PIPE_MODE => MEM_EXT_PIPE_MODE, - BIG_ENDIAN => MEM_EXT_BIG_ENDIAN, - ASYNC_RX => MEM_EXT_ASYNC_RX, - ASYNC_TX => MEM_EXT_ASYNC_TX + TIMEOUT => max_proc_int_response_time_c, + -- IMEM port -- + IMEM_ENABLE => MEM_INT_IMEM_EN, + IMEM_BASE => imem_base_c, + IMEM_SIZE => MEM_INT_IMEM_SIZE, + -- DMEM port -- + DMEM_ENABLE => MEM_INT_DMEM_EN, + DMEM_BASE => dmem_base_c, + DMEM_SIZE => MEM_INT_DMEM_SIZE, + -- XIP port -- + XIP_ENABLE => IO_XIP_EN, + XIP_BASE => x"E0000000", + XIP_SIZE => 256*1024*1024, + -- BOOT ROM port -- + BOOT_ENABLE => INT_BOOTLOADER_EN, + BOOT_BASE => boot_rom_base_c, + BOOT_SIZE => boot_rom_max_size_c, + -- IO port -- + IO_ENABLE => true, + IO_REQ_REG => false, + IO_RSP_REG => false, + IO_BASE => io_base_c, + IO_SIZE => io_size_c, + -- EXT port -- + EXT_ENABLE => MEM_EXT_EN ) port map ( -- global control -- clk_i => clk_i, rstn_i => rstn_int, - bus_req_i => soc_req, - bus_rsp_o => rsp_bus(DEV_WISHBONE), - tmo_o => ext_timeout, - ext_o => ext_access, - xip_en_i => xip_enable, - xip_page_i => xip_page, - -- - wb_tag_o => wb_tag_o, - wb_adr_o => wb_adr_o, - wb_dat_i => wb_dat_i, - wb_dat_o => wb_dat_o, - wb_we_o => wb_we_o, - wb_sel_o => wb_sel_o, - wb_stb_o => wb_stb_o, - wb_cyc_o => wb_cyc_o, - wb_ack_i => wb_ack_i, - wb_err_i => wb_err_i - ); - end generate; - - neorv32_wishbone_inst_false: - if (MEM_EXT_EN = false) generate - rsp_bus(DEV_WISHBONE) <= rsp_terminate_c; - ext_timeout <= '0'; - ext_access <= '0'; - wb_adr_o <= (others => '0'); - wb_dat_o <= (others => '0'); - wb_we_o <= '0'; - wb_sel_o <= (others => '0'); - wb_stb_o <= '0'; - wb_cyc_o <= '0'; - wb_tag_o <= (others => '0'); - end generate; - - - -- Execute In Place Module (XIP) ---------------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_xip_inst_true: - if (IO_XIP_EN = true) generate - neorv32_xip_inst: entity neorv32.neorv32_xip - port map ( - -- global control -- - clk_i => clk_i, - rstn_i => rstn_int, - bus_req_i => io_req, - bus_rsp_o => rsp_bus(DEV_XIP_CT), - xip_req_i => soc_req, - xip_rsp_o => rsp_bus(DEV_XIP_ACC), - xip_en_o => xip_enable, - xip_acc_o => xip_access, - xip_page_o => xip_page, - clkgen_en_o => cg_en.xip, - clkgen_i => clk_gen, - spi_csn_o => xip_csn_o, - spi_clk_o => xip_clk_o, - spi_dat_i => xip_dat_i, - spi_dat_o => xip_dat_o - ); - end generate; - - neorv32_xip_inst_false: - if (IO_XIP_EN = false) generate - rsp_bus(DEV_XIP_CT) <= rsp_terminate_c; - rsp_bus(DEV_XIP_ACC) <= rsp_terminate_c; - xip_enable <= '0'; - xip_access <= '0'; - xip_page <= (others => '0'); - cg_en.xip <= '0'; - xip_csn_o <= '1'; - xip_clk_o <= '0'; - xip_dat_o <= '0'; - end generate; - - --- **************************************************************************************************************************** --- IO/Peripheral Modules --- **************************************************************************************************************************** - - -- IO Gateway ----------------------------------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - io_gateway: process(soc_req, io_acc) - begin - io_req <= soc_req; - io_req.re <= io_acc and soc_req.re and (not soc_req.src); -- PMA: read access only from data interface - io_req.we <= io_acc and soc_req.we and and_reduce_f(soc_req.ben); -- PMA: full-word write accesses only - end process io_gateway; - - -- IO access? -- - io_acc <= '1' when (soc_req.addr(31 downto index_size_f(io_size_c)) = io_base_c(31 downto index_size_f(io_size_c))) else '0'; - - - -- Custom Functions Subsystem (CFS) ------------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_cfs_inst_true: - if (IO_CFS_EN = true) generate - neorv32_cfs_inst: entity neorv32.neorv32_cfs - generic map ( - CFS_CONFIG => IO_CFS_CONFIG, - CFS_IN_SIZE => IO_CFS_IN_SIZE, - CFS_OUT_SIZE => IO_CFS_OUT_SIZE - ) - port map ( - clk_i => clk_i, - rstn_i => rstn_int, - bus_req_i => io_req, - bus_rsp_o => rsp_bus(DEV_CFS), - clkgen_en_o => cg_en.cfs, - clkgen_i => clk_gen, - irq_o => firq.cfs, - cfs_in_i => cfs_in_i, - cfs_out_o => cfs_out_o - ); - end generate; - - neorv32_cfs_inst_false: - if (IO_CFS_EN = false) generate - rsp_bus(DEV_CFS) <= rsp_terminate_c; - cg_en.cfs <= '0'; - firq.cfs <= '0'; - cfs_out_o <= (others => '0'); - end generate; - - - -- Serial Data Interface (SDI) ------------------------------------------------------------ - -- ------------------------------------------------------------------------------------------- - neorv32_sdi_inst_true: - if (IO_SDI_EN = true) generate - neorv32_SDI_inst: entity neorv32.neorv32_sdi - generic map ( - RTX_FIFO => IO_SDI_FIFO - ) - port map ( - clk_i => clk_i, - rstn_i => rstn_int, - bus_req_i => io_req, - bus_rsp_o => rsp_bus(DEV_SDI), - sdi_csn_i => sdi_csn_i, - sdi_clk_i => sdi_clk_i, - sdi_dat_i => sdi_dat_i, - sdi_dat_o => sdi_dat_o, - irq_o => firq.sdi - ); - end generate; - - neorv32_sdi_inst_false: - if (IO_SDI_EN = false) generate - rsp_bus(DEV_SDI) <= rsp_terminate_c; - sdi_dat_o <= '0'; - firq.sdi <= '0'; - end generate; - - - -- General Purpose Input/Output Port (GPIO) ----------------------------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_gpio_inst_true: - if (IO_GPIO_NUM > 0) generate - neorv32_gpio_inst: entity neorv32.neorv32_gpio - generic map ( - GPIO_NUM => IO_GPIO_NUM - ) - port map ( - -- host access -- - clk_i => clk_i, - rstn_i => rstn_int, - bus_req_i => io_req, - bus_rsp_o => rsp_bus(DEV_GPIO), - gpio_o => gpio_o, - gpio_i => gpio_i - ); - end generate; - - neorv32_gpio_inst_false: - if (IO_GPIO_NUM = 0) generate - rsp_bus(DEV_GPIO) <= rsp_terminate_c; - gpio_o <= (others => '0'); - end generate; - - - -- Watch Dog Timer (WDT) ------------------------------------------------------------------ - -- ------------------------------------------------------------------------------------------- - neorv32_wdt_inst_true: - if (IO_WDT_EN = true) generate - neorv32_wdt_inst: entity neorv32.neorv32_wdt - port map ( - clk_i => clk_i, - rstn_ext_i => rstn_ext, - rstn_int_i => rstn_int, - bus_req_i => io_req, - bus_rsp_o => rsp_bus(DEV_WDT), - cpu_debug_i => cpu_debug, - cpu_sleep_i => cpu_sleep, - clkgen_en_o => cg_en.wdt, - clkgen_i => clk_gen, - irq_o => firq.wdt, - rstn_o => rstn_wdt - ); - end generate; - - neorv32_wdt_inst_false: - if (IO_WDT_EN = false) generate - rsp_bus(DEV_WDT) <= rsp_terminate_c; - firq.wdt <= '0'; - rstn_wdt <= '1'; - cg_en.wdt <= '0'; - end generate; - - - -- Machine System Timer (MTIME) ----------------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_mtime_inst_true: - if (IO_MTIME_EN = true) generate - neorv32_mtime_inst: entity neorv32.neorv32_mtime - port map ( - clk_i => clk_i, - rstn_i => rstn_int, - bus_req_i => io_req, - bus_rsp_o => rsp_bus(DEV_MTIME), - irq_o => mtime_irq - ); - end generate; - - neorv32_mtime_inst_false: - if (IO_MTIME_EN = false) generate - rsp_bus(DEV_MTIME) <= rsp_terminate_c; - mtime_irq <= mtime_irq_i; - end generate; - - - -- Primary Universal Asynchronous Receiver/Transmitter (UART0) ---------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_uart0_inst_true: - if (IO_UART0_EN = true) generate - neorv32_uart0_inst: entity neorv32.neorv32_uart - generic map ( - UART_PRIMARY => true, - UART_RX_FIFO => IO_UART0_RX_FIFO, - UART_TX_FIFO => IO_UART0_TX_FIFO - ) - port map ( - clk_i => clk_i, - rstn_i => rstn_int, - bus_req_i => io_req, - bus_rsp_o => rsp_bus(DEV_UART0), - clkgen_en_o => cg_en.uart0, - clkgen_i => clk_gen, - uart_txd_o => uart0_txd_o, - uart_rxd_i => uart0_rxd_i, - uart_rts_o => uart0_rts_o, - uart_cts_i => uart0_cts_i, - irq_rx_o => firq.uart0_rx, - irq_tx_o => firq.uart0_tx - ); - end generate; - - neorv32_uart0_inst_false: - if (IO_UART0_EN = false) generate - rsp_bus(DEV_UART0) <= rsp_terminate_c; - uart0_txd_o <= '0'; - uart0_rts_o <= '1'; - cg_en.uart0 <= '0'; - firq.uart0_rx <= '0'; - firq.uart0_tx <= '0'; - end generate; - - - -- Secondary Universal Asynchronous Receiver/Transmitter (UART1) -------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_uart1_inst_true: - if (IO_UART1_EN = true) generate - neorv32_uart1_inst: entity neorv32.neorv32_uart - generic map ( - UART_PRIMARY => false, - UART_RX_FIFO => IO_UART1_RX_FIFO, - UART_TX_FIFO => IO_UART1_TX_FIFO - ) - port map ( - clk_i => clk_i, - rstn_i => rstn_int, - bus_req_i => io_req, - bus_rsp_o => rsp_bus(DEV_UART1), - clkgen_en_o => cg_en.uart1, - clkgen_i => clk_gen, - uart_txd_o => uart1_txd_o, - uart_rxd_i => uart1_rxd_i, - uart_rts_o => uart1_rts_o, - uart_cts_i => uart1_cts_i, - irq_rx_o => firq.uart1_rx, - irq_tx_o => firq.uart1_tx - ); - end generate; - - neorv32_uart1_inst_false: - if (IO_UART1_EN = false) generate - rsp_bus(DEV_UART1) <= rsp_terminate_c; - uart1_txd_o <= '0'; - uart1_rts_o <= '1'; - cg_en.uart1 <= '0'; - firq.uart1_rx <= '0'; - firq.uart1_tx <= '0'; - end generate; - - - -- Serial Peripheral Interface (SPI) ------------------------------------------------------ - -- ------------------------------------------------------------------------------------------- - neorv32_spi_inst_true: - if (IO_SPI_EN = true) generate - neorv32_spi_inst: entity neorv32.neorv32_spi - generic map ( - IO_SPI_FIFO => IO_SPI_FIFO - ) - port map ( - clk_i => clk_i, - rstn_i => rstn_int, - bus_req_i => io_req, - bus_rsp_o => rsp_bus(DEV_SPI), - clkgen_en_o => cg_en.spi, - clkgen_i => clk_gen, - spi_clk_o => spi_clk_o, - spi_dat_o => spi_dat_o, - spi_dat_i => spi_dat_i, - spi_csn_o => spi_csn_o, - irq_o => firq.spi - ); - end generate; - - neorv32_spi_inst_false: - if (IO_SPI_EN = false) generate - rsp_bus(DEV_SPI) <= rsp_terminate_c; - spi_clk_o <= '0'; - spi_dat_o <= '0'; - spi_csn_o <= (others => '1'); - cg_en.spi <= '0'; - firq.spi <= '0'; - end generate; - - - -- Two-Wire Interface (TWI) --------------------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_twi_inst_true: - if (IO_TWI_EN = true) generate - neorv32_twi_inst: entity neorv32.neorv32_twi - port map ( - clk_i => clk_i, - rstn_i => rstn_int, - bus_req_i => io_req, - bus_rsp_o => rsp_bus(DEV_TWI), - clkgen_en_o => cg_en.twi, - clkgen_i => clk_gen, - twi_sda_i => twi_sda_i, - twi_sda_o => twi_sda_o, - twi_scl_i => twi_scl_i, - twi_scl_o => twi_scl_o, - irq_o => firq.twi - ); - end generate; - - neorv32_twi_inst_false: - if (IO_TWI_EN = false) generate - rsp_bus(DEV_TWI) <= rsp_terminate_c; - twi_sda_o <= '1'; - twi_scl_o <= '1'; - cg_en.twi <= '0'; - firq.twi <= '0'; - end generate; - - - -- Pulse-Width Modulation Controller (PWM) ------------------------------------------------ - -- ------------------------------------------------------------------------------------------- - neorv32_pwm_inst_true: - if (IO_PWM_NUM_CH > 0) generate - neorv32_pwm_inst: entity neorv32.neorv32_pwm - generic map ( - NUM_CHANNELS => IO_PWM_NUM_CH - ) - port map ( - clk_i => clk_i, - rstn_i => rstn_int, - bus_req_i => io_req, - bus_rsp_o => rsp_bus(DEV_PWM), - clkgen_en_o => cg_en.pwm, - clkgen_i => clk_gen, - pwm_o => pwm_o - ); - end generate; - - neorv32_pwm_inst_false: - if (IO_PWM_NUM_CH = 0) generate - rsp_bus(DEV_PWM) <= rsp_terminate_c; - cg_en.pwm <= '0'; - pwm_o <= (others => '0'); - end generate; - - - -- True Random Number Generator (TRNG) ---------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_trng_inst_true: - if (IO_TRNG_EN = true) generate - neorv32_trng_inst: entity neorv32.neorv32_trng - generic map ( - IO_TRNG_FIFO => IO_TRNG_FIFO - ) - port map ( - clk_i => clk_i, - rstn_i => rstn_int, - bus_req_i => io_req, - bus_rsp_o => rsp_bus(DEV_TRNG), - irq_o => firq.trng + -- host port -- + main_req_i => main_req, + main_rsp_o => main_rsp, + -- section ports -- + imem_req_o => imem_req, + imem_rsp_i => imem_rsp, + dmem_req_o => dmem_req, + dmem_rsp_i => dmem_rsp, + xip_req_o => xip_req, + xip_rsp_i => xip_rsp, + boot_req_o => boot_req, + boot_rsp_i => boot_rsp, + io_req_o => io_req, + io_rsp_i => io_rsp, + ext_req_o => xbus_req, + ext_rsp_i => xbus_rsp ); - end generate; - neorv32_trng_inst_false: - if (IO_TRNG_EN = false) generate - rsp_bus(DEV_TRNG) <= rsp_terminate_c; - firq.trng <= '0'; - end generate; + -- ************************************************************************************************************************** + -- Memory System + -- ************************************************************************************************************************** + memory_system: + if (true) generate - -- Smart LED (WS2811/WS2812) Interface (NEOLED) ------------------------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_neoled_inst_true: - if (IO_NEOLED_EN = true) generate - neorv32_neoled_inst: entity neorv32.neorv32_neoled - generic map ( - FIFO_DEPTH => IO_NEOLED_TX_FIFO - ) - port map ( - clk_i => clk_i, - rstn_i => rstn_int, - bus_req_i => io_req, - bus_rsp_o => rsp_bus(DEV_NEOLED), - clkgen_en_o => cg_en.neoled, - clkgen_i => clk_gen, - irq_o => firq.neoled, - neoled_o => neoled_o - ); - end generate; - - neorv32_neoled_inst_false: - if (IO_NEOLED_EN = false) generate - rsp_bus(DEV_NEOLED) <= rsp_terminate_c; - cg_en.neoled <= '0'; - firq.neoled <= '0'; - neoled_o <= '0'; - end generate; - - - -- External Interrupt Controller (XIRQ) --------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_xirq_inst_true: - if (XIRQ_NUM_CH > 0) generate - neorv32_xirq_inst: entity neorv32.neorv32_xirq - generic map ( - XIRQ_NUM_CH => XIRQ_NUM_CH, - XIRQ_TRIGGER_TYPE => XIRQ_TRIGGER_TYPE, - XIRQ_TRIGGER_POLARITY => XIRQ_TRIGGER_POLARITY - ) - port map ( - -- host access -- - clk_i => clk_i, - rstn_i => rstn_int, - bus_req_i => io_req, - bus_rsp_o => rsp_bus(DEV_XIRQ), - xirq_i => xirq_i, - cpu_irq_o => firq.xirq - ); - end generate; + -- Processor-Internal Instruction Memory (IMEM) ------------------------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_int_imem_inst_true: + if (MEM_INT_IMEM_EN = true) and (MEM_INT_IMEM_SIZE > 0) generate + neorv32_int_imem_inst: entity neorv32.neorv32_imem + generic map ( + IMEM_SIZE => MEM_INT_IMEM_SIZE, + IMEM_AS_IROM => not INT_BOOTLOADER_EN + ) + port map ( + clk_i => clk_i, + bus_req_i => imem_req, + bus_rsp_o => imem_rsp + ); + end generate; - neorv32_xirq_inst_false: - if (XIRQ_NUM_CH = 0) generate - rsp_bus(DEV_XIRQ) <= rsp_terminate_c; - firq.xirq <= '0'; - end generate; + neorv32_int_imem_inst_false: + if (MEM_INT_IMEM_EN = false) or (MEM_INT_IMEM_SIZE = 0) generate + imem_rsp <= rsp_terminate_c; + end generate; - -- General Purpose Timer (GPTMR) ---------------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_gptmr_inst_true: - if (IO_GPTMR_EN = true) generate - neorv32_gptmr_inst: entity neorv32.neorv32_gptmr - port map ( - clk_i => clk_i, - rstn_i => rstn_int, - bus_req_i => io_req, - bus_rsp_o => rsp_bus(DEV_GPTMR), - clkgen_en_o => cg_en.gptmr, - clkgen_i => clk_gen, - irq_o => firq.gptmr - ); - end generate; + -- Processor-Internal Data Memory (DMEM) -------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_int_dmem_inst_true: + if (MEM_INT_DMEM_EN = true) and (MEM_INT_DMEM_SIZE > 0) generate + neorv32_int_dmem_inst: entity neorv32.neorv32_dmem + generic map ( + DMEM_SIZE => MEM_INT_DMEM_SIZE + ) + port map ( + clk_i => clk_i, + bus_req_i => dmem_req, + bus_rsp_o => dmem_rsp + ); + end generate; - neorv32_gptmr_inst_false: - if (IO_GPTMR_EN = false) generate - rsp_bus(DEV_GPTMR) <= rsp_terminate_c; - cg_en.gptmr <= '0'; - firq.gptmr <= '0'; - end generate; + neorv32_int_dmem_inst_false: + if (MEM_INT_DMEM_EN = false) or (MEM_INT_DMEM_SIZE = 0) generate + dmem_rsp <= rsp_terminate_c; + end generate; - -- 1-Wire Interface Controller (ONEWIRE) -------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_onewire_inst_true: - if (IO_ONEWIRE_EN = true) generate - neorv32_onewire_inst: entity neorv32.neorv32_onewire - port map ( - clk_i => clk_i, - rstn_i => rstn_int, - bus_req_i => io_req, - bus_rsp_o => rsp_bus(DEV_ONEWIRE), - clkgen_en_o => cg_en.onewire, - clkgen_i => clk_gen, - onewire_i => onewire_i, - onewire_o => onewire_o, - irq_o => firq.onewire - ); - end generate; + -- Processor-Internal Bootloader ROM (BOOTROM) -------------------------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_boot_rom_inst_true: + if (INT_BOOTLOADER_EN = true) generate + neorv32_boot_rom_inst: entity neorv32.neorv32_boot_rom + port map ( + clk_i => clk_i, + bus_req_i => boot_req, + bus_rsp_o => boot_rsp + ); + end generate; - neorv32_onewire_inst_false: - if (IO_ONEWIRE_EN = false) generate - rsp_bus(DEV_ONEWIRE) <= rsp_terminate_c; - onewire_o <= '1'; - cg_en.onewire <= '0'; - firq.onewire <= '0'; - end generate; + neorv32_boot_rom_inst_false: + if (INT_BOOTLOADER_EN = false) generate + boot_rsp <= rsp_terminate_c; + end generate; - -- Stream Link Interface (SLINK) ---------------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_slink_inst_true: - if (IO_SLINK_EN = true) generate - neorv32_slink_inst: entity neorv32.neorv32_slink + -- Execute In Place Module (XIP) ---------------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_xip_inst_true: + if (IO_XIP_EN = true) generate + neorv32_xip_inst: entity neorv32.neorv32_xip + port map ( + -- global control -- + clk_i => clk_i, + rstn_i => rstn_int, + bus_req_i => io_req, + bus_rsp_o => io_dev_rsp(IODEV_XIP), + xip_req_i => xip_req, + xip_rsp_o => xip_rsp, + clkgen_en_o => cg_en.xip, + clkgen_i => clk_gen, + spi_csn_o => xip_csn_o, + spi_clk_o => xip_clk_o, + spi_dat_i => xip_dat_i, + spi_dat_o => xip_dat_o + ); + end generate; + + neorv32_xip_inst_false: + if (IO_XIP_EN = false) generate + io_dev_rsp(IODEV_XIP) <= rsp_terminate_c; + xip_rsp <= rsp_terminate_c; + cg_en.xip <= '0'; + xip_csn_o <= '1'; + xip_clk_o <= '0'; + xip_dat_o <= '0'; + end generate; + + + -- External Wishbone Gateway (WISHBONE) --------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_wishbone_inst_true: + if (MEM_EXT_EN = true) generate + neorv32_wishbone_inst: entity neorv32.neorv32_wishbone + generic map ( + BUS_TIMEOUT => MEM_EXT_TIMEOUT, + PIPE_MODE => MEM_EXT_PIPE_MODE, + BIG_ENDIAN => MEM_EXT_BIG_ENDIAN, + ASYNC_RX => MEM_EXT_ASYNC_RX, + ASYNC_TX => MEM_EXT_ASYNC_TX + ) + port map ( + clk_i => clk_i, + rstn_i => rstn_int, + bus_req_i => xbus_req, + bus_rsp_o => xbus_rsp, + -- + wb_tag_o => wb_tag_o, + wb_adr_o => wb_adr_o, + wb_dat_i => wb_dat_i, + wb_dat_o => wb_dat_o, + wb_we_o => wb_we_o, + wb_sel_o => wb_sel_o, + wb_stb_o => wb_stb_o, + wb_cyc_o => wb_cyc_o, + wb_ack_i => wb_ack_i, + wb_err_i => wb_err_i + ); + end generate; + + neorv32_wishbone_inst_false: + if (MEM_EXT_EN = false) generate + xbus_rsp <= rsp_terminate_c; + wb_adr_o <= (others => '0'); + wb_dat_o <= (others => '0'); + wb_we_o <= '0'; + wb_sel_o <= (others => '0'); + wb_stb_o <= '0'; + wb_cyc_o <= '0'; + wb_tag_o <= (others => '0'); + end generate; + + end generate; -- /memory_system + + + -- ************************************************************************************************************************** + -- IO/Peripheral Modules + -- ************************************************************************************************************************** + io_system: + if (true) generate + + -- Global IO Response Bus ----------------------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + bus_response: process(io_dev_rsp) + variable tmp_v : bus_rsp_t; + begin + tmp_v := rsp_terminate_c; + for i in io_dev_rsp'range loop -- OR all response signals + tmp_v.data := tmp_v.data or io_dev_rsp(i).data; + tmp_v.ack := tmp_v.ack or io_dev_rsp(i).ack; + tmp_v.err := tmp_v.err or io_dev_rsp(i).err; + end loop; + io_rsp <= tmp_v; + end process; + + + -- Custom Functions Subsystem (CFS) ------------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_cfs_inst_true: + if (IO_CFS_EN = true) generate + neorv32_cfs_inst: entity neorv32.neorv32_cfs + generic map ( + CFS_CONFIG => IO_CFS_CONFIG, + CFS_IN_SIZE => IO_CFS_IN_SIZE, + CFS_OUT_SIZE => IO_CFS_OUT_SIZE + ) + port map ( + clk_i => clk_i, + rstn_i => rstn_int, + bus_req_i => io_req, + bus_rsp_o => io_dev_rsp(IODEV_CFS), + clkgen_en_o => cg_en.cfs, + clkgen_i => clk_gen, + irq_o => firq.cfs, + cfs_in_i => cfs_in_i, + cfs_out_o => cfs_out_o + ); + end generate; + + neorv32_cfs_inst_false: + if (IO_CFS_EN = false) generate + io_dev_rsp(IODEV_CFS) <= rsp_terminate_c; + cg_en.cfs <= '0'; + firq.cfs <= '0'; + cfs_out_o <= (others => '0'); + end generate; + + + -- Serial Data Interface (SDI) ------------------------------------------------------------ + -- ------------------------------------------------------------------------------------------- + neorv32_sdi_inst_true: + if (IO_SDI_EN = true) generate + neorv32_SDI_inst: entity neorv32.neorv32_sdi + generic map ( + RTX_FIFO => IO_SDI_FIFO + ) + port map ( + clk_i => clk_i, + rstn_i => rstn_int, + bus_req_i => io_req, + bus_rsp_o => io_dev_rsp(IODEV_SDI), + sdi_csn_i => sdi_csn_i, + sdi_clk_i => sdi_clk_i, + sdi_dat_i => sdi_dat_i, + sdi_dat_o => sdi_dat_o, + irq_o => firq.sdi + ); + end generate; + + neorv32_sdi_inst_false: + if (IO_SDI_EN = false) generate + io_dev_rsp(IODEV_SDI) <= rsp_terminate_c; + sdi_dat_o <= '0'; + firq.sdi <= '0'; + end generate; + + + -- General Purpose Input/Output Port (GPIO) ----------------------------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_gpio_inst_true: + if (IO_GPIO_NUM > 0) generate + neorv32_gpio_inst: entity neorv32.neorv32_gpio + generic map ( + GPIO_NUM => IO_GPIO_NUM + ) + port map ( + -- host access -- + clk_i => clk_i, + rstn_i => rstn_int, + bus_req_i => io_req, + bus_rsp_o => io_dev_rsp(IODEV_GPIO), + gpio_o => gpio_o, + gpio_i => gpio_i + ); + end generate; + + neorv32_gpio_inst_false: + if (IO_GPIO_NUM = 0) generate + io_dev_rsp(IODEV_GPIO) <= rsp_terminate_c; + gpio_o <= (others => '0'); + end generate; + + + -- Watch Dog Timer (WDT) ------------------------------------------------------------------ + -- ------------------------------------------------------------------------------------------- + neorv32_wdt_inst_true: + if (IO_WDT_EN = true) generate + neorv32_wdt_inst: entity neorv32.neorv32_wdt + port map ( + clk_i => clk_i, + rstn_ext_i => rstn_ext, + rstn_int_i => rstn_int, + bus_req_i => io_req, + bus_rsp_o => io_dev_rsp(IODEV_WDT), + cpu_debug_i => cpu_debug, + cpu_sleep_i => cpu_sleep, + clkgen_en_o => cg_en.wdt, + clkgen_i => clk_gen, + irq_o => firq.wdt, + rstn_o => rstn_wdt + ); + end generate; + + neorv32_wdt_inst_false: + if (IO_WDT_EN = false) generate + io_dev_rsp(IODEV_WDT) <= rsp_terminate_c; + firq.wdt <= '0'; + rstn_wdt <= '1'; + cg_en.wdt <= '0'; + end generate; + + + -- Machine System Timer (MTIME) ----------------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_mtime_inst_true: + if (IO_MTIME_EN = true) generate + neorv32_mtime_inst: entity neorv32.neorv32_mtime + port map ( + clk_i => clk_i, + rstn_i => rstn_int, + bus_req_i => io_req, + bus_rsp_o => io_dev_rsp(IODEV_MTIME), + irq_o => mtime_irq + ); + end generate; + + neorv32_mtime_inst_false: + if (IO_MTIME_EN = false) generate + io_dev_rsp(IODEV_MTIME) <= rsp_terminate_c; + mtime_irq <= mtime_irq_i; + end generate; + + + -- Primary Universal Asynchronous Receiver/Transmitter (UART0) ---------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_uart0_inst_true: + if (IO_UART0_EN = true) generate + neorv32_uart0_inst: entity neorv32.neorv32_uart + generic map ( + UART_PRIMARY => true, + UART_RX_FIFO => IO_UART0_RX_FIFO, + UART_TX_FIFO => IO_UART0_TX_FIFO + ) + port map ( + clk_i => clk_i, + rstn_i => rstn_int, + bus_req_i => io_req, + bus_rsp_o => io_dev_rsp(IODEV_UART0), + clkgen_en_o => cg_en.uart0, + clkgen_i => clk_gen, + uart_txd_o => uart0_txd_o, + uart_rxd_i => uart0_rxd_i, + uart_rts_o => uart0_rts_o, + uart_cts_i => uart0_cts_i, + irq_rx_o => firq.uart0_rx, + irq_tx_o => firq.uart0_tx + ); + end generate; + + neorv32_uart0_inst_false: + if (IO_UART0_EN = false) generate + io_dev_rsp(IODEV_UART0) <= rsp_terminate_c; + uart0_txd_o <= '0'; + uart0_rts_o <= '1'; + cg_en.uart0 <= '0'; + firq.uart0_rx <= '0'; + firq.uart0_tx <= '0'; + end generate; + + + -- Secondary Universal Asynchronous Receiver/Transmitter (UART1) -------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_uart1_inst_true: + if (IO_UART1_EN = true) generate + neorv32_uart1_inst: entity neorv32.neorv32_uart + generic map ( + UART_PRIMARY => false, + UART_RX_FIFO => IO_UART1_RX_FIFO, + UART_TX_FIFO => IO_UART1_TX_FIFO + ) + port map ( + clk_i => clk_i, + rstn_i => rstn_int, + bus_req_i => io_req, + bus_rsp_o => io_dev_rsp(IODEV_UART1), + clkgen_en_o => cg_en.uart1, + clkgen_i => clk_gen, + uart_txd_o => uart1_txd_o, + uart_rxd_i => uart1_rxd_i, + uart_rts_o => uart1_rts_o, + uart_cts_i => uart1_cts_i, + irq_rx_o => firq.uart1_rx, + irq_tx_o => firq.uart1_tx + ); + end generate; + + neorv32_uart1_inst_false: + if (IO_UART1_EN = false) generate + io_dev_rsp(IODEV_UART1) <= rsp_terminate_c; + uart1_txd_o <= '0'; + uart1_rts_o <= '1'; + cg_en.uart1 <= '0'; + firq.uart1_rx <= '0'; + firq.uart1_tx <= '0'; + end generate; + + + -- Serial Peripheral Interface (SPI) ------------------------------------------------------ + -- ------------------------------------------------------------------------------------------- + neorv32_spi_inst_true: + if (IO_SPI_EN = true) generate + neorv32_spi_inst: entity neorv32.neorv32_spi + generic map ( + IO_SPI_FIFO => IO_SPI_FIFO + ) + port map ( + clk_i => clk_i, + rstn_i => rstn_int, + bus_req_i => io_req, + bus_rsp_o => io_dev_rsp(IODEV_SPI), + clkgen_en_o => cg_en.spi, + clkgen_i => clk_gen, + spi_clk_o => spi_clk_o, + spi_dat_o => spi_dat_o, + spi_dat_i => spi_dat_i, + spi_csn_o => spi_csn_o, + irq_o => firq.spi + ); + end generate; + + neorv32_spi_inst_false: + if (IO_SPI_EN = false) generate + io_dev_rsp(IODEV_SPI) <= rsp_terminate_c; + spi_clk_o <= '0'; + spi_dat_o <= '0'; + spi_csn_o <= (others => '1'); + cg_en.spi <= '0'; + firq.spi <= '0'; + end generate; + + + -- Two-Wire Interface (TWI) --------------------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_twi_inst_true: + if (IO_TWI_EN = true) generate + neorv32_twi_inst: entity neorv32.neorv32_twi + port map ( + clk_i => clk_i, + rstn_i => rstn_int, + bus_req_i => io_req, + bus_rsp_o => io_dev_rsp(IODEV_TWI), + clkgen_en_o => cg_en.twi, + clkgen_i => clk_gen, + twi_sda_i => twi_sda_i, + twi_sda_o => twi_sda_o, + twi_scl_i => twi_scl_i, + twi_scl_o => twi_scl_o, + irq_o => firq.twi + ); + end generate; + + neorv32_twi_inst_false: + if (IO_TWI_EN = false) generate + io_dev_rsp(IODEV_TWI) <= rsp_terminate_c; + twi_sda_o <= '1'; + twi_scl_o <= '1'; + cg_en.twi <= '0'; + firq.twi <= '0'; + end generate; + + + -- Pulse-Width Modulation Controller (PWM) ------------------------------------------------ + -- ------------------------------------------------------------------------------------------- + neorv32_pwm_inst_true: + if (IO_PWM_NUM_CH > 0) generate + neorv32_pwm_inst: entity neorv32.neorv32_pwm + generic map ( + NUM_CHANNELS => IO_PWM_NUM_CH + ) + port map ( + clk_i => clk_i, + rstn_i => rstn_int, + bus_req_i => io_req, + bus_rsp_o => io_dev_rsp(IODEV_PWM), + clkgen_en_o => cg_en.pwm, + clkgen_i => clk_gen, + pwm_o => pwm_o + ); + end generate; + + neorv32_pwm_inst_false: + if (IO_PWM_NUM_CH = 0) generate + io_dev_rsp(IODEV_PWM) <= rsp_terminate_c; + cg_en.pwm <= '0'; + pwm_o <= (others => '0'); + end generate; + + + -- True Random Number Generator (TRNG) ---------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_trng_inst_true: + if (IO_TRNG_EN = true) generate + neorv32_trng_inst: entity neorv32.neorv32_trng + generic map ( + IO_TRNG_FIFO => IO_TRNG_FIFO + ) + port map ( + clk_i => clk_i, + rstn_i => rstn_int, + bus_req_i => io_req, + bus_rsp_o => io_dev_rsp(IODEV_TRNG), + irq_o => firq.trng + ); + end generate; + + neorv32_trng_inst_false: + if (IO_TRNG_EN = false) generate + io_dev_rsp(IODEV_TRNG) <= rsp_terminate_c; + firq.trng <= '0'; + end generate; + + + -- Smart LED (WS2811/WS2812) Interface (NEOLED) ------------------------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_neoled_inst_true: + if (IO_NEOLED_EN = true) generate + neorv32_neoled_inst: entity neorv32.neorv32_neoled + generic map ( + FIFO_DEPTH => IO_NEOLED_TX_FIFO + ) + port map ( + clk_i => clk_i, + rstn_i => rstn_int, + bus_req_i => io_req, + bus_rsp_o => io_dev_rsp(IODEV_NEOLED), + clkgen_en_o => cg_en.neoled, + clkgen_i => clk_gen, + irq_o => firq.neoled, + neoled_o => neoled_o + ); + end generate; + + neorv32_neoled_inst_false: + if (IO_NEOLED_EN = false) generate + io_dev_rsp(IODEV_NEOLED) <= rsp_terminate_c; + cg_en.neoled <= '0'; + firq.neoled <= '0'; + neoled_o <= '0'; + end generate; + + + -- External Interrupt Controller (XIRQ) --------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_xirq_inst_true: + if (XIRQ_NUM_CH > 0) generate + neorv32_xirq_inst: entity neorv32.neorv32_xirq + generic map ( + XIRQ_NUM_CH => XIRQ_NUM_CH, + XIRQ_TRIGGER_TYPE => XIRQ_TRIGGER_TYPE, + XIRQ_TRIGGER_POLARITY => XIRQ_TRIGGER_POLARITY + ) + port map ( + -- host access -- + clk_i => clk_i, + rstn_i => rstn_int, + bus_req_i => io_req, + bus_rsp_o => io_dev_rsp(IODEV_XIRQ), + xirq_i => xirq_i, + cpu_irq_o => firq.xirq + ); + end generate; + + neorv32_xirq_inst_false: + if (XIRQ_NUM_CH = 0) generate + io_dev_rsp(IODEV_XIRQ) <= rsp_terminate_c; + firq.xirq <= '0'; + end generate; + + + -- General Purpose Timer (GPTMR) ---------------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_gptmr_inst_true: + if (IO_GPTMR_EN = true) generate + neorv32_gptmr_inst: entity neorv32.neorv32_gptmr + port map ( + clk_i => clk_i, + rstn_i => rstn_int, + bus_req_i => io_req, + bus_rsp_o => io_dev_rsp(IODEV_GPTMR), + clkgen_en_o => cg_en.gptmr, + clkgen_i => clk_gen, + irq_o => firq.gptmr + ); + end generate; + + neorv32_gptmr_inst_false: + if (IO_GPTMR_EN = false) generate + io_dev_rsp(IODEV_GPTMR) <= rsp_terminate_c; + cg_en.gptmr <= '0'; + firq.gptmr <= '0'; + end generate; + + + -- 1-Wire Interface Controller (ONEWIRE) -------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_onewire_inst_true: + if (IO_ONEWIRE_EN = true) generate + neorv32_onewire_inst: entity neorv32.neorv32_onewire + port map ( + clk_i => clk_i, + rstn_i => rstn_int, + bus_req_i => io_req, + bus_rsp_o => io_dev_rsp(IODEV_ONEWIRE), + clkgen_en_o => cg_en.onewire, + clkgen_i => clk_gen, + onewire_i => onewire_i, + onewire_o => onewire_o, + irq_o => firq.onewire + ); + end generate; + + neorv32_onewire_inst_false: + if (IO_ONEWIRE_EN = false) generate + io_dev_rsp(IODEV_ONEWIRE) <= rsp_terminate_c; + onewire_o <= '1'; + cg_en.onewire <= '0'; + firq.onewire <= '0'; + end generate; + + + -- Stream Link Interface (SLINK) ---------------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_slink_inst_true: + if (IO_SLINK_EN = true) generate + neorv32_slink_inst: entity neorv32.neorv32_slink + generic map ( + SLINK_RX_FIFO => IO_SLINK_RX_FIFO, + SLINK_TX_FIFO => IO_SLINK_TX_FIFO + ) + port map ( + -- Host access -- + clk_i => clk_i, + rstn_i => rstn_int, + bus_req_i => io_req, + bus_rsp_o => io_dev_rsp(IODEV_SLINK), + irq_o => firq.slink, + -- RX stream interface -- + slink_rx_data_i => slink_rx_dat_i, + slink_rx_valid_i => slink_rx_val_i, + slink_rx_ready_o => slink_rx_rdy_o, + -- TX stream interface -- + slink_tx_data_o => slink_tx_dat_o, + slink_tx_valid_o => slink_tx_val_o, + slink_tx_ready_i => slink_tx_rdy_i + ); + end generate; + + neorv32_slink_inst_false: + if (IO_SLINK_EN = false) generate + io_dev_rsp(IODEV_SLINK) <= rsp_terminate_c; + firq.slink <= '0'; + slink_rx_rdy_o <= '0'; + slink_tx_dat_o <= (others => '0'); + slink_tx_val_o <= '0'; + end generate; + + + -- Cyclic Redundancy Check Unit (CRC) ----------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_crc_inst_true: + if (IO_CRC_EN = true) generate + neorv32_crc_inst: entity neorv32.neorv32_crc + port map ( + clk_i => clk_i, + rstn_i => rstn_int, + bus_req_i => io_req, + bus_rsp_o => io_dev_rsp(IODEV_CRC) + ); + end generate; + + neorv32_crc_inst_false: + if (IO_CRC_EN = false) generate + io_dev_rsp(IODEV_CRC) <= rsp_terminate_c; + end generate; + + + -- System Configuration Information Memory (SYSINFO) -------------------------------------- + -- ------------------------------------------------------------------------------------------- + neorv32_sysinfo_inst: entity neorv32.neorv32_sysinfo generic map ( - SLINK_RX_FIFO => IO_SLINK_RX_FIFO, - SLINK_TX_FIFO => IO_SLINK_TX_FIFO + -- General -- + CLOCK_FREQUENCY => CLOCK_FREQUENCY, + CUSTOM_ID => CUSTOM_ID, + INT_BOOTLOADER_EN => INT_BOOTLOADER_EN, + -- Physical memory protection (PMP) -- + PMP_NUM_REGIONS => PMP_NUM_REGIONS, + -- internal Instruction memory -- + MEM_INT_IMEM_EN => MEM_INT_IMEM_EN, + MEM_INT_IMEM_SIZE => MEM_INT_IMEM_SIZE, + -- Internal Data memory -- + MEM_INT_DMEM_EN => MEM_INT_DMEM_EN, + MEM_INT_DMEM_SIZE => MEM_INT_DMEM_SIZE, + -- Instruction cache -- + ICACHE_EN => ICACHE_EN, + ICACHE_NUM_BLOCKS => ICACHE_NUM_BLOCKS, + ICACHE_BLOCK_SIZE => ICACHE_BLOCK_SIZE, + ICACHE_ASSOCIATIVITY => ICACHE_ASSOCIATIVITY, + -- Data cache -- + DCACHE_EN => DCACHE_EN, + DCACHE_NUM_BLOCKS => DCACHE_NUM_BLOCKS, + DCACHE_BLOCK_SIZE => DCACHE_BLOCK_SIZE, + -- External memory interface -- + MEM_EXT_EN => MEM_EXT_EN, + MEM_EXT_BIG_ENDIAN => MEM_EXT_BIG_ENDIAN, + -- On-Chip Debugger -- + ON_CHIP_DEBUGGER_EN => ON_CHIP_DEBUGGER_EN, + -- Processor peripherals -- + IO_GPIO_NUM => IO_GPIO_NUM, + IO_MTIME_EN => IO_MTIME_EN, + IO_UART0_EN => IO_UART0_EN, + IO_UART1_EN => IO_UART1_EN, + IO_SPI_EN => IO_SPI_EN, + IO_SDI_EN => IO_SDI_EN, + IO_TWI_EN => IO_TWI_EN, + IO_PWM_NUM_CH => IO_PWM_NUM_CH, + IO_WDT_EN => IO_WDT_EN, + IO_TRNG_EN => IO_TRNG_EN, + IO_CFS_EN => IO_CFS_EN, + IO_NEOLED_EN => IO_NEOLED_EN, + IO_XIRQ_NUM_CH => XIRQ_NUM_CH, + IO_GPTMR_EN => IO_GPTMR_EN, + IO_XIP_EN => IO_XIP_EN, + IO_ONEWIRE_EN => IO_ONEWIRE_EN, + IO_DMA_EN => IO_DMA_EN, + IO_SLINK_EN => IO_SLINK_EN, + IO_CRC_EN => IO_CRC_EN ) port map ( - -- Host access -- - clk_i => clk_i, - rstn_i => rstn_int, - bus_req_i => io_req, - bus_rsp_o => rsp_bus(DEV_SLINK), - irq_o => firq.slink, - -- RX stream interface -- - slink_rx_data_i => slink_rx_dat_i, - slink_rx_valid_i => slink_rx_val_i, - slink_rx_ready_o => slink_rx_rdy_o, - -- TX stream interface -- - slink_tx_data_o => slink_tx_dat_o, - slink_tx_valid_o => slink_tx_val_o, - slink_tx_ready_i => slink_tx_rdy_i - ); - end generate; - - neorv32_slink_inst_false: - if (IO_SLINK_EN = false) generate - rsp_bus(DEV_SLINK) <= rsp_terminate_c; - firq.slink <= '0'; - slink_rx_rdy_o <= '0'; - slink_tx_dat_o <= (others => '0'); - slink_tx_val_o <= '0'; - end generate; - - - -- Cyclic Redundancy Check Unit (CRC) ----------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_crc_inst_true: - if (IO_CRC_EN = true) generate - neorv32_crc_inst: entity neorv32.neorv32_crc - port map ( clk_i => clk_i, - rstn_i => rstn_int, bus_req_i => io_req, - bus_rsp_o => rsp_bus(DEV_CRC) + bus_rsp_o => io_dev_rsp(IODEV_SYSINFO) ); - end generate; - - neorv32_crc_inst_false: - if (IO_CRC_EN = false) generate - rsp_bus(DEV_CRC) <= rsp_terminate_c; - end generate; - - - -- System Configuration Information Memory (SYSINFO) -------------------------------------- - -- ------------------------------------------------------------------------------------------- - neorv32_sysinfo_inst: entity neorv32.neorv32_sysinfo - generic map ( - -- General -- - CLOCK_FREQUENCY => CLOCK_FREQUENCY, - CUSTOM_ID => CUSTOM_ID, - INT_BOOTLOADER_EN => INT_BOOTLOADER_EN, - -- Physical memory protection (PMP) -- - PMP_NUM_REGIONS => PMP_NUM_REGIONS, - -- internal Instruction memory -- - MEM_INT_IMEM_EN => MEM_INT_IMEM_EN, - MEM_INT_IMEM_SIZE => MEM_INT_IMEM_SIZE, - -- Internal Data memory -- - MEM_INT_DMEM_EN => MEM_INT_DMEM_EN, - MEM_INT_DMEM_SIZE => MEM_INT_DMEM_SIZE, - -- Instruction cache -- - ICACHE_EN => ICACHE_EN, - ICACHE_NUM_BLOCKS => ICACHE_NUM_BLOCKS, - ICACHE_BLOCK_SIZE => ICACHE_BLOCK_SIZE, - ICACHE_ASSOCIATIVITY => ICACHE_ASSOCIATIVITY, - -- Data cache -- - DCACHE_EN => DCACHE_EN, - DCACHE_NUM_BLOCKS => DCACHE_NUM_BLOCKS, - DCACHE_BLOCK_SIZE => DCACHE_BLOCK_SIZE, - -- External memory interface -- - MEM_EXT_EN => MEM_EXT_EN, - MEM_EXT_BIG_ENDIAN => MEM_EXT_BIG_ENDIAN, - -- On-Chip Debugger -- - ON_CHIP_DEBUGGER_EN => ON_CHIP_DEBUGGER_EN, - -- Processor peripherals -- - IO_GPIO_NUM => IO_GPIO_NUM, - IO_MTIME_EN => IO_MTIME_EN, - IO_UART0_EN => IO_UART0_EN, - IO_UART1_EN => IO_UART1_EN, - IO_SPI_EN => IO_SPI_EN, - IO_SDI_EN => IO_SDI_EN, - IO_TWI_EN => IO_TWI_EN, - IO_PWM_NUM_CH => IO_PWM_NUM_CH, - IO_WDT_EN => IO_WDT_EN, - IO_TRNG_EN => IO_TRNG_EN, - IO_CFS_EN => IO_CFS_EN, - IO_NEOLED_EN => IO_NEOLED_EN, - IO_XIRQ_NUM_CH => XIRQ_NUM_CH, - IO_GPTMR_EN => IO_GPTMR_EN, - IO_XIP_EN => IO_XIP_EN, - IO_ONEWIRE_EN => IO_ONEWIRE_EN, - IO_DMA_EN => IO_DMA_EN, - IO_SLINK_EN => IO_SLINK_EN, - IO_CRC_EN => IO_CRC_EN - ) - port map ( - clk_i => clk_i, - bus_req_i => io_req, - bus_rsp_o => rsp_bus(DEV_SYSINFO) - ); + end generate; -- /io_system --- **************************************************************************************************************************** --- On-Chip Debugger Complex --- **************************************************************************************************************************** + -- ************************************************************************************************************************** + -- On-Chip Debugger Complex + -- ************************************************************************************************************************** neorv32_neorv32_ocd_inst_true: if (ON_CHIP_DEBUGGER_EN = true) generate @@ -1490,8 +1495,8 @@ begin dmi_rsp_data_o => dmi.rsp_data, dmi_rsp_op_o => dmi.rsp_op, -- CPU bus access -- - bus_req_i => soc_req, - bus_rsp_o => rsp_bus(DEV_OCD), + bus_req_i => io_req, + bus_rsp_o => io_dev_rsp(IODEV_OCD), -- CPU control -- cpu_ndmrstn_o => dci_ndmrstn, cpu_halt_req_o => dci_halt_req @@ -1501,10 +1506,10 @@ begin neorv32_debug_ocd_inst_false: if (ON_CHIP_DEBUGGER_EN = false) generate - rsp_bus(DEV_OCD) <= rsp_terminate_c; - jtag_tdo_o <= jtag_tdi_i; -- JTAG feed-through - dci_ndmrstn <= '1'; - dci_halt_req <= '0'; + io_dev_rsp(IODEV_OCD) <= rsp_terminate_c; + jtag_tdo_o <= jtag_tdi_i; -- JTAG feed-through + dci_ndmrstn <= '1'; + dci_halt_req <= '0'; end generate; From e8162afb721b529f782c188afc60600ee638839a Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Fri, 14 Jul 2023 22:05:51 +0200 Subject: [PATCH 06/31] :warning: [XIP-SW] hardwire XIP page --- sw/example/demo_xip/main.c | 16 +++++++--------- sw/lib/include/neorv32.h | 6 +++--- sw/lib/include/neorv32_xip.h | 10 ++++------ sw/lib/source/neorv32_xip.c | 12 ++---------- sw/svd/neorv32.svd | 11 +++-------- 5 files changed, 19 insertions(+), 36 deletions(-) diff --git a/sw/example/demo_xip/main.c b/sw/example/demo_xip/main.c index c3535cde3..00e2d9534 100644 --- a/sw/example/demo_xip/main.c +++ b/sw/example/demo_xip/main.c @@ -48,8 +48,6 @@ /**@{*/ /** UART BAUD rate */ #define BAUD_RATE 19200 -/** XIP page base address (32-bit) */ -#define XIP_PAGE_BASE_ADDR 0x40000000 /** Flash base address (32-bit) */ #define FLASH_BASE 0x00400000 /** Flash address bytes */ @@ -124,7 +122,7 @@ int main() { // configuration note neorv32_uart0_printf("Flash base address: 0x%x\n" "XIP base address: 0x%x\n" - "Flash address bytes: %u\n", (uint32_t)FLASH_BASE, (uint32_t)XIP_PAGE_BASE_ADDR, (uint32_t)FLASH_ABYTES); + "Flash address bytes: %u\n", (uint32_t)FLASH_BASE, (uint32_t)XIP_MEM_BASE_ADDRESS, (uint32_t)FLASH_ABYTES); neorv32_uart0_printf("XIP SPI clock speed: %u Hz\n\n", neorv32_cpu_get_clk_from_prsc(XIP_CLK_PRSC)/2); @@ -151,7 +149,7 @@ int main() { " Navigate to any example program folder (like 'neorv32/sw/example/hello_word').\n" " Compile the program but relocate the instruction to the beginning of the Flash:\n" " make MARCH=rv32i USER_FLAGS+=\"-Wl,--defsym,__neorv32_rom_base=0x%x\" clean_all exe\n\n", - (uint32_t)(XIP_PAGE_BASE_ADDR + FLASH_BASE)); + (uint32_t)(XIP_MEM_BASE_ADDRESS + FLASH_BASE)); neorv32_uart0_printf("Press any key when you are ready.\n\n"); neorv32_uart0_getc(); // wait for any key @@ -201,17 +199,17 @@ int main() { // configure and enable the actual XIP mode // * configure FLASH_ABYTES address bytes send to the SPI flash for addressing - // * map the XIP flash to the address space starting at XIP_PAGE_BASE_ADDR - only the 4 MSBs are relevant here + // * map the XIP flash to the address space starting at XIP_MEM_BASE_ADDRESS - only the 4 MSBs are relevant here // after calling this function the SPI flash is mapped to the processor's address space and is accessible as "normal" // memory-mapped read-only memory - if (neorv32_xip_start(FLASH_ABYTES, XIP_PAGE_BASE_ADDR)) { + if (neorv32_xip_start(FLASH_ABYTES)) { neorv32_uart0_printf("Error! XIP mode configuration error!\n"); return 1; } // since the flash is now mapped to the processor's address space we can dump its content by using normal memory accesses neorv32_uart0_printf("\nRead-back XIP flash content (first 10 words) via memory-mapped access...\n"); - uint32_t flash_base_addr = XIP_PAGE_BASE_ADDR + FLASH_BASE; + uint32_t flash_base_addr = XIP_MEM_BASE_ADDRESS + FLASH_BASE; uint32_t *xip_mem = (uint32_t*)flash_base_addr; asm volatile("fence"); uint32_t i; @@ -230,9 +228,9 @@ int main() { // ---------------------------------------------------------- // finally, jump to the XIP flash's base address we have configured to start execution **from there** - neorv32_uart0_printf("\nStarting Execute In-Place program (@0x%x)...\n", (uint32_t)(XIP_PAGE_BASE_ADDR + FLASH_BASE)); + neorv32_uart0_printf("\nStarting Execute In-Place program (@0x%x)...\n", (uint32_t)(XIP_MEM_BASE_ADDRESS + FLASH_BASE)); asm volatile("fence.i"); - asm volatile ("call %[dest]" : : [dest] "i" (XIP_PAGE_BASE_ADDR + FLASH_BASE)); + asm volatile ("call %[dest]" : : [dest] "i" (XIP_MEM_BASE_ADDRESS + FLASH_BASE)); // this should never be reached diff --git a/sw/lib/include/neorv32.h b/sw/lib/include/neorv32.h index 3621d292c..3acf4b9c5 100644 --- a/sw/lib/include/neorv32.h +++ b/sw/lib/include/neorv32.h @@ -184,13 +184,13 @@ enum NEORV32_CLOCK_PRSC_enum { /**********************************************************************//** - * @name Address space sections + * @name Main Address Space Sections **************************************************************************/ /**@{*/ +/** XIP-mapped memory base address */ +#define XIP_MEM_BASE_ADDRESS (0xE0000000U) /** bootloader memory base address */ #define BOOTLOADER_BASE_ADDRESS (0xFFFF0000U) -/** on-chip debugger complex base address */ -#define OCD_BASE_ADDRESS (0XFFFFF800U) /** peripheral/IO devices memory base address */ #define IO_BASE_ADDRESS (0xFFFFFE00U) /**@}*/ diff --git a/sw/lib/include/neorv32_xip.h b/sw/lib/include/neorv32_xip.h index 432b539af..e55ca2cca 100644 --- a/sw/lib/include/neorv32_xip.h +++ b/sw/lib/include/neorv32_xip.h @@ -73,11 +73,9 @@ enum NEORV32_XIP_CTRL_enum { XIP_CTRL_XIP_ABYTES_MSB = 12, /**< XIP control register(12) (r/w): Number XIP address bytes (minus 1), MSB */ XIP_CTRL_RD_CMD_LSB = 13, /**< XIP control register(13) (r/w): SPI flash read command, LSB */ XIP_CTRL_RD_CMD_MSB = 20, /**< XIP control register(20) (r/w): SPI flash read command, MSB */ - XIP_CTRL_PAGE_LSB = 21, /**< XIP control register(21) (r/w): XIP memory page, LSB */ - XIP_CTRL_PAGE_MSB = 24, /**< XIP control register(24) (r/w): XIP memory page, MSB */ - XIP_CTRL_SPI_CSEN = 25, /**< XIP control register(25) (r/w): SPI chip-select enable */ - XIP_CTRL_HIGHSPEED = 26, /**< XIP control register(26) (r/w): SPI high-speed mode enable (ignoring XIP_CTRL_PRSC) */ - XIP_CTRL_BURST_EN = 27, /**< XIP control register(27) (r/w): Enable XIP burst mode */ + XIP_CTRL_SPI_CSEN = 21, /**< XIP control register(21) (r/w): SPI chip-select enable */ + XIP_CTRL_HIGHSPEED = 22, /**< XIP control register(22) (r/w): SPI high-speed mode enable (ignoring XIP_CTRL_PRSC) */ + XIP_CTRL_BURST_EN = 23, /**< XIP control register(23) (r/w): Enable XIP burst mode */ XIP_CTRL_PHY_BUSY = 30, /**< XIP control register(20) (r/-): SPI PHY is busy */ XIP_CTRL_XIP_BUSY = 31 /**< XIP control register(31) (r/-): XIP access in progress */ @@ -91,7 +89,7 @@ enum NEORV32_XIP_CTRL_enum { /**@{*/ int neorv32_xip_available(void); void neorv32_xip_setup(int prsc, int cpol, int cpha, uint8_t rd_cmd); -int neorv32_xip_start(int abytes, uint32_t page_base); +int neorv32_xip_start(int abytes); void neorv32_xip_highspeed_enable(void); void neorv32_xip_highspeed_disable(void); void neorv32_xip_burst_mode_enable(void); diff --git a/sw/lib/source/neorv32_xip.c b/sw/lib/source/neorv32_xip.c index 7393ab0b8..f0132b71d 100644 --- a/sw/lib/source/neorv32_xip.c +++ b/sw/lib/source/neorv32_xip.c @@ -105,17 +105,13 @@ void neorv32_xip_setup(int prsc, int cpol, int cpha, uint8_t rd_cmd) { * Enable XIP mode (to allow CPU to _transparently_ fetch data & instructions). * * @param[in] abytes Number of address bytes used to access the SPI flash (1,2,3,4). - * @param[in] page_base XIP memory page base address (top 4 address bits, 0..15). * @return 0 if XIP configuration is OK, -1 if configuration error. **************************************************************************/ -int neorv32_xip_start(int abytes, uint32_t page_base) { +int neorv32_xip_start(int abytes) { - if ((abytes < 1) || (abytes > 4) || // invalid address bytes - (page_base & 0x0FFFFFFFUL) || // invalid granularity - (page_base >= 0xF0000000UL)) { // IO/BOOTROM page + if ((abytes < 1) || (abytes > 4)) { return -1; } - page_base >>= 28; uint32_t ctrl = NEORV32_XIP->CTRL; @@ -128,10 +124,6 @@ int neorv32_xip_start(int abytes, uint32_t page_base) { ctrl &= ~(0xF << XIP_CTRL_SPI_NBYTES_LSB); // clear old configuration ctrl |= ((uint32_t)(abytes+1+4)) << XIP_CTRL_SPI_NBYTES_LSB; // set new configuration - // XIP memory page - ctrl &= ~(0xF << XIP_CTRL_PAGE_LSB); // clear old configuration - ctrl |= ((uint32_t)(page_base & 0xf)) << XIP_CTRL_PAGE_LSB; // set new configuration - ctrl |= 1 << XIP_CTRL_XIP_EN; // enable XIP mode NEORV32_XIP->CTRL = ctrl; diff --git a/sw/svd/neorv32.svd b/sw/svd/neorv32.svd index 348761234..debedbdde 100644 --- a/sw/svd/neorv32.svd +++ b/sw/svd/neorv32.svd @@ -585,24 +585,19 @@ [20:13] SPI flash read command - - XIP_CTRL_XIP_PAGE - [24:21] - XIP memory page - XIP_CTRL_SPI_CSEN - [25:25] + [21:21] SPI chip-select enable XIP_CTRL_HIGHSPEED - [26:26] + [22:22] SPI high-speed mode enable (ignoring XIP_CTRL_PRSC) XIP_CTRL_BURST_EN - [27:27] + [23:23] Enable burst mode (for XIP accesses) From 11fe775ac5914356fd4bb4c9b96124e7569dd2a3 Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Sat, 15 Jul 2023 12:59:59 +0200 Subject: [PATCH 07/31] [CHANGELOG] add v1.8.6.3 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 77ba534ab..16081c463 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ mimpid = 0x01080200 => Version 01.08.02.00 => v1.8.2 | Date (*dd.mm.yyyy*) | Version | Comment | |:-------------------:|:-------:|:--------| +| 14.07.2023 | 1.8.6.3 | :warning: rework SoC bus system & memory map - part 1: add central bus gateways to propagate core accesses to the main address regions | | 14.07.2023 | 1.8.6.2 | minor rtl edits; [#646](https://github.com/stnolting/neorv32/pull/646) | | 30.06.2023 | 1.8.6.1 | minor rtl edits, cleanups and optimizations; [#641](https://github.com/stnolting/neorv32/pull/641) | | 27.06.2023 | [**:rocket:1.8.6**](https://github.com/stnolting/neorv32/releases/tag/v1.8.6) | **New release** | From 1ce87944c0f2420b0f370776f1b0cd330304d58c Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Sat, 15 Jul 2023 20:40:53 +0200 Subject: [PATCH 08/31] [IO devices] remove local address decoding --- rtl/core/neorv32_cfs.vhd | 47 ++---- rtl/core/neorv32_crc.vhd | 25 +-- rtl/core/neorv32_debug_dm.vhd | 64 ++++---- rtl/core/neorv32_dma.vhd | 20 +-- rtl/core/neorv32_gpio.vhd | 28 +--- rtl/core/neorv32_gptmr.vhd | 30 +--- rtl/core/neorv32_mtime.vhd | 34 +--- rtl/core/neorv32_neoled.vhd | 24 +-- rtl/core/neorv32_onewire.vhd | 32 +--- rtl/core/neorv32_package.vhd | 282 +++++++--------------------------- rtl/core/neorv32_pwm.vhd | 32 +--- rtl/core/neorv32_sdi.vhd | 30 +--- rtl/core/neorv32_slink.vhd | 24 +-- rtl/core/neorv32_spi.vhd | 32 +--- rtl/core/neorv32_sysinfo.vhd | 30 +--- rtl/core/neorv32_trng.vhd | 22 +-- rtl/core/neorv32_twi.vhd | 33 ++-- rtl/core/neorv32_uart.vhd | 40 ++--- rtl/core/neorv32_wdt.vhd | 19 +-- rtl/core/neorv32_xip.vhd | 32 +--- rtl/core/neorv32_xirq.vhd | 35 ++--- 21 files changed, 220 insertions(+), 695 deletions(-) diff --git a/rtl/core/neorv32_cfs.vhd b/rtl/core/neorv32_cfs.vhd index c8b061fe1..1ab5daf07 100644 --- a/rtl/core/neorv32_cfs.vhd +++ b/rtl/core/neorv32_cfs.vhd @@ -67,18 +67,6 @@ end neorv32_cfs; architecture neorv32_cfs_rtl of neorv32_cfs is - -- IO space: module base address -- - -- WARNING: Do not modify the CFS base address or the CFS' occupied address - -- space as this might cause access collisions with other processor modules. - constant hi_abb_c : natural := index_size_f(io_size_c)-1; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(cfs_size_c); -- low address boundary bit - - -- access control -- - signal acc_en : std_ulogic; -- module access enable - signal addr : std_ulogic_vector(31 downto 0); -- access address - signal wren : std_ulogic; -- word write enable - signal rden : std_ulogic; -- read enable - -- default CFS interface registers -- type cfs_regs_t is array (0 to 3) of std_ulogic_vector(31 downto 0); -- just implement 4 registers for this example signal cfs_reg_wr : cfs_regs_t; -- interface registers for WRITE accesses @@ -86,15 +74,6 @@ architecture neorv32_cfs_rtl of neorv32_cfs is begin - -- Access Control ------------------------------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - -- This logic is required to handle the CPU accesses - DO NOT MODIFY! - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = cfs_base_c(hi_abb_c downto lo_abb_c)) else '0'; - addr <= cfs_base_c(31 downto lo_abb_c) & bus_req_i.addr(lo_abb_c-1 downto 2) & "00"; -- word aligned - wren <= acc_en and bus_req_i.we; -- only full-word write accesses are supported - rden <= acc_en and bus_req_i.re; -- read accesses always return a full 32-bit word - - -- CFS Generics --------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- -- In it's default version the CFS provides three configuration generics: @@ -210,33 +189,33 @@ begin -- transfer/access acknowledge -- -- default: required for the CPU to check the CFS is answering a bus read OR write request; -- all read and write accesses (to any cfs_reg, even if there is no according physical register implemented) will succeed. - bus_rsp_o.ack <= rden or wren; + bus_rsp_o.ack <= bus_req_i.re or bus_req_i.we; -- write access -- - if (wren = '1') then -- full-word write access, high for one cycle if there is an actual write access - if (addr = cfs_reg0_addr_c) then -- make sure to use the internal "addr" signal for the read/write interface + if (bus_req_i.we = '1') then -- full-word write access, high for one cycle if there is an actual write access + if (bus_req_i.addr(7 downto 2) = "000000") then -- make sure to use the internal "addr" signal for the read/write interface cfs_reg_wr(0) <= bus_req_i.data; -- some physical register, for example: control register end if; - if (addr = cfs_reg1_addr_c) then + if (bus_req_i.addr(7 downto 2) = "000001") then cfs_reg_wr(1) <= bus_req_i.data; -- some physical register, for example: data in/out fifo end if; - if (addr = cfs_reg2_addr_c) then + if (bus_req_i.addr(7 downto 2) = "000010") then cfs_reg_wr(2) <= bus_req_i.data; -- some physical register, for example: command fifo end if; - if (addr = cfs_reg3_addr_c) then + if (bus_req_i.addr(7 downto 2) = "000011") then cfs_reg_wr(3) <= bus_req_i.data; -- some physical register, for example: status register end if; end if; -- read access -- bus_rsp_o.data <= (others => '0'); -- the output HAS TO BE ZERO if there is no actual read access - if (rden = '1') then -- the read access is always 32-bit wide, high for one cycle if there is an actual read access - case addr is -- make sure to use the internal 'addr' signal for the read/write interface - when cfs_reg0_addr_c => bus_rsp_o.data <= cfs_reg_rd(0); - when cfs_reg1_addr_c => bus_rsp_o.data <= cfs_reg_rd(1); - when cfs_reg2_addr_c => bus_rsp_o.data <= cfs_reg_rd(2); - when cfs_reg3_addr_c => bus_rsp_o.data <= cfs_reg_rd(3); - when others => bus_rsp_o.data <= (others => '0'); -- the remaining registers are not implemented and will read as zero + if (bus_req_i.re = '1') then -- the read access is always 32-bit wide, high for one cycle if there is an actual read access + case bus_req_i.addr(7 downto 2) is -- make sure to use the internal 'addr' signal for the read/write interface + when "000000" => bus_rsp_o.data <= cfs_reg_rd(0); + when "000001" => bus_rsp_o.data <= cfs_reg_rd(1); + when "000010" => bus_rsp_o.data <= cfs_reg_rd(2); + when "000011" => bus_rsp_o.data <= cfs_reg_rd(3); + when others => bus_rsp_o.data <= (others => '0'); -- the remaining registers are not implemented and will read as zero end case; end if; end if; diff --git a/rtl/core/neorv32_crc.vhd b/rtl/core/neorv32_crc.vhd index e41e65a69..2beee15c5 100644 --- a/rtl/core/neorv32_crc.vhd +++ b/rtl/core/neorv32_crc.vhd @@ -54,21 +54,12 @@ end neorv32_crc; architecture neorv32_crc_rtl of neorv32_crc is - -- IO space: module base address -- - constant hi_abb_c : natural := index_size_f(io_size_c)-1; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(crc_size_c); -- low address boundary bit - -- interface register addresses -- constant mode_addr_c : std_ulogic_vector(1 downto 0) := "00"; -- r/w: mode register constant poly_addr_c : std_ulogic_vector(1 downto 0) := "01"; -- r/w: polynomial register constant data_addr_c : std_ulogic_vector(1 downto 0) := "10"; -- -/w: data register constant sreg_addr_c : std_ulogic_vector(1 downto 0) := "11"; -- r/w: CRC shift register - -- access control -- - signal acc_en : std_ulogic; -- module access enable - signal wren : std_ulogic; -- word write enable - signal rden : std_ulogic; -- read enable - -- CRC core -- type crc_t is record mode : std_ulogic_vector(01 downto 0); @@ -88,10 +79,6 @@ begin -- Host Access ---------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - -- access control -- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = crc_base_c(hi_abb_c downto lo_abb_c)) else '0'; - wren <= acc_en and bus_req_i.we; - rden <= acc_en and bus_req_i.re; -- write access -- write_access: process(rstn_i, clk_i) @@ -102,7 +89,7 @@ begin crc.data <= (others => '0'); we_ack <= (others => '0'); elsif rising_edge(clk_i) then - if (wren = '1') then + if (bus_req_i.we = '1') then if (bus_req_i.addr(3 downto 2) = mode_addr_c) then -- mode select crc.mode <= bus_req_i.data(01 downto 0); end if; @@ -114,7 +101,7 @@ begin end if; end if; -- delayed write ACK -- - we_ack <= we_ack(we_ack'left-1 downto 0) & wren; + we_ack <= we_ack(we_ack'left-1 downto 0) & bus_req_i.we; end if; end process write_access; @@ -123,8 +110,8 @@ begin begin if rising_edge(clk_i) then bus_rsp_o.data <= (others => '0'); - bus_rsp_o.ack <= we_ack(we_ack'left) or rden; - if (rden = '1') then + bus_rsp_o.ack <= we_ack(we_ack'left) or bus_req_i.re; + if (bus_req_i.re = '1') then case bus_req_i.addr(3 downto 2) is when mode_addr_c => bus_rsp_o.data(01 downto 0) <= crc.mode; -- mode select when poly_addr_c => bus_rsp_o.data(31 downto 0) <= crc.poly; -- polynomial @@ -147,13 +134,13 @@ begin crc.sreg <= (others => '0'); elsif rising_edge(clk_i) then -- arbitration -- - if (wren = '1') and (bus_req_i.addr(3 downto 2) = data_addr_c) then -- writing new data + if (bus_req_i.we = '1') and (bus_req_i.addr(3 downto 2) = data_addr_c) then -- writing new data crc.cnt <= "0111"; -- start with MSB elsif (crc.cnt(3) = '0') then -- not done yet? crc.cnt <= std_ulogic_vector(unsigned(crc.cnt) - 1); end if; -- computation -- - if (wren = '1') and (bus_req_i.addr(3 downto 2) = sreg_addr_c) then -- set start value + if (bus_req_i.we = '1') and (bus_req_i.addr(3 downto 2) = sreg_addr_c) then -- set start value crc.sreg <= bus_req_i.data; elsif (crc.cnt(3) = '0') then if (crc.msb = crc.data(to_integer(unsigned(crc.cnt(2 downto 0))))) then diff --git a/rtl/core/neorv32_debug_dm.vhd b/rtl/core/neorv32_debug_dm.vhd index db0315f31..47222af08 100644 --- a/rtl/core/neorv32_debug_dm.vhd +++ b/rtl/core/neorv32_debug_dm.vhd @@ -56,6 +56,9 @@ library neorv32; use neorv32.neorv32_package.all; entity neorv32_debug_dm is + generic ( + CPU_BASE_ADDR : std_ulogic_vector(31 downto 0) + ); port ( -- global control -- clk_i : in std_ulogic; -- global clock line @@ -82,6 +85,14 @@ end neorv32_debug_dm; architecture neorv32_debug_dm_rtl of neorv32_debug_dm is + -- ********************************************************** + -- DM Layout + -- ********************************************************** + constant dm_code_base_c : std_ulogic_vector(31 downto 0) := std_ulogic_vector(unsigned(CPU_BASE_ADDR) + x"00"); -- base address of code ROM (park loop) + constant dm_pbuf_base_c : std_ulogic_vector(31 downto 0) := std_ulogic_vector(unsigned(CPU_BASE_ADDR) + x"40"); -- base address of program buffer (PBUF) + constant dm_data_base_c : std_ulogic_vector(31 downto 0) := std_ulogic_vector(unsigned(CPU_BASE_ADDR) + x"80"); -- base address of abstract data buffer (DATA) + constant dm_sreg_base_c : std_ulogic_vector(31 downto 0) := std_ulogic_vector(unsigned(CPU_BASE_ADDR) + x"C0"); -- base address of status register (SREG) + -- ********************************************************** -- DMI Access -- ********************************************************** @@ -175,10 +186,6 @@ architecture neorv32_debug_dm_rtl of neorv32_debug_dm is -- CPU Bus Interface -- ********************************************************** - -- IO space: module base address -- - constant hi_abb_c : natural := 31; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(dm_size_c); -- low address boundary bit - -- status and control register - bits -- -- for write access we only care about the actual BYTE WRITE ACCESSES! -- constant sreg_halt_ack_c : natural := 0; -- -/w: CPU is halted in debug mode and waits in park loop @@ -192,25 +199,28 @@ architecture neorv32_debug_dm_rtl of neorv32_debug_dm is -- copied manually from 'sw/ocd-firmware/neorv32_debug_mem_code.vhd' -- type code_rom_file_t is array (0 to 15) of std_ulogic_vector(31 downto 0); constant code_rom_file : code_rom_file_t := ( - 00 => x"8c0001a3", + 00 => x"fc0001a3", 01 => x"00100073", 02 => x"7b241073", - 03 => x"8c000023", - 04 => x"8c204403", + 03 => x"fc000023", + 04 => x"fc204403", 05 => x"00041c63", - 06 => x"8c104403", + 06 => x"fc104403", 07 => x"fe0408e3", - 08 => x"8c8000a3", + 08 => x"fc8000a3", 09 => x"7b202473", 10 => x"7b200073", - 11 => x"8c000123", + 11 => x"fc000123", 12 => x"7b202473", 13 => x"0000100f", - 14 => x"84000067", + 14 => x"f4000067", 15 => x"00000073" ); - -- Debug Core Interface + -- access helpers -- + signal rden, wren : std_ulogic; + + -- Debug Core Interface -- type dci_t is record halt_ack : std_ulogic; -- CPU (re-)entered HALT state (single-shot) resume_req : std_ulogic; -- DM wants the CPU to resume when set @@ -225,12 +235,6 @@ architecture neorv32_debug_dm_rtl of neorv32_debug_dm is end record; signal dci : dci_t; - -- global access control -- - signal acc_en : std_ulogic; - signal rden : std_ulogic; - signal wren : std_ulogic; - signal maddr : std_ulogic_vector(01 downto 0); - -- data buffer -- signal data_buf : std_ulogic_vector(31 downto 0); @@ -310,7 +314,7 @@ begin dm_ctrl.ldsw_progbuf(11 downto 07) <= dataaddr_c(04 downto 00); -- destination address else -- "write" = 1 -> write to GPR dm_ctrl.ldsw_progbuf <= instr_lw_c; - dm_ctrl.ldsw_progbuf(31 downto 20) <= dataaddr_c; -- source address + dm_ctrl.ldsw_progbuf(31 downto 20) <= dataaddr_c(11 downto 00); -- source address dm_ctrl.ldsw_progbuf(11 downto 07) <= dm_reg.command(4 downto 0); -- "regno" = destination register end if; else @@ -602,7 +606,7 @@ begin dmi_rsp_data_o(19 downto 17) <= (others => '0'); -- reserved (r/-) dmi_rsp_data_o(16) <= dataaccess_c; -- dataaccess (r/-): 1: data registers are memory-mapped, 0: data reisters are CSR-mapped dmi_rsp_data_o(15 downto 12) <= datasize_c; -- datasize (r/-): number data registers in memory/CSR space - dmi_rsp_data_o(11 downto 00) <= dataaddr_c; -- dataaddr (r/-): data registers base address (memory/CSR) + dmi_rsp_data_o(11 downto 00) <= dataaddr_c(11 downto 0); -- dataaddr (r/-): data registers base address (memory/CSR) -- abstract control and status -- when addr_abstractcs_c => @@ -680,10 +684,8 @@ begin -- Access Control ------------------------------------------------------------------------ -- ------------------------------------------------------------------------------------------- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = dm_base_c(hi_abb_c downto lo_abb_c)) else '0'; - maddr <= bus_req_i.addr(lo_abb_c-1 downto lo_abb_c-2); -- (sub-)module select address - rden <= acc_en and cpu_debug_i and bus_req_i.re; -- allow access only when in debug mode - wren <= acc_en and cpu_debug_i and bus_req_i.we; -- allow access only when in debug mode + rden <= cpu_debug_i and bus_req_i.re; -- allow access only when in debug mode + wren <= cpu_debug_i and bus_req_i.we; -- allow access only when in debug mode -- Write Access --------------------------------------------------------------------------- @@ -700,7 +702,7 @@ begin -- data buffer -- if (dci.data_we = '1') then -- DM write access data_buf <= dci.wdata; - elsif (maddr = "10") and (wren = '1') then -- CPU write access + elsif (bus_req_i.addr(7 downto 6) = dm_data_base_c(7 downto 6)) and (wren = '1') then -- CPU write access data_buf <= bus_req_i.data; end if; -- control and status register CPU write access -- @@ -709,7 +711,7 @@ begin dci.resume_ack <= '0'; dci.execute_ack <= '0'; dci.exception_ack <= '0'; - if (maddr = "11") and (wren = '1') then + if (bus_req_i.addr(7 downto 6) = dm_sreg_base_c(7 downto 6)) and (wren = '1') then if (bus_req_i.ben(sreg_halt_ack_c/8) = '1') then dci.halt_ack <= '1'; end if; @@ -738,14 +740,14 @@ begin bus_rsp_o.ack <= rden or wren; bus_rsp_o.data <= (others => '0'); if (rden = '1') then -- output enable - case maddr is -- module select - when "00" => -- code ROM + case bus_req_i.addr(7 downto 6) is -- module select + when "00" => -- dm_code_base_c: code ROM bus_rsp_o.data <= code_rom_file(to_integer(unsigned(bus_req_i.addr(5 downto 2)))); - when "01" => -- program buffer + when "01" => -- dm_pbuf_base_c: program buffer bus_rsp_o.data <= cpu_progbuf(to_integer(unsigned(bus_req_i.addr(3 downto 2)))); - when "10" => -- data buffer + when "10" => -- dm_data_base_c: data buffer bus_rsp_o.data <= data_buf; - when others => -- control and status register + when others => -- dm_sreg_base_c: control and status register bus_rsp_o.data(sreg_resume_req_c) <= dci.resume_req; bus_rsp_o.data(sreg_execute_req_c) <= dci.execute_req; end case; diff --git a/rtl/core/neorv32_dma.vhd b/rtl/core/neorv32_dma.vhd index 80ff9b71f..22e7b818e 100644 --- a/rtl/core/neorv32_dma.vhd +++ b/rtl/core/neorv32_dma.vhd @@ -57,15 +57,6 @@ end neorv32_dma; architecture neorv32_dma_rtl of neorv32_dma is - -- IO space: module base address -- - constant hi_abb_c : natural := index_size_f(io_size_c)-1; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(dma_size_c); -- low address boundary bit - - -- control access control -- - signal acc_en : std_ulogic; -- module access enable - signal wren : std_ulogic; -- word write enable - signal rden : std_ulogic; -- read enable - -- transfer type register bits -- constant type_num_lo_c : natural := 0; -- r/w: Number of elements to transfer, LSB constant type_num_hi_c : natural := 23; -- r/w: Number of elements to transfer, MSB @@ -140,11 +131,6 @@ begin -- Control Interface ------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - -- access control -- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = dma_base_c(hi_abb_c downto lo_abb_c)) else '0'; - wren <= acc_en and bus_req_i.we; - rden <= acc_en and bus_req_i.re; - -- write access -- write_access: process(rstn_i, clk_i) begin @@ -162,7 +148,7 @@ begin config.start <= '0'; elsif rising_edge(clk_i) then config.start <= '0'; -- default - if (wren = '1') then + if (bus_req_i.we = '1') then if (bus_req_i.addr(3 downto 2) = "00") then -- control and status register config.enable <= bus_req_i.data(ctrl_en_c); config.auto <= bus_req_i.data(ctrl_auto_c); @@ -190,9 +176,9 @@ begin read_access: process(clk_i) begin if rising_edge(clk_i) then - bus_rsp_o.ack <= rden or wren; -- bus access acknowledge + bus_rsp_o.ack <= bus_req_i.re or bus_req_i.we; -- bus access acknowledge bus_rsp_o.data <= (others => '0'); - if (rden = '1') then + if (bus_req_i.re = '1') then case bus_req_i.addr(3 downto 2) is when "00" => -- control and status register bus_rsp_o.data(ctrl_en_c) <= config.enable; diff --git a/rtl/core/neorv32_gpio.vhd b/rtl/core/neorv32_gpio.vhd index 6269857cd..4e87cce28 100644 --- a/rtl/core/neorv32_gpio.vhd +++ b/rtl/core/neorv32_gpio.vhd @@ -55,16 +55,6 @@ end neorv32_gpio; architecture neorv32_gpio_rtl of neorv32_gpio is - -- IO space: module base address -- - constant hi_abb_c : natural := index_size_f(io_size_c)-1; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(gpio_size_c); -- low address boundary bit - - -- access control -- - signal acc_en : std_ulogic; -- module access enable - signal addr : std_ulogic_vector(31 downto 0); -- access address - signal wren : std_ulogic; -- word write enable - signal rden : std_ulogic; -- read enable - -- accessible regs -- signal din, din_rd, dout, dout_rd : std_ulogic_vector(63 downto 0); @@ -79,23 +69,17 @@ begin -- Host Access ---------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - -- access control -- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = gpio_base_c(hi_abb_c downto lo_abb_c)) else '0'; - addr <= gpio_base_c(31 downto lo_abb_c) & bus_req_i.addr(lo_abb_c-1 downto 2) & "00"; -- word aligned - wren <= acc_en and bus_req_i.we; - rden <= acc_en and bus_req_i.re; - -- write access -- write_access: process(rstn_i, clk_i) begin if (rstn_i = '0') then dout <= (others => '0'); elsif rising_edge(clk_i) then - if (wren = '1') then - if (addr = gpio_out_lo_addr_c) then + if (bus_req_i.we = '1') then + if (bus_req_i.addr(3 downto 2) = "10") then dout(31 downto 00) <= bus_req_i.data; end if; - if (addr = gpio_out_hi_addr_c) then + if (bus_req_i.addr(3 downto 2) = "11") then dout(63 downto 32) <= bus_req_i.data; end if; end if; @@ -107,11 +91,11 @@ begin begin if rising_edge(clk_i) then -- bus handshake -- - bus_rsp_o.ack <= wren or rden; + bus_rsp_o.ack <= bus_req_i.we or bus_req_i.re; -- read data -- bus_rsp_o.data <= (others => '0'); - if (rden = '1') then - case addr(3 downto 2) is + if (bus_req_i.re = '1') then + case bus_req_i.addr(3 downto 2) is when "00" => bus_rsp_o.data <= din_rd(31 downto 00); when "01" => bus_rsp_o.data <= din_rd(63 downto 32); when "10" => bus_rsp_o.data <= dout_rd(31 downto 00); diff --git a/rtl/core/neorv32_gptmr.vhd b/rtl/core/neorv32_gptmr.vhd index deee5a66b..2e981e4e5 100644 --- a/rtl/core/neorv32_gptmr.vhd +++ b/rtl/core/neorv32_gptmr.vhd @@ -58,10 +58,6 @@ end neorv32_gptmr; architecture neorv32_gptmr_rtl of neorv32_gptmr is - -- IO space: module base address -- - constant hi_abb_c : natural := index_size_f(io_size_c)-1; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(gptmr_size_c); -- low address boundary bit - -- control register -- constant ctrl_en_c : natural := 0; -- r/w: timer enable constant ctrl_prsc0_c : natural := 1; -- r/w: clock prescaler select bit 0 @@ -71,12 +67,6 @@ architecture neorv32_gptmr_rtl of neorv32_gptmr is -- signal ctrl : std_ulogic_vector(4 downto 0); - -- access control -- - signal acc_en : std_ulogic; -- module access enable - signal addr : std_ulogic_vector(31 downto 0); -- access address - signal wren : std_ulogic; -- word write enable - signal rden : std_ulogic; -- read enable - -- timer core -- type timer_t is record count : std_ulogic_vector(31 downto 0); -- counter register @@ -92,12 +82,6 @@ begin -- Host Access ---------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - -- access control -- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = gptmr_base_c(hi_abb_c downto lo_abb_c)) else '0'; - addr <= gptmr_base_c(31 downto lo_abb_c) & bus_req_i.addr(lo_abb_c-1 downto 2) & "00"; -- word aligned - wren <= acc_en and bus_req_i.we; - rden <= acc_en and bus_req_i.re; - -- write access -- write_access: process(rstn_i, clk_i) begin @@ -107,18 +91,18 @@ begin timer.thres <= (others => '0'); elsif rising_edge(clk_i) then timer.cnt_we <= '0'; -- default - if (wren = '1') then - if (addr = gptmr_ctrl_addr_c) then -- control register + if (bus_req_i.we = '1') then + if (bus_req_i.addr(3 downto 2) = "00") then -- control register ctrl(ctrl_en_c) <= bus_req_i.data(ctrl_en_c); ctrl(ctrl_prsc0_c) <= bus_req_i.data(ctrl_prsc0_c); ctrl(ctrl_prsc1_c) <= bus_req_i.data(ctrl_prsc1_c); ctrl(ctrl_prsc2_c) <= bus_req_i.data(ctrl_prsc2_c); ctrl(ctrl_mode_c) <= bus_req_i.data(ctrl_mode_c); end if; - if (addr = gptmr_thres_addr_c) then -- threshold register + if (bus_req_i.addr(3 downto 2) = "01") then -- threshold register timer.thres <= bus_req_i.data; end if; - if (addr = gptmr_count_addr_c) then -- counter register + if (bus_req_i.addr(3 downto 2) = "10") then -- counter register timer.cnt_we <= '1'; end if; end if; @@ -129,10 +113,10 @@ begin read_access: process(clk_i) begin if rising_edge(clk_i) then - bus_rsp_o.ack <= rden or wren; -- bus access acknowledge + bus_rsp_o.ack <= bus_req_i.re or bus_req_i.we; -- bus access acknowledge bus_rsp_o.data <= (others => '0'); - if (rden = '1') then - case addr(3 downto 2) is + if (bus_req_i.re = '1') then + case bus_req_i.addr(3 downto 2) is when "00" => -- control register bus_rsp_o.data(ctrl_en_c) <= ctrl(ctrl_en_c); bus_rsp_o.data(ctrl_prsc0_c) <= ctrl(ctrl_prsc0_c); diff --git a/rtl/core/neorv32_mtime.vhd b/rtl/core/neorv32_mtime.vhd index 76084caf1..758318e6f 100644 --- a/rtl/core/neorv32_mtime.vhd +++ b/rtl/core/neorv32_mtime.vhd @@ -54,16 +54,6 @@ end neorv32_mtime; architecture neorv32_mtime_rtl of neorv32_mtime is - -- IO space: module base address -- - constant hi_abb_c : natural := index_size_f(io_size_c)-1; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(mtime_size_c); -- low address boundary bit - - -- access control -- - signal acc_en : std_ulogic; -- module access enable - signal addr : std_ulogic_vector(31 downto 0); -- access address - signal wren : std_ulogic; -- module access enable - signal rden : std_ulogic; -- read enable - -- time write access buffer -- signal mtime_lo_we : std_ulogic; signal mtime_hi_we : std_ulogic; @@ -84,14 +74,6 @@ architecture neorv32_mtime_rtl of neorv32_mtime is begin - -- Access Control ------------------------------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = mtime_base_c(hi_abb_c downto lo_abb_c)) else '0'; - addr <= mtime_base_c(31 downto lo_abb_c) & bus_req_i.addr(lo_abb_c-1 downto 2) & "00"; -- word aligned - wren <= acc_en and bus_req_i.we; - rden <= acc_en and bus_req_i.re; - - -- Write Access --------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- write_access: process(rstn_i, clk_i) @@ -106,23 +88,23 @@ begin mtime_hi <= (others => '0'); elsif rising_edge(clk_i) then -- mtimecmp -- - if (wren = '1') then - if (addr = mtime_cmp_lo_addr_c) then + if (bus_req_i.we = '1') then + if (bus_req_i.addr(3 downto 2) = "10") then mtimecmp_lo <= bus_req_i.data; end if; - if (addr = mtime_cmp_hi_addr_c) then + if (bus_req_i.addr(3 downto 2) = "11") then mtimecmp_hi <= bus_req_i.data; end if; end if; -- mtime write access buffer -- mtime_lo_we <= '0'; - if (wren = '1') and (addr = mtime_time_lo_addr_c) then + if (bus_req_i.we = '1') and (bus_req_i.addr(3 downto 2) = "00") then mtime_lo_we <= '1'; end if; -- mtime_hi_we <= '0'; - if (wren = '1') and (addr = mtime_time_hi_addr_c) then + if (bus_req_i.we = '1') and (bus_req_i.addr(3 downto 2) = "01") then mtime_hi_we <= '1'; end if; @@ -152,10 +134,10 @@ begin read_access: process(clk_i) begin if rising_edge(clk_i) then - bus_rsp_o.ack <= rden or wren; -- bus handshake + bus_rsp_o.ack <= bus_req_i.re or bus_req_i.we; -- bus handshake bus_rsp_o.data <= (others => '0'); -- default - if (rden = '1') then - case addr(3 downto 2) is + if (bus_req_i.re = '1') then + case bus_req_i.addr(3 downto 2) is when "00" => bus_rsp_o.data <= mtime_lo; when "01" => bus_rsp_o.data <= mtime_hi; when "10" => bus_rsp_o.data <= mtimecmp_lo; diff --git a/rtl/core/neorv32_neoled.vhd b/rtl/core/neorv32_neoled.vhd index 9ccb96054..037c037eb 100644 --- a/rtl/core/neorv32_neoled.vhd +++ b/rtl/core/neorv32_neoled.vhd @@ -71,16 +71,6 @@ end neorv32_neoled; architecture neorv32_neoled_rtl of neorv32_neoled is - -- IO space: module base address -- - constant hi_abb_c : natural := index_size_f(io_size_c)-1; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(neoled_size_c); -- low address boundary bit - - -- access control -- - signal acc_en : std_ulogic; -- module access enable - signal addr : std_ulogic_vector(31 downto 0); -- access address - signal wren : std_ulogic; -- word write enable - signal rden : std_ulogic; -- read enable - -- Control register bits -- constant ctrl_en_c : natural := 0; -- r/w: module enable constant ctrl_mode_c : natural := 1; -- r/w: 0 = 24-bit RGB mode, 1 = 32-bit RGBW mode @@ -175,12 +165,6 @@ begin -- Host Access ---------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - -- access control -- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = neoled_base_c(hi_abb_c downto lo_abb_c)) else '0'; - addr <= neoled_base_c(31 downto lo_abb_c) & bus_req_i.addr(lo_abb_c-1 downto 2) & "00"; -- word aligned - wren <= acc_en and bus_req_i.we; - rden <= acc_en and bus_req_i.re; - -- write access -- write_access: process(rstn_i, clk_i) begin @@ -194,7 +178,7 @@ begin ctrl.t0_high <= (others => '0'); ctrl.t1_high <= (others => '0'); elsif rising_edge(clk_i) then - if (wren = '1') and (addr = neoled_ctrl_addr_c) then + if (bus_req_i.we = '1') and (bus_req_i.addr(2) = '0') then ctrl.enable <= bus_req_i.data(ctrl_en_c); ctrl.mode <= bus_req_i.data(ctrl_mode_c); ctrl.strobe <= bus_req_i.data(ctrl_strobe_c); @@ -211,9 +195,9 @@ begin read_access: process(clk_i) begin if rising_edge(clk_i) then - bus_rsp_o.ack <= wren or rden; -- access acknowledge + bus_rsp_o.ack <= bus_req_i.we or bus_req_i.re; -- access acknowledge bus_rsp_o.data <= (others => '0'); - if (rden = '1') then -- and (addr = neoled_ctrl_addr_c) then + if (bus_req_i.re = '1') then bus_rsp_o.data(ctrl_en_c) <= ctrl.enable; bus_rsp_o.data(ctrl_mode_c) <= ctrl.mode; bus_rsp_o.data(ctrl_strobe_c) <= ctrl.strobe; @@ -265,7 +249,7 @@ begin ); tx_fifo.re <= '1' when (serial.state = "100") else '0'; - tx_fifo.we <= '1' when (wren = '1') and (addr = neoled_data_addr_c) else '0'; + tx_fifo.we <= '1' when (bus_req_i.we = '1') and (bus_req_i.addr(2) = '1') else '0'; tx_fifo.wdata <= ctrl.strobe & ctrl.mode & bus_req_i.data; tx_fifo.clear <= not ctrl.enable; diff --git a/rtl/core/neorv32_onewire.vhd b/rtl/core/neorv32_onewire.vhd index 1a9ec37db..88c0fc175 100644 --- a/rtl/core/neorv32_onewire.vhd +++ b/rtl/core/neorv32_onewire.vhd @@ -74,10 +74,6 @@ architecture neorv32_onewire_rtl of neorv32_onewire is constant t_presence_end_c : unsigned(6 downto 0) := to_unsigned(96, 7); -- t6 -- -> see data sheet for more information about the t* timing values -- - -- IO space: module base address -- - constant hi_abb_c : natural := index_size_f(io_size_c)-1; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(twi_size_c); -- low address boundary bit - -- control register -- constant ctrl_en_c : natural := 0; -- r/w: TWI enable constant ctrl_prsc0_c : natural := 1; -- r/w: prescaler select bit 0 @@ -98,12 +94,6 @@ architecture neorv32_onewire_rtl of neorv32_onewire is constant ctrl_presence_c : natural := 30; -- r/-: bus presence detected constant ctrl_busy_c : natural := 31; -- r/-: set while operation in progress - -- access control -- - signal acc_en : std_ulogic; -- module access enable - signal addr : std_ulogic_vector(31 downto 0); -- access address - signal wren : std_ulogic; -- word write enable - signal rden : std_ulogic; -- read enable - -- control register -- type ctrl_t is record enable : std_ulogic; @@ -146,12 +136,6 @@ begin -- Write Access --------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - -- access control -- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = onewire_base_c(hi_abb_c downto lo_abb_c)) else '0'; - addr <= onewire_base_c(31 downto lo_abb_c) & bus_req_i.addr(lo_abb_c-1 downto 2) & "00"; -- word aligned - wren <= acc_en and bus_req_i.we; - rden <= acc_en and bus_req_i.re; - -- write access -- write_access: process(rstn_i, clk_i) begin @@ -165,21 +149,21 @@ begin tx_data <= (others => '0'); elsif rising_edge(clk_i) then -- write access -- - if (wren = '1') then + if (bus_req_i.we = '1') then -- control register -- - if (addr = onewire_ctrl_addr_c) then + if (bus_req_i.addr(2) = '0') then ctrl.enable <= bus_req_i.data(ctrl_en_c); ctrl.clk_prsc <= bus_req_i.data(ctrl_prsc1_c downto ctrl_prsc0_c); ctrl.clk_div <= bus_req_i.data(ctrl_clkdiv7_c downto ctrl_clkdiv0_c); end if; -- data register -- - if (addr = onewire_data_addr_c) then + if (bus_req_i.addr(2) = '1') then tx_data <= bus_req_i.data(7 downto 0); end if; end if; -- operation triggers -- - if (wren = '1') and (addr = onewire_ctrl_addr_c) then -- set by host + if (bus_req_i.we = '1') and (bus_req_i.addr(2) = '0') then -- set by host ctrl.trig_rst <= bus_req_i.data(ctrl_trig_rst_c); ctrl.trig_bit <= bus_req_i.data(ctrl_trig_bit_c); ctrl.trig_byte <= bus_req_i.data(ctrl_trig_byte_c); @@ -195,11 +179,11 @@ begin read_access: process(clk_i) begin if rising_edge(clk_i) then - bus_rsp_o.ack <= rden or wren; -- bus handshake + bus_rsp_o.ack <= bus_req_i.re or bus_req_i.we; -- bus handshake bus_rsp_o.data <= (others => '0'); - if (rden = '1') then + if (bus_req_i.re = '1') then -- control register -- - if (addr = onewire_ctrl_addr_c) then + if (bus_req_i.addr(2) = '0') then bus_rsp_o.data(ctrl_en_c) <= ctrl.enable; bus_rsp_o.data(ctrl_prsc1_c downto ctrl_prsc0_c) <= ctrl.clk_prsc; bus_rsp_o.data(ctrl_clkdiv7_c downto ctrl_clkdiv0_c) <= ctrl.clk_div; @@ -208,7 +192,7 @@ begin bus_rsp_o.data(ctrl_presence_c) <= serial.presence; bus_rsp_o.data(ctrl_busy_c) <= serial.busy; -- data register -- - else -- if (addr = onewire_data_addr_c) then + else bus_rsp_o.data(7 downto 0) <= serial.sreg; end if; end if; diff --git a/rtl/core/neorv32_package.vhd b/rtl/core/neorv32_package.vhd index 7e078e54b..5246d58c8 100644 --- a/rtl/core/neorv32_package.vhd +++ b/rtl/core/neorv32_package.vhd @@ -44,10 +44,6 @@ package neorv32_package is -- Architecture Configuration ------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - -- address space -- - constant ispace_base_c : std_ulogic_vector(31 downto 0) := x"00000000"; -- default instruction memory address space base address - constant dspace_base_c : std_ulogic_vector(31 downto 0) := x"80000000"; -- default data memory address space base address - -- if register x0 is implemented as a *physical register* it has to be explicitly set to zero by the CPU hardware -- constant reset_x0_c : boolean := true; -- has to be 'true' for the default register file rtl description (BRAM-based) @@ -60,7 +56,7 @@ package neorv32_package is -- Architecture Constants ----------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01080603"; -- hardware version + constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01080604"; -- hardware version constant archid_c : natural := 19; -- official RISC-V architecture ID constant XLEN : natural := 32; -- native data path width, do not change! @@ -82,227 +78,57 @@ package neorv32_package is -- Processor Address Space Layout -- **************************************************************************************************************************** - -- Internal Instruction Memory (IMEM) and Date Memory (DMEM) -- - --> internal data/instruction memory sizes are configured via top's generics - constant imem_base_c : std_ulogic_vector(31 downto 0) := ispace_base_c; -- internal instruction memory base address - constant dmem_base_c : std_ulogic_vector(31 downto 0) := dspace_base_c; -- internal data memory base address - - -- !!! IMPORTANT: The base address of each component/module has to be aligned to the !!! - -- !!! total size of the module's occupied address space. The occupied address space !!! - -- !!! has to be a power of two (minimum 4 bytes). Address spaces must not overlap. !!! - - -- Internal Bootloader ROM -- - -- Actual bootloader size is determined during runtime via the length of the bootloader initialization image - constant boot_rom_base_c : std_ulogic_vector(31 downto 0) := x"ffff0000"; -- bootloader base address, fixed! - constant boot_rom_max_size_c : natural := 32*1024; -- max module's address space size in bytes, fixed! - - -- On-Chip Debugger: Debug Module -- - constant dm_base_c : std_ulogic_vector(31 downto 0) := x"fffff800"; -- base address, fixed! - constant dm_size_c : natural := 4*16*4; -- debug ROM address space size in bytes, fixed - constant dm_code_base_c : std_ulogic_vector(31 downto 0) := x"fffff800"; - constant dm_pbuf_base_c : std_ulogic_vector(31 downto 0) := x"fffff840"; - constant dm_data_base_c : std_ulogic_vector(31 downto 0) := x"fffff880"; - constant dm_sreg_base_c : std_ulogic_vector(31 downto 0) := x"fffff8c0"; - -- park loop entry points - these need to be sync with the OCD firmware (sw/ocd-firmware/park_loop.S) -- - constant dm_exc_entry_c : std_ulogic_vector(31 downto 0) := std_ulogic_vector(unsigned(dm_code_base_c) + 0); -- entry point for exceptions - constant dm_park_entry_c : std_ulogic_vector(31 downto 0) := std_ulogic_vector(unsigned(dm_code_base_c) + 8); -- normal entry point - - -- IO: Internal Peripheral Devices ("IO") Area -- - -- Control register(s) (including the device-enable flag) should be located at the base address of each device - constant io_base_c : std_ulogic_vector(31 downto 0) := x"fffffe00"; - constant io_size_c : natural := 512; -- IO address space size in bytes, fixed! - - -- Custom Functions Subsystem (CFS) -- - constant cfs_base_c : std_ulogic_vector(31 downto 0) := x"fffffe00"; -- base address - constant cfs_size_c : natural := 64*4; -- module's address space in bytes - constant cfs_reg0_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe00"; - constant cfs_reg1_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe04"; - constant cfs_reg2_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe08"; - constant cfs_reg3_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe0c"; - constant cfs_reg4_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe10"; - constant cfs_reg5_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe14"; - constant cfs_reg6_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe18"; - constant cfs_reg7_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe1c"; - constant cfs_reg8_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe20"; - constant cfs_reg9_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe24"; - constant cfs_reg10_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe28"; - constant cfs_reg11_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe2c"; - constant cfs_reg12_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe30"; - constant cfs_reg13_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe34"; - constant cfs_reg14_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe38"; - constant cfs_reg15_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe3c"; - constant cfs_reg16_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe40"; - constant cfs_reg17_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe44"; - constant cfs_reg18_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe48"; - constant cfs_reg19_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe4c"; - constant cfs_reg20_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe50"; - constant cfs_reg21_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe54"; - constant cfs_reg22_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe58"; - constant cfs_reg23_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe5c"; - constant cfs_reg24_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe60"; - constant cfs_reg25_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe64"; - constant cfs_reg26_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe68"; - constant cfs_reg27_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe6c"; - constant cfs_reg28_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe70"; - constant cfs_reg29_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe74"; - constant cfs_reg30_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe78"; - constant cfs_reg31_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe7c"; - constant cfs_reg32_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe80"; - constant cfs_reg33_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe84"; - constant cfs_reg34_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe88"; - constant cfs_reg35_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe8c"; - constant cfs_reg36_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe90"; - constant cfs_reg37_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe94"; - constant cfs_reg38_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe98"; - constant cfs_reg39_addr_c : std_ulogic_vector(31 downto 0) := x"fffffe9c"; - constant cfs_reg40_addr_c : std_ulogic_vector(31 downto 0) := x"fffffea0"; - constant cfs_reg41_addr_c : std_ulogic_vector(31 downto 0) := x"fffffea4"; - constant cfs_reg42_addr_c : std_ulogic_vector(31 downto 0) := x"fffffea8"; - constant cfs_reg43_addr_c : std_ulogic_vector(31 downto 0) := x"fffffeac"; - constant cfs_reg44_addr_c : std_ulogic_vector(31 downto 0) := x"fffffeb0"; - constant cfs_reg45_addr_c : std_ulogic_vector(31 downto 0) := x"fffffeb4"; - constant cfs_reg46_addr_c : std_ulogic_vector(31 downto 0) := x"fffffeb8"; - constant cfs_reg47_addr_c : std_ulogic_vector(31 downto 0) := x"fffffebc"; - constant cfs_reg48_addr_c : std_ulogic_vector(31 downto 0) := x"fffffec0"; - constant cfs_reg49_addr_c : std_ulogic_vector(31 downto 0) := x"fffffec4"; - constant cfs_reg50_addr_c : std_ulogic_vector(31 downto 0) := x"fffffec8"; - constant cfs_reg51_addr_c : std_ulogic_vector(31 downto 0) := x"fffffecc"; - constant cfs_reg52_addr_c : std_ulogic_vector(31 downto 0) := x"fffffed0"; - constant cfs_reg53_addr_c : std_ulogic_vector(31 downto 0) := x"fffffed4"; - constant cfs_reg54_addr_c : std_ulogic_vector(31 downto 0) := x"fffffed8"; - constant cfs_reg55_addr_c : std_ulogic_vector(31 downto 0) := x"fffffedc"; - constant cfs_reg56_addr_c : std_ulogic_vector(31 downto 0) := x"fffffee0"; - constant cfs_reg57_addr_c : std_ulogic_vector(31 downto 0) := x"fffffee4"; - constant cfs_reg58_addr_c : std_ulogic_vector(31 downto 0) := x"fffffee8"; - constant cfs_reg59_addr_c : std_ulogic_vector(31 downto 0) := x"fffffeec"; - constant cfs_reg60_addr_c : std_ulogic_vector(31 downto 0) := x"fffffef0"; - constant cfs_reg61_addr_c : std_ulogic_vector(31 downto 0) := x"fffffef4"; - constant cfs_reg62_addr_c : std_ulogic_vector(31 downto 0) := x"fffffef8"; - constant cfs_reg63_addr_c : std_ulogic_vector(31 downto 0) := x"fffffefc"; - - -- Serial Data Interface (SDI) -- - constant sdi_base_c : std_ulogic_vector(31 downto 0) := x"ffffff00"; -- base address - constant sdi_size_c : natural := 2*4; -- module's address space size in bytes - constant sdi_ctrl_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff00"; - constant sdi_rtx_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff04"; - - -- Stream Link Interface (SLINK) -- - constant slink_base_c : std_ulogic_vector(31 downto 0) := x"ffffff08"; -- base address - constant slink_size_c : natural := 2*4; -- module's address space size in bytes - - -- Direct Memory Access Controller (DMA) -- - constant dma_base_c : std_ulogic_vector(31 downto 0) := x"ffffff10"; -- base address - constant dma_size_c : natural := 4*4; -- module's address space size in bytes - - -- Cyclic Redundancy Check Unit (CRC) -- - constant crc_base_c : std_ulogic_vector(31 downto 0) := x"ffffff20"; -- base address - constant crc_size_c : natural := 4*4; -- module's address space size in bytes - - -- reserved -- ---constant reserved_base_c : std_ulogic_vector(31 downto 0) := x"ffffff30"; -- base address ---constant reserved_size_c : natural := 4*4; -- module's address space size in bytes - - -- Execute In-Place Module (XIP) -- - constant xip_base_c : std_ulogic_vector(31 downto 0) := x"ffffff40"; -- base address - constant xip_size_c : natural := 4*4; -- module's address space size in bytes - constant xip_ctrl_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff40"; ---constant xip_reserved_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff44"; - constant xip_data_lo_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff48"; - constant xip_data_hi_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff4C"; - - -- Pulse-Width Modulation Controller (PWM) -- - constant pwm_base_c : std_ulogic_vector(31 downto 0) := x"ffffff50"; -- base address - constant pwm_size_c : natural := 4*4; -- module's address space size in bytes - constant pwm_ctrl_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff50"; - constant pwm_dc0_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff54"; - constant pwm_dc1_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff58"; - constant pwm_dc2_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff5c"; - - -- General Purpose Timer (GPTMR) -- - constant gptmr_base_c : std_ulogic_vector(31 downto 0) := x"ffffff60"; -- base address - constant gptmr_size_c : natural := 4*4; -- module's address space size in bytes - constant gptmr_ctrl_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff60"; - constant gptmr_thres_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff64"; - constant gptmr_count_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff68"; ---constant gptmr_reserve_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff6c"; - - -- 1-Wire Interface Controller (ONEWIRE) -- - constant onewire_base_c : std_ulogic_vector(31 downto 0) := x"ffffff70"; -- base address - constant onewire_size_c : natural := 2*4; -- module's address space size in bytes - constant onewire_ctrl_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff70"; - constant onewire_data_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff74"; - ----- reserved -- ---constant reserved_base_c : std_ulogic_vector(31 downto 0) := x"ffffff78"; -- base address ---constant reserved_size_c : natural := 2*4; -- module's address space size in bytes - - -- External Interrupt Controller (XIRQ) -- - constant xirq_base_c : std_ulogic_vector(31 downto 0) := x"ffffff80"; -- base address - constant xirq_size_c : natural := 4*4; -- module's address space size in bytes - constant xirq_enable_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff80"; - constant xirq_pending_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff84"; - constant xirq_source_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff88"; ---constant xirq_reserved_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff8c"; - - -- Machine System Timer (MTIME) -- - constant mtime_base_c : std_ulogic_vector(31 downto 0) := x"ffffff90"; -- base address - constant mtime_size_c : natural := 4*4; -- module's address space size in bytes - constant mtime_time_lo_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff90"; - constant mtime_time_hi_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff94"; - constant mtime_cmp_lo_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff98"; - constant mtime_cmp_hi_addr_c : std_ulogic_vector(31 downto 0) := x"ffffff9c"; - - -- Primary Universal Asynchronous Receiver/Transmitter (UART0) -- - constant uart0_base_c : std_ulogic_vector(31 downto 0) := x"ffffffa0"; -- base address - constant uart0_size_c : natural := 2*4; -- module's address space size in bytes - constant uart0_ctrl_addr_c : std_ulogic_vector(31 downto 0) := x"ffffffa0"; - constant uart0_rtx_addr_c : std_ulogic_vector(31 downto 0) := x"ffffffa4"; - - -- Serial Peripheral Interface (SPI) -- - constant spi_base_c : std_ulogic_vector(31 downto 0) := x"ffffffa8"; -- base address - constant spi_size_c : natural := 2*4; -- module's address space size in bytes - constant spi_ctrl_addr_c : std_ulogic_vector(31 downto 0) := x"ffffffa8"; - constant spi_rtx_addr_c : std_ulogic_vector(31 downto 0) := x"ffffffac"; - - -- Two Wire Interface (TWI) -- - constant twi_base_c : std_ulogic_vector(31 downto 0) := x"ffffffb0"; -- base address - constant twi_size_c : natural := 2*4; -- module's address space size in bytes - constant twi_ctrl_addr_c : std_ulogic_vector(31 downto 0) := x"ffffffb0"; - constant twi_rtx_addr_c : std_ulogic_vector(31 downto 0) := x"ffffffb4"; - - -- True Random Number Generator (TRNG) -- - constant trng_base_c : std_ulogic_vector(31 downto 0) := x"ffffffb8"; -- base address - constant trng_size_c : natural := 1*4; -- module's address space size in bytes - constant trng_ctrl_addr_c : std_ulogic_vector(31 downto 0) := x"ffffffb8"; - - -- Watch Dog Timer (WDT) -- - constant wdt_base_c : std_ulogic_vector(31 downto 0) := x"ffffffbc"; -- base address - constant wdt_size_c : natural := 1*4; -- module's address space size in bytes - constant wdt_ctrl_addr_c : std_ulogic_vector(31 downto 0) := x"ffffffbc"; - - -- General Purpose Input/Output Controller (GPIO) -- - constant gpio_base_c : std_ulogic_vector(31 downto 0) := x"ffffffc0"; -- base address - constant gpio_size_c : natural := 4*4; -- module's address space size in bytes - constant gpio_in_lo_addr_c : std_ulogic_vector(31 downto 0) := x"ffffffc0"; - constant gpio_in_hi_addr_c : std_ulogic_vector(31 downto 0) := x"ffffffc4"; - constant gpio_out_lo_addr_c : std_ulogic_vector(31 downto 0) := x"ffffffc8"; - constant gpio_out_hi_addr_c : std_ulogic_vector(31 downto 0) := x"ffffffcc"; - - -- Secondary Universal Asynchronous Receiver/Transmitter (UART1) -- - constant uart1_base_c : std_ulogic_vector(31 downto 0) := x"ffffffd0"; -- base address - constant uart1_size_c : natural := 2*4; -- module's address space size in bytes - constant uart1_ctrl_addr_c : std_ulogic_vector(31 downto 0) := x"ffffffd0"; - constant uart1_rtx_addr_c : std_ulogic_vector(31 downto 0) := x"ffffffd4"; - - -- Smart LED (WS2811/WS2812) Interface (NEOLED) -- - constant neoled_base_c : std_ulogic_vector(31 downto 0) := x"ffffffd8"; -- base address - constant neoled_size_c : natural := 2*4; -- module's address space size in bytes - constant neoled_ctrl_addr_c : std_ulogic_vector(31 downto 0) := x"ffffffd8"; - constant neoled_data_addr_c : std_ulogic_vector(31 downto 0) := x"ffffffdc"; - - -- System Information Memory (SYSINFO) -- - constant sysinfo_base_c : std_ulogic_vector(31 downto 0) := x"ffffffe0"; -- base address - constant sysinfo_size_c : natural := 8*4; -- module's address space size in bytes + -- Main Memory Sections Address Map --- + constant mem_ispace_base_c : std_ulogic_vector(31 downto 0) := x"00000000"; -- IMEM size via generic + constant mem_dspace_base_c : std_ulogic_vector(31 downto 0) := x"80000000"; -- DMEM size via generic + constant mem_xip_base_c : std_ulogic_vector(31 downto 0) := x"e0000000"; -- page (4MSBs) only! + constant mem_xip_size_c : natural := 256*1024*1024; + constant mem_boot_base_c : std_ulogic_vector(31 downto 0) := x"ffffc000"; + constant mem_boot_size_c : natural := 8*1024; + constant mem_io_base_c : std_ulogic_vector(31 downto 0) := x"ffffe000"; + constant mem_io_size_c : natural := 8*1024; + + -- Start of uncached memory access (page / 4MSBs only) -- + constant uncached_begin_c : std_ulogic_vector(31 downto 0) := x"f0000000"; + + -- IO Address Map -- + constant iodev_size_c : natural := 256; -- size of a single IO device (bytes) +--constant base_res_cfs_c : std_ulogic_vector(31 downto 0) := x"ffffe000"; -- reserved +--constant base_res_cfs_c : std_ulogic_vector(31 downto 0) := x"ffffe100"; -- reserved +--constant base_res_cfs_c : std_ulogic_vector(31 downto 0) := x"ffffe200"; -- reserved +--constant base_res_cfs_c : std_ulogic_vector(31 downto 0) := x"ffffe300"; -- reserved +--constant base_res_cfs_c : std_ulogic_vector(31 downto 0) := x"ffffe400"; -- reserved +--constant base_res_cfs_c : std_ulogic_vector(31 downto 0) := x"ffffe500"; -- reserved +--constant base_res_cfs_c : std_ulogic_vector(31 downto 0) := x"ffffe600"; -- reserved +--constant base_res_cfs_c : std_ulogic_vector(31 downto 0) := x"ffffe700"; -- reserved +--constant base_res_cfs_c : std_ulogic_vector(31 downto 0) := x"ffffe800"; -- reserved +--constant base_res_cfs_c : std_ulogic_vector(31 downto 0) := x"ffffe900"; -- reserved +--constant base_res_cfs_c : std_ulogic_vector(31 downto 0) := x"ffffea00"; -- reserved + constant base_io_cfs_c : std_ulogic_vector(31 downto 0) := x"ffffeb00"; + constant base_io_slink_c : std_ulogic_vector(31 downto 0) := x"ffffec00"; + constant base_io_dma_c : std_ulogic_vector(31 downto 0) := x"ffffed00"; + constant base_io_crc_c : std_ulogic_vector(31 downto 0) := x"ffffee00"; + constant base_io_xip_c : std_ulogic_vector(31 downto 0) := x"ffffef00"; + constant base_io_pwm_c : std_ulogic_vector(31 downto 0) := x"fffff000"; + constant base_io_gptmr_c : std_ulogic_vector(31 downto 0) := x"fffff100"; + constant base_io_onewire_c : std_ulogic_vector(31 downto 0) := x"fffff200"; + constant base_io_xirq_c : std_ulogic_vector(31 downto 0) := x"fffff300"; + constant base_io_mtime_c : std_ulogic_vector(31 downto 0) := x"fffff400"; + constant base_io_uart0_c : std_ulogic_vector(31 downto 0) := x"fffff500"; + constant base_io_uart1_c : std_ulogic_vector(31 downto 0) := x"fffff600"; + constant base_io_sdi_c : std_ulogic_vector(31 downto 0) := x"fffff700"; + constant base_io_spi_c : std_ulogic_vector(31 downto 0) := x"fffff800"; + constant base_io_twi_c : std_ulogic_vector(31 downto 0) := x"fffff900"; + constant base_io_trng_c : std_ulogic_vector(31 downto 0) := x"fffffa00"; + constant base_io_wdt_c : std_ulogic_vector(31 downto 0) := x"fffffb00"; + constant base_io_gpio_c : std_ulogic_vector(31 downto 0) := x"fffffc00"; + constant base_io_neoled_c : std_ulogic_vector(31 downto 0) := x"fffffd00"; + constant base_io_sysinfo_c : std_ulogic_vector(31 downto 0) := x"fffffe00"; + constant base_io_dm_c : std_ulogic_vector(31 downto 0) := x"ffffff00"; + + -- OCD Debug Module Entry Points -- + constant dm_exc_entry_c : std_ulogic_vector(31 downto 0) := x"ffffff00"; -- = base_io_dm_c + 0, exceptions entry point + constant dm_park_entry_c : std_ulogic_vector(31 downto 0) := x"ffffff08"; -- = base_io_dm_c + 8, normal entry point -- **************************************************************************************************************************** -- SoC Definitions @@ -361,6 +187,10 @@ package neorv32_package is err => '0' ); + -- pre-constrained array types -- + type bus_req_array_t is array (20 downto 0) of bus_req_t; + type bus_rsp_array_t is array (20 downto 0) of bus_rsp_t; + -- **************************************************************************************************************************** -- RISC-V ISA Definitions diff --git a/rtl/core/neorv32_pwm.vhd b/rtl/core/neorv32_pwm.vhd index 7719091fe..947fd04bb 100644 --- a/rtl/core/neorv32_pwm.vhd +++ b/rtl/core/neorv32_pwm.vhd @@ -59,22 +59,12 @@ end neorv32_pwm; architecture neorv32_pwm_rtl of neorv32_pwm is - -- IO space: module base address -- - constant hi_abb_c : natural := index_size_f(io_size_c)-1; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(pwm_size_c); -- low address boundary bit - -- Control register bits -- constant ctrl_enable_c : natural := 0; -- r/w: PWM enable constant ctrl_prsc0_bit_c : natural := 1; -- r/w: prescaler select bit 0 constant ctrl_prsc1_bit_c : natural := 2; -- r/w: prescaler select bit 1 constant ctrl_prsc2_bit_c : natural := 3; -- r/w: prescaler select bit 2 - -- access control -- - signal acc_en : std_ulogic; -- module access enable - signal addr : std_ulogic_vector(31 downto 0); -- access address - signal wren : std_ulogic; -- write enable - signal rden : std_ulogic; -- read enable - -- accessible regs -- type pwm_ch_t is array (0 to 11) of std_ulogic_vector(7 downto 0); signal pwm_ch : pwm_ch_t; -- duty cycle (r/w) @@ -100,12 +90,6 @@ begin -- Host Access ---------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - -- access control -- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = pwm_base_c(hi_abb_c downto lo_abb_c)) else '0'; - addr <= pwm_base_c(31 downto lo_abb_c) & bus_req_i.addr(lo_abb_c-1 downto 2) & "00"; -- word aligned - rden <= acc_en and bus_req_i.re; - wren <= acc_en and bus_req_i.we; - -- write access -- write_access: process(rstn_i, clk_i) begin @@ -114,28 +98,28 @@ begin prsc <= (others => '0'); pwm_ch <= (others => (others => '0')); elsif rising_edge(clk_i) then - if (wren = '1') then + if (bus_req_i.we = '1') then -- control register -- - if (addr = pwm_ctrl_addr_c) then + if (bus_req_i.addr(3 downto 2) = "00") then enable <= bus_req_i.data(ctrl_enable_c); prsc <= bus_req_i.data(ctrl_prsc2_bit_c downto ctrl_prsc0_bit_c); end if; -- duty cycle register 0 -- - if (addr = pwm_dc0_addr_c) then + if (bus_req_i.addr(3 downto 2) = "01") then pwm_ch(00) <= bus_req_i.data(07 downto 00); pwm_ch(01) <= bus_req_i.data(15 downto 08); pwm_ch(02) <= bus_req_i.data(23 downto 16); pwm_ch(03) <= bus_req_i.data(31 downto 24); end if; -- duty cycle register 1 -- - if (addr = pwm_dc1_addr_c) then + if (bus_req_i.addr(3 downto 2) = "10") then pwm_ch(04) <= bus_req_i.data(07 downto 00); pwm_ch(05) <= bus_req_i.data(15 downto 08); pwm_ch(06) <= bus_req_i.data(23 downto 16); pwm_ch(07) <= bus_req_i.data(31 downto 24); end if; -- duty cycle register 2 -- - if (addr = pwm_dc2_addr_c) then + if (bus_req_i.addr(3 downto 2) = "11") then pwm_ch(08) <= bus_req_i.data(07 downto 00); pwm_ch(09) <= bus_req_i.data(15 downto 08); pwm_ch(10) <= bus_req_i.data(23 downto 16); @@ -149,10 +133,10 @@ begin read_access: process(clk_i) begin if rising_edge(clk_i) then - bus_rsp_o.ack <= rden or wren; -- bus handshake + bus_rsp_o.ack <= bus_req_i.re or bus_req_i.we; -- bus handshake bus_rsp_o.data <= (others => '0'); - if (rden = '1') then - case addr(3 downto 2) is + if (bus_req_i.re = '1') then + case bus_req_i.addr(3 downto 2) is when "00" => bus_rsp_o.data(ctrl_enable_c) <= enable; bus_rsp_o.data(ctrl_prsc2_bit_c downto ctrl_prsc0_bit_c) <= prsc; when "01" => bus_rsp_o.data <= pwm_ch_rd(03) & pwm_ch_rd(02) & pwm_ch_rd(01) & pwm_ch_rd(00); when "10" => bus_rsp_o.data <= pwm_ch_rd(07) & pwm_ch_rd(06) & pwm_ch_rd(05) & pwm_ch_rd(04); diff --git a/rtl/core/neorv32_sdi.vhd b/rtl/core/neorv32_sdi.vhd index b3a624076..61cce1fe5 100644 --- a/rtl/core/neorv32_sdi.vhd +++ b/rtl/core/neorv32_sdi.vhd @@ -61,10 +61,6 @@ end neorv32_sdi; architecture neorv32_sdi_rtl of neorv32_sdi is - -- IO space: module base address -- - constant hi_abb_c : natural := index_size_f(io_size_c)-1; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(sdi_size_c); -- low address boundary bit - -- control register -- constant ctrl_en_c : natural := 0; -- r/w: SDI enable constant ctrl_clr_rx_c : natural := 1; -- -/w: clear RX FIFO, auto-clears @@ -86,12 +82,6 @@ architecture neorv32_sdi_rtl of neorv32_sdi is constant ctrl_tx_empty_c : natural := 26; -- r/-: TX FIFO empty constant ctrl_tx_full_c : natural := 27; -- r/-: TX FIFO full - -- access control -- - signal acc_en : std_ulogic; -- module access enable - signal addr : std_ulogic_vector(31 downto 0); -- access address - signal wren : std_ulogic; -- word write enable - signal rden : std_ulogic; -- read enable - -- control register (see bit definitions above) -- type ctrl_t is record enable : std_ulogic; @@ -151,12 +141,6 @@ begin -- Host Access ---------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - -- access control -- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = sdi_base_c(hi_abb_c downto lo_abb_c)) else '0'; - addr <= sdi_base_c(31 downto lo_abb_c) & bus_req_i.addr(lo_abb_c-1 downto 2) & "00"; -- word aligned - wren <= acc_en and bus_req_i.we; - rden <= acc_en and bus_req_i.re; - -- write access -- write_access: process(rstn_i, clk_i) begin @@ -169,8 +153,8 @@ begin ctrl.irq_tx_empty <= '0'; elsif rising_edge(clk_i) then ctrl.clr_rx <= '0'; - if (wren = '1') then - if (addr = sdi_ctrl_addr_c) then -- control register + if (bus_req_i.we = '1') then + if (bus_req_i.addr(2) = '0') then -- control register ctrl.enable <= bus_req_i.data(ctrl_en_c); ctrl.clr_rx <= bus_req_i.data(ctrl_clr_rx_c); -- @@ -187,10 +171,10 @@ begin read_aceess: process(clk_i) begin if rising_edge(clk_i) then - bus_rsp_o.ack <= rden or wren; -- bus access acknowledge + bus_rsp_o.ack <= bus_req_i.re or bus_req_i.we; -- bus access acknowledge bus_rsp_o.data <= (others => '0'); - if (rden = '1') then - if (addr = sdi_ctrl_addr_c) then -- control register + if (bus_req_i.re = '1') then + if (bus_req_i.addr(2) = '0') then -- control register bus_rsp_o.data(ctrl_en_c) <= ctrl.enable; -- bus_rsp_o.data(ctrl_fifo_size3_c downto ctrl_fifo_size0_c) <= std_ulogic_vector(to_unsigned(index_size_f(RTX_FIFO), 4)); @@ -246,7 +230,7 @@ begin -- write access (CPU) -- tx_fifo.clear <= not ctrl.enable; tx_fifo.wdata <= bus_req_i.data(7 downto 0); - tx_fifo.we <= '1' when (wren = '1') and (addr = sdi_rtx_addr_c) else '0'; + tx_fifo.we <= '1' when (bus_req_i.we = '1') and (bus_req_i.addr(2) = '1') else '0'; -- read access (SDI) -- tx_fifo.re <= serial.start; @@ -281,7 +265,7 @@ begin -- read access (CPU) -- rx_fifo.clear <= (not ctrl.enable) or ctrl.clr_rx; - rx_fifo.re <= '1' when (rden = '1') and (addr = sdi_rtx_addr_c) else '0'; + rx_fifo.re <= '1' when (bus_req_i.re = '1') and (bus_req_i.addr(2) = '1') else '0'; -- Input Synchronizer --------------------------------------------------------------------- diff --git a/rtl/core/neorv32_slink.vhd b/rtl/core/neorv32_slink.vhd index 2207b66ac..9f181c7a5 100644 --- a/rtl/core/neorv32_slink.vhd +++ b/rtl/core/neorv32_slink.vhd @@ -67,10 +67,6 @@ end neorv32_slink; architecture neorv32_slink_rtl of neorv32_slink is - -- IO space: module base address -- - constant hi_abb_c : natural := index_size_f(io_size_c)-1; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(slink_size_c); -- low address boundary bit - -- control register -- constant ctrl_en_c : natural := 0; -- r/w: Global module enable constant ctrl_rx_clr_c : natural := 1; -- -/w: Clear RX FIFO, auto-clears @@ -99,11 +95,6 @@ architecture neorv32_slink_rtl of neorv32_slink is constant ctrl_tx_fifo_size2_c : natural := 30; -- r/-: log2(TX fifo size), bit 2 constant ctrl_tx_fifo_size3_c : natural := 31; -- r/-: log2(TX fifo size), bit 3 (msb) - -- access control -- - signal acc_en : std_ulogic; -- module access enable - signal wren : std_ulogic; -- word write enable - signal rden : std_ulogic; -- read enable - -- control register (see bit definitions above) -- type ctrl_t is record enable : std_ulogic; @@ -144,11 +135,6 @@ begin -- Host Access ---------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - -- access control -- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = slink_base_c(hi_abb_c downto lo_abb_c)) else '0'; - wren <= acc_en and bus_req_i.we; - rden <= acc_en and bus_req_i.re; - -- write access -- write_access: process(rstn_i, clk_i) begin @@ -165,7 +151,7 @@ begin elsif rising_edge(clk_i) then ctrl.rx_clr <= '0'; -- auto-clear ctrl.tx_clr <= '0'; -- auto-clear - if (wren = '1') then + if (bus_req_i.we = '1') then if (bus_req_i.addr(2) = '0') then -- control register ctrl.enable <= bus_req_i.data(ctrl_en_c); ctrl.rx_clr <= bus_req_i.data(ctrl_rx_clr_c); @@ -186,9 +172,9 @@ begin read_aceess: process(clk_i) begin if rising_edge(clk_i) then - bus_rsp_o.ack <= rden or wren; -- bus access acknowledge + bus_rsp_o.ack <= bus_req_i.re or bus_req_i.we; -- bus access acknowledge bus_rsp_o.data <= (others => '0'); - if (rden = '1') then + if (bus_req_i.re = '1') then if (bus_req_i.addr(2) = '0') then -- control register bus_rsp_o.data(ctrl_en_c) <= ctrl.enable; -- @@ -245,7 +231,7 @@ begin ); rx_fifo.clear <= (not ctrl.enable) or ctrl.rx_clr; - rx_fifo.re <= '1' when (rden = '1') and (bus_req_i.addr(2) = '1') else '0'; + rx_fifo.re <= '1' when (bus_req_i.re = '1') and (bus_req_i.addr(2) = '1') else '0'; rx_fifo.we <= slink_rx_valid_i; rx_fifo.wdata <= slink_rx_data_i; @@ -278,7 +264,7 @@ begin ); tx_fifo.clear <= (not ctrl.enable) or ctrl.tx_clr; - tx_fifo.we <= '1' when (wren = '1') and (bus_req_i.addr(2) = '1') else '0'; + tx_fifo.we <= '1' when (bus_req_i.we = '1') and (bus_req_i.addr(2) = '1') else '0'; tx_fifo.wdata <= bus_req_i.data; tx_fifo.re <= slink_tx_ready_i; diff --git a/rtl/core/neorv32_spi.vhd b/rtl/core/neorv32_spi.vhd index ccc514b8d..9c6bb1798 100644 --- a/rtl/core/neorv32_spi.vhd +++ b/rtl/core/neorv32_spi.vhd @@ -60,10 +60,6 @@ end neorv32_spi; architecture neorv32_spi_rtl of neorv32_spi is - -- IO space: module base address -- - constant hi_abb_c : natural := index_size_f(io_size_c)-1; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(spi_size_c); -- low address boundary bit - -- control register -- constant ctrl_en_c : natural := 0; -- r/w: spi enable constant ctrl_cpha_c : natural := 1; -- r/w: spi clock phase @@ -94,12 +90,6 @@ architecture neorv32_spi_rtl of neorv32_spi is -- constant ctrl_busy_c : natural := 31; -- r/-: spi phy busy or tx fifo not empty yet - -- access control -- - signal acc_en : std_ulogic; -- module access enable - signal addr : std_ulogic_vector(31 downto 0); -- access address - signal wren : std_ulogic; -- word write enable - signal rden : std_ulogic; -- read enable - -- control register -- type ctrl_t is record enable : std_ulogic; @@ -156,12 +146,6 @@ begin -- Host Access ---------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - -- access control -- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = spi_base_c(hi_abb_c downto lo_abb_c)) else '0'; - addr <= spi_base_c(31 downto lo_abb_c) & bus_req_i.addr(lo_abb_c-1 downto 2) & "00"; -- word aligned - wren <= acc_en and bus_req_i.we; - rden <= acc_en and bus_req_i.re; - -- write access -- write_access: process(rstn_i, clk_i) begin @@ -177,8 +161,8 @@ begin ctrl.irq_tx_empty <= '0'; ctrl.irq_tx_nhalf <= '0'; elsif rising_edge(clk_i) then - if (wren = '1') then - if (addr = spi_ctrl_addr_c) then -- control register + if (bus_req_i.we = '1') then + if (bus_req_i.addr(2) = '0') then -- control register ctrl.enable <= bus_req_i.data(ctrl_en_c); ctrl.cpha <= bus_req_i.data(ctrl_cpha_c); ctrl.cpol <= bus_req_i.data(ctrl_cpol_c); @@ -198,10 +182,10 @@ begin read_access: process(clk_i) begin if rising_edge(clk_i) then - bus_rsp_o.ack <= wren or rden; -- bus access acknowledge + bus_rsp_o.ack <= bus_req_i.we or bus_req_i.re; -- bus access acknowledge bus_rsp_o.data <= (others => '0'); - if (rden = '1') then - if (addr = spi_ctrl_addr_c) then -- control register + if (bus_req_i.re = '1') then + if (bus_req_i.addr(2) = '0') then -- control register bus_rsp_o.data(ctrl_en_c) <= ctrl.enable; bus_rsp_o.data(ctrl_cpha_c) <= ctrl.cpha; bus_rsp_o.data(ctrl_cpol_c) <= ctrl.cpol; @@ -221,7 +205,7 @@ begin bus_rsp_o.data(ctrl_fifo_size3_c downto ctrl_fifo_size0_c) <= std_ulogic_vector(to_unsigned(index_size_f(IO_SPI_FIFO), 4)); -- bus_rsp_o.data(ctrl_busy_c) <= rtx_engine.busy or tx_fifo.avail; - else -- data register (spi_rtx_addr_c) + else bus_rsp_o.data(7 downto 0) <= rx_fifo.rdata; end if; end if; @@ -269,7 +253,7 @@ begin ); tx_fifo.clear <= not ctrl.enable; - tx_fifo.we <= '1' when (wren = '1') and (addr = spi_rtx_addr_c) else '0'; + tx_fifo.we <= '1' when (bus_req_i.we = '1') and (bus_req_i.addr(2) = '1') else '0'; tx_fifo.wdata <= bus_req_i.data(7 downto 0); tx_fifo.re <= '1' when (rtx_engine.state = "100") else '0'; @@ -301,7 +285,7 @@ begin rx_fifo.clear <= not ctrl.enable; rx_fifo.wdata <= rtx_engine.sreg; rx_fifo.we <= rtx_engine.done; - rx_fifo.re <= '1' when (rden = '1') and (addr = spi_rtx_addr_c) else '0'; + rx_fifo.re <= '1' when (bus_req_i.re = '1') and (bus_req_i.addr(2) = '1') else '0'; -- IRQ generator -- diff --git a/rtl/core/neorv32_sysinfo.vhd b/rtl/core/neorv32_sysinfo.vhd index 32fea06a8..a61ce4def 100644 --- a/rtl/core/neorv32_sysinfo.vhd +++ b/rtl/core/neorv32_sysinfo.vhd @@ -100,30 +100,12 @@ end neorv32_sysinfo; architecture neorv32_sysinfo_rtl of neorv32_sysinfo is - -- IO space: module base address -- - constant hi_abb_c : natural := index_size_f(io_size_c)-1; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(sysinfo_size_c); -- low address boundary bit - - -- access control -- - signal acc_en : std_ulogic; -- module access enable - signal rden : std_ulogic; - signal wren : std_ulogic; - signal addr : std_ulogic_vector(2 downto 0); - -- system information ROM -- type info_mem_t is array (0 to 7) of std_ulogic_vector(31 downto 0); signal sysinfo : info_mem_t; begin - -- Access Control ------------------------------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = sysinfo_base_c(hi_abb_c downto lo_abb_c)) else '0'; - addr <= bus_req_i.addr(index_size_f(sysinfo_size_c)-1 downto 2); - rden <= acc_en and bus_req_i.re; -- read access - wren <= acc_en and bus_req_i.we; -- write access - - -- Construct Info ROM --------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- -- SYSINFO(0): Processor (primary) clock frequency -- @@ -181,10 +163,10 @@ begin sysinfo(3)(31 downto 28) <= (others => '0'); -- d-cache: replacement strategy -- SYSINFO(4): Base address of instruction memory space -- - sysinfo(4) <= ispace_base_c; -- defined in neorv32_package.vhd file + sysinfo(4) <= mem_ispace_base_c; -- defined in neorv32_package.vhd file -- SYSINFO(5): Base address of data memory space -- - sysinfo(5) <= dspace_base_c; -- defined in neorv32_package.vhd file + sysinfo(5) <= mem_dspace_base_c; -- defined in neorv32_package.vhd file -- SYSINFO(6): Size of IMEM in bytes -- sysinfo(6) <= std_ulogic_vector(to_unsigned(MEM_INT_IMEM_SIZE, 32)) when (MEM_INT_IMEM_EN = true) else (others => '0'); @@ -198,11 +180,11 @@ begin read_access: process(clk_i) begin if rising_edge(clk_i) then - bus_rsp_o.ack <= rden; - bus_rsp_o.err <= wren; -- read-only! + bus_rsp_o.ack <= bus_req_i.re; + bus_rsp_o.err <= bus_req_i.we; -- read-only! bus_rsp_o.data <= (others => '0'); - if (rden = '1') then - bus_rsp_o.data <= sysinfo(to_integer(unsigned(addr))); + if (bus_req_i.re = '1') then + bus_rsp_o.data <= sysinfo(to_integer(unsigned(bus_req_i.addr(4 downto 2)))); end if; end if; end process read_access; diff --git a/rtl/core/neorv32_trng.vhd b/rtl/core/neorv32_trng.vhd index e92910cdc..0b430d479 100644 --- a/rtl/core/neorv32_trng.vhd +++ b/rtl/core/neorv32_trng.vhd @@ -85,15 +85,6 @@ architecture neorv32_trng_rtl of neorv32_trng is constant ctrl_en_c : natural := 30; -- r/w: TRNG enable constant ctrl_valid_c : natural := 31; -- r/-: Output data valid - -- IO space: module base address -- - constant hi_abb_c : natural := index_size_f(io_size_c)-1; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(trng_size_c); -- low address boundary bit - - -- access control -- - signal acc_en : std_ulogic; -- module access enable - signal wren : std_ulogic; -- full word write enable - signal rden : std_ulogic; -- read enable - -- Component: neoTRNG true random number generator -- component neoTRNG generic ( @@ -148,11 +139,6 @@ begin -- Write Access --------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - -- access control -- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = trng_base_c(hi_abb_c downto lo_abb_c)) else '0'; - wren <= acc_en and bus_req_i.we; - rden <= acc_en and bus_req_i.re; - -- write access -- write_access: process(rstn_i, clk_i) begin @@ -164,7 +150,7 @@ begin irq_fifo_full <= '0'; elsif rising_edge(clk_i) then fifo_clr <= '0'; -- auto-clear - if (wren = '1') then + if (bus_req_i.we = '1') then enable <= bus_req_i.data(ctrl_en_c); fifo_clr <= bus_req_i.data(ctrl_fifo_clr_c); irq_fifo_nempty <= bus_req_i.data(ctrl_irq_fifo_nempty); @@ -178,9 +164,9 @@ begin read_access: process(clk_i) begin if rising_edge(clk_i) then - bus_rsp_o.ack <= wren or rden; -- host bus acknowledge + bus_rsp_o.ack <= bus_req_i.we or bus_req_i.re; -- host bus acknowledge bus_rsp_o.data <= (others => '0'); - if (rden = '1') then + if (bus_req_i.re = '1') then bus_rsp_o.data(ctrl_data_msb_c downto ctrl_data_lsb_c) <= fifo.rdata; -- bus_rsp_o.data(ctrl_fifo_size3_c downto ctrl_fifo_size0_c) <= std_ulogic_vector(to_unsigned(index_size_f(IO_TRNG_FIFO), 4)); @@ -245,7 +231,7 @@ begin ); fifo.clear <= '1' when (enable = '0') or (fifo_clr = '1') else '0'; - fifo.re <= '1' when (rden = '1') else '0'; + fifo.re <= '1' when (bus_req_i.re = '1') else '0'; -- FIFO-level interrupt generator -- irq_generator: process(clk_i) diff --git a/rtl/core/neorv32_twi.vhd b/rtl/core/neorv32_twi.vhd index c9ec14abc..a57c3e00b 100644 --- a/rtl/core/neorv32_twi.vhd +++ b/rtl/core/neorv32_twi.vhd @@ -62,10 +62,6 @@ end neorv32_twi; architecture neorv32_twi_rtl of neorv32_twi is - -- IO space: module base address -- - constant hi_abb_c : natural := index_size_f(io_size_c)-1; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(twi_size_c); -- low address boundary bit - -- control register -- constant ctrl_en_c : natural := 0; -- r/w: TWI enable constant ctrl_start_c : natural := 1; -- -/w: Generate START condition @@ -84,12 +80,6 @@ architecture neorv32_twi_rtl of neorv32_twi is constant ctrl_ack_c : natural := 30; -- r/-: Set if ACK received constant ctrl_busy_c : natural := 31; -- r/-: Set if TWI unit is busy - -- access control -- - signal acc_en : std_ulogic; -- module access enable - signal addr : std_ulogic_vector(31 downto 0); -- access address - signal wren : std_ulogic; -- word write enable - signal rden : std_ulogic; -- read enable - -- control register -- type ctrl_t is record enable : std_ulogic; @@ -138,11 +128,6 @@ begin -- Host Access ---------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - -- access control -- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = twi_base_c(hi_abb_c downto lo_abb_c)) else '0'; - addr <= twi_base_c(31 downto lo_abb_c) & bus_req_i.addr(lo_abb_c-1 downto 2) & "00"; -- word aligned - wren <= acc_en and bus_req_i.we; - rden <= acc_en and bus_req_i.re; -- write access -- write_access: process(rstn_i, clk_i) @@ -154,8 +139,8 @@ begin ctrl.prsc <= (others => '0'); ctrl.cdiv <= (others => '0'); elsif rising_edge(clk_i) then - if (wren = '1') then - if (addr = twi_ctrl_addr_c) then + if (bus_req_i.we = '1') then + if (bus_req_i.addr(2) = '0') then ctrl.enable <= bus_req_i.data(ctrl_en_c); ctrl.mack <= bus_req_i.data(ctrl_mack_c); ctrl.csen <= bus_req_i.data(ctrl_csen_c); @@ -170,10 +155,10 @@ begin read_access: process(clk_i) begin if rising_edge(clk_i) then - bus_rsp_o.ack <= rden or wren; -- bus handshake + bus_rsp_o.ack <= bus_req_i.re or bus_req_i.we; -- bus handshake bus_rsp_o.data <= (others => '0'); - if (rden = '1') then - if (addr = twi_ctrl_addr_c) then + if (bus_req_i.re = '1') then + if (bus_req_i.addr(2) = '0') then bus_rsp_o.data(ctrl_en_c) <= ctrl.enable; bus_rsp_o.data(ctrl_mack_c) <= ctrl.mack; bus_rsp_o.data(ctrl_csen_c) <= ctrl.csen; @@ -183,7 +168,7 @@ begin bus_rsp_o.data(ctrl_claimed_c) <= arbiter.claimed; bus_rsp_o.data(ctrl_ack_c) <= not arbiter.rtx_sreg(0); bus_rsp_o.data(ctrl_busy_c) <= arbiter.busy; - else -- twi_rtx_addr_c => + else bus_rsp_o.data(7 downto 0) <= arbiter.rtx_sreg(8 downto 1); end if; end if; @@ -268,14 +253,14 @@ begin when "100" => -- IDLE: waiting for operation requests -- ------------------------------------------------------------ arbiter.bitcnt <= (others => '0'); - if (wren = '1') then - if (addr = twi_ctrl_addr_c) then + if (bus_req_i.we = '1') then + if (bus_req_i.addr(2) = '0') then if (bus_req_i.data(ctrl_start_c) = '1') then -- issue START condition arbiter.state_nxt <= "01"; elsif (bus_req_i.data(ctrl_stop_c) = '1') then -- issue STOP condition arbiter.state_nxt <= "10"; end if; - elsif (addr = twi_rtx_addr_c) then -- start a data transmission + elsif (bus_req_i.addr(2) = '1') then -- start a data transmission -- one bit extra for ACK: issued by controller if ctrl_mack_c is set, -- sampled from peripheral if ctrl_mack_c is cleared arbiter.rtx_sreg <= bus_req_i.data(7 downto 0) & (not ctrl.mack); diff --git a/rtl/core/neorv32_uart.vhd b/rtl/core/neorv32_uart.vhd index 95f865ef8..09459b3d5 100644 --- a/rtl/core/neorv32_uart.vhd +++ b/rtl/core/neorv32_uart.vhd @@ -89,16 +89,6 @@ end neorv32_uart; architecture neorv32_uart_rtl of neorv32_uart is - -- interface configuration for UART0 / UART1 -- - constant uart_id_base_c : std_ulogic_vector(31 downto 0) := cond_sel_stdulogicvector_f(UART_PRIMARY, uart0_base_c, uart1_base_c); - constant uart_id_size_c : natural := cond_sel_natural_f( UART_PRIMARY, uart0_size_c, uart1_size_c); - constant uart_id_ctrl_addr_c : std_ulogic_vector(31 downto 0) := cond_sel_stdulogicvector_f(UART_PRIMARY, uart0_ctrl_addr_c, uart1_ctrl_addr_c); - constant uart_id_rtx_addr_c : std_ulogic_vector(31 downto 0) := cond_sel_stdulogicvector_f(UART_PRIMARY, uart0_rtx_addr_c, uart1_rtx_addr_c); - - -- IO space: module base address -- - constant hi_abb_c : natural := index_size_f(io_size_c)-1; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(uart_id_size_c); -- low address boundary bit - -- simulation output configuration -- constant sim_screen_output_en_c : boolean := true; -- output lowest byte as char to simulator console when enabled constant sim_text_output_en_c : boolean := true; -- output lowest byte as char to text file when enabled @@ -147,12 +137,6 @@ architecture neorv32_uart_rtl of neorv32_uart is constant data_tx_fifo_size_lsb : natural := 12; -- r/-: log2(TX fifo size) LSB constant data_tx_fifo_size_msb : natural := 15; -- r/-: log2(TX fifo size) MSB - -- access control -- - signal acc_en : std_ulogic; -- module access enable - signal addr : std_ulogic_vector(31 downto 0); -- access address - signal wren : std_ulogic; -- word write enable - signal rden : std_ulogic; -- read enable - -- clock generator -- signal uart_clk : std_ulogic; @@ -221,12 +205,6 @@ begin -- Host Access ---------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - -- access control -- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = uart_id_base_c(hi_abb_c downto lo_abb_c)) else '0'; - addr <= uart_id_base_c(31 downto lo_abb_c) & bus_req_i.addr(lo_abb_c-1 downto 2) & "00"; -- word aligned - wren <= acc_en and bus_req_i.we; - rden <= acc_en and bus_req_i.re; - -- write access -- write_access: process(rstn_i, clk_i) begin @@ -242,8 +220,8 @@ begin ctrl.irq_tx_empty <= '0'; ctrl.irq_tx_nhalf <= '0'; elsif rising_edge(clk_i) then - if (wren = '1') then - if (addr = uart_id_ctrl_addr_c) then -- control register + if (bus_req_i.we = '1') then + if (bus_req_i.addr(2) = '0') then -- control register ctrl.enable <= bus_req_i.data(ctrl_en_c); ctrl.sim_mode <= bus_req_i.data(ctrl_sim_en_c); ctrl.hwfc_en <= bus_req_i.data(ctrl_hwfc_en_c); @@ -264,10 +242,10 @@ begin read_access: process(clk_i) begin if rising_edge(clk_i) then - bus_rsp_o.ack <= wren or rden; -- bus access acknowledge + bus_rsp_o.ack <= bus_req_i.we or bus_req_i.re; -- bus access acknowledge bus_rsp_o.data <= (others => '0'); - if (rden = '1') then - if (addr = uart_id_ctrl_addr_c) then -- control register + if (bus_req_i.re = '1') then + if (bus_req_i.addr(2) = '0') then -- control register bus_rsp_o.data(ctrl_en_c) <= ctrl.enable; bus_rsp_o.data(ctrl_sim_en_c) <= ctrl.sim_mode; bus_rsp_o.data(ctrl_hwfc_en_c) <= ctrl.hwfc_en; @@ -335,7 +313,7 @@ begin tx_fifo.clear <= '1' when (ctrl.enable = '0') or (ctrl.sim_mode = '1') else '0'; tx_fifo.wdata <= bus_req_i.data(data_rtx_msb_c downto data_rtx_lsb_c); - tx_fifo.we <= '1' when (wren = '1') and (addr = uart_id_rtx_addr_c) else '0'; + tx_fifo.we <= '1' when (bus_req_i.we = '1') and (bus_req_i.addr(2) = '1') else '0'; tx_fifo.re <= '1' when (tx_engine.state = "100") else '0'; -- TX interrupt generator -- @@ -376,7 +354,7 @@ begin rx_fifo.clear <= '1' when (ctrl.enable = '0') or (ctrl.sim_mode = '1') else '0'; rx_fifo.wdata <= rx_engine.sreg(8 downto 1); rx_fifo.we <= rx_engine.done; - rx_fifo.re <= '1' when (rden = '1') and (addr = uart_id_rtx_addr_c) else '0'; + rx_fifo.re <= '1' when (bus_req_i.re = '1') and (bus_req_i.addr(2) = '1') else '0'; -- RX interrupt generator -- rx_irq_generator: process(clk_i) @@ -506,7 +484,7 @@ begin fifo_overrun: process(clk_i) begin if rising_edge(clk_i) then - if ((rden = '1') and (addr = uart_id_rtx_addr_c)) or (ctrl.enable = '0') then -- clear when reading data register + if ((bus_req_i.re = '1') and (bus_req_i.addr(2) = '1')) or (ctrl.enable = '0') then -- clear when reading data register rx_engine.over <= '0'; elsif (rx_fifo.we = '1') and (rx_fifo.free = '0') then -- writing to full FIFO rx_engine.over <= '1'; @@ -546,7 +524,7 @@ begin begin if rising_edge(clk_i) then if (ctrl.enable = '1') and (ctrl.sim_mode = '1') and -- UART simulation mode - (wren = '1') and (addr = uart_id_rtx_addr_c) then + (bus_req_i.we = '1') and (bus_req_i.addr(2) = '1') then -- print lowest byte as ASCII char -- char_v := to_integer(unsigned(bus_req_i.data(7 downto 0))); diff --git a/rtl/core/neorv32_wdt.vhd b/rtl/core/neorv32_wdt.vhd index c1357a3cf..dc9b89811 100644 --- a/rtl/core/neorv32_wdt.vhd +++ b/rtl/core/neorv32_wdt.vhd @@ -65,10 +65,6 @@ end neorv32_wdt; architecture neorv32_wdt_rtl of neorv32_wdt is - -- IO space: module base address -- - constant hi_abb_c : natural := index_size_f(io_size_c)-1; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(wdt_size_c); -- low address boundary bit - -- Control register bits -- constant ctrl_enable_c : natural := 0; -- r/w: WDT enable constant ctrl_lock_c : natural := 1; -- r/w: lock write access to control register when set @@ -80,11 +76,6 @@ architecture neorv32_wdt_rtl of neorv32_wdt is constant ctrl_timeout_lsb_c : natural := 8; -- r/w: timeout value LSB constant ctrl_timeout_msb_c : natural := 31; -- r/w: timeout value MSB - -- access control -- - signal acc_en : std_ulogic; -- module access enable - signal wren : std_ulogic; - signal rden : std_ulogic; - -- control register -- type ctrl_t is record enable : std_ulogic; -- WDT enable @@ -114,10 +105,6 @@ begin -- Host Access ---------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - -- access control -- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = wdt_base_c(hi_abb_c downto lo_abb_c)) else '0'; - wren <= acc_en and bus_req_i.we; - rden <= acc_en and bus_req_i.re; -- write access -- write_access: process(rstn_int_i, clk_i) @@ -131,7 +118,7 @@ begin ctrl.timeout <= (others => '0'); elsif rising_edge(clk_i) then ctrl.reset <= '0'; -- default - if (wren = '1') then + if (bus_req_i.we = '1') then ctrl.reset <= bus_req_i.data(ctrl_reset_c); if (ctrl.lock = '0') then -- update configuration only if not locked ctrl.enable <= bus_req_i.data(ctrl_enable_c); @@ -148,9 +135,9 @@ begin read_access: process(clk_i) begin if rising_edge(clk_i) then - bus_rsp_o.ack <= rden or wren; + bus_rsp_o.ack <= bus_req_i.re or bus_req_i.we; bus_rsp_o.data <= (others => '0'); - if (rden = '1') then + if (bus_req_i.re = '1') then bus_rsp_o.data(ctrl_enable_c) <= ctrl.enable; bus_rsp_o.data(ctrl_lock_c) <= ctrl.lock; bus_rsp_o.data(ctrl_dben_c) <= ctrl.dben; diff --git a/rtl/core/neorv32_xip.vhd b/rtl/core/neorv32_xip.vhd index ad44a0901..9c6170008 100644 --- a/rtl/core/neorv32_xip.vhd +++ b/rtl/core/neorv32_xip.vhd @@ -64,16 +64,6 @@ end neorv32_xip; architecture neorv32_xip_rtl of neorv32_xip is - -- IO space: module base address -- - constant hi_abb_c : natural := index_size_f(io_size_c)-1; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(xip_size_c); -- low address boundary bit - - -- CT register access control -- - signal ct_acc_en : std_ulogic; -- module access enable - signal ct_addr : std_ulogic_vector(31 downto 0); -- access address - signal ct_wren : std_ulogic; -- word write enable - signal ct_rden : std_ulogic; -- read enable - -- control register -- constant ctrl_enable_c : natural := 0; -- r/w: module enable constant ctrl_spi_prsc0_c : natural := 1; -- r/w: SPI clock prescaler select - bit 0 @@ -159,14 +149,6 @@ architecture neorv32_xip_rtl of neorv32_xip is begin - -- Access Control (IO/CTRL port) ---------------------------------------------------------- - -- ------------------------------------------------------------------------------------------- - ct_acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = xip_base_c(hi_abb_c downto lo_abb_c)) else '0'; - ct_addr <= xip_base_c(31 downto lo_abb_c) & bus_req_i.addr(lo_abb_c-1 downto 2) & "00"; -- word aligned - ct_wren <= ct_acc_en and bus_req_i.we; - ct_rden <= ct_acc_en and bus_req_i.re; - - -- Control Write Access ------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- ctrl_write_access : process(rstn_i, clk_i) @@ -178,9 +160,9 @@ begin spi_trigger <= '0'; elsif rising_edge(clk_i) then spi_trigger <= '0'; - if (ct_wren = '1') then -- only full-word writes! + if (bus_req_i.we = '1') then -- only full-word writes! -- control register -- - if (ct_addr = xip_ctrl_addr_c) then + if (bus_req_i.addr(3 downto 2) = "00") then ctrl(ctrl_enable_c) <= bus_req_i.data(ctrl_enable_c); ctrl(ctrl_spi_prsc2_c downto ctrl_spi_prsc0_c) <= bus_req_i.data(ctrl_spi_prsc2_c downto ctrl_spi_prsc0_c); ctrl(ctrl_spi_cpol_c) <= bus_req_i.data(ctrl_spi_cpol_c); @@ -194,11 +176,11 @@ begin ctrl(ctrl_burst_en_c) <= bus_req_i.data(ctrl_burst_en_c); end if; -- SPI direct data access register lo -- - if (ct_addr = xip_data_lo_addr_c) then + if (bus_req_i.addr(3 downto 2) = "10") then spi_data_lo <= bus_req_i.data; end if; -- SPI direct data access register hi -- - if (ct_addr = xip_data_hi_addr_c) then + if (bus_req_i.addr(3 downto 2) = "11") then spi_data_hi <= bus_req_i.data; spi_trigger <= '1'; -- trigger direct SPI transaction end if; @@ -212,10 +194,10 @@ begin ctrl_read_access : process(clk_i) begin if rising_edge(clk_i) then - bus_rsp_o.ack <= ct_wren or ct_rden; -- access acknowledge + bus_rsp_o.ack <= bus_req_i.we or bus_req_i.re; -- access acknowledge bus_rsp_o.data <= (others => '0'); - if (ct_rden = '1') then - case ct_addr(3 downto 2) is + if (bus_req_i.re = '1') then + case bus_req_i.addr(3 downto 2) is when "00" => -- 'xip_ctrl_addr_c' - control register bus_rsp_o.data(ctrl_enable_c) <= ctrl(ctrl_enable_c); bus_rsp_o.data(ctrl_spi_prsc2_c downto ctrl_spi_prsc0_c) <= ctrl(ctrl_spi_prsc2_c downto ctrl_spi_prsc0_c); diff --git a/rtl/core/neorv32_xirq.vhd b/rtl/core/neorv32_xirq.vhd index 4d2846ecc..b1bde603d 100644 --- a/rtl/core/neorv32_xirq.vhd +++ b/rtl/core/neorv32_xirq.vhd @@ -64,16 +64,6 @@ end neorv32_xirq; architecture neorv32_xirq_rtl of neorv32_xirq is - -- IO space: module base address -- - constant hi_abb_c : natural := index_size_f(io_size_c)-1; -- high address boundary bit - constant lo_abb_c : natural := index_size_f(xirq_size_c); -- low address boundary bit - - -- access control -- - signal acc_en : std_ulogic; -- module access enable - signal addr : std_ulogic_vector(31 downto 0); -- access address - signal wren : std_ulogic; -- word write enable - signal rden : std_ulogic; -- read enable - -- interface registers -- signal irq_enable : std_ulogic_vector(XIRQ_NUM_CH-1 downto 0); -- r/w: channel enable signal nclr_pending : std_ulogic_vector(XIRQ_NUM_CH-1 downto 0); -- r/w: pending IRQs @@ -103,11 +93,6 @@ begin -- Host Access ---------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - -- access control -- - acc_en <= '1' when (bus_req_i.addr(hi_abb_c downto lo_abb_c) = xirq_base_c(hi_abb_c downto lo_abb_c)) else '0'; - addr <= xirq_base_c(31 downto lo_abb_c) & bus_req_i.addr(lo_abb_c-1 downto 2) & "00"; -- word aligned - wren <= acc_en and bus_req_i.we; - rden <= acc_en and bus_req_i.re; -- write access -- write_access: process(rstn_i, clk_i) @@ -117,11 +102,11 @@ begin irq_enable <= (others => '0'); elsif rising_edge(clk_i) then nclr_pending <= (others => '1'); - if (wren = '1') then - if (addr = xirq_enable_addr_c) then -- channel-enable + if (bus_req_i.we = '1') then + if (bus_req_i.addr(3 downto 2) = "00") then -- channel-enable irq_enable <= bus_req_i.data(XIRQ_NUM_CH-1 downto 0); end if; - if (addr = xirq_pending_addr_c) then -- clear pending IRQs + if (bus_req_i.addr(3 downto 2) = "01") then -- clear pending IRQs nclr_pending <= bus_req_i.data(XIRQ_NUM_CH-1 downto 0); -- set zero to clear pending IRQ end if; end if; @@ -132,13 +117,13 @@ begin read_access: process(clk_i) begin if rising_edge(clk_i) then - bus_rsp_o.ack <= rden or wren; -- bus handshake + bus_rsp_o.ack <= bus_req_i.re or bus_req_i.we; -- bus handshake bus_rsp_o.data <= (others => '0'); - if (rden = '1') then - case addr is - when xirq_enable_addr_c => bus_rsp_o.data(XIRQ_NUM_CH-1 downto 0) <= irq_enable; -- channel-enable - when xirq_pending_addr_c => bus_rsp_o.data(XIRQ_NUM_CH-1 downto 0) <= irq_pending; -- pending IRQs - when others => bus_rsp_o.data(4 downto 0) <= irq_source; -- IRQ source + if (bus_req_i.re = '1') then + case bus_req_i.addr(3 downto 2) is + when "00" => bus_rsp_o.data(XIRQ_NUM_CH-1 downto 0) <= irq_enable; -- channel-enable + when "01" => bus_rsp_o.data(XIRQ_NUM_CH-1 downto 0) <= irq_pending; -- pending IRQs + when others => bus_rsp_o.data(4 downto 0) <= irq_source; -- IRQ source end case; end if; end if; @@ -222,7 +207,7 @@ begin cpu_irq_o <= '1'; irq_active <= '1'; end if; - elsif (wren = '1') and (addr = xirq_source_addr_c) then -- acknowledge on write access + elsif (bus_req_i.we = '1') and (bus_req_i.addr(3 downto 2) = "10") then -- acknowledge on write access irq_active <= '0'; end if; end if; From cf74b30511f7ea69bfe6be1ef25f3f4b56540617 Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Sat, 15 Jul 2023 20:41:30 +0200 Subject: [PATCH 09/31] [icache] add uncached accesses --- rtl/core/neorv32_icache.vhd | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/rtl/core/neorv32_icache.vhd b/rtl/core/neorv32_icache.vhd index 718b2e136..ed4739c70 100644 --- a/rtl/core/neorv32_icache.vhd +++ b/rtl/core/neorv32_icache.vhd @@ -46,7 +46,8 @@ entity neorv32_icache is generic ( ICACHE_NUM_BLOCKS : natural; -- number of blocks (min 1), has to be a power of 2 ICACHE_BLOCK_SIZE : natural; -- block size in bytes (min 4), has to be a power of 2 - ICACHE_NUM_SETS : natural -- associativity / number of sets (1=direct_mapped), has to be a power of 2 + ICACHE_NUM_SETS : natural; -- associativity / number of sets (1=direct_mapped), has to be a power of 2 + ICACHE_UC_PBEGIN : std_ulogic_vector(3 downto 0) -- begin of uncached address space (page number) ); port ( clk_i : in std_ulogic; -- global clock, rising edge @@ -106,7 +107,7 @@ architecture neorv32_icache_rtl of neorv32_icache is signal cache : cache_if_t; -- control engine -- - type ctrl_engine_state_t is (S_IDLE, S_CLEAR, S_CHECK, S_DOWNLOAD_REQ, S_DOWNLOAD_GET, S_RESYNC); + type ctrl_engine_state_t is (S_IDLE, S_CLEAR, S_CHECK, S_DOWNLOAD_REQ, S_DOWNLOAD_GET, S_DIRECT_REQ, S_DIRECT_GET, S_RESYNC); type ctrl_t is record state : ctrl_engine_state_t; -- current state state_nxt : ctrl_engine_state_t; -- next state @@ -123,7 +124,6 @@ begin -- Sanity Checks -------------------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - -- configuration -- assert not (is_power_of_two_f(ICACHE_NUM_BLOCKS) = false) report "NEORV32 PROCESSOR CONFIG ERROR! i-cache number of blocks has to be a power of 2." severity error; assert not (is_power_of_two_f(ICACHE_BLOCK_SIZE) = false) report @@ -136,6 +136,8 @@ begin "NEORV32 PROCESSOR CONFIG ERROR! i-cache block size has to be >= 4." severity error; assert not ((ICACHE_NUM_SETS = 0) or (ICACHE_NUM_SETS > 2)) report "NEORV32 PROCESSOR CONFIG ERROR! i-cache associativity has to be 1 (direct-mapped) or 2 (2-way set-associative)." severity error; + assert false report + "NEORV32 PROCESSOR CONFIG NOTE: i-cache uncached memory space 0x" & to_hstring32_f(ICACHE_UC_PBEGIN & x"0000000") & "..0xffffffff." severity note; -- Control Engine FSM Sync ---------------------------------------------------------------- @@ -194,16 +196,20 @@ begin when S_IDLE => -- wait for host access request or cache control operation -- ------------------------------------------------------------ + ctrl.addr_reg_nxt <= cpu_req_i.addr; if (ctrl.clear_buf = '1') then -- cache control operation? ctrl.state_nxt <= S_CLEAR; - elsif (cpu_req_i.re = '1') or (ctrl.re_buf = '1') then -- cache access - ctrl.state_nxt <= S_CHECK; + elsif (cpu_req_i.re = '1') or (ctrl.re_buf = '1') then + if (unsigned(cpu_req_i.addr(31 downto 28)) >= unsigned(ICACHE_UC_PBEGIN)) then + ctrl.state_nxt <= S_DIRECT_REQ; -- uncached access + else + ctrl.state_nxt <= S_CHECK; -- cache access + end if; end if; when S_CHECK => -- finalize host access if cache hit -- ------------------------------------------------------------ -- calculate block base address - in case we need to download it -- - ctrl.addr_reg_nxt <= cpu_req_i.addr; ctrl.addr_reg_nxt((cache_offset_size_c+2)-1 downto 2) <= (others => '0'); -- block-aligned ctrl.addr_reg_nxt(1 downto 0) <= "00"; -- word-aligned -- @@ -237,6 +243,23 @@ begin end if; end if; + when S_DIRECT_REQ => -- direct access: request new word + -- ------------------------------------------------------------ + bus_req_o.re <= '1'; -- request new read transfer + ctrl.state_nxt <= S_DIRECT_GET; + + when S_DIRECT_GET => -- direct access: wait for bus response + -- ------------------------------------------------------------ + ctrl.re_buf_nxt <= '0'; + cpu_rsp_o.data <= bus_rsp_i.data; + if (bus_rsp_i.err = '1') then + cpu_rsp_o.err <= '1'; + ctrl.state_nxt <= S_IDLE; + elsif (bus_rsp_i.ack = '1') then + cpu_rsp_o.ack <= '1'; + ctrl.state_nxt <= S_IDLE; + end if; + when S_RESYNC => -- re-sync host/cache access: cache read-latency -- ------------------------------------------------------------ ctrl.state_nxt <= S_CHECK; From bff9bdc305d972574bfc214b7ec6c0f386ec627f Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Sat, 15 Jul 2023 20:42:39 +0200 Subject: [PATCH 10/31] [top] add central IO access switch --- rtl/core/neorv32_intercon.vhd | 164 ++++++++++++++++++++++++++-- rtl/core/neorv32_top.vhd | 194 +++++++++++++++++++++++----------- 2 files changed, 291 insertions(+), 67 deletions(-) diff --git a/rtl/core/neorv32_intercon.vhd b/rtl/core/neorv32_intercon.vhd index 9d1f6bc0a..c7b7a74b0 100644 --- a/rtl/core/neorv32_intercon.vhd +++ b/rtl/core/neorv32_intercon.vhd @@ -1,8 +1,8 @@ -- ################################################################################################# --- # << NEORV32 - 2-to-1 Bus Switch >> # +-- # << NEORV32 - Processor Bus: 2-to-1 Bus Switch >> # -- # ********************************************************************************************* # -- # Allows to access a single bus ("p_bus") by two controller ports. Controller port A ("ca_bus") # ---# has priority over controller port B ("cb_bus"). # +-- # has priority over controller port B ("cb_bus"). # -- # ********************************************************************************************* # -- # BSD 3-Clause License # -- # # @@ -230,7 +230,7 @@ end neorv32_busswitch_rtl; -- ################################################################################################# --- # << NEORV32 - Processor Interconnect >> # +-- # << NEORV32 - Processor Bus: Section Gateway >> # -- # ********************************************************************************************* # -- # Bus gateway to distribute the core's access to the processor's main memory sections: # -- # -> IMEM - internal instruction memory [optional] # @@ -516,11 +516,11 @@ begin end if; else -- bus access in progress keeper.cnt <= std_ulogic_vector(unsigned(keeper.cnt) - 1); - if (int_rsp.ack = '1') then -- normal access termination - keeper.busy <= '0'; - elsif (int_rsp.err = '1') or ((or_reduce_f(keeper.cnt) = '0') and (keeper.halt = '0')) then -- bus error or timeout + if (int_rsp.err = '1') or ((or_reduce_f(keeper.cnt) = '0') and (keeper.halt = '0')) then -- bus error or timeout keeper.err <= '1'; keeper.busy <= '0'; + elsif (int_rsp.ack = '1') then -- normal access termination + keeper.busy <= '0'; end if; end if; end if; @@ -528,3 +528,155 @@ begin end neorv32_gateway_rtl; + + +-- ############################################################################################################################ +-- ############################################################################################################################ + + +-- ################################################################################################# +-- # << NEORV32 - Processor Bus: IO Switch >> # +-- # ********************************************************************************************* # +-- # Simple address decoding switch for the processor's IO/peripheral devices. # +-- # ********************************************************************************************* # +-- # BSD 3-Clause License # +-- # # +-- # Copyright (c) 2023, Stephan Nolting. All rights reserved. # +-- # # +-- # Redistribution and use in source and binary forms, with or without modification, are # +-- # permitted provided that the following conditions are met: # +-- # # +-- # 1. Redistributions of source code must retain the above copyright notice, this list of # +-- # conditions and the following disclaimer. # +-- # # +-- # 2. Redistributions in binary form must reproduce the above copyright notice, this list of # +-- # conditions and the following disclaimer in the documentation and/or other materials # +-- # provided with the distribution. # +-- # # +-- # 3. Neither the name of the copyright holder nor the names of its contributors may be used to # +-- # endorse or promote products derived from this software without specific prior written # +-- # permission. # +-- # # +-- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS # +-- # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # +-- # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # +-- # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # +-- # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # +-- # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED # +-- # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # +-- # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # +-- # OF THE POSSIBILITY OF SUCH DAMAGE. # +-- # ********************************************************************************************* # +-- # The NEORV32 Processor - https://github.com/stnolting/neorv32 (c) Stephan Nolting # +-- ################################################################################################# + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library neorv32; +use neorv32.neorv32_package.all; + +entity io_switch is + generic ( + DEV_SIZE : natural; -- size of a single IO device, has to be a power of two + -- device base addresses -- + DEV_00_BASE : std_ulogic_vector(31 downto 0); + DEV_01_BASE : std_ulogic_vector(31 downto 0); + DEV_02_BASE : std_ulogic_vector(31 downto 0); + DEV_03_BASE : std_ulogic_vector(31 downto 0); + DEV_04_BASE : std_ulogic_vector(31 downto 0); + DEV_05_BASE : std_ulogic_vector(31 downto 0); + DEV_06_BASE : std_ulogic_vector(31 downto 0); + DEV_07_BASE : std_ulogic_vector(31 downto 0); + DEV_08_BASE : std_ulogic_vector(31 downto 0); + DEV_09_BASE : std_ulogic_vector(31 downto 0); + DEV_10_BASE : std_ulogic_vector(31 downto 0); + DEV_11_BASE : std_ulogic_vector(31 downto 0); + DEV_12_BASE : std_ulogic_vector(31 downto 0); + DEV_13_BASE : std_ulogic_vector(31 downto 0); + DEV_14_BASE : std_ulogic_vector(31 downto 0); + DEV_15_BASE : std_ulogic_vector(31 downto 0); + DEV_16_BASE : std_ulogic_vector(31 downto 0); + DEV_17_BASE : std_ulogic_vector(31 downto 0); + DEV_18_BASE : std_ulogic_vector(31 downto 0); + DEV_19_BASE : std_ulogic_vector(31 downto 0); + DEV_20_BASE : std_ulogic_vector(31 downto 0) + ); + port ( + -- host port -- + main_req_i : in bus_req_t; -- host request + main_rsp_o : out bus_rsp_t; -- host response + -- device ports -- + dev_req_o : out bus_req_array_t; + dev_rsp_i : in bus_rsp_array_t + ); +end io_switch; + +architecture io_switch_rtl of io_switch is + + -- module configuration -- + constant num_devs_physical_c : natural := 21; -- actual number of devices + constant num_devs_logical_c : natural := 32; -- logical max number of devices; do not change! + constant lo_c : natural := index_size_f(DEV_SIZE); -- low address boundary bit + constant hi_c : natural := (index_size_f(DEV_SIZE) + index_size_f(num_devs_logical_c)) - 1; -- high address boundary bit + + signal device_sel : std_ulogic_vector(num_devs_physical_c-1 downto 0); -- device select, one-hot + +begin + + -- Device Decoder ------------------------------------------------------------------------- + -- ------------------------------------------------------------------------------------------- + device_sel(00) <= '1' when (main_req_i.addr(hi_c downto lo_c) = DEV_00_BASE(hi_c downto lo_c)) else '0'; + device_sel(01) <= '1' when (main_req_i.addr(hi_c downto lo_c) = DEV_01_BASE(hi_c downto lo_c)) else '0'; + device_sel(02) <= '1' when (main_req_i.addr(hi_c downto lo_c) = DEV_02_BASE(hi_c downto lo_c)) else '0'; + device_sel(03) <= '1' when (main_req_i.addr(hi_c downto lo_c) = DEV_03_BASE(hi_c downto lo_c)) else '0'; + device_sel(04) <= '1' when (main_req_i.addr(hi_c downto lo_c) = DEV_04_BASE(hi_c downto lo_c)) else '0'; + device_sel(05) <= '1' when (main_req_i.addr(hi_c downto lo_c) = DEV_05_BASE(hi_c downto lo_c)) else '0'; + device_sel(06) <= '1' when (main_req_i.addr(hi_c downto lo_c) = DEV_06_BASE(hi_c downto lo_c)) else '0'; + device_sel(07) <= '1' when (main_req_i.addr(hi_c downto lo_c) = DEV_07_BASE(hi_c downto lo_c)) else '0'; + device_sel(08) <= '1' when (main_req_i.addr(hi_c downto lo_c) = DEV_08_BASE(hi_c downto lo_c)) else '0'; + device_sel(09) <= '1' when (main_req_i.addr(hi_c downto lo_c) = DEV_09_BASE(hi_c downto lo_c)) else '0'; + device_sel(10) <= '1' when (main_req_i.addr(hi_c downto lo_c) = DEV_10_BASE(hi_c downto lo_c)) else '0'; + device_sel(11) <= '1' when (main_req_i.addr(hi_c downto lo_c) = DEV_11_BASE(hi_c downto lo_c)) else '0'; + device_sel(12) <= '1' when (main_req_i.addr(hi_c downto lo_c) = DEV_12_BASE(hi_c downto lo_c)) else '0'; + device_sel(13) <= '1' when (main_req_i.addr(hi_c downto lo_c) = DEV_13_BASE(hi_c downto lo_c)) else '0'; + device_sel(14) <= '1' when (main_req_i.addr(hi_c downto lo_c) = DEV_14_BASE(hi_c downto lo_c)) else '0'; + device_sel(15) <= '1' when (main_req_i.addr(hi_c downto lo_c) = DEV_15_BASE(hi_c downto lo_c)) else '0'; + device_sel(16) <= '1' when (main_req_i.addr(hi_c downto lo_c) = DEV_16_BASE(hi_c downto lo_c)) else '0'; + device_sel(17) <= '1' when (main_req_i.addr(hi_c downto lo_c) = DEV_17_BASE(hi_c downto lo_c)) else '0'; + device_sel(18) <= '1' when (main_req_i.addr(hi_c downto lo_c) = DEV_18_BASE(hi_c downto lo_c)) else '0'; + device_sel(19) <= '1' when (main_req_i.addr(hi_c downto lo_c) = DEV_19_BASE(hi_c downto lo_c)) else '0'; + device_sel(20) <= '1' when (main_req_i.addr(hi_c downto lo_c) = DEV_20_BASE(hi_c downto lo_c)) else '0'; + + + -- Device Requests ------------------------------------------------------------------------ + -- ------------------------------------------------------------------------------------------- + request_gen: + for i in 0 to (num_devs_physical_c-1) generate + dev_req_o(i).addr <= main_req_i.addr; + dev_req_o(i).data <= main_req_i.data; + dev_req_o(i).ben <= main_req_i.ben; + dev_req_o(i).we <= main_req_i.we and device_sel(i); + dev_req_o(i).re <= main_req_i.re and device_sel(i); + dev_req_o(i).src <= main_req_i.src; + dev_req_o(i).priv <= main_req_i.priv; + end generate; + + + -- Global Response ------------------------------------------------------------------------ + -- ------------------------------------------------------------------------------------------- + bus_response: process(dev_rsp_i) + variable tmp_v : bus_rsp_t; + begin + tmp_v := rsp_terminate_c; -- start with with all-zero + for i in 0 to (num_devs_physical_c-1) loop -- OR all response signals + tmp_v.data := tmp_v.data or dev_rsp_i(i).data; + tmp_v.ack := tmp_v.ack or dev_rsp_i(i).ack; + tmp_v.err := tmp_v.err or dev_rsp_i(i).err; + end loop; + main_rsp_o <= tmp_v; + end process; + + +end io_switch_rtl; diff --git a/rtl/core/neorv32_top.vhd b/rtl/core/neorv32_top.vhd index 1b50dbac4..f7a47f2df 100644 --- a/rtl/core/neorv32_top.vhd +++ b/rtl/core/neorv32_top.vhd @@ -250,8 +250,9 @@ end neorv32_top; architecture neorv32_top_rtl of neorv32_top is - -- CPU boot configuration -- - constant cpu_boot_addr_c : std_ulogic_vector(31 downto 0) := cond_sel_stdulogicvector_f(INT_BOOTLOADER_EN, boot_rom_base_c, ispace_base_c); + -- auto-configuration -- + constant cpu_boot_addr_c : std_ulogic_vector(31 downto 0) := cond_sel_stdulogicvector_f(INT_BOOTLOADER_EN, mem_boot_base_c, mem_ispace_base_c); + constant io_reg_buf_en_c : boolean := ICACHE_EN or DCACHE_EN; -- reset generator -- signal rstn_ext_sreg, rstn_int_sreg : std_ulogic_vector(3 downto 0); @@ -288,10 +289,9 @@ architecture neorv32_top_rtl of neorv32_top is signal dmi : dmi_t; -- debug core interface (DCI) -- - signal dci_ndmrstn : std_ulogic; - signal dci_halt_req : std_ulogic; + signal dci_ndmrstn, dci_halt_req : std_ulogic; - -- core complex -- + -- bus: core complex -- signal cpu_i_req, cpu_d_req : bus_req_t; -- CPU core signal cpu_i_rsp, cpu_d_rsp : bus_rsp_t; -- CPU core signal icache_req, dcache_req : bus_req_t; -- CPU caches @@ -299,18 +299,23 @@ architecture neorv32_top_rtl of neorv32_top is signal core_req : bus_req_t; -- core complex (CPU + caches) signal core_rsp : bus_rsp_t; -- core complex (CPU + caches) - -- core complex + DMA -- + -- bus: core complex + DMA -- signal main_req, dma_req : bus_req_t; -- core complex (CPU + caches + DMA) signal main_rsp, dma_rsp : bus_rsp_t; -- core complex (CPU + caches + DMA) - -- main sections -- + -- bus: main sections -- signal imem_req, dmem_req, xip_req, boot_req, io_req, xbus_req : bus_req_t; signal imem_rsp, dmem_rsp, xip_rsp, boot_rsp, io_rsp, xbus_rsp : bus_rsp_t; - -- IO bus -- - type io_devices_t is (IODEV_GPIO, IODEV_MTIME, IODEV_UART0, IODEV_UART1, IODEV_SPI, IODEV_TWI, IODEV_PWM, IODEV_WDT, IODEV_TRNG, IODEV_CFS, IODEV_NEOLED, - IODEV_SYSINFO, IODEV_OCD, IODEV_XIRQ, IODEV_GPTMR, IODEV_XIP, IODEV_ONEWIRE, IODEV_SDI, IODEV_DMA, IODEV_SLINK, IODEV_CRC); + -- bus: IO devices -- + type io_devices_t is ( + IODEV_OCD, IODEV_SYSINFO, IODEV_NEOLED, IODEV_GPIO, IODEV_WDT, IODEV_TRNG, IODEV_TWI, + IODEV_SPI, IODEV_SDI, IODEV_UART1, IODEV_UART0, IODEV_MTIME, IODEV_XIRQ, IODEV_ONEWIRE, + IODEV_GPTMR, IODEV_PWM, IODEV_XIP, IODEV_CRC, IODEV_DMA, IODEV_SLINK, IODEV_CFS + ); + type io_req_bus_t is array (io_devices_t) of bus_req_t; type io_rsp_bus_t is array (io_devices_t) of bus_rsp_t; + signal io_dev_req : io_req_bus_t; signal io_dev_rsp : io_rsp_bus_t; -- IRQs -- @@ -372,9 +377,9 @@ begin "NEORV32 PROCESSOR CONFIG NOTE: Boot configuration = direct boot from memory (processor-external memory)." severity note; -- memory layout -- - assert not (ispace_base_c /= x"00000000") report + assert not (mem_ispace_base_c /= x"00000000") report "NEORV32 PROCESSOR CONFIG WARNING! Non-default base address for INSTRUCTION ADDRESS SPACE. Make sure this is sync with the software framework." severity warning; - assert not (dspace_base_c /= x"80000000") report + assert not (mem_dspace_base_c /= x"80000000") report "NEORV32 PROCESSOR CONFIG WARNING! Non-default base address for DATA ADDRESS SPACE. Make sure this is sync with the software framework." severity warning; -- on-chip debugger -- @@ -391,7 +396,7 @@ begin -- ************************************************************************************************************************** -- Clock and Reset Generators -- ************************************************************************************************************************** - generators_inst: + generators: if (true) generate -- Reset Generator ------------------------------------------------------------------------ @@ -452,7 +457,7 @@ begin clk_gen_en <= cg_en.wdt or cg_en.uart0 or cg_en.uart1 or cg_en.spi or cg_en.twi or cg_en.pwm or cg_en.cfs or cg_en.neoled or cg_en.gptmr or cg_en.xip or cg_en.onewire; - end generate; -- /generators_inst + end generate; -- /generators -- ************************************************************************************************************************** @@ -550,7 +555,8 @@ begin generic map ( ICACHE_NUM_BLOCKS => ICACHE_NUM_BLOCKS, ICACHE_BLOCK_SIZE => ICACHE_BLOCK_SIZE, - ICACHE_NUM_SETS => ICACHE_ASSOCIATIVITY + ICACHE_NUM_SETS => ICACHE_ASSOCIATIVITY, + ICACHE_UC_PBEGIN => uncached_begin_c(31 downto 28) ) port map ( clk_i => clk_i, @@ -578,7 +584,7 @@ begin generic map ( DCACHE_NUM_BLOCKS => DCACHE_NUM_BLOCKS, DCACHE_BLOCK_SIZE => DCACHE_BLOCK_SIZE, - DCACHE_UC_PBEGIN => "1111" + DCACHE_UC_PBEGIN => uncached_begin_c(31 downto 28) ) port map ( clk_i => clk_i, @@ -631,7 +637,7 @@ begin port map ( clk_i => clk_i, rstn_i => rstn_int, - bus_req_i => io_req, + bus_req_i => io_dev_req(IODEV_DMA), bus_rsp_o => io_dev_rsp(IODEV_DMA), dma_req_o => dma_req, dma_rsp_i => dma_rsp, @@ -669,34 +675,33 @@ begin -- ************************************************************************************************************************** - -- Bus System - Section Gateway + -- Address Region Gateway -- ************************************************************************************************************************** - neorv32_gateway_inst: entity neorv32.neorv32_gateway generic map ( TIMEOUT => max_proc_int_response_time_c, -- IMEM port -- IMEM_ENABLE => MEM_INT_IMEM_EN, - IMEM_BASE => imem_base_c, + IMEM_BASE => mem_ispace_base_c, IMEM_SIZE => MEM_INT_IMEM_SIZE, -- DMEM port -- DMEM_ENABLE => MEM_INT_DMEM_EN, - DMEM_BASE => dmem_base_c, + DMEM_BASE => mem_dspace_base_c, DMEM_SIZE => MEM_INT_DMEM_SIZE, -- XIP port -- XIP_ENABLE => IO_XIP_EN, - XIP_BASE => x"E0000000", - XIP_SIZE => 256*1024*1024, + XIP_BASE => mem_xip_base_c, + XIP_SIZE => mem_xip_size_c, -- BOOT ROM port -- BOOT_ENABLE => INT_BOOTLOADER_EN, - BOOT_BASE => boot_rom_base_c, - BOOT_SIZE => boot_rom_max_size_c, + BOOT_BASE => mem_boot_base_c, + BOOT_SIZE => mem_boot_size_c, -- IO port -- IO_ENABLE => true, - IO_REQ_REG => false, - IO_RSP_REG => false, - IO_BASE => io_base_c, - IO_SIZE => io_size_c, + IO_REQ_REG => io_reg_buf_en_c, + IO_RSP_REG => io_reg_buf_en_c, + IO_BASE => mem_io_base_c, + IO_SIZE => mem_io_size_c, -- EXT port -- EXT_ENABLE => MEM_EXT_EN ) @@ -799,7 +804,7 @@ begin -- global control -- clk_i => clk_i, rstn_i => rstn_int, - bus_req_i => io_req, + bus_req_i => io_dev_req(IODEV_XIP), bus_rsp_o => io_dev_rsp(IODEV_XIP), xip_req_i => xip_req, xip_rsp_o => xip_rsp, @@ -875,19 +880,83 @@ begin io_system: if (true) generate - -- Global IO Response Bus ----------------------------------------------------------------- + -- IO Switch ------------------------------------------------------------------------------ -- ------------------------------------------------------------------------------------------- - bus_response: process(io_dev_rsp) - variable tmp_v : bus_rsp_t; - begin - tmp_v := rsp_terminate_c; - for i in io_dev_rsp'range loop -- OR all response signals - tmp_v.data := tmp_v.data or io_dev_rsp(i).data; - tmp_v.ack := tmp_v.ack or io_dev_rsp(i).ack; - tmp_v.err := tmp_v.err or io_dev_rsp(i).err; - end loop; - io_rsp <= tmp_v; - end process; + io_switch_inst: entity neorv32.io_switch + generic map ( + DEV_SIZE => iodev_size_c, -- size of a single IO device, has to be a power of two + -- device base addresses -- + DEV_00_BASE => base_io_dm_c, + DEV_01_BASE => base_io_sysinfo_c, + DEV_02_BASE => base_io_neoled_c, + DEV_03_BASE => base_io_gpio_c, + DEV_04_BASE => base_io_wdt_c, + DEV_05_BASE => base_io_trng_c, + DEV_06_BASE => base_io_twi_c, + DEV_07_BASE => base_io_spi_c, + DEV_08_BASE => base_io_sdi_c, + DEV_09_BASE => base_io_uart1_c, + DEV_10_BASE => base_io_uart0_c, + DEV_11_BASE => base_io_mtime_c, + DEV_12_BASE => base_io_xirq_c, + DEV_13_BASE => base_io_onewire_c, + DEV_14_BASE => base_io_gptmr_c, + DEV_15_BASE => base_io_pwm_c, + DEV_16_BASE => base_io_xip_c, + DEV_17_BASE => base_io_crc_c, + DEV_18_BASE => base_io_dma_c, + DEV_19_BASE => base_io_slink_c, + DEV_20_BASE => base_io_cfs_c + ) + port map ( + -- host port -- + main_req_i => io_req, + main_rsp_o => io_rsp, + -- device ports -- + dev_req_o(00) => io_dev_req(IODEV_OCD), + dev_req_o(01) => io_dev_req(IODEV_SYSINFO), + dev_req_o(02) => io_dev_req(IODEV_NEOLED), + dev_req_o(03) => io_dev_req(IODEV_GPIO), + dev_req_o(04) => io_dev_req(IODEV_WDT), + dev_req_o(05) => io_dev_req(IODEV_TRNG), + dev_req_o(06) => io_dev_req(IODEV_TWI), + dev_req_o(07) => io_dev_req(IODEV_SPI), + dev_req_o(08) => io_dev_req(IODEV_SDI), + dev_req_o(09) => io_dev_req(IODEV_UART1), + dev_req_o(10) => io_dev_req(IODEV_UART0), + dev_req_o(11) => io_dev_req(IODEV_MTIME), + dev_req_o(12) => io_dev_req(IODEV_XIRQ), + dev_req_o(13) => io_dev_req(IODEV_ONEWIRE), + dev_req_o(14) => io_dev_req(IODEV_GPTMR), + dev_req_o(15) => io_dev_req(IODEV_PWM), + dev_req_o(16) => io_dev_req(IODEV_XIP), + dev_req_o(17) => io_dev_req(IODEV_CRC), + dev_req_o(18) => io_dev_req(IODEV_DMA), + dev_req_o(19) => io_dev_req(IODEV_SLINK), + dev_req_o(20) => io_dev_req(IODEV_CFS), + -- + dev_rsp_i(00) => io_dev_rsp(IODEV_OCD), + dev_rsp_i(01) => io_dev_rsp(IODEV_SYSINFO), + dev_rsp_i(02) => io_dev_rsp(IODEV_NEOLED), + dev_rsp_i(03) => io_dev_rsp(IODEV_GPIO), + dev_rsp_i(04) => io_dev_rsp(IODEV_WDT), + dev_rsp_i(05) => io_dev_rsp(IODEV_TRNG), + dev_rsp_i(06) => io_dev_rsp(IODEV_TWI), + dev_rsp_i(07) => io_dev_rsp(IODEV_SPI), + dev_rsp_i(08) => io_dev_rsp(IODEV_SDI), + dev_rsp_i(09) => io_dev_rsp(IODEV_UART1), + dev_rsp_i(10) => io_dev_rsp(IODEV_UART0), + dev_rsp_i(11) => io_dev_rsp(IODEV_MTIME), + dev_rsp_i(12) => io_dev_rsp(IODEV_XIRQ), + dev_rsp_i(13) => io_dev_rsp(IODEV_ONEWIRE), + dev_rsp_i(14) => io_dev_rsp(IODEV_GPTMR), + dev_rsp_i(15) => io_dev_rsp(IODEV_PWM), + dev_rsp_i(16) => io_dev_rsp(IODEV_XIP), + dev_rsp_i(17) => io_dev_rsp(IODEV_CRC), + dev_rsp_i(18) => io_dev_rsp(IODEV_DMA), + dev_rsp_i(19) => io_dev_rsp(IODEV_SLINK), + dev_rsp_i(20) => io_dev_rsp(IODEV_CFS) + ); -- Custom Functions Subsystem (CFS) ------------------------------------------------------- @@ -903,7 +972,7 @@ begin port map ( clk_i => clk_i, rstn_i => rstn_int, - bus_req_i => io_req, + bus_req_i => io_dev_req(IODEV_CFS), bus_rsp_o => io_dev_rsp(IODEV_CFS), clkgen_en_o => cg_en.cfs, clkgen_i => clk_gen, @@ -933,7 +1002,7 @@ begin port map ( clk_i => clk_i, rstn_i => rstn_int, - bus_req_i => io_req, + bus_req_i => io_dev_req(IODEV_SDI), bus_rsp_o => io_dev_rsp(IODEV_SDI), sdi_csn_i => sdi_csn_i, sdi_clk_i => sdi_clk_i, @@ -963,7 +1032,7 @@ begin -- host access -- clk_i => clk_i, rstn_i => rstn_int, - bus_req_i => io_req, + bus_req_i => io_dev_req(IODEV_GPIO), bus_rsp_o => io_dev_rsp(IODEV_GPIO), gpio_o => gpio_o, gpio_i => gpio_i @@ -986,7 +1055,7 @@ begin clk_i => clk_i, rstn_ext_i => rstn_ext, rstn_int_i => rstn_int, - bus_req_i => io_req, + bus_req_i => io_dev_req(IODEV_WDT), bus_rsp_o => io_dev_rsp(IODEV_WDT), cpu_debug_i => cpu_debug, cpu_sleep_i => cpu_sleep, @@ -1014,7 +1083,7 @@ begin port map ( clk_i => clk_i, rstn_i => rstn_int, - bus_req_i => io_req, + bus_req_i => io_dev_req(IODEV_MTIME), bus_rsp_o => io_dev_rsp(IODEV_MTIME), irq_o => mtime_irq ); @@ -1040,7 +1109,7 @@ begin port map ( clk_i => clk_i, rstn_i => rstn_int, - bus_req_i => io_req, + bus_req_i => io_dev_req(IODEV_UART0), bus_rsp_o => io_dev_rsp(IODEV_UART0), clkgen_en_o => cg_en.uart0, clkgen_i => clk_gen, @@ -1077,7 +1146,7 @@ begin port map ( clk_i => clk_i, rstn_i => rstn_int, - bus_req_i => io_req, + bus_req_i => io_dev_req(IODEV_UART1), bus_rsp_o => io_dev_rsp(IODEV_UART1), clkgen_en_o => cg_en.uart1, clkgen_i => clk_gen, @@ -1112,7 +1181,7 @@ begin port map ( clk_i => clk_i, rstn_i => rstn_int, - bus_req_i => io_req, + bus_req_i => io_dev_req(IODEV_SPI), bus_rsp_o => io_dev_rsp(IODEV_SPI), clkgen_en_o => cg_en.spi, clkgen_i => clk_gen, @@ -1143,7 +1212,7 @@ begin port map ( clk_i => clk_i, rstn_i => rstn_int, - bus_req_i => io_req, + bus_req_i => io_dev_req(IODEV_TWI), bus_rsp_o => io_dev_rsp(IODEV_TWI), clkgen_en_o => cg_en.twi, clkgen_i => clk_gen, @@ -1176,7 +1245,7 @@ begin port map ( clk_i => clk_i, rstn_i => rstn_int, - bus_req_i => io_req, + bus_req_i => io_dev_req(IODEV_PWM), bus_rsp_o => io_dev_rsp(IODEV_PWM), clkgen_en_o => cg_en.pwm, clkgen_i => clk_gen, @@ -1203,7 +1272,7 @@ begin port map ( clk_i => clk_i, rstn_i => rstn_int, - bus_req_i => io_req, + bus_req_i => io_dev_req(IODEV_TRNG), bus_rsp_o => io_dev_rsp(IODEV_TRNG), irq_o => firq.trng ); @@ -1227,7 +1296,7 @@ begin port map ( clk_i => clk_i, rstn_i => rstn_int, - bus_req_i => io_req, + bus_req_i => io_dev_req(IODEV_NEOLED), bus_rsp_o => io_dev_rsp(IODEV_NEOLED), clkgen_en_o => cg_en.neoled, clkgen_i => clk_gen, @@ -1259,7 +1328,7 @@ begin -- host access -- clk_i => clk_i, rstn_i => rstn_int, - bus_req_i => io_req, + bus_req_i => io_dev_req(IODEV_XIRQ), bus_rsp_o => io_dev_rsp(IODEV_XIRQ), xirq_i => xirq_i, cpu_irq_o => firq.xirq @@ -1281,7 +1350,7 @@ begin port map ( clk_i => clk_i, rstn_i => rstn_int, - bus_req_i => io_req, + bus_req_i => io_dev_req(IODEV_GPTMR), bus_rsp_o => io_dev_rsp(IODEV_GPTMR), clkgen_en_o => cg_en.gptmr, clkgen_i => clk_gen, @@ -1305,7 +1374,7 @@ begin port map ( clk_i => clk_i, rstn_i => rstn_int, - bus_req_i => io_req, + bus_req_i => io_dev_req(IODEV_ONEWIRE), bus_rsp_o => io_dev_rsp(IODEV_ONEWIRE), clkgen_en_o => cg_en.onewire, clkgen_i => clk_gen, @@ -1337,7 +1406,7 @@ begin -- Host access -- clk_i => clk_i, rstn_i => rstn_int, - bus_req_i => io_req, + bus_req_i => io_dev_req(IODEV_SLINK), bus_rsp_o => io_dev_rsp(IODEV_SLINK), irq_o => firq.slink, -- RX stream interface -- @@ -1369,7 +1438,7 @@ begin port map ( clk_i => clk_i, rstn_i => rstn_int, - bus_req_i => io_req, + bus_req_i => io_dev_req(IODEV_CRC), bus_rsp_o => io_dev_rsp(IODEV_CRC) ); end generate; @@ -1433,7 +1502,7 @@ begin ) port map ( clk_i => clk_i, - bus_req_i => io_req, + bus_req_i => io_dev_req(IODEV_SYSINFO), bus_rsp_o => io_dev_rsp(IODEV_SYSINFO) ); @@ -1479,6 +1548,9 @@ begin -- On-Chip Debugger - Debug Module (DM) --------------------------------------------------- -- ------------------------------------------------------------------------------------------- neorv32_debug_dm_inst: entity neorv32.neorv32_debug_dm + generic map ( + CPU_BASE_ADDR => base_io_dm_c + ) port map ( -- global control -- clk_i => clk_i, @@ -1495,7 +1567,7 @@ begin dmi_rsp_data_o => dmi.rsp_data, dmi_rsp_op_o => dmi.rsp_op, -- CPU bus access -- - bus_req_i => io_req, + bus_req_i => io_dev_req(IODEV_OCD), bus_rsp_o => io_dev_rsp(IODEV_OCD), -- CPU control -- cpu_ndmrstn_o => dci_ndmrstn, From 7ce0f4aeffd270278de40235b1e8017f288f42a8 Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Sat, 15 Jul 2023 20:42:52 +0200 Subject: [PATCH 11/31] minor edits --- rtl/core/neorv32_boot_rom.vhd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtl/core/neorv32_boot_rom.vhd b/rtl/core/neorv32_boot_rom.vhd index a624b2d94..e6b53952e 100644 --- a/rtl/core/neorv32_boot_rom.vhd +++ b/rtl/core/neorv32_boot_rom.vhd @@ -69,8 +69,8 @@ begin assert false report "NEORV32 PROCESSOR CONFIG NOTE: Implementing internal bootloader ROM (" & natural'image(boot_rom_size_c) & " bytes)." severity note; - assert not (boot_rom_size_c > boot_rom_max_size_c) report - "NEORV32 PROCESSOR CONFIG ERROR! Boot ROM size out of range! Max " & natural'image(boot_rom_max_size_c) & " bytes." severity error; + assert not (boot_rom_size_c > mem_boot_size_c) report + "NEORV32 PROCESSOR CONFIG ERROR! Boot ROM size out of range! Max " & natural'image(mem_boot_size_c) & " bytes." severity error; -- Memory Access -------------------------------------------------------------------------- From 2242143f79765ef9959af1e268f3deadd3fcadfb Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Sat, 15 Jul 2023 20:59:25 +0200 Subject: [PATCH 12/31] [mem] minor edits --- rtl/core/mem/neorv32_imem.default.vhd | 4 +--- rtl/core/mem/neorv32_imem.legacy.vhd | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/rtl/core/mem/neorv32_imem.default.vhd b/rtl/core/mem/neorv32_imem.default.vhd index eafcb6a42..5a7613b78 100644 --- a/rtl/core/mem/neorv32_imem.default.vhd +++ b/rtl/core/mem/neorv32_imem.default.vhd @@ -110,9 +110,7 @@ begin mem_access: process(clk_i) begin if rising_edge(clk_i) then - if (bus_req_i.re = '1') then - mem_rom_rd <= mem_rom(to_integer(unsigned(addr))); - end if; + mem_rom_rd <= mem_rom(to_integer(unsigned(addr))); end if; end process mem_access; -- read data -- diff --git a/rtl/core/mem/neorv32_imem.legacy.vhd b/rtl/core/mem/neorv32_imem.legacy.vhd index 12ca8cd52..47ee36d75 100644 --- a/rtl/core/mem/neorv32_imem.legacy.vhd +++ b/rtl/core/mem/neorv32_imem.legacy.vhd @@ -111,9 +111,7 @@ begin mem_access: process(clk_i) begin if rising_edge(clk_i) then - if (bus_req_i.re = '1') then -- reduce switching activity when not accessed - mem_rom_rd <= mem_rom(to_integer(unsigned(addr))); - end if; + mem_rom_rd <= mem_rom(to_integer(unsigned(addr))); end if; end process mem_access; -- read data -- From c49b0f016fbca257bf85025413ddce4c3f606f07 Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Sat, 15 Jul 2023 21:09:36 +0200 Subject: [PATCH 13/31] [docs] add rtl compile order --- docs/datasheet/overview.adoc | 168 +++++++++++++++++++---------------- 1 file changed, 89 insertions(+), 79 deletions(-) diff --git a/docs/datasheet/overview.adoc b/docs/datasheet/overview.adoc index d84f25aa7..a6b6f3017 100644 --- a/docs/datasheet/overview.adoc +++ b/docs/datasheet/overview.adoc @@ -170,63 +170,70 @@ neorv32 - Project home folder All necessary VHDL hardware description files are located in the project's `rtl/core` folder. The top entity of the entire processor including all the required configuration generics is `neorv32_top.vhd`. -.NEORV32 VHDL Library +.Compile Order +[IMPORTANT] +Most of the RTL sources use **entity instantiation**. Hence, the RTL compile order might be relevant. +The list below shows the hierarchical compile order srarting at the top. + +.VHDL Library [IMPORTANT] All core VHDL files from the list below have to be assigned to a new design library named `neorv32`. ................................... -neorv32_top.vhd - NEORV32 Processor top entity + +┌-neorv32_package.vhd - Processor/CPU main VHDL package file +├-neorv32_fifo.vhd - Generic FIFO component +│ +│ ┌-neorv32_cpu_cp_bitmanip.vhd - Bit-manipulation co-processor (B ext.) +│ ├-neorv32_cpu_cp_cfu.vhd - Custom instructions co-processor (Zxcfu ext.) +│ ├-neorv32_cpu_cp_cond.vhd - Conditional operations co-processor (Zicond ext.) +│ ├-neorv32_cpu_cp_fpu.vhd - Floating-point co-processor (Zfinx ext.) +│ ├-neorv32_cpu_cp_shifter.vhd - Bit-shift co-processor (base ISA) +│ ├-neorv32_cpu_cp_muldiv.vhd - Mul/Div co-processor (M ext.) +│ ┌-neorv32_cpu_alu.vhd - Arithmetic/logic unit +│ ├-neorv32_cpu_bus.vhd - Load/store unit + physical memory protection +│ │ ┌-neorv32_cpu_decompressor.vhd - Compressed instructions decoder +│ ├-neorv32_cpu_control.vhd - CPU control, exception system and CSRs +│ ├-neorv32_cpu_regfile.vhd - Data register file +├-neorv32_cpu.vhd - NEORV32 CPU top entity +│ +├-mem/neorv32_dmem.default.vhd - _Default_ data memory (architecture-only) +├-mem/neorv32_imem.default.vhd - _Default_ instruction memory (architecture-only) │ -├neorv32_fifo.vhd - General purpose FIFO component -├neorv32_package.vhd - Processor/CPU main VHDL package file +│ ┌-neorv32_bootloader_image.vhd - Bootloader ROM memory image +├-neorv32_boot_rom.vhd - Bootloader ROM │ -├neorv32_cpu.vhd - NEORV32 CPU top entity -│├neorv32_cpu_alu.vhd - Arithmetic/logic unit -││├neorv32_cpu_cp_bitmanip.vhd - Bit-manipulation co-processor (B ext.) -││├neorv32_cpu_cp_cfu.vhd - Custom instructions co-processor (Zxcfu ext.) -││├neorv32_cpu_cp_cond.vhd - Conditional operations co-processor (Zicond ext.) -││├neorv32_cpu_cp_fpu.vhd - Floating-point co-processor (Zfinx ext.) -││├neorv32_cpu_cp_muldiv.vhd - Mul/Div co-processor (M ext.) -││└neorv32_cpu_cp_shifter.vhd - Bit-shift co-processor (base ISA) -│├neorv32_cpu_bus.vhd - Load/store unit + physical memory protection -│├neorv32_cpu_control.vhd - CPU control, exception system and CSRs -││└neorv32_cpu_decompressor.vhd - Compressed instructions decoder -│└neorv32_cpu_regfile.vhd - Data register file +│ ┌-neor32_application_image.vhd - IMEM application initialization image +├-neorv32_imem.entity.vhd - Processor-internal instruction memory (entity-only!) │ -├neorv32_boot_rom.vhd - Bootloader ROM -│└neorv32_bootloader_image.vhd - Bootloader ROM memory image -├neorv32_busswitch.vhd - Processor bus switch for CPU buses (I&D) -├neorv32_bus_keeper.vhd - Processor-internal bus monitor -├neorv32_cfs.vhd - Custom functions subsystem -├neorv32_crc.vhd - Cyclic redundancy check unit -├neorv32_dcache.vhd - Processor-internal data cache -├neorv32_debug_dm.vhd - on-chip debugger: debug module -├neorv32_debug_dtm.vhd - on-chip debugger: debug transfer module -├neorv32_dma.vhd - Direct memory access controller -├neorv32_dmem.entity.vhd - Processor-internal data memory (entity-only!) -├neorv32_gpio.vhd - General purpose input/output port unit -├neorv32_gptmr.vhd - General purpose 32-bit timer -├neorv32_icache.vhd - Processor-internal instruction cache -├neorv32_imem.entity.vhd - Processor-internal instruction memory (entity-only!) -│└neor32_application_image.vhd - IMEM application initialization image -├neorv32_mtime.vhd - Machine system timer -├neorv32_neoled.vhd - NeoPixel (TM) compatible smart LED interface -├neorv32_onewire.vhd - One-Wire serial interface controller -├neorv32_pwm.vhd - Pulse-width modulation controller -├neorv32_sdi.vhd - Serial data interface controller (SPI device) -├neorv32_slink.vhd - Stream link interface -├neorv32_spi.vhd - Serial peripheral interface controller (SPI host) -├neorv32_sysinfo.vhd - System configuration information memory -├neorv32_trng.vhd - True random number generator -├neorv32_twi.vhd - Two wire serial interface controller -├neorv32_uart.vhd - Universal async. receiver/transmitter -├neorv32_wdt.vhd - Watchdog timer -├neorv32_wishbone.vhd - External (Wishbone) bus interface -├neorv32_xip.vhd - Execute in place module -├neorv32_xirq.vhd - External interrupt controller +├neorv32_cfs.vhd - Custom functions subsystem +├neorv32_crc.vhd - Cyclic redundancy check unit +├neorv32_dcache.vhd - Processor-internal data cache +├neorv32_debug_dm.vhd - on-chip debugger: debug module +├neorv32_debug_dtm.vhd - on-chip debugger: debug transfer module +├neorv32_dma.vhd - Direct memory access controller +├neorv32_dmem.entity.vhd - Processor-internal data memory (entity-only!) +├neorv32_gpio.vhd - General purpose input/output port unit +├neorv32_gptmr.vhd - General purpose 32-bit timer +├neorv32_icache.vhd - Processor-internal instruction cache +├neorv32_intercon.vhd - SoC bus infrastructure +├neorv32_mtime.vhd - Machine system timer +├neorv32_neoled.vhd - NeoPixel (TM) compatible smart LED interface +├neorv32_onewire.vhd - One-Wire serial interface controller +├neorv32_pwm.vhd - Pulse-width modulation controller +├neorv32_sdi.vhd - Serial data interface controller (SPI device) +├neorv32_slink.vhd - Stream link interface +├neorv32_spi.vhd - Serial peripheral interface controller (SPI host) +├neorv32_sysinfo.vhd - System configuration information memory +├neorv32_trng.vhd - True random number generator +├neorv32_twi.vhd - Two wire serial interface controller +├neorv32_uart.vhd - Universal async. receiver/transmitter +├neorv32_wdt.vhd - Watchdog timer +├neorv32_wishbone.vhd - External (Wishbone) bus interface +├neorv32_xip.vhd - Execute in place module +├neorv32_xirq.vhd - External interrupt controller │ -├mem/neorv32_dmem.default.vhd - _Default_ data memory (architecture-only) -└mem/neorv32_imem.default.vhd - _Default_ instruction memory (architecture-only) +neorv32_top.vhd - NEORV32 Processor top entity ................................... [NOTE] @@ -287,7 +294,7 @@ https://stnolting.github.io/neorv32/ug/#_application_specific_processor_configur [cols="<2,<8"] [grid="topbot"] |======================= -| HW version: | `1.6.8.3++` +| HW version: | `1.8.6.4` | Top entity: | `rtl/core/neorv32_top.vhd` | FPGA: | Intel Cyclone IV E `EP4CE22F17C6` | Toolchain: | Quartus Prime Lite 21.1 @@ -298,35 +305,38 @@ https://stnolting.github.io/neorv32/ug/#_application_specific_processor_configur [cols="<2,<8,>1,>1,>2,>1"] [options="header",grid="rows"] |======================= -| Module | Description | LEs | FFs | MEM bits | DSPs -| Boot ROM | Bootloader ROM (4kB) | 3 | 2 | 32768 | 0 -| BUSKEEPER | Processor-internal bus monitor | 28 | 15 | 0 | 0 -| CFS | Custom functions subsystem footnote:[Resource utilization depends on custom design logic.] | - | - | - | - -| CRC | Cyclic redundancy check unit | 135 | 117 | 0 | 0 -| DM | On-chip debugger - debug module | 391 | 220 | 0 | 0 -| DMA | Direct memory access controller | 313 | 257 | 0 | 0 -| DTM | On-chip debugger - debug transfer module (JTAG) | 259 | 221 | 0 | 0 -| DMEM | Processor-internal data memory (8kB) | 18 | 2 | 65536 | 0 -| GPIO | General purpose input/output ports | 102 | 98 | 0 | 0 -| GPTMR | General Purpose Timer | 153 | 105 | 0 | 0 -| iCACHE | Instruction cache (2x4 blocks, 64 bytes per block) | 417 | 294 | 4096 | 0 -| dCACHE | Data cache (4 blocks, 64 bytes per block) | 308 | 167 | 2112 | 0 -| IMEM | Processor-internal instruction memory (16kB) | 12 | 2 | 131072 | 0 -| MTIME | Machine system timer | 345 | 166 | 0 | 0 -| NEOLED | Smart LED Interface (NeoPixel/WS28128) (FIFO_depth=1) | 227 | 184 | 0 | 0 -| ONEWIRE | 1-wire interface | 107 | 77 | 0 | 0 -| PWM | Pulse_width modulation controller (8 channels) | 128 | 117 | 0 | 0 -| SPI | Serial peripheral interface | 114 | 94 | 0 | 0 -| SLINK | Stream link interface (RX/TX FIFO depth=32) | 104 | 73 | 2048 | 0 -| SDI | Serial data interface | 72 | 66 | 0 | 0 -| SYSINFO | System configuration information memory | 13 | 11 | 0 | 0 -| TRNG | True random number generator | 89 | 79 | 0 | 0 -| TWI | Two-wire interface | 77 | 43 | 0 | 0 -| UART0, UART1 | Universal asynchronous receiver/transmitter 0/1 (FIFO_depth=1) | 195 | 143 | 0 | 0 -| WDT | Watchdog timer | 61 | 46 | 0 | 0 -| WISHBONE | External memory interface | 120 | 112 | 0 | 0 -| XIP | Execute in place module | 318 | 244 | 0 | 0 -| XIRQ | External interrupt controller (32 channels) | 245 | 200 | 0 | 0 +| Module | Description | LEs | FFs | MEM bits | DSPs +| BOOT ROM | Bootloader ROM (4kB) | 2 | 2 | 32768 | 0 +| BUSSWITCH (core) | _SoC bus infrastructure_ | 28 | 15 | 0 | 0 +| BUSSWITCH (DMA) | _SoC bus infrastructure_ | 159 | 9 | 0 | 0 +| CFS | Custom functions subsystem footnote:[Resource utilization depends on custom design logic.] | - | - | - | - +| CRC | Cyclic redundancy check unit | 130 | 117 | 0 | 0 +| dCACHE | Data cache (4 blocks, 64 bytes per block) | 300 | 167 | 2112 | 0 +| DM | On-chip debugger - debug module | 377 | 241 | 0 | 0 +| DTM | On-chip debugger - debug transfer module (JTAG) | 262 | 220 | 0 | 0 +| DMA | Direct memory access controller | 365 | 291 | 0 | 0 +| DMEM | Processor-internal data memory (8kB) | 6 | 2 | 65536 | 0 +| Gateway | _SoC bus infrastructure_ | 215 | 91 | 0 | 0 +| GPIO | General purpose input/output ports | 102 | 98 | 0 | 0 +| GPTMR | General Purpose Timer | 150 | 105 | 0 | 0 +| IO Switch | _SoC bus infrastructure_ | 217 | 0 | 0 | 0 +| iCACHE | Instruction cache (2x4 blocks, 64 bytes per block) | 458 | 296 | 4096 | 0 +| IMEM | Processor-internal instruction memory (16kB) | 7 | 2 | 131072 | 0 +| MTIME | Machine system timer | 307 | 166 | 0 | 0 +| NEOLED | Smart LED Interface (NeoPixel/WS28128) (FIFO_depth=1) | 171 | 129 | 0 | 0 +| ONEWIRE | 1-wire interface | 105 | 77 | 0 | 0 +| PWM | Pulse_width modulation controller (4 channels) | 91 | 81 | 0 | 0 +| SDI | Serial data interface | 103 | 77 | 512 | 0 +| SLINK | Stream link interface (RX/TX FIFO depth=32) | 96 | 73 | 2048 | 0 +| SPI | Serial peripheral interface | 137 | 97 | 1024 | 0 +| SYSINFO | System configuration information memory | 11 | 11 | 0 | 0 +| TRNG | True random number generator | 140 | 108 | 512 | 0 +| TWI | Two-wire interface | 93 | 64 | 0 | 0 +| UART0, UART1 | Universal asynchronous receiver/transmitter 0/1 (FIFO_depth=1) | 222 | 142 | 1024 | 0 +| WDT | Watchdog timer | 107 | 89 | 0 | 0 +| WISHBONE | External memory interface | 122 | 112 | 0 | 0 +| XIP | Execute in place module | 369 | 276 | 0 | 0 +| XIRQ | External interrupt controller (4 channels) | 35 | 29 | 0 | 0 |======================= From 725b9e45d437bbb351967cdfb2133dc923e250cb Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Sat, 15 Jul 2023 21:09:49 +0200 Subject: [PATCH 14/31] [CHANGELOG] add v1.8.6.3 --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 16081c463..a1dbaf5b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,7 +33,8 @@ mimpid = 0x01080200 => Version 01.08.02.00 => v1.8.2 | Date (*dd.mm.yyyy*) | Version | Comment | |:-------------------:|:-------:|:--------| -| 14.07.2023 | 1.8.6.3 | :warning: rework SoC bus system & memory map - part 1: add central bus gateways to propagate core accesses to the main address regions | +| 15.07.2023 | 1.8.6.4 | :warning: **rework SoC bus system & memory map - part 2**: move IO address decoding to central IO switch; add i-cache uncached accesses; [#648](https://github.com/stnolting/neorv32/pull/648) | +| 14.07.2023 | 1.8.6.3 | :warning: **rework SoC bus system & memory map - part 1**: add central bus gateways to propagate core accesses to the main address regions; [#648](https://github.com/stnolting/neorv32/pull/648) | | 14.07.2023 | 1.8.6.2 | minor rtl edits; [#646](https://github.com/stnolting/neorv32/pull/646) | | 30.06.2023 | 1.8.6.1 | minor rtl edits, cleanups and optimizations; [#641](https://github.com/stnolting/neorv32/pull/641) | | 27.06.2023 | [**:rocket:1.8.6**](https://github.com/stnolting/neorv32/releases/tag/v1.8.6) | **New release** | From 8a794505446f6674cfdef8e05a310df62aab4612 Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Sat, 15 Jul 2023 21:10:13 +0200 Subject: [PATCH 15/31] update bootloader --- rtl/core/neorv32_bootloader_image.vhd | 700 +++++++++++++------------- sw/bootloader/bootloader.c | 16 +- 2 files changed, 356 insertions(+), 360 deletions(-) diff --git a/rtl/core/neorv32_bootloader_image.vhd b/rtl/core/neorv32_bootloader_image.vhd index 21b947905..2f680eeec 100644 --- a/rtl/core/neorv32_bootloader_image.vhd +++ b/rtl/core/neorv32_bootloader_image.vhd @@ -1,8 +1,8 @@ -- The NEORV32 RISC-V Processor: https://github.com/stnolting/neorv32 -- Auto-generated memory initialization file (for BOOTLOADER) from source file --- Size: 4064 bytes +-- Size: 4088 bytes -- MARCH: default --- Built: 02.06.2023 11:53:49 +-- Built: 15.07.2023 18:35:31 -- prototype defined in 'neorv32_package.vhd' package body neorv32_bootloader_image is @@ -13,9 +13,9 @@ x"30401073", x"00000097", x"0e008093", x"30509073", -x"80010117", +x"80004117", x"1e810113", -x"80010197", +x"80004197", x"7e418193", x"00000213", x"00000293", @@ -40,10 +40,10 @@ x"00000e93", x"00000f13", x"00000f93", x"00001597", -x"f6458593", -x"80010617", +x"f7c58593", +x"80004617", x"f7c60613", -x"80010697", +x"80004697", x"f7468693", x"00c58e63", x"00d65c63", @@ -52,7 +52,7 @@ x"00e62023", x"00458593", x"00460613", x"fedff06f", -x"80010717", +x"80004717", x"f5070713", x"80818793", x"00f75863", @@ -91,7 +91,7 @@ x"800004b7", x"0004a223", x"800007b7", x"0007a023", -x"ffff17b7", +x"ffffd7b7", x"04112623", x"04812423", x"05212023", @@ -104,282 +104,291 @@ x"03812423", x"03912223", x"03a12023", x"01b12e23", -x"a3478793", +x"a6c78793", x"30579073", -x"fe802783", +x"e0802783", x"00080737", x"00e7f7b3", x"00078863", -x"fa002423", +x"80002023", x"10100793", -x"faf02423", -x"fe802783", +x"80f02023", +x"e0802783", x"40000737", x"00e7f7b3", -x"06078863", -x"f4002023", -x"f4002423", -x"000067b7", -x"f4002623", -x"20578793", -x"f4f02023", -x"f4002423", -x"f4002623", -x"f4002783", -x"00e7f7b3", -x"fe079ce3", -x"f4002783", -x"02000737", -x"00e7e7b3", -x"f4f02023", -x"f4002783", -x"08000737", -x"00e7e7b3", -x"f4f02023", -x"f4002783", -x"fe1fe737", -x"43f70713", -x"00e7f7b3", -x"00801737", -x"60070713", -x"00e7e7b3", -x"f4f02023", -x"fe802783", +x"06078e63", +x"fffff737", +x"f0072023", +x"f0072423", +x"000066b7", +x"f0072623", +x"20568693", +x"f0d72023", +x"f0072423", +x"f0072623", +x"fffff7b7", +x"400006b7", +x"f007a703", +x"00d77733", +x"fe071ce3", +x"f007a703", +x"002006b7", +x"00d76733", +x"f0e7a023", +x"f007a703", +x"008006b7", +x"00d76733", +x"f0e7a023", +x"f007a703", +x"ffffe6b7", +x"43f68693", +x"00d77733", +x"000016b7", +x"60068693", +x"00d76733", +x"f0e7a023", +x"e0802783", x"00010737", x"00e7f7b3", x"00078863", x"00100793", -x"fcf02423", -x"fc002623", -x"fa002023", -x"fe002683", +x"c0f02423", +x"c0002623", +x"fffff7b7", +x"5007a023", +x"e0002683", x"00009737", x"ffff7637", x"00000793", x"5ff70713", x"a0060613", -x"20d76263", +x"20d76863", x"00000713", x"3fe00613", -x"20f66263", +x"20f66863", x"fff78793", x"000106b7", -x"00679793", x"fff68693", +x"00679793", x"00371713", -x"01877713", x"00d7f7b3", +x"01877713", x"00e7e7b3", x"0017e793", -x"faf02023", -x"fe802783", -x"00020737", -x"00e7f7b3", -x"02078663", -x"f8002823", -x"f8002a23", -x"fe002783", -x"0027d793", -x"f8f02c23", -x"f8002e23", +x"fffff737", +x"50f72023", +x"e0802783", +x"000206b7", +x"00d7f7b3", +x"02078863", +x"40072023", +x"40072223", +x"40070793", +x"e0002703", +x"00275713", +x"00e7a423", +x"0007a623", x"08000793", x"30479073", x"00800793", x"3007a073", -x"ffff1537", -x"dd850513", -x"6b0000ef", +x"ffffd537", +x"e0450513", +x"6d0000ef", x"f1302573", -x"634000ef", -x"ffff1537", -x"e1050513", -x"69c000ef", -x"fe402503", -x"620000ef", -x"ffff1537", -x"e1850513", -x"688000ef", -x"fe002503", -x"60c000ef", -x"ffff1537", -x"e2050513", -x"674000ef", +x"654000ef", +x"ffffd537", +x"e3c50513", +x"6bc000ef", +x"e0402503", +x"640000ef", +x"ffffd537", +x"e4450513", +x"6a8000ef", +x"e0002503", +x"62c000ef", +x"ffffd537", +x"e4c50513", +x"694000ef", x"30102573", -x"5f8000ef", -x"ffff1537", -x"e2850513", -x"660000ef", +x"618000ef", +x"ffffd537", +x"e5450513", +x"680000ef", x"fc002573", -x"5e4000ef", -x"ffff1537", -x"e3050513", -x"64c000ef", -x"fe802503", -x"ffff1437", -x"ffff1937", -x"5c8000ef", -x"ffff1537", -x"e3850513", -x"630000ef", -x"ff802503", -x"5b4000ef", -x"e4040513", -x"620000ef", -x"ff002503", -x"5a4000ef", -x"ffff1537", -x"e4c50513", +x"604000ef", +x"ffffd537", +x"e5c50513", +x"66c000ef", +x"e0802503", +x"ffffd437", +x"ffffd937", +x"5e8000ef", +x"ffffd537", +x"e6450513", +x"650000ef", +x"e1802503", +x"5d4000ef", +x"e6c40513", +x"640000ef", +x"e1002503", +x"5c4000ef", +x"ffffd537", +x"e7850513", +x"62c000ef", +x"e1c02503", +x"5b0000ef", +x"e6c40513", +x"61c000ef", +x"e1402503", +x"5a0000ef", +x"e0090513", x"60c000ef", -x"ffc02503", -x"590000ef", -x"e4040513", -x"5fc000ef", -x"ff402503", -x"580000ef", -x"dd490513", -x"5ec000ef", -x"fe802783", +x"e0802783", x"00020737", x"00e7f7b3", -x"04078c63", -x"ffff1537", -x"e5450513", -x"5d0000ef", -x"2bc000ef", -x"fe002403", -x"00040a37", -x"00010ab7", +x"04078e63", +x"ffffd537", +x"e8050513", +x"5f0000ef", +x"2c8000ef", +x"e0002403", +x"00040ab7", +x"fffffa37", x"00341413", x"00a409b3", x"0089b433", x"00b40433", -x"fe802783", -x"0147f7b3", -x"0a078663", -x"fa002783", +x"00010b37", +x"e0802783", x"0157f7b3", +x"0a078663", +x"500a2783", +x"0167f7b3", x"0a078063", -x"ffff1537", -x"fa402783", -x"e8050513", -x"588000ef", -x"ffff1a37", -x"e8ca0513", +x"ffffd537", +x"504a2783", +x"eac50513", +x"5a4000ef", +x"ffffda37", +x"eb8a0513", +x"598000ef", +x"fffffab7", +x"06c00b13", +x"07800c13", +x"07300c93", +x"ffffd7b7", +x"f3878513", x"57c000ef", -x"06c00a93", -x"07800b93", -x"07300c13", -x"06500c93", -x"ffff17b7", -x"f0c78513", -x"560000ef", -x"fa002783", -x"00010737", -x"00e7f7b3", +x"500aa783", +x"000106b7", +x"00d7f7b3", x"fe078ae3", -x"fa402403", +x"504aa403", x"0ff47413", x"00040513", -x"4b4000ef", -x"dd490513", -x"538000ef", +x"4cc000ef", +x"e0090513", +x"554000ef", x"07200793", x"06f41063", -x"ffff02b7", +x"ffffc2b7", x"00028067", x"00c686b3", x"00178793", -x"df5ff06f", +x"de9ff06f", x"ffe70693", x"ffd6f693", x"00069863", x"0037d793", x"00170713", -x"de9ff06f", +x"dddff06f", x"0017d793", x"ff5ff06f", -x"1e8000ef", +x"1f0000ef", x"f485e4e3", x"00b41463", x"f53560e3", x"00100513", -x"718000ef", -x"dd490513", -x"4dc000ef", +x"738000ef", +x"e0090513", +x"4f8000ef", x"00000513", -x"069000ef", -x"19540863", -x"028ae463", -x"19940863", +x"089000ef", +x"19640c63", +x"028b6663", +x"06500793", +x"18f40a63", x"06800793", -x"e8ca0513", +x"eb8a0513", x"02f40c63", x"03f00793", -x"18f40c63", -x"ffff1537", -x"fb050513", +x"18f40e63", +x"ffffd537", +x"fc850513", x"0240006f", x"07500793", x"02f40263", -x"17740c63", -x"ff8414e3", +x"17840e63", +x"ff9414e3", x"0044a403", x"02041063", -x"ffff1537", -x"f1450513", -x"484000ef", -x"f19ff06f", +x"ffffd537", +x"f4050513", +x"49c000ef", +x"f15ff06f", x"00000513", -x"6ac000ef", -x"f0dff06f", -x"ffff1537", -x"f3050513", -x"468000ef", +x"6c8000ef", +x"f09ff06f", +x"ffffd537", +x"f5c50513", +x"480000ef", x"00040513", -x"3ec000ef", -x"ffff1537", -x"f3850513", -x"454000ef", +x"404000ef", +x"ffffd537", +x"f6450513", +x"46c000ef", x"00400537", -x"3d8000ef", -x"ffff1537", -x"f5050513", -x"440000ef", -x"00010737", -x"fa002783", -x"00e7f7b3", +x"3f0000ef", +x"ffffd537", +x"f7c50513", +x"458000ef", +x"fffff737", +x"00010637", +x"50072783", +x"00c7f7b3", x"fe078ce3", -x"fa402983", +x"50472983", x"0ff9f993", x"00098513", -x"394000ef", +x"3a4000ef", x"07900793", -x"eaf998e3", -x"2a0000ef", +x"eaf994e3", +x"2b0000ef", x"00050663", x"00300513", -x"460000ef", -x"ffff1537", -x"f5c50513", -x"3fc000ef", -x"01045b13", +x"474000ef", +x"ffffd537", +x"f8850513", +x"410000ef", +x"01045b93", x"004009b7", x"00010db7", x"fff00d13", -x"220000ef", -x"150000ef", +x"230000ef", +x"154000ef", x"0d800513", -x"0f4000ef", +x"0f8000ef", x"00098513", -x"104000ef", -x"0d4000ef", -x"224000ef", +x"108000ef", +x"0d8000ef", +x"234000ef", x"00157513", x"fe051ce3", -x"fffb0b13", +x"fffb8b93", x"01b989b3", -x"fdab18e3", -x"ff002683", +x"fdab98e3", +x"e1002683", x"004009b7", x"00000d13", x"00000d93", @@ -389,7 +398,7 @@ x"00072583", x"00fd0533", x"00d12623", x"00bd8db3", -x"26c000ef", +x"27c000ef", x"004007b7", x"004d0d13", x"00c12683", @@ -398,42 +407,43 @@ x"fc8d6ce3", x"4788d5b7", x"afe58593", x"00400537", -x"248000ef", +x"258000ef", x"00040593", x"00498513", -x"23c000ef", +x"24c000ef", x"00898513", x"41b005b3", -x"230000ef", -x"ffff1537", -x"dbc50513", -x"ec1ff06f", +x"240000ef", +x"ffffd537", +x"de850513", +x"ebdff06f", x"00100513", -x"ec5ff06f", +x"ec1ff06f", x"0044a783", -x"e4079ee3", -x"ffff1537", -x"f6c50513", -x"ea5ff06f", +x"e4079ae3", +x"ffffd537", +x"f9850513", +x"ea1ff06f", x"00100513", -x"e4dff06f", -x"ffff1537", -x"f7c50513", -x"e91ff06f", -x"f9402583", -x"f9002503", -x"f9402783", +x"e45ff06f", +x"ffffd537", +x"fa850513", +x"e8dff06f", +x"fffff737", +x"40472583", +x"40072503", +x"40472783", x"fef59ae3", x"00008067", -x"fa800713", +x"80000713", x"00072783", x"fbf7f793", x"00f72023", x"00008067", -x"faa02623", -x"fa802783", +x"80a02223", +x"80002783", x"fe07cee3", -x"fac02503", +x"80402503", x"0ff57513", x"00008067", x"ff010113", @@ -451,7 +461,7 @@ x"00812403", x"00c12083", x"01010113", x"fb1ff06f", -x"fa800713", +x"80000713", x"00072783", x"f877f793", x"0407e793", @@ -463,24 +473,26 @@ x"03212023", x"01312e23", x"01412c23", x"01512a23", +x"01612823", x"02112623", x"02812423", x"00050913", x"00058993", x"00000493", -x"00010ab7", -x"00400a13", -x"04091a63", -x"fa002783", -x"0157f7b3", +x"fffffa37", +x"00010b37", +x"00400a93", +x"04091c63", +x"500a2783", +x"0167f7b3", x"fe078ce3", -x"fa402403", +x"504a2403", x"0ff47413", x"00c10793", x"009787b3", x"00878023", x"00148493", -x"fd449ce3", +x"fd549ce3", x"02c12083", x"02812403", x"00c12503", @@ -489,55 +501,56 @@ x"02012903", x"01c12983", x"01812a03", x"01412a83", +x"01012b03", x"03010113", x"00008067", -x"f61ff0ef", +x"f55ff0ef", x"00300513", x"00998433", -x"f01ff0ef", +x"ef5ff0ef", x"00040513", -x"f11ff0ef", +x"f05ff0ef", x"00000513", -x"ef1ff0ef", +x"ee5ff0ef", x"00050413", -x"ed5ff0ef", -x"f9dff06f", +x"ec9ff0ef", +x"f99ff06f", x"ff010113", x"00112623", -x"f2dff0ef", +x"f21ff0ef", x"00600513", -x"ed1ff0ef", +x"ec5ff0ef", x"00c12083", x"01010113", -x"eb1ff06f", +x"ea5ff06f", x"fe010113", x"00112e23", -x"f0dff0ef", +x"f01ff0ef", x"00500513", -x"eb1ff0ef", +x"ea5ff0ef", x"00000513", -x"ea9ff0ef", +x"e9dff0ef", x"00a12623", -x"e8dff0ef", +x"e81ff0ef", x"01c12083", x"00c12503", x"02010113", x"00008067", x"ff010113", x"00112623", -x"ed9ff0ef", +x"ecdff0ef", x"0ab00513", -x"e7dff0ef", -x"e65ff0ef", +x"e71ff0ef", +x"e59ff0ef", x"f95ff0ef", x"fb1ff0ef", x"00257793", x"fff00513", x"02078063", -x"eb5ff0ef", +x"ea9ff0ef", x"00400513", -x"e59ff0ef", -x"e41ff0ef", +x"e4dff0ef", +x"e35ff0ef", x"f91ff0ef", x"01e51513", x"41f55513", @@ -559,15 +572,15 @@ x"00c10793", x"008787b3", x"0007ca03", x"f21ff0ef", -x"e51ff0ef", +x"e45ff0ef", x"00200513", -x"df5ff0ef", +x"de9ff0ef", x"00848933", x"00090513", -x"e01ff0ef", +x"df5ff0ef", x"000a0513", -x"de1ff0ef", -x"dc9ff0ef", +x"dd5ff0ef", +x"dbdff0ef", x"f19ff0ef", x"00157513", x"fe051ce3", @@ -581,11 +594,12 @@ x"01c12983", x"01812a03", x"03010113", x"00008067", -x"00200737", -x"fa002783", -x"00e7f7b3", +x"fffff737", +x"00200637", +x"50072783", +x"00c7f7b3", x"fe079ce3", -x"faa02223", +x"50a72223", x"00008067", x"fe010113", x"01212823", @@ -595,19 +609,19 @@ x"00112e23", x"00812c23", x"00912a23", x"01312623", -x"fc9ff0ef", +x"fc5ff0ef", x"07800513", -x"ffff14b7", -x"fbdff0ef", +x"ffffd4b7", +x"fb9ff0ef", x"01c00413", -x"fbc48493", +x"fd448493", x"ffc00993", x"008957b3", x"00f7f793", x"00f487b3", x"0007c503", x"ffc40413", -x"f99ff0ef", +x"f95ff0ef", x"ff3414e3", x"01c12083", x"01812403", @@ -634,32 +648,32 @@ x"01010113", x"00008067", x"01249663", x"00d00513", -x"f2dff0ef", +x"f29ff0ef", x"00048513", -x"f25ff0ef", +x"f21ff0ef", x"fc9ff06f", x"ff010113", x"00812423", x"00050413", -x"ffff1537", -x"d7450513", +x"ffffd537", +x"da050513", x"00112623", x"f91ff0ef", x"00241793", -x"ffff1537", +x"ffffd537", x"008787b3", -x"fcc50513", +x"fe450513", x"00f50533", x"f79ff0ef", x"00800793", x"3007b073", -x"fe802783", +x"e0802783", x"00010737", x"00e7f7b3", x"00078863", x"00100793", -x"fcf02423", -x"fc002623", +x"c0f02423", +x"c0002623", x"0000006f", x"fb010113", x"04112623", @@ -683,28 +697,29 @@ x"01f12423", x"342024f3", x"800007b7", x"00778793", -x"0af49663", -x"fe802783", +x"0af49863", +x"e0802783", x"00010737", x"00e7f7b3", x"00078863", -x"fc802783", +x"c0802783", x"0017c793", -x"fcf02423", -x"fe802783", +x"c0f02423", +x"e0802783", x"00020737", x"00e7f7b3", -x"02078863", -x"bb5ff0ef", -x"fe002783", -x"fff00713", -x"f8e02c23", +x"02078a63", +x"ba1ff0ef", +x"e0002783", +x"fffff737", +x"fff00693", x"0027d793", x"00a78533", x"00f537b3", +x"40d72423", x"00b787b3", -x"f8f02e23", -x"f8a02c23", +x"40f72623", +x"40a72423", x"00000013", x"03c12403", x"04c12083", @@ -732,28 +747,28 @@ x"800007b7", x"0007a783", x"00078663", x"00100513", -x"e89ff0ef", +x"e85ff0ef", x"34102473", -x"fe802783", +x"e0802783", x"00040737", x"00e7f7b3", x"04078263", -x"ffff1537", -x"d7c50513", -x"e11ff0ef", +x"ffffd537", +x"da850513", +x"e0dff0ef", x"00048513", -x"d95ff0ef", +x"d91ff0ef", x"02000513", -x"d75ff0ef", +x"d6dff0ef", x"00040513", -x"d85ff0ef", +x"d81ff0ef", x"02000513", -x"d65ff0ef", +x"d5dff0ef", x"34302573", -x"d75ff0ef", -x"ffff1537", -x"dd450513", -x"dddff0ef", +x"d71ff0ef", +x"ffffd537", +x"e0050513", +x"dd9ff0ef", x"00440413", x"34141073", x"f39ff06f", @@ -773,43 +788,43 @@ x"01812423", x"00fb2023", x"00050413", x"02051863", -x"ffff1537", -x"d8850513", -x"d85ff0ef", +x"ffffd537", +x"db450513", +x"d81ff0ef", x"004005b7", x"00040513", -x"afdff0ef", +x"ae9ff0ef", x"4788d7b7", x"afe78793", x"04f50863", x"00000513", x"0380006f", -x"ffff1537", -x"da850513", -x"d59ff0ef", +x"ffffd537", +x"dd450513", +x"d55ff0ef", x"00400537", -x"cddff0ef", -x"ffff1537", -x"db450513", -x"d45ff0ef", -x"fe802783", +x"cd9ff0ef", +x"ffffd537", +x"de050513", +x"d41ff0ef", +x"e0802783", x"00080737", x"00e7f7b3", x"00079663", x"00300513", -x"d85ff0ef", -x"bb5ff0ef", +x"d81ff0ef", +x"badff0ef", x"fa0502e3", x"ff1ff06f", x"004009b7", x"00498593", x"00040513", -x"a95ff0ef", +x"a81ff0ef", x"00050a13", x"00898593", x"00040513", -x"a85ff0ef", -x"ff002c03", +x"a71ff0ef", +x"e1002c03", x"00050a93", x"ffca7b93", x"00000913", @@ -820,9 +835,9 @@ x"05791c63", x"015484b3", x"00200513", x"fa0494e3", -x"ffff1537", -x"dbc50513", -x"cc9ff0ef", +x"ffffd537", +x"de850513", +x"cc5ff0ef", x"02c12083", x"02812403", x"800007b7", @@ -839,7 +854,7 @@ x"00812c03", x"03010113", x"00008067", x"00040513", -x"a09ff0ef", +x"9f5ff0ef", x"012c07b3", x"00a484b3", x"00a7a023", @@ -850,24 +865,20 @@ x"00112623", x"00812423", x"00800793", x"3007b073", -x"ff002403", +x"e1002403", x"00050463", -x"40400437", -x"ffff1537", -x"dc050513", -x"c45ff0ef", +x"e0400437", +x"ffffd537", +x"dec50513", +x"c41ff0ef", x"00040513", -x"bc9ff0ef", -x"ffff1537", -x"dd050513", -x"c31ff0ef", -x"fa002783", +x"bc5ff0ef", +x"ffffd537", +x"dfc50513", +x"c2dff0ef", +x"fffff737", +x"50072783", x"fe07cee3", -x"fc0027f3", -x"0027f793", -x"00078463", -x"0000100f", -x"0ff0000f", x"000400e7", x"52450a07", x"00005f52", @@ -903,8 +914,8 @@ x"72656461", x"0a3e3e20", x"444c420a", x"4a203a56", -x"20206e75", -x"30322032", +x"31206c75", +x"30322035", x"480a3332", x"203a5657", x"00000020", @@ -999,19 +1010,14 @@ x"65206f4e", x"75636578", x"6c626174", x"00002e65", -x"20296328", -x"53207962", -x"68706574", -x"4e206e61", -x"69746c6f", -x"670a676e", -x"75687469", -x"6f632e62", -x"74732f6d", -x"746c6f6e", -x"2f676e69", -x"726f656e", -x"00323376", +x"68746967", +x"632e6275", +x"732f6d6f", +x"6c6f6e74", +x"676e6974", +x"6f656e2f", +x"32337672", +x"00000000", x"61766e49", x"2064696c", x"00444d43", diff --git a/sw/bootloader/bootloader.c b/sw/bootloader/bootloader.c index 19e093788..5a9b4d1a6 100644 --- a/sw/bootloader/bootloader.c +++ b/sw/bootloader/bootloader.c @@ -124,10 +124,6 @@ #define XIP_EN 1 #endif -/** XIP page base address */ -#ifndef XIP_PAGE_BASE_ADDR - #define XIP_PAGE_BASE_ADDR 0x40000000UL -#endif /**@}*/ @@ -294,7 +290,7 @@ int main(void) { if (neorv32_xip_available()) { neorv32_xip_setup(SPI_FLASH_CLK_PRSC, 0, 0, SPI_FLASH_CMD_READ); neorv32_xip_burst_mode_enable(); - neorv32_xip_start(SPI_FLASH_ADDR_BYTES, XIP_PAGE_BASE_ADDR); + neorv32_xip_start(SPI_FLASH_ADDR_BYTES); } #endif @@ -431,7 +427,7 @@ int main(void) { } #endif else if (c == '?') { - PRINT_TEXT("(c) by Stephan Nolting\ngithub.com/stnolting/neorv32"); + PRINT_TEXT("github.com/stnolting/neorv32"); } else { // unknown command PRINT_TEXT("Invalid CMD"); @@ -476,7 +472,7 @@ void start_app(int boot_xip) { register uint32_t app_base = NEORV32_SYSINFO->ISPACE_BASE; // default = start at beginning of IMEM #if (XIP_EN != 0) if (boot_xip) { - app_base = (uint32_t)(XIP_PAGE_BASE_ADDR + SPI_BOOT_BASE_ADDR); // start from XIP mapped address + app_base = (uint32_t)(XIP_MEM_BASE_ADDRESS + SPI_BOOT_BASE_ADDR); // start from XIP mapped address } #endif @@ -487,12 +483,6 @@ void start_app(int boot_xip) { // wait for UART0 to finish transmitting while (neorv32_uart0_tx_busy()); - // memory sync - if (neorv32_cpu_csr_read(CSR_MXISA) & (1 << CSR_MXISA_ZIFENCEI)) { // Zifenci ISA extension available? - asm volatile ("fence.i"); - } - asm volatile ("fence"); - // start application asm volatile ("jalr ra, %0" : : "r" (app_base)); From 0bce4b59f9a594ffc503546fdeb5142df0284983 Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Sat, 15 Jul 2023 21:10:53 +0200 Subject: [PATCH 16/31] update default/example programs --- rtl/core/neorv32_application_image.vhd | 37 +++---- sw/example/demo_blink_led_asm/main.S | 10 +- sw/example/processor_check/main.c | 136 ++++++++++++------------- 3 files changed, 92 insertions(+), 91 deletions(-) diff --git a/rtl/core/neorv32_application_image.vhd b/rtl/core/neorv32_application_image.vhd index babd71b6b..aac037428 100644 --- a/rtl/core/neorv32_application_image.vhd +++ b/rtl/core/neorv32_application_image.vhd @@ -1,8 +1,8 @@ -- The NEORV32 RISC-V Processor: https://github.com/stnolting/neorv32 -- Auto-generated memory initialization file (for APPLICATION) from source file --- Size: 1092 bytes +-- Size: 1096 bytes -- MARCH: default --- Built: 02.06.2023 11:53:17 +-- Built: 15.07.2023 21:10:26 -- prototype defined in 'neorv32_package.vhd' package body neorv32_application_image is @@ -39,7 +39,7 @@ x"00000e13", x"00000e93", x"00000f13", x"00000f93", -x"44400593", +x"44800593", x"80000617", x"f8060613", x"80000697", @@ -60,9 +60,9 @@ x"00072023", x"00470713", x"ff5ff06f", x"00000417", -x"37840413", +x"37c40413", x"00000497", -x"37048493", +x"37448493", x"00945a63", x"00042083", x"000080e7", @@ -74,9 +74,9 @@ x"090000ef", x"30401073", x"34051073", x"00000417", -x"34040413", +x"34440413", x"00000497", -x"33848493", +x"33c48493", x"00945a63", x"00042083", x"000080e7", @@ -111,19 +111,20 @@ x"00000513", x"00000593", x"00112623", x"00812423", -x"134000ef", +x"138000ef", x"00000513", x"00150413", x"00000593", x"0ff57513", -x"120000ef", +x"124000ef", x"0fa00513", -x"034000ef", +x"038000ef", x"00040513", x"fe5ff06f", -x"f9402583", -x"f9002503", -x"f9402783", +x"fffff737", +x"40472583", +x"40072503", +x"40472783", x"fef59ae3", x"00008067", x"c80027f3", @@ -133,7 +134,7 @@ x"fef59ae3", x"00008067", x"fe010113", x"00a12623", -x"fe002503", +x"e0002503", x"3e800593", x"00112e23", x"00812c23", @@ -165,16 +166,16 @@ x"01812403", x"01412483", x"02010113", x"00008067", -x"fe802783", +x"e0802783", x"00020737", x"00e7f7b3", x"02078663", -x"f41ff0ef", +x"f3dff0ef", x"00850433", x"00a43533", x"009585b3", x"00b504b3", -x"f2dff0ef", +x"f29ff0ef", x"fe95eee3", x"fcb490e3", x"fe856ae3", @@ -188,7 +189,7 @@ x"fff40413", x"00000013", x"ff1ff06f", x"f95ff06f", -x"fc000793", +x"c0000793", x"00a7a423", x"00b7a623", x"00008067", diff --git a/sw/example/demo_blink_led_asm/main.S b/sw/example/demo_blink_led_asm/main.S index 12babd15f..88ec2ee14 100644 --- a/sw/example/demo_blink_led_asm/main.S +++ b/sw/example/demo_blink_led_asm/main.S @@ -3,7 +3,7 @@ /* # ********************************************************************************************* # */ /* # BSD 3-Clause License # */ /* # # */ -/* # Copyright (c) 2022, Stephan Nolting. All rights reserved. # */ +/* # Copyright (c) 2023, Stephan Nolting. All rights reserved. # */ /* # # */ /* # Redistribution and use in source and binary forms, with or without modification, are # */ /* # permitted provided that the following conditions are met: # */ @@ -47,15 +47,15 @@ .global main // Memory map -.set GPIO_OUTPUT_LO, 0xFFFFFFC8U // address of the GPIO.OUTPUT_LO register -.set SYSINFO_CKLK, 0xFFFFFFE0U // address of SYSINFO.CLK +.set GPIO_OUTPUT_LO, 0xFFFFFC00U // address of GPIO +.set SYSINFO_CKLK, 0xFFFFFE00U // address of SYSINFO /**********************************************************************//** * Entry point = main **************************************************************************/ main: - li a0, GPIO_OUTPUT_LO // address of the GPIO.OUTPUT_LO register + li a0, GPIO_OUTPUT_LO+8 // address of the GPIO.OUTPUT_LO register li a1, 0 // clear counter loop: @@ -70,7 +70,7 @@ loop: * Delay subroutine using mcycle (waiting for 0.25s) **************************************************************************/ delay: - li t0, SYSINFO_CKLK // address of SYSINFO.CLK + li t0, SYSINFO_CKLK+0 // address of SYSINFO.CLK lw t0, 0(t0) // read SYSINFO.CLK (= CPU clock speed in Hz = tick per second) srli t0, t0, 2 // = ticks per 0.25 seconds csrw mcycle, zero //clear cycle counter (low word) diff --git a/sw/example/processor_check/main.c b/sw/example/processor_check/main.c index 1d26bb0d5..d44ab6c7d 100644 --- a/sw/example/processor_check/main.c +++ b/sw/example/processor_check/main.c @@ -47,18 +47,18 @@ * @name User configuration **************************************************************************/ /**@{*/ -/** UART BAUD rate */ +//** UART BAUD rate */ #define BAUD_RATE (19200) //** Reachable unaligned address */ -#define ADDR_UNALIGNED_1 (0x00000001) +#define ADDR_UNALIGNED_1 (0x00000001UL) //** Reachable unaligned address */ -#define ADDR_UNALIGNED_2 (0x00000002) +#define ADDR_UNALIGNED_2 (0x00000002UL) //** Unreachable word-aligned address */ -#define ADDR_UNREACHABLE (IO_BASE_ADDRESS-4) -//**Read-only word-aligned address */ +#define ADDR_UNREACHABLE ((uint32_t)&NEORV32_DM->SREG) +//** Read-only word-aligned address */ #define ADDR_READONLY ((uint32_t)&NEORV32_SYSINFO->CLK) -//** external memory base address */ -#define EXT_MEM_BASE (0xF0000000) +//** External memory base address */ +#define EXT_MEM_BASE (0xF0000000UL) /**@}*/ @@ -90,7 +90,7 @@ void test_ok(void); void test_fail(void); // MCAUSE value that will be NEVER set by the hardware -const uint32_t mcause_never_c = 0x80000000U; // = reserved +const uint32_t mcause_never_c = 0x80000000UL; // = reserved // Global variables (also test initialization of global vars here) /// Global counter for failing tests @@ -232,7 +232,7 @@ int main() { } } else { - PRINT_STANDARD("[skipped, n.a.]\n"); + PRINT_STANDARD("[n.a.]\n"); } neorv32_cpu_csr_write(CSR_MCOUNTINHIBIT, 0); // enable all counters @@ -268,7 +268,7 @@ int main() { } } else { - PRINT_STANDARD("[skipped, n.a.]\n"); + PRINT_STANDARD("[n.a.]\n"); } @@ -292,7 +292,7 @@ int main() { // ---------------------------------------------------------- - // Test standard RISC-V counters + // Test standard RISC-V counters // ---------------------------------------------------------- neorv32_cpu_csr_write(CSR_MCAUSE, mcause_never_c); PRINT_STANDARD("[%i] Zicntr CNTs ", cnt_test); @@ -363,12 +363,12 @@ int main() { neorv32_cpu_csr_set(CSR_MCOUNTINHIBIT, 0); } else { - PRINT_STANDARD("[skipped, n.a.]\n"); + PRINT_STANDARD("[n.a.]\n"); } // ---------------------------------------------------------- - // Test mcountinhibit: inhibit counter auto-inc + // Test mcountinhibit: inhibit counter auto-inc // ---------------------------------------------------------- neorv32_cpu_csr_write(CSR_MCAUSE, mcause_never_c); PRINT_STANDARD("[%i] mcountinhibit CSR ", cnt_test); @@ -424,7 +424,7 @@ int main() { } } else { - PRINT_STANDARD("[skipped, n.a.]\n"); + PRINT_STANDARD("[n.a.]\n"); } @@ -459,7 +459,7 @@ int main() { } } else { - PRINT_STANDARD("[skipped, n.a.]\n"); + PRINT_STANDARD("[n.a.]\n"); } @@ -523,7 +523,7 @@ int main() { // Unaligned instruction address // ---------------------------------------------------------- neorv32_cpu_csr_write(CSR_MCAUSE, mcause_never_c); - PRINT_STANDARD("[%i] I_ALG (instr. align) EXC ", cnt_test); + PRINT_STANDARD("[%i] Fetch align EXC ", cnt_test); // skip if C-mode is implemented if ((neorv32_cpu_csr_read(CSR_MISA) & (1< taken %u\n" - "13 EXCs %u\n" - "14 Illegals %u\n", + "00 Instr. %u\n" + "02 Clocks %u\n" + "03 Compr. %u\n" + "04 IF w. %u\n" + "05 II w. %u\n" + "06 ALU w. %u\n" + "07 M LD %u\n" + "08 M ST %u\n" + "09 M w. %u\n" + "10 Jump %u\n" + "11 Branch %u\n" + "12 >taken %u\n" + "13 EXCs %u\n" + "14 Traps %u\n", (uint32_t)neorv32_cpu_csr_read(CSR_INSTRET), (uint32_t)neorv32_cpu_csr_read(CSR_CYCLE), (uint32_t)neorv32_cpu_csr_read(CSR_MHPMCOUNTER3), @@ -1902,7 +1903,6 @@ int main() { (uint32_t)neorv32_cpu_csr_read(CSR_MHPMCOUNTER12), (uint32_t)neorv32_cpu_csr_read(CSR_MHPMCOUNTER13), (uint32_t)neorv32_cpu_csr_read(CSR_MHPMCOUNTER14)); - } From 9e2abdc6d78dd9b2a54d5df80c9d6e50166ae622 Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Sat, 15 Jul 2023 21:11:07 +0200 Subject: [PATCH 17/31] [ocd] update OCD firmware --- sw/ocd-firmware/park_loop.S | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sw/ocd-firmware/park_loop.S b/sw/ocd-firmware/park_loop.S index d9fc6fc05..97227ff74 100644 --- a/sw/ocd-firmware/park_loop.S +++ b/sw/ocd-firmware/park_loop.S @@ -33,10 +33,10 @@ /* ################################################################################################# */ // debug module (DM) address map -.equ DM_CODE_BASE, 0xfffff800 // base address of debug_module's code ROM (park loop) -.equ DM_PBUF_BASE, 0xfffff840 // base address of debug_module's program buffer (PBUF) -.equ DM_DATA_BASE, 0xfffff880 // base address of debug_module's abstract data buffer (DATA) -.equ DM_SREG_BASE, 0xfffff8C0 // base address of debug_module's status register +.equ DM_CODE_BASE, 0xffffff00 // base address of debug_module's code ROM (park loop) +.equ DM_PBUF_BASE, 0xffffff40 // base address of debug_module's program buffer (PBUF) +.equ DM_DATA_BASE, 0xffffff80 // base address of debug_module's abstract data buffer (DATA) +.equ DM_SREG_BASE, 0xffffffC0 // base address of debug_module's status register // status register (SREG) byte(!!!) offsets .equ SREG_HLT_ACK, ( 0 / 8) // -/w: CPU has halted in debug mode and is waiting in park loop From 2919cfdd480c6aa8f36d6fbaeb3b97852671514d Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Sat, 15 Jul 2023 21:11:30 +0200 Subject: [PATCH 18/31] [sw] update address space layout --- sw/common/neorv32.ld | 9 +++----- sw/lib/include/neorv32.h | 48 ++++++++++++++++++++-------------------- 2 files changed, 27 insertions(+), 30 deletions(-) diff --git a/sw/common/neorv32.ld b/sw/common/neorv32.ld index 9c9f5ea72..37f080971 100644 --- a/sw/common/neorv32.ld +++ b/sw/common/neorv32.ld @@ -69,14 +69,13 @@ __neorv32_ram_base = DEFINED(__neorv32_ram_base) ? __neorv32_ram_base : 0x800000 /* ************************************************************************************************* */ -/* If compiling the bootloader, the rom section is automatically re-mapped to the processor-internal */ +/* If compiling the bootloader, the ROM section is automatically re-mapped to the processor-internal */ /* bootloader ROM address space. */ /* ************************************************************************************************* */ MEMORY { - rom (rx) : ORIGIN = DEFINED(make_bootloader) ? 0xFFFF0000 : __neorv32_rom_base, LENGTH = DEFINED(make_bootloader) ? 32K : __neorv32_rom_size - ram (rwx) : ORIGIN = __neorv32_ram_base, LENGTH = DEFINED(make_bootloader) ? 512 : __neorv32_ram_size - iodev (rw) : ORIGIN = 0xFFFFFE00, LENGTH = 512 /* this is hardware-defined and should not be modified! */ + rom (rx) : ORIGIN = DEFINED(make_bootloader) ? 0xFFFFC000 : __neorv32_rom_base, LENGTH = DEFINED(make_bootloader) ? 8K : __neorv32_rom_size + ram (rwx) : ORIGIN = __neorv32_ram_base, LENGTH = DEFINED(make_bootloader) ? 512 : __neorv32_ram_size } @@ -301,6 +300,4 @@ SECTIONS PROVIDE(__crt0_copy_data_src_begin = LOADADDR(.data)); PROVIDE(__crt0_copy_data_dst_begin = ADDR(.data)); PROVIDE(__crt0_copy_data_dst_end = ADDR(.data) + SIZEOF(.data)); - PROVIDE(__crt0_io_space_begin = ORIGIN(iodev)); - PROVIDE(__crt0_io_space_end = ORIGIN(iodev) + LENGTH(iodev)); } diff --git a/sw/lib/include/neorv32.h b/sw/lib/include/neorv32.h index 3acf4b9c5..1cb790d48 100644 --- a/sw/lib/include/neorv32.h +++ b/sw/lib/include/neorv32.h @@ -190,37 +190,37 @@ enum NEORV32_CLOCK_PRSC_enum { /** XIP-mapped memory base address */ #define XIP_MEM_BASE_ADDRESS (0xE0000000U) /** bootloader memory base address */ -#define BOOTLOADER_BASE_ADDRESS (0xFFFF0000U) +#define BOOTLOADER_BASE_ADDRESS (0xFFFFC000U) /** peripheral/IO devices memory base address */ -#define IO_BASE_ADDRESS (0xFFFFFE00U) +#define IO_BASE_ADDRESS (0xFFFFE000U) /**@}*/ /**********************************************************************//** - * @name Peripheral/IO Devices - IO Address Space - base addresses + * @name IO Address Space - Peripheral/IO Devices **************************************************************************/ /**@{*/ -#define NEORV32_DM_BASE (0xFFFFF800U) /**< On-Chip Debugger - Debuf Module (OCD) */ -#define NEORV32_CFS_BASE (0xFFFFFE00U) /**< Custom Functions Subsystem (CFS) */ -#define NEORV32_SDI_BASE (0xFFFFFF00U) /**< Serial Data Interface (SDI) */ -#define NEORV32_SLINK_BASE (0xFFFFFF08U) /**< Stream Link Interface (SLINK) */ -#define NEORV32_DMA_BASE (0xFFFFFF10U) /**< Direct Memory Access Controller (DMA) */ -#define NEORV32_CRC_BASE (0xFFFFFF20U) /**< Cyclic Redundancy Check Unit (DMA) */ -#define NEORV32_XIP_BASE (0xFFFFFF40U) /**< Execute In Place Module (XIP) */ -#define NEORV32_PWM_BASE (0xFFFFFF50U) /**< Pulse Width Modulation Controller (PWM) */ -#define NEORV32_GPTMR_BASE (0xFFFFFF60U) /**< General Purpose Timer (GPTMR) */ -#define NEORV32_ONEWIRE_BASE (0xFFFFFF70U) /**< 1-Wire Interface Controller (ONEWIRE) */ -#define NEORV32_XIRQ_BASE (0xFFFFFF80U) /**< External Interrupt Controller (XIRQ) */ -#define NEORV32_MTIME_BASE (0xFFFFFF90U) /**< Machine System Timer (MTIME) */ -#define NEORV32_UART0_BASE (0xFFFFFFA0U) /**< Primary Universal Asynchronous Receiver and Transmitter (UART0) */ -#define NEORV32_SPI_BASE (0xFFFFFFA8U) /**< Serial Peripheral Interface Controller (SPI) */ -#define NEORV32_TWI_BASE (0xFFFFFFB0U) /**< Two-Wire Interface Controller (TWI) */ -#define NEORV32_TRNG_BASE (0xFFFFFFB8U) /**< True Random Number Generator (TRNG) */ -#define NEORV32_WDT_BASE (0xFFFFFFBCU) /**< Watchdog Timer (WDT) */ -#define NEORV32_GPIO_BASE (0xFFFFFFC0U) /**< General Purpose Input/Output Port Controller (GPIO) */ -#define NEORV32_UART1_BASE (0xFFFFFFD0U) /**< Secondary Universal Asynchronous Receiver and Transmitter (UART1) */ -#define NEORV32_NEOLED_BASE (0xFFFFFFD8U) /**< Smart LED Hardware Interface (NEOLED) */ -#define NEORV32_SYSINFO_BASE (0xFFFFFFE0U) /**< System Information Memory (SYSINFO) */ +#define NEORV32_CFS_BASE (0xFFFFEB00U) /**< Custom Functions Subsystem (CFS) */ +#define NEORV32_SLINK_BASE (0xFFFFEC00U) /**< Stream Link Interface (SLINK) */ +#define NEORV32_DMA_BASE (0xFFFFED00U) /**< Direct Memory Access Controller (DMA) */ +#define NEORV32_CRC_BASE (0xFFFFEE00U) /**< Cyclic Redundancy Check Unit (DMA) */ +#define NEORV32_XIP_BASE (0xFFFFEF00U) /**< Execute In Place Module (XIP) */ +#define NEORV32_PWM_BASE (0xFFFFF000U) /**< Pulse Width Modulation Controller (PWM) */ +#define NEORV32_GPTMR_BASE (0xFFFFF100U) /**< General Purpose Timer (GPTMR) */ +#define NEORV32_ONEWIRE_BASE (0xFFFFF200U) /**< 1-Wire Interface Controller (ONEWIRE) */ +#define NEORV32_XIRQ_BASE (0xFFFFF300U) /**< External Interrupt Controller (XIRQ) */ +#define NEORV32_MTIME_BASE (0xFFFFF400U) /**< Machine System Timer (MTIME) */ +#define NEORV32_UART0_BASE (0xFFFFF500U) /**< Primary Universal Asynchronous Receiver and Transmitter (UART0) */ +#define NEORV32_UART1_BASE (0xFFFFF600U) /**< Secondary Universal Asynchronous Receiver and Transmitter (UART1) */ +#define NEORV32_SDI_BASE (0xFFFFF700U) /**< Serial Data Interface (SDI) */ +#define NEORV32_SPI_BASE (0xFFFFF800U) /**< Serial Peripheral Interface Controller (SPI) */ +#define NEORV32_TWI_BASE (0xFFFFF900U) /**< Two-Wire Interface Controller (TWI) */ +#define NEORV32_TRNG_BASE (0xFFFFFA00U) /**< True Random Number Generator (TRNG) */ +#define NEORV32_WDT_BASE (0xFFFFFB00U) /**< Watchdog Timer (WDT) */ +#define NEORV32_GPIO_BASE (0xFFFFFC00U) /**< General Purpose Input/Output Port Controller (GPIO) */ +#define NEORV32_NEOLED_BASE (0xFFFFFD00U) /**< Smart LED Hardware Interface (NEOLED) */ +#define NEORV32_SYSINFO_BASE (0xFFFFFE00U) /**< System Information Memory (SYSINFO) */ +#define NEORV32_DM_BASE (0xFFFFFF00U) /**< On-Chip Debugger - Debug Module (OCD) */ /**@}*/ From 279443dccedc02fb3cd1b14b315e328486477553 Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Sat, 15 Jul 2023 23:46:12 +0200 Subject: [PATCH 19/31] [rtl] re-add PMAs --- rtl/core/neorv32_boot_rom.vhd | 17 ++++++----------- rtl/core/neorv32_intercon.vhd | 19 ++++++++++--------- rtl/core/neorv32_package.vhd | 4 ++-- 3 files changed, 18 insertions(+), 22 deletions(-) diff --git a/rtl/core/neorv32_boot_rom.vhd b/rtl/core/neorv32_boot_rom.vhd index e6b53952e..40b6236de 100644 --- a/rtl/core/neorv32_boot_rom.vhd +++ b/rtl/core/neorv32_boot_rom.vhd @@ -52,11 +52,10 @@ architecture neorv32_boot_rom_rtl of neorv32_boot_rom is -- determine required ROM size in bytes (expand to next power of two) -- constant boot_rom_size_index_c : natural := index_size_f((bootloader_init_image'length)); -- address with (32-bit entries) - constant boot_rom_size_c : natural := (2**boot_rom_size_index_c)*4; -- size in bytes + constant boot_rom_size_c : natural := (2**boot_rom_size_index_c)*4; -- physical size in bytes -- local signals -- signal rden : std_ulogic; - signal wren : std_ulogic; signal rdata : std_ulogic_vector(31 downto 0); -- ROM - initialized with executable code -- @@ -68,7 +67,6 @@ begin -- ------------------------------------------------------------------------------------------- assert false report "NEORV32 PROCESSOR CONFIG NOTE: Implementing internal bootloader ROM (" & natural'image(boot_rom_size_c) & " bytes)." severity note; - assert not (boot_rom_size_c > mem_boot_size_c) report "NEORV32 PROCESSOR CONFIG ERROR! Boot ROM size out of range! Max " & natural'image(mem_boot_size_c) & " bytes." severity error; @@ -78,18 +76,15 @@ begin mem_file_access: process(clk_i) begin if rising_edge(clk_i) then - rden <= bus_req_i.re; - wren <= bus_req_i.we; - if (bus_req_i.re = '1') then -- reduce switching activity when not accessed - rdata <= mem_rom(to_integer(unsigned(bus_req_i.addr(boot_rom_size_index_c+1 downto 2)))); - end if; + rden <= bus_req_i.re; + rdata <= mem_rom(to_integer(unsigned(bus_req_i.addr(boot_rom_size_index_c+1 downto 2)))); end if; end process mem_file_access; - -- output gate -- - bus_rsp_o.data <= rdata when (rden = '1') else (others => '0'); + -- response -- + bus_rsp_o.data <= rdata when (rden = '1') else (others => '0'); -- output gate bus_rsp_o.ack <= rden; - bus_rsp_o.err <= wren; + bus_rsp_o.err <= '0'; end neorv32_boot_rom_rtl; diff --git a/rtl/core/neorv32_intercon.vhd b/rtl/core/neorv32_intercon.vhd index c7b7a74b0..271b580fc 100644 --- a/rtl/core/neorv32_intercon.vhd +++ b/rtl/core/neorv32_intercon.vhd @@ -233,14 +233,15 @@ end neorv32_busswitch_rtl; -- # << NEORV32 - Processor Bus: Section Gateway >> # -- # ********************************************************************************************* # -- # Bus gateway to distribute the core's access to the processor's main memory sections: # --- # -> IMEM - internal instruction memory [optional] # --- # -> DMEM - internal data memory [optional] # --- # -> XIP - memory-mapped XIP flash [optional] # --- # -> BOOT - internal bootloader ROM [optional] # --- # -> IO - internal IO devices [mandatory] # +-- # -> IMEM - internal instruction memory [optional], {rwx} # +-- # -> DMEM - internal data memory [optional], {rwx} # +-- # -> XIP - memory-mapped XIP flash [optional], {r-x} # +-- # -> BOOT - internal bootloader ROM [optional], {r-x} # +-- # -> IO - internal IO devices [mandatory], {rw-} # -- # All accesses that do not match any of these sections are redirected to the "external" port. # -- # The gateway-internal bus monitor ensures that all processor-internal accesses are completed # -- # within a fixed time window. # +-- # This module also enforces the region's PMAs (physical memory attributes). # -- # ********************************************************************************************* # -- # BSD 3-Clause License # -- # # @@ -395,16 +396,16 @@ begin dmem_req_o.re <= main_req_i.re and port_en(port_dmem_c); -- xip_req_o <= main_req_i; - xip_req_o.we <= main_req_i.we and port_en(port_xip_c); + xip_req_o.we <= '0'; -- PMA: read-only xip_req_o.re <= main_req_i.re and port_en(port_xip_c); -- boot_req_o <= main_req_i; - boot_req_o.we <= main_req_i.we and port_en(port_boot_c); + boot_req_o.we <= '0'; -- PMA: read-only boot_req_o.re <= main_req_i.re and port_en(port_boot_c); -- io_req <= main_req_i; - io_req.we <= main_req_i.we and port_en(port_io_c); - io_req.re <= main_req_i.re and port_en(port_io_c); + io_req.we <= main_req_i.we and port_en(port_io_c) and and_reduce_f(main_req_i.ben) ; -- PMA: 32-bit writes only + io_req.re <= main_req_i.re and port_en(port_io_c) and (not main_req_i.src); -- PMA: no-execute -- ext_req_o <= main_req_i; ext_req_o.we <= main_req_i.we and port_en(port_ext_c); diff --git a/rtl/core/neorv32_package.vhd b/rtl/core/neorv32_package.vhd index 5246d58c8..a7d5ccfbf 100644 --- a/rtl/core/neorv32_package.vhd +++ b/rtl/core/neorv32_package.vhd @@ -56,7 +56,7 @@ package neorv32_package is -- Architecture Constants ----------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- - constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01080604"; -- hardware version + constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01080605"; -- hardware version constant archid_c : natural := 19; -- official RISC-V architecture ID constant XLEN : natural := 32; -- native data path width, do not change! @@ -78,7 +78,7 @@ package neorv32_package is -- Processor Address Space Layout -- **************************************************************************************************************************** - -- Main Memory Sections Address Map --- + -- Main Address Regions --- constant mem_ispace_base_c : std_ulogic_vector(31 downto 0) := x"00000000"; -- IMEM size via generic constant mem_dspace_base_c : std_ulogic_vector(31 downto 0) := x"80000000"; -- DMEM size via generic constant mem_xip_base_c : std_ulogic_vector(31 downto 0) := x"e0000000"; -- page (4MSBs) only! From 56de415762cbaca1e2ad7523011f549488223f88 Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Sun, 16 Jul 2023 20:25:09 +0200 Subject: [PATCH 20/31] [CHANGELOG] add part 3 - v1.8.6.5 --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a1dbaf5b5..15ce1b191 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,8 +33,9 @@ mimpid = 0x01080200 => Version 01.08.02.00 => v1.8.2 | Date (*dd.mm.yyyy*) | Version | Comment | |:-------------------:|:-------:|:--------| +| 16.07.2023 | 1.8.6.5 | :warning: **rework SoC bus system & memory map - part 3**: re-enforce PMAs (physical memory attributes); [#648](https://github.com/stnolting/neorv32/pull/648) | | 15.07.2023 | 1.8.6.4 | :warning: **rework SoC bus system & memory map - part 2**: move IO address decoding to central IO switch; add i-cache uncached accesses; [#648](https://github.com/stnolting/neorv32/pull/648) | -| 14.07.2023 | 1.8.6.3 | :warning: **rework SoC bus system & memory map - part 1**: add central bus gateways to propagate core accesses to the main address regions; [#648](https://github.com/stnolting/neorv32/pull/648) | +| 14.07.2023 | 1.8.6.3 | :warning: **rework SoC bus system & memory map - part 1**: add central bus gateway to control core accesses to the main address regions; [#648](https://github.com/stnolting/neorv32/pull/648) | | 14.07.2023 | 1.8.6.2 | minor rtl edits; [#646](https://github.com/stnolting/neorv32/pull/646) | | 30.06.2023 | 1.8.6.1 | minor rtl edits, cleanups and optimizations; [#641](https://github.com/stnolting/neorv32/pull/641) | | 27.06.2023 | [**:rocket:1.8.6**](https://github.com/stnolting/neorv32/releases/tag/v1.8.6) | **New release** | From 951fc1c153d81b3cc3ac48ab50a4ed511e624fb7 Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Sun, 16 Jul 2023 20:25:44 +0200 Subject: [PATCH 21/31] [sw] update SVD file -module addresses --- sw/svd/neorv32.svd | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/sw/svd/neorv32.svd b/sw/svd/neorv32.svd index debedbdde..569f8e69d 100644 --- a/sw/svd/neorv32.svd +++ b/sw/svd/neorv32.svd @@ -38,7 +38,7 @@ CFS Custom functions subsystem CFS - 0xFFFFFE00 + 0xFFFFEB00 CFS_FIRQ1 @@ -121,7 +121,7 @@ SDI Serial data interface controller SDI - 0xFFFFFF00 + 0xFFFFF700 SDI_FIRQ11 @@ -217,7 +217,7 @@ SLINK Stream Link Interface SLINK - 0xFFFFFF08 + 0xFFFFEC00 SLINK_FIRQ14 @@ -344,7 +344,7 @@ DMA Direct memory access controller DMA - 0xFFFFFF10 + 0xFFFFED00 DMA_FIRQ10 @@ -445,7 +445,7 @@ CRC Cyclic redundancy check unit CRC - 0xFFFFFF20 + 0xFFFFEE00 0 @@ -482,7 +482,7 @@ PWM Pulse-width modulation controller PWM - 0xFFFFFF50 + 0xFFFFF000 0 @@ -531,7 +531,7 @@ XIP Execute In Place Module CIP - 0xFFFFFF40 + 0xFFFFEF00 0 @@ -632,7 +632,7 @@ GPTMR General purpose timer GPTMR - 0xFFFFFF60 + 0xFFFFF100 GPTMR_FIRQ12 @@ -683,7 +683,7 @@ ONEWIRE 1-Wire Interface Controller ONEWIRE - 0xFFFFFF70 + 0xFFFFF200 ONEWIRE_FIRQ13 @@ -770,7 +770,7 @@ XIRQ External interrupts controller XIRQ - 0xFFFFFF80 + 0xFFFFF300 XIRQ_FIRQ8 @@ -804,7 +804,7 @@ MTIME Machine timer MTIME - 0xFFFFFF90 + 0xFFFFF400 0 @@ -841,7 +841,7 @@ UART0 Primary universal asynchronous receiver and transmitter UART0 - 0xFFFFFFA0 + 0xFFFFF500 UART0_RX_FIRQ2 UART0_TX_FIRQ3 @@ -971,7 +971,7 @@ UART1 Secondary universal asynchronous receiver and transmitter UART1 - 0xFFFFFFD0 + 0xFFFFF600 UART1_RX_FIRQ4 UART1_TX_FIRQ5 @@ -988,7 +988,7 @@ SPI Serial peripheral interface controller SPI - 0xFFFFFFA8 + 0xFFFFF800 SPI_FIRQ6 @@ -1105,7 +1105,7 @@ TWI Two-wire interface controller SPI - 0xFFFFFFB0 + 0xFFFFF900 TWI_FIRQ7 @@ -1196,7 +1196,7 @@ TRNG True random number generator TRNG - 0xFFFFFFB8 + 0xFFFFFA00 0 @@ -1269,7 +1269,7 @@ WDT Watchdog timer WDT - 0xFFFFFFBC + 0xFFFFFB00 WDT_FIRQ0 @@ -1352,7 +1352,7 @@ GPIO General purpose input/output port GPIO - 0xFFFFFFc0 + 0xFFFFFC00 0 @@ -1391,7 +1391,7 @@ NEOLED Smart LED hardware interface NEOLED - 0xFFFFFFD8 + 0xFFFFFD00 NEOLED_FIRQ9 @@ -1492,7 +1492,7 @@ SYSINFO System configuration information memory SYSINFO - 0xFFFFFFE0 + 0xFFFFFE00 0 From 165c88a6d39200f39a8bbed093780e070daaa43b Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Sun, 16 Jul 2023 21:03:15 +0200 Subject: [PATCH 22/31] [docs] update IO module base addresses --- docs/datasheet/on_chip_debugger.adoc | 12 ++++++------ docs/datasheet/soc_cfs.adoc | 8 ++++---- docs/datasheet/soc_crc.adoc | 8 ++++---- docs/datasheet/soc_dma.adoc | 8 ++++---- docs/datasheet/soc_gpio.adoc | 8 ++++---- docs/datasheet/soc_gptmr.adoc | 6 +++--- docs/datasheet/soc_mtime.adoc | 8 ++++---- docs/datasheet/soc_neoled.adoc | 4 ++-- docs/datasheet/soc_onewire.adoc | 4 ++-- docs/datasheet/soc_pwm.adoc | 8 ++++---- docs/datasheet/soc_sdi.adoc | 4 ++-- docs/datasheet/soc_slink.adoc | 4 ++-- docs/datasheet/soc_spi.adoc | 4 ++-- docs/datasheet/soc_sysinfo.adoc | 16 ++++++++-------- docs/datasheet/soc_trng.adoc | 2 +- docs/datasheet/soc_twi.adoc | 4 ++-- docs/datasheet/soc_uart.adoc | 8 ++++---- docs/datasheet/soc_wdt.adoc | 2 +- docs/datasheet/soc_xirq.adoc | 8 ++++---- 19 files changed, 63 insertions(+), 63 deletions(-) diff --git a/docs/datasheet/on_chip_debugger.adoc b/docs/datasheet/on_chip_debugger.adoc index 29299adbc..b76bc2195 100644 --- a/docs/datasheet/on_chip_debugger.adoc +++ b/docs/datasheet/on_chip_debugger.adoc @@ -414,14 +414,14 @@ the _program buffer_, the _data buffer_ and the _status register_. The program b status register do not fully occupy the 64-byte-wide sections and are mirrored to fill the entire section. .DM CPU access - address map (divided into four sections) -[cols="^2,^4,^2,<7"] +[cols="^2,^2,<5"] [options="header",grid="rows"] |======================= -| Base address | Name [VHDL package] | Actual size | Description -| `0xfffff800` | `dm_code_base_c` (= `dm_base_c`) | 64 bytes | ROM for the "park loop" code -| `0xfffff840` | `dm_pbuf_base_c` | 16 bytes | Program buffer, provided by DM -| `0xfffff880` | `dm_data_base_c` | 4 bytes | Data buffer (`dm.data0`) -| `0xfffff8c0` | `dm_sreg_base_c` | 4 bytes | Control and status register +| Base address | Actual size | Description +| `0xffffff00` | 64 bytes | ROM for the "park loop" code +| `0xffffff40` | 16 bytes | Program buffer, provided by DM +| `0xffffff80` | 4 bytes | Data buffer (`dm.data0`) +| `0xffffffc0` | 4 bytes | Control and status register |======================= .DM Register Access diff --git a/docs/datasheet/soc_cfs.adoc b/docs/datasheet/soc_cfs.adoc index 74b3d8372..2c2c6bec6 100644 --- a/docs/datasheet/soc_cfs.adoc +++ b/docs/datasheet/soc_cfs.adoc @@ -93,9 +93,9 @@ generic (default = 32-bit). The size of the output signal conduit `cfs_out_o` is [options="header",grid="all"] |======================= | Address | Name [C] | Bit(s) | R/W | Function -| `0xfffffe00` | `REG[0]` |`31:0` | (r)/(w) | custom CFS register 0 -| `0xfffffe04` | `REG[1]` |`31:0` | (r)/(w) | custom CFS register 1 +| `0xffffeb00` | `REG[0]` |`31:0` | (r)/(w) | custom CFS register 0 +| `0xffffeb04` | `REG[1]` |`31:0` | (r)/(w) | custom CFS register 1 | ... | ... |`31:0` | (r)/(w) | ... -| `0xfffffef8` | `REG[62]` |`31:0` | (r)/(w) | custom CFS register 62 -| `0xfffffefc` | `REG[63]` |`31:0` | (r)/(w) | custom CFS register 63 +| `0xffffebf8` | `REG[62]` |`31:0` | (r)/(w) | custom CFS register 62 +| `0xffffebfc` | `REG[63]` |`31:0` | (r)/(w) | custom CFS register 63 |======================= diff --git a/docs/datasheet/soc_crc.adoc b/docs/datasheet/soc_crc.adoc index eb773dbed..1ef5449db 100644 --- a/docs/datasheet/soc_crc.adoc +++ b/docs/datasheet/soc_crc.adoc @@ -62,10 +62,10 @@ and for CRC32-mode the entire 32-bit of `POLY` and `SREG` are used. [options="header",grid="all"] |======================= | Address | Name [C] | Bit(s), Name [C] | R/W | Function -.2+<| `0xffffff20` .2+<| `CTRL` <|`1:0` ^| r/w <| CRC mode select (`00` CRC8, `01`: CRC16, `10`: CRC32) +.2+<| `0xffffee00` .2+<| `CTRL` <|`1:0` ^| r/w <| CRC mode select (`00` CRC8, `01`: CRC16, `10`: CRC32) <|`31:2` ^| r/- <| _reserved_, read as zero -| `0xffffff24` | `POLY` |`31:0` | r/w | CRC polynomial -.2+<| `0xffffff28` .2+<| `DATA` <|`7:0` ^| r/w <| data input (single byte) +| `0xffffee04` | `POLY` |`31:0` | r/w | CRC polynomial +.2+<| `0xffffee08` .2+<| `DATA` <|`7:0` ^| r/w <| data input (single byte) <|`31:8` ^| r/- <| _reserved_, read as zero, writes are ignored -| `0xffffff2c` | `SREG` |`32:0` | r/w | current CRC shift register value (set start value on write) +| `0xffffee0c` | `SREG` |`32:0` | r/w | current CRC shift register value (set start value on write) |======================= diff --git a/docs/datasheet/soc_dma.adoc b/docs/datasheet/soc_dma.adoc index 0bf56d628..0975ada8b 100644 --- a/docs/datasheet/soc_dma.adoc +++ b/docs/datasheet/soc_dma.adoc @@ -122,7 +122,7 @@ explicitly cleared again by writing zero to the according <<_mip>> CSR bit. [options="header",grid="all"] |======================= | Address | Name [C] | Bit(s), Name [C] | R/W | Function -.8+<| `0xffffff10` .8+<| `CTRL` <|`0` `DMA_CTRL_EN` ^| r/w <| DMA module enable +.8+<| `0xffffed00` .8+<| `CTRL` <|`0` `DMA_CTRL_EN` ^| r/w <| DMA module enable <|`1` `DMA_CTRL_AUTO` ^| r/w <| Enable automatic mode (FIRQ-triggered) <|`7:2` _reserved_ ^| r/- <| reserved, read as zero <|`8` `DMA_CTRL_ERROR_RD` ^| r/- <| Error during read access, clears when starting a new transfer @@ -130,9 +130,9 @@ explicitly cleared again by writing zero to the according <<_mip>> CSR bit. <|`10` `DMA_CTRL_BUSY` ^| r/- <| DMA transfer in progress <|`15:11` _reserved_ ^| r/- <| reserved, read as zero <|`31:16` `DMA_CTRL_FIRQ_MASK_MSB : DMA_CTRL_FIRQ_MASK_LSB` ^| r/w <| FIRQ trigger mask (same bits as in <<_mip>>) -| `0xffffff14` | `SRC_BASE` |`31:0` | r/w | Source base address (shows the last-accessed source address when read) -| `0xffffff18` | `DST_BASE` |`31:0` | r/w | Destination base address (shows the last-accessed destination address when read) -.6+<| `0xffffff1c` .6+<| `TTYPE` <|`23:0` `DMA_TTYPE_NUM_MSB : DMA_TTYPE_NUM_LSB` ^| r/w <| Number of elements to transfer (shows the last-transferred element index when read) +| `0xffffed04` | `SRC_BASE` |`31:0` | r/w | Source base address (shows the last-accessed source address when read) +| `0xffffed08` | `DST_BASE` |`31:0` | r/w | Destination base address (shows the last-accessed destination address when read) +.6+<| `0xffffed0c` .6+<| `TTYPE` <|`23:0` `DMA_TTYPE_NUM_MSB : DMA_TTYPE_NUM_LSB` ^| r/w <| Number of elements to transfer (shows the last-transferred element index when read) <|`26:24` _reserved_ ^| r/- <| reserved, read as zero <|`28:27` `DMA_TTYPE_QSEL_MSB : DMA_TTYPE_QSEL_LSB` ^| r/w <| Source data quantity select (`00` = byte, `01` = half-word, `10` = word) <|`29` `DMA_TTYPE_SRC_INC` ^| r/w <| Constant (`0`) or incrementing (`1`) source address diff --git a/docs/datasheet/soc_gpio.adoc b/docs/datasheet/soc_gpio.adoc index 6886578b9..2e2fceb84 100644 --- a/docs/datasheet/soc_gpio.adoc +++ b/docs/datasheet/soc_gpio.adoc @@ -37,8 +37,8 @@ be performed within a single clock cycle. [options="header",grid="rows"] |======================= | Address | Name [C] | Bit(s) | R/W | Function -| `0xffffffc0` | `INPUT_LO` | 31:0 | r/- | parallel input port pins 31:0 -| `0xffffffc4` | `INPUT_HI` | 31:0 | r/- | parallel input port pins 63:32 -| `0xffffffc8` | `OUTPUT_LO` | 31:0 | r/w | parallel output port pins 31:0 -| `0xffffffcc` | `OUTPUT_HI` | 31:0 | r/w | parallel output port pins 63:32 +| `0xfffffc00` | `INPUT_LO` | 31:0 | r/- | parallel input port pins 31:0 +| `0xfffffc04` | `INPUT_HI` | 31:0 | r/- | parallel input port pins 63:32 +| `0xfffffc08` | `OUTPUT_LO` | 31:0 | r/w | parallel output port pins 31:0 +| `0xfffffc0c` | `OUTPUT_HI` | 31:0 | r/w | parallel output port pins 63:32 |======================= diff --git a/docs/datasheet/soc_gptmr.adoc b/docs/datasheet/soc_gptmr.adoc index fcfb34e6b..cae926563 100644 --- a/docs/datasheet/soc_gptmr.adoc +++ b/docs/datasheet/soc_gptmr.adoc @@ -57,10 +57,10 @@ remains pending inside the CPU until it explicitly cleared by writing zero to th [options="header",grid="all"] |======================= | Address | Name [C] | Bit(s), Name [C] | R/W | Function -.4+<| `0xffffff60` .4+<| `CTRL` <|`0` `GPTMR_CTRL_EN` ^| r/w <| Timer enable flag +.4+<| `0xfffff100` .4+<| `CTRL` <|`0` `GPTMR_CTRL_EN` ^| r/w <| Timer enable flag <|`3:1` `GPTMR_CTRL_PRSC2 : GPTMR_CTRL_PRSC0` ^| r/w <| 3-bit clock prescaler select <|`4` `GPTMR_CTRL_MODE` ^| r/w <| Counter mode: `0`=single-shot, `1`=continuous <|`31:5` - ^| r/- <| _reserved_, read as zero -| `0xffffff64` | `THRES` |`31:0` | r/w | Threshold value register -| `0xffffff68` | `COUNT` |`31:0` | r/w | Counter register +| `0xfffff104` | `THRES` |`31:0` | r/w | Threshold value register +| `0xfffff108` | `COUNT` |`31:0` | r/w | Counter register |======================= diff --git a/docs/datasheet/soc_mtime.adoc b/docs/datasheet/soc_mtime.adoc index 4efa39002..70a437890 100644 --- a/docs/datasheet/soc_mtime.adoc +++ b/docs/datasheet/soc_mtime.adoc @@ -39,8 +39,8 @@ the interrupt request is explicitly acknowledged (e.g. writing to a memory-mappe [options="header",grid="all"] |======================= | Address | Name [C] | Bits | R/W | Function -| `0xffffff90` | `TIME_LO` | 31:0 | r/w | machine system time, low word -| `0xffffff94` | `TIME_HI` | 31:0 | r/w | machine system time, high word -| `0xffffff98` | `TIMECMP_LO` | 31:0 | r/w | time compare, low word -| `0xffffff9c` | `TIMECMP_HI` | 31:0 | r/w | time compare, high word +| `0xfffff400` | `TIME_LO` | 31:0 | r/w | machine system time, low word +| `0xfffff404` | `TIME_HI` | 31:0 | r/w | machine system time, high word +| `0xfffff408` | `TIMECMP_LO` | 31:0 | r/w | time compare, low word +| `0xfffff40c` | `TIMECMP_HI` | 31:0 | r/w | time compare, high word |======================= diff --git a/docs/datasheet/soc_neoled.adoc b/docs/datasheet/soc_neoled.adoc index bdb79798d..7e35cc03f 100644 --- a/docs/datasheet/soc_neoled.adoc +++ b/docs/datasheet/soc_neoled.adoc @@ -186,7 +186,7 @@ writing zero to according <<_mip>> CSR bit. [options="header",grid="all"] |======================= | Address | Name [C] | Bit(s), Name [C] | R/W | Function -.13+<| `0xffffffd8` .13+<| `CTRL` <|`0` `NEOLED_CTRL_EN` ^| r/w <| NEOLED enable +.13+<| `0xfffffd00` .13+<| `CTRL` <|`0` `NEOLED_CTRL_EN` ^| r/w <| NEOLED enable <|`1` `NEOLED_CTRL_MODE` ^| r/w <| data transfer size; `0`=24-bit; `1`=32-bit <|`2` `NEOLED_CTRL_STROBE` ^| r/w <| `0`=send normal color data; `1`=send RESET command on data write access <|`5:3` `NEOLED_CTRL_PRSC2 : NEOLED_CTRL_PRSC0` ^| r/w <| 3-bit clock prescaler, bit 0 @@ -199,5 +199,5 @@ writing zero to according <<_mip>> CSR bit. <|`29` `NEOLED_CTRL_TX_HALF` ^| r/- <| TX FIFO is _at least_ half full <|`30` `NEOLED_CTRL_TX_FULL` ^| r/- <| TX FIFO is full <|`31` `NEOLED_CTRL_TX_BUSY` ^| r/- <| TX serial engine is busy when set -| `0xffffffdc` | `DATA` <|`31:0` / `23:0` ^| -/w <| TX data (32- or 24-bit, depending on _NEOLED_CTRL_MODE_ bit) +| `0xfffffd04` | `DATA` <|`31:0` / `23:0` ^| -/w <| TX data (32- or 24-bit, depending on _NEOLED_CTRL_MODE_ bit) |======================= diff --git a/docs/datasheet/soc_onewire.adoc b/docs/datasheet/soc_onewire.adoc index ab9364a8b..612a6cad9 100644 --- a/docs/datasheet/soc_onewire.adoc +++ b/docs/datasheet/soc_onewire.adoc @@ -176,7 +176,7 @@ according <<_mip>> CSR FIRQ bit. [options="header",grid="all"] |======================= | Address | Name [C] | Bit(s), Name [C] | R/W | Function -.10+<| `0xffffff70` .10+<| `CTRL` <|`0` `ONEWIRE_CTRL_EN` ^| r/w <| ONEWIRE enable, reset if cleared +.10+<| `0xfffff200` .10+<| `CTRL` <|`0` `ONEWIRE_CTRL_EN` ^| r/w <| ONEWIRE enable, reset if cleared <|`2:1` `ONEWIRE_CTRL_PRSC1 : ONEWIRE_CTRL_PRSC0` ^| r/w <| 2-bit clock prescaler select <|`10:3` `ONEWIRE_CTRL_CLKDIV7 : ONEWIRE_CTRL_CLKDIV0` ^| r/w <| 8-bit clock divider value <|`11` `ONEWIRE_CTRL_TRIG_RST` ^| -/w <| trigger reset pulse, auto-clears @@ -186,5 +186,5 @@ according <<_mip>> CSR FIRQ bit. <|`29` `ONEWIRE_CTRL_SENSE` ^| r/- <| current state of the bus line <|`30` `ONEWIRE_CTRL_PRESENCE` ^| r/- <| device presence detected after reset pulse <|`31` `ONEWIRE_CTRL_BUSY` ^| r/- <| operation in progress when set -| `0xffffff74` | `DATA` |`7:0` `ONEWIRE_DATA_MSB : ONEWIRE_DATA_LSB` | r/w | receive/transmit data (8-bit) +| `0xfffff204` | `DATA` |`7:0` `ONEWIRE_DATA_MSB : ONEWIRE_DATA_LSB` | r/w | receive/transmit data (8-bit) |======================= \ No newline at end of file diff --git a/docs/datasheet/soc_pwm.adoc b/docs/datasheet/soc_pwm.adoc index 93bf22eb4..97e1a3100 100644 --- a/docs/datasheet/soc_pwm.adoc +++ b/docs/datasheet/soc_pwm.adoc @@ -67,18 +67,18 @@ _**f~PWM~**_ = _f~main~[Hz]_ / (2^8^ * `clock_prescaler`) [options="header",grid="all"] |======================= | Address | Name [C] | Bit(s), Name [C] | R/W | Function -.3+<| `0xffffff50` .3+<| `CTRL` <|`0` `PWM_CTRL_EN` ^| r/w <| PWM enable +.3+<| `0xfffff000` .3+<| `CTRL` <|`0` `PWM_CTRL_EN` ^| r/w <| PWM enable <|`3:1` `PWM_CTRL_PRSC2 : PWM_CTRL_PRSC0` ^| r/w <| 3-bit clock prescaler select <|`31:4` - ^| r/- <| _reserved_, read as zero -.4+<| `0xffffff54` .4+<| `DC[0]` <|`7:0` ^| r/w <| 8-bit duty cycle for channel 0 +.4+<| `0xfffff004` .4+<| `DC[0]` <|`7:0` ^| r/w <| 8-bit duty cycle for channel 0 <|`15:8` ^| r/w <| 8-bit duty cycle for channel 1 <|`23:16` ^| r/w <| 8-bit duty cycle for channel 2 <|`31:24` ^| r/w <| 8-bit duty cycle for channel 3 -.4+<| `0xffffff58` .4+<| `DC[1]` <|`7:0` ^| r/w <| 8-bit duty cycle for channel 4 +.4+<| `0xfffff008` .4+<| `DC[1]` <|`7:0` ^| r/w <| 8-bit duty cycle for channel 4 <|`15:8` ^| r/w <| 8-bit duty cycle for channel 5 <|`23:16` ^| r/w <| 8-bit duty cycle for channel 6 <|`31:24` ^| r/w <| 8-bit duty cycle for channel 7 -.4+<| `0xffffff5c` .4+<| `DC[2]` <|`7:0` ^| r/w <| 8-bit duty cycle for channel 8 +.4+<| `0xfffff00c` .4+<| `DC[2]` <|`7:0` ^| r/w <| 8-bit duty cycle for channel 8 <|`15:8` ^| r/w <| 8-bit duty cycle for channel 9 <|`23:16` ^| r/w <| 8-bit duty cycle for channel 10 <|`31:24` ^| r/w <| 8-bit duty cycle for channel 11 diff --git a/docs/datasheet/soc_sdi.adoc b/docs/datasheet/soc_sdi.adoc index 98f93796d..34426486f 100644 --- a/docs/datasheet/soc_sdi.adoc +++ b/docs/datasheet/soc_sdi.adoc @@ -82,7 +82,7 @@ Furthermore, an active SDI interrupt has to be explicitly cleared again by writi [options="header",grid="all"] |======================= | Address | Name [C] | Bit(s), Name [C] | R/W | Function -.16+<| `0xfffffff0` .16+<| `CTRL` <|`0` `SDI_CTRL_EN` ^| r/w <| SDI module enable +.16+<| `0xfffff700` .16+<| `CTRL` <|`0` `SDI_CTRL_EN` ^| r/w <| SDI module enable <|`1` `SDI_CTRL_CLR_RX` ^| -/w <| clear RX FIFO when set, bit auto-clears <|`3:2` _reserved_ ^| r/- <| reserved, read as zero <|`7:4` `SDI_CTRL_FIFO_MSB : SDI_CTRL_FIFO_LSB` ^| r/- <| FIFO depth; log2(_IO_SDI_FIFO_) @@ -98,5 +98,5 @@ Furthermore, an active SDI interrupt has to be explicitly cleared again by writi <|`26` `SDI_CTRL_TX_EMPTY` ^| r/- <| TX FIFO empty <|`27` `SDI_CTRL_TX_FULL` ^| r/- <| TX FIFO full <|`31:28` _reserved_ ^| r/- <| reserved, read as zero -| `0xfffffff4` | `DATA` |`7:0` | r/w | receive/transmit data (FIFO) +| `0xfffff704` | `DATA` |`7:0` | r/w | receive/transmit data (FIFO) |======================= diff --git a/docs/datasheet/soc_slink.adoc b/docs/datasheet/soc_slink.adoc index ee3c999aa..b750a8dc5 100644 --- a/docs/datasheet/soc_slink.adoc +++ b/docs/datasheet/soc_slink.adoc @@ -76,7 +76,7 @@ it has to be explicitly cleared again by writing zero to the according <<_mip>> [options="header",grid="all"] |======================= | Address | Name [C] | Bit(s) | R/W | Function -.20+<| `0xffffff08` .20+<| `NEORV32_SLINK.CTRL` <| `0` `SLINK_CTRL_EN` ^| r/w | SLINK global enable +.20+<| `0xffffec00` .20+<| `NEORV32_SLINK.CTRL` <| `0` `SLINK_CTRL_EN` ^| r/w | SLINK global enable <| `1` `SLINK_CTRL_RX_CLR` ^| -/w | Clear RX FIFO (bit auto-clears) <| `2` `SLINK_CTRL_TX_CLR` ^| -/w | Clear TX FIFO (bit auto-clears) <| `7:3` _reserved_ ^| r/- | _reserved_, read as zero @@ -96,5 +96,5 @@ it has to be explicitly cleared again by writing zero to the according <<_mip>> <| `23:22` _reserved_ ^| r/- | _reserved_, read as zero <| `27:24` `SLINK_CTRL_RX_FIFO_MSB : SLINK_CTRL_RX_FIFO_LSB` ^| r/- | log2(RX FIFO size) <| `31:28` `SLINK_CTRL_TX_FIFO_MSB : SLINK_CTRL_TX_FIFO_LSB` ^| r/- | log2(TX FIFO size) -| `0xffffff0c` | `NEORV32_SLINK.DATA` | `31:0` | r/w | RX/TX data +| `0xffffec04` | `NEORV32_SLINK.DATA` | `31:0` | r/w | RX/TX data |======================= diff --git a/docs/datasheet/soc_spi.adoc b/docs/datasheet/soc_spi.adoc index 8cea9a745..0fd078af3 100644 --- a/docs/datasheet/soc_spi.adoc +++ b/docs/datasheet/soc_spi.adoc @@ -107,7 +107,7 @@ Furthermore, an active SPI interrupt has to be explicitly cleared again by writi [options="header",grid="all"] |======================= | Address | Name [C] | Bit(s), Name [C] | R/W | Function -.18+<| `0xffffffa8` .18+<| `CTRL` <|`0` `SPI_CTRL_EN` ^| r/w <| SPI module enable +.18+<| `0xfffff800` .18+<| `CTRL` <|`0` `SPI_CTRL_EN` ^| r/w <| SPI module enable <|`1` `SPI_CTRL_CPHA` ^| r/w <| clock phase <|`2` `SPI_CTRL_CPOL` ^| r/w <| clock polarity <|`5:3` `SPI_CTRL_CS_SEL2 : SPI_CTRL_CS_SEL0` ^| r/w <| Direct chip-select 0..7 @@ -125,5 +125,5 @@ Furthermore, an active SPI interrupt has to be explicitly cleared again by writi <|`26:23` `SPI_CTRL_FIFO_MSB : SPI_CTRL_FIFO_LSB` ^| r/- <| FIFO depth; log2(_IO_SPI_FIFO_) <|`30:27` `reserved_ ^| r/- <| reserved, read as zero <|`31` `SPI_CTRL_BUSY` ^| r/- <| SPI module busy when set (serial engine operation in progress and TX FIFO not empty yet) -| `0xffffffac` | `DATA` |`7:0` | r/w | receive/transmit data (FIFO) +| `0xfffff804` | `DATA` |`7:0` | r/w | receive/transmit data (FIFO) |======================= diff --git a/docs/datasheet/soc_sysinfo.adoc b/docs/datasheet/soc_sysinfo.adoc index 20a73bbb3..b438606d9 100644 --- a/docs/datasheet/soc_sysinfo.adoc +++ b/docs/datasheet/soc_sysinfo.adoc @@ -33,14 +33,14 @@ Any write access to the SYSINFO module will raise a store bus error exception. [options="header",grid="all"] |======================= | Address | Name [C] | Function -| `0xffffffe0` | `CLK` | clock speed in Hz (via top's `CLOCK_FREQUENCY` generic) -| `0xffffffe4` | `CUSTOM_ID | custom user-defined ID (via top's `CUSTOM_ID` generic) -| `0xffffffe8` | `SOC` | specific SoC configuration (see `sysinfo_soc_configuration>>) -| `0xffffffec` | `CACHE` | cache configuration information (see <<_sysinfo_cache_configuration>>) -| `0xfffffff0` | `ISPACE_BASE` | instruction address space base (via package's `ispace_base_c` constant) -| `0xfffffff4` | `IMEM_SIZE` | internal IMEM size in bytes (via top's `MEM_INT_IMEM_SIZE` generic) -| `0xfffffff8` | `DSPACE_BASE` | data address space base (via package's `sdspace_base_c` constant) -| `0xfffffffc` | `DMEM_SIZE` | internal DMEM size in bytes (via top's `MEM_INT_DMEM_SIZE` generic) +| `0xfffffe00` | `CLK` | clock speed in Hz (via top's `CLOCK_FREQUENCY` generic) +| `0xfffffe04` | `CUSTOM_ID | custom user-defined ID (via top's `CUSTOM_ID` generic) +| `0xfffffe08` | `SOC` | specific SoC configuration (see `sysinfo_soc_configuration>>) +| `0xfffffe0c` | `CACHE` | cache configuration information (see <<_sysinfo_cache_configuration>>) +| `0xfffffe10` | `ISPACE_BASE` | instruction address space base (via package's `ispace_base_c` constant) +| `0xfffffe14` | `IMEM_SIZE` | internal IMEM size in bytes (via top's `MEM_INT_IMEM_SIZE` generic) +| `0xfffffe18` | `DSPACE_BASE` | data address space base (via package's `sdspace_base_c` constant) +| `0xfffffe1c` | `DMEM_SIZE` | internal DMEM size in bytes (via top's `MEM_INT_DMEM_SIZE` generic) |======================= diff --git a/docs/datasheet/soc_trng.adoc b/docs/datasheet/soc_trng.adoc index 76692e384..8f9fbc93a 100644 --- a/docs/datasheet/soc_trng.adoc +++ b/docs/datasheet/soc_trng.adoc @@ -71,7 +71,7 @@ an active TRNG interrupt has to be explicitly cleared again by writing zero to t [options="header",grid="all"] |======================= | Address | Name [C] | Bit(s), Name [C] | R/W | Function -.11+<| `0xffffffb8` .11+<| `CTRL` <|`7:0` `TRNG_CTRL_DATA_MSB : TRNG_CTRL_DATA_MSB` ^| r/- <| 8-bit random data +.11+<| `0xfffffa00` .11+<| `CTRL` <|`7:0` `TRNG_CTRL_DATA_MSB : TRNG_CTRL_DATA_MSB` ^| r/- <| 8-bit random data <|`15:8` - ^| r/- <| reserved, read as zero <|`19:16` `TRNG_CTRL_FIFO_MSB : TRNG_CTRL_FIFO_MSB` ^| r/- <| FIFO depth, log2(`IO_TRNG_FIFO`) <|`25:20` - ^| r/- <| reserved, read as zero diff --git a/docs/datasheet/soc_twi.adoc b/docs/datasheet/soc_twi.adoc index f28c887bd..1ed74a3f5 100644 --- a/docs/datasheet/soc_twi.adoc +++ b/docs/datasheet/soc_twi.adoc @@ -125,7 +125,7 @@ explicitly cleared again by writing zero to the according <<_mip>> CSR bit. [options="header",grid="all"] |======================= | Address | Name [C] | Bit(s), Name [C] | R/W | Function -.10+<| `0xffffffb0` .10+<| `CTRL` <|`0` `TWI_CTRL_EN` ^| r/w <| TWI enable, reset if cleared +.10+<| `0xfffff900` .10+<| `CTRL` <|`0` `TWI_CTRL_EN` ^| r/w <| TWI enable, reset if cleared <|`1` `TWI_CTRL_START` ^| -/w <| generate START condition, auto-clears <|`2` `TWI_CTRL_STOP` ^| -/w <| generate STOP condition, auto-clears <|`3` `TWI_CTRL_MACK` ^| r/w <| generate controller-ACK for each transmission ("MACK") @@ -136,5 +136,5 @@ explicitly cleared again by writing zero to the according <<_mip>> CSR bit. <|`29` `TWI_CTRL_CLAIMED` ^| r/- <| set if the TWI bus is claimed by any controller <|`30` `TWI_CTRL_ACK` ^| r/- <| ACK received when set, NACK received when cleared <|`31` `TWI_CTRL_BUSY` ^| r/- <| transfer/START/STOP in progress when set -| `0xffffffb4` | `DATA` |`7:0` | r/w | receive/transmit data +| `0xfffff904` | `DATA` |`7:0` | r/w | receive/transmit data |======================= diff --git a/docs/datasheet/soc_uart.adoc b/docs/datasheet/soc_uart.adoc index b5fd727e6..8763d97e6 100644 --- a/docs/datasheet/soc_uart.adoc +++ b/docs/datasheet/soc_uart.adoc @@ -122,7 +122,7 @@ Both file are created in the simulation's home folder. [options="header",grid="all"] |======================= | Address | Name [C] | Bit(s), Name [C] | R/W | Function -.19+<| `0xffffffa0` .19+<| `CTRL` <|`0` `UART_CTRL_EN` ^| r/w <| UART enable +.19+<| `0xfffff500` .19+<| `CTRL` <|`0` `UART_CTRL_EN` ^| r/w <| UART enable <|`1` `UART_CTRL_SIM_MODE` ^| r/w <| enable **simulation mode** <|`2` `UART_CTRL_HWFC_EN` ^| r/w <| enable RTS/CTS hardware flow-control <|`5:3` `UART_CTRL_PRSC2 : UART_CTRL_PRSC0` ^| r/w <| Baud rate clock prescaler select @@ -141,7 +141,7 @@ Both file are created in the simulation's home folder. <|`29:27` - ^| r/- <| _reserved_ read as zero <|`30` `UART_CTRL_RX_OVER` ^| r/- <| RX FIFO overflow <|`31` `UART_CTRL_TX_BUSY` ^| r/- <| TX busy or TX FIFO not empty -.5+<| `0xffffffa4` .3+<| `DATA` <|`7:0` `UART_DATA_RTX_MSB : UART_DATA_RTX_LSB` ^| r/w <| receive/transmit data +.5+<| `0xfffff504` .3+<| `DATA` <|`7:0` `UART_DATA_RTX_MSB : UART_DATA_RTX_LSB` ^| r/w <| receive/transmit data <|`11:8` `UART_DATA_RX_FIFO_SIZE_MSB : UART_DATA_RX_FIFO_SIZE_LSB` ^| r/- <| log2(RX FIFO size) <|`15:12` `UART_DATA_TX_FIFO_SIZE_MSB : UART_DATA_TX_FIFO_SIZE_LSB` ^| r/- <| log2(RX FIFO size) <|`31:16` ^| r/- <| _reserved_, read as zero @@ -196,6 +196,6 @@ data words. [options="header",grid="all"] |======================= | Address | Name [C] | Bit(s), Name [C] | R/W | Function -| `0xffffffd0` | `CTRL` | ... | ... | Same as UART0 -| `0xffffffd4` | `DATA` | ... | ... | Same as UART0 +| `0xfffff600` | `CTRL` | ... | ... | Same as UART0 +| `0xfffff604` | `DATA` | ... | ... | Same as UART0 |======================= diff --git a/docs/datasheet/soc_wdt.adoc b/docs/datasheet/soc_wdt.adoc index 8c462f3ad..d436945c5 100644 --- a/docs/datasheet/soc_wdt.adoc +++ b/docs/datasheet/soc_wdt.adoc @@ -84,7 +84,7 @@ the last system reset was caused by the watchdog itself. [options="header",grid="all"] |======================= | Address | Name [C] | Bit(s), Name [C] | R/W | Reset value | Writable if locked | Function -.8+<| `0xffffffbc` .8+<| `CTRL` <|`0` `WDT_CTRL_EN` ^| r/w ^| `0` ^| no <| watchdog enable +.8+<| `0xfffffb00` .8+<| `CTRL` <|`0` `WDT_CTRL_EN` ^| r/w ^| `0` ^| no <| watchdog enable <|`1 `WDT_CTRL_LOCK` ^| r/w ^| `0` ^| no <| lock configuration when set, clears only on system reset, can only be set if enable bit is set already <|`2` `WDT_CTRL_DBEN` ^| r/w ^| `0` ^| no <| set to allow WDT to continue operation even when CPU is in debug mode <|`3` `WDT_CTRL_SEN` ^| r/w ^| `0` ^| no <| set to allow WDT to continue operation even when CPU is in sleep mode diff --git a/docs/datasheet/soc_xirq.adoc b/docs/datasheet/soc_xirq.adoc index 44e350a2d..f163d82c4 100644 --- a/docs/datasheet/soc_xirq.adoc +++ b/docs/datasheet/soc_xirq.adoc @@ -71,8 +71,8 @@ In order to acknowledge an XIRQ interrupt, the interrupt handler has to... [options="header",grid="all"] |======================= | Address | Name [C] | Bit(s) | R/W | Description -| `0xffffff80` | `EIE` | `31:0` | r/w | External interrupt enable register (one bit per channel, LSB-aligned) -| `0xffffff84` | `EIP` | `31:0` | r/w | External interrupt pending register (one bit per channel, LSB-aligned); writing 0 to a bit clears the according pending interrupt -| `0xffffff88` | `ESC` | `4:0` | r/w | Interrupt source ID (0..31) of firing IRQ (prioritized!); writing _any_ value will acknowledge the current XIRQ interrupt -| `0xffffff8c` | - | `31:0` | r/- | _reserved_, read as zero +| `0xfffff300` | `EIE` | `31:0` | r/w | External interrupt enable register (one bit per channel, LSB-aligned) +| `0xfffff304` | `EIP` | `31:0` | r/w | External interrupt pending register (one bit per channel, LSB-aligned); writing 0 to a bit clears the according pending interrupt +| `0xfffff308` | `ESC` | `4:0` | r/w | Interrupt source ID (0..31) of firing IRQ (prioritized!); writing _any_ value will acknowledge the current XIRQ interrupt +| `0xfffff30c` | - | `31:0` | r/- | _reserved_, read as zero |======================= From cb90c45bdd852f5e6521b94411788013c21f6ae2 Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Sun, 16 Jul 2023 21:03:54 +0200 Subject: [PATCH 23/31] [docs] update figures --- docs/figures/address_space.png | Bin 132590 -> 143869 bytes docs/figures/neorv32_bus.png | Bin 38894 -> 56290 bytes .../figures/neorv32_memory_configurations.png | Bin 56965 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/figures/neorv32_memory_configurations.png diff --git a/docs/figures/address_space.png b/docs/figures/address_space.png index b358eee95621874e32aca84b80310332c4b9d5dc..94925415e6d35f9d3fbca66be6009f94f17dc0f4 100644 GIT binary patch literal 143869 zcmce-cUaQx8#Z2!+Ri4#nE?57x?+>ed-W4xRM|7&h^qH0uPjq!%X$I#O7#EF`0t|Jdt#(R#C>yF?P zCwO~~|4t4Be|&J_1pWOD6T`bvZktrDwjg^~>6mIsrX;vY*ZteqAN5!o8MPa@^CvXe z#>CvzyEq+xcs3>{bf%}T$K9@>|5T|wvJhM>EK*ZTjg0$z42D7qXzE{sa z`G5ZcI$Ru#3Y6ei?L68EP8-%t`HClC2C8)Cz4ia{rqz%Nojg{2<_Wk zDeOq*Xr62wm5WGckG+uu8IGF$Z_l9G5KOMUTXYvWn%U@er;ciVGR37i@(Iq}jBMT4 zaC|asNusNiH2&F0t{SQs1_R`boL^|kvQDK0u zT~=RT4OyB*VUw9~C&D`q;qE(aznaw-&#@jh>0zS%vHGhXWx>b$JVP!<=`<24lby2z zV`i@rGEjOaKvj7)o7-o4Oh~p9pYDGQJR*nBlgWN5e)Q2a=mv;3iOC*E`Ge;FS_dfHtq>GH6-cga6!HZ8G19ekqCZWUJC1TnOn`F?`yFpllu5Z>MXls-0xNxGc zaVb5XUm7LC}OW?A5 zT=`+|iXvj}rR}lXvo$FTy+DaaPn|O$C0s}7A6A;Iez3V`E_2Ya|1~$tDWu#;JXncv zQyB}TpX@5s{prowJ^x^csY@=Z3H+RfNz@gY(d_kt--yp=!zW{~C%a;AxIiCLgA{MY zP0^bSwqIClH+8pk0iH6)$?~cE6lWM!8Z^bC(~C;LXAHx*Nd?u=eK@v#kteu0FzV;= z$phZxH{&H0Zvjuk?(*F&%DxW5y|8D>o!T4FOU8&}vRCr*rdjTB=* za4Yz=UzY|Jt9YBZ*Y9WbXe-?ldEu2cu%%HQ%+tgTU(a<;ZrM)M{pUa1owA#O1uB7KJ&mY5qt8@JJYzD7uG6>if0JD^oNqt&>f2pl_(-u^eiWx8$#t7@&eSZyymJMw3o~^kpl1#Ij|F zq!E;4Pg`u-mL)rEQT;~*@xJDN(dhil!WiSQD2(us$|6(5fpcl?@QaSr(@dmh?teY0 zTv<_3(Us>QG_RHx0%prxu8sEl!9hO`Q7Rxxe&^L@U8SH_+MGYWeLc4jnI8n&ym9Oh zXP@YbJH3{c;ua;G=xX;+3rh>?o)g?Me32bB7&Ri)E*AS|VB^t()59lfqu9)Z4#vMk z@G$MT29uNDkA}{-qw^5RtM9-g)ooE*e8J5@d+oc66Z~jR)ZQ;k98nFWlk(TM%0NCw zYBy%&j22c(7MSM}^*Q}w^E8WIO3{d^yFP|K)C={?em(Om?AR9S@2Vb-)y4eo5@}G! zqOBjlM<`!wRDLeP44L}=)fcaXFen=UJwejQ#^S2=rtE4oFwo4qk z;jur*r;+FTYTH(%!VZvkVPDRVn8v2e-e~uRCGsd>#eS@Wck)Nyo}W*gci?;*ooh?c zCjo=EI1oqA2tkp}2RYKNvH0<734P#-Zgy2M>0_|CK5F`&EMv2Aq2!}A@hWkNkHGz@ zX7Ga57dD8w&&Y8`^VDV-^tu2{IJJG5aG8`__ncCuuk^#LD-X6;&0ZzHl~e+(Xm)OY z70B;p;nILa80urA6f^P-+rVw&vUHZCEBwgeDCeyjP3=nqmUr5?dx;X(uhyf^5dW

Yu{zY*h-?f3ecMTgG}QW5TY_ z^y2B&A+PxGx0Jlt5gzw zk|V=Q@8u%C9EW{#R0H`)T9k%V(BEz(eCN2Hn)`1Xa@L(x*F*jD+kNciN-BKK2q!=v zoUN8>zQ$A9cRBfJ@qt#5)5LMCy?WN?LQFbEO5nbBzC>w-JkH=x%@8ksJ}XSjNVWU> zV?C7->!k1Uej$d-)&d@sYyL|7E~5T++t862sh<`|eA~ICtulR5TWTd__&q`#V*Mxt zYMyk`W3#$Mmcn}S){mg%;HW=MJa$Jc&*HWU-2h8+Du;?c=70xk^xjkSTRjhqR28eE zdUHx^hzkP%FY>J~h3CHI)BU1o`A6fWXYd;Rz!9!nyKaV4h3t>q&`_+A8YuYK{%=)Q zQ`wZuL|9~o5AM2Pf8(ctF9-uKrm8HeVztAL9nqjjsHL|YvYcM1AJ<*`qtqgv+a&N1 zj0NoULc`D`x!}%+{8%g!>(5qWeaZP@DS~5Dn}1fT8-2hHUhI=QGVa_$@Es`N;IQN) z&fO%R4&TAy9O$-!=>5X$@Pzii?%ZFH%!m+dwjrIeNe37Fw|u9U?u|X)j2iv7C_(Rl zSQgwc*~0iDuY_U>7!{r|fyhpMSEGf6ZVG=h_)`vS0&!4BxZp=}rAL{jMdYL_e>fg- zu6?&w9R}j>pmfMWKf%@7a--6RfhfSc#aACa`o0^f{s5SD;a^3cj1D?Jhcb}&TL%6N z*>{j|?tKVWg!ry5tL}5K)}D%q7R;h-x5Z`vd_W#XAAB~RWPBg#cuFxI zBb)Tv+t7Mg3r=$GZlAe^+l8!v@w`5c2(L|I)#UO{^l2VYNp*n#aeS3r*Wdp%o7Fte z$B&5~YI}cBK(ngAAEyA{tGG7bc<3NM`qk?T-yFLgM>vA*Njv=?+v;Oo~eie#S^%xT{*&4s2HG1Sw{+eSLhyv6qjj1qC2A`5cBTLjDWv z>SD2?s{@l0Zi2WcLXk5nxmkLydf(-mJPODjhH2~hN$Tt8C$y_=c3ZE~xInxhgcH4 zY*sH)m@u%=0y-#Pq#37`3k?u8&PM)gQmT1!5^or+oJ@+Vj$jYtj3F_ zlHB%(4C5xZMXpIId_!UMH+Jo?NRq#1n+382?_$S`9%f$c4UUdZ5p(Y-*R%F=Pu@44 zpXh6_|FGP9@)xyA^Qe2fC2yEA1@3J5LON*O)v&zukH6EOrq33u_>si{87SXjIVO}I zVx1O8&+h_D3lL^oedJ$*RwlQ(+OGY6C6(kn5H&hIz1=3;ong^t<08~1Y5ALx*82_b z0rQ*d>TBadb!%Uia3}GTJc|!zpEZEF^gP<25894PV$Av19fio)QI0un{}|4tizWV3 zISq7)CHdW3QNzraOYmO7S9#AsVQp?&ZX_O=cO2lig))OO&31rL-iG3{E+sl{GN`CJ zjxP1COkHeH7Pft)no%!@ZkDrBwFRc3oG51FrRkmfKw@m|>jAz4W6Vxfh8O;Pe8WY{?|2M$rdsGLr#1*|aF8NhLUs|}^Qc4p{4;z0CDHlPo;6)pL>mI8y z*Su2giXqJBs4EDqL{nf1A{k}n8l+JAWK2ADDuI>*I&klyMl4Z4iCBFZG}PTCEzB

0% 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 vZYomm3VW_ z#8zphIq8!G9gZ;g7=|SBtntb;ELVLnmo?IAb_SZOv9z5B{;M5KyGV`s6HB4{ll74f*_OE8!uvly7VAbcH z6C+;>d3iz+r{gW$y(;1m~8{lds%ppUWb93PKlz zZ=K^$V>z6T>>MCJh}7C-DwaRkEo(SB?(Kgm5X-W$ETdP7gc8Wks?@^rTc>@1*Ff+2 z@C|B399q3h)Rks3rRT71ob&r}U=LuX$o!Oip;4S$uScyve3KP7gxRC!&38gqSq}gC zv2*P_c>Csa>J;atbH8)!M$Oa`9UnULi?WyKxVKe@v1(8~_^Kct&X%0~o#MpDtk&Ye z^7Wbxw%Z{esGhuHERj7+HX%(9`SACPMTpMtzSdi_BA`0qN?VFc*3w!}Z`59=WD2Z4 z9fk)Vlv(q3v$JQ{^Ou5AU@@b#W#o?Ax#v;`OFk9FkfvB}n(b}Z9ebGfC*K=yHV%YJ z4&L&}DzOntT=xJQK-Zo9bbtETOeLl^G&x7fXjS+7aL`V> zt5r(kRAJS+i$sV{!Of zZtv6KmH->`h1`UegnL2gvJCL@k5*gM@1^P>)wGQcx!=GtmYBDybMlYMhi4Ys?b}1Q zRthIr0U(p}@}Ku(3rt_WJh#+K;2|6p%DI?|teQZX@UPsX3ER=QX-jD+=>mah`Hb!- zr94b)zeD!pq6~3(q21dqus)xBJztf(d!w>e-Jj^)N zBM8_^P7l@uqMzE*QScH9GXOkHZY z*mu#@0x3hYB(>iAdb{S&L*y1TIKIxwqAgFhmR&hj&ABIOd74F&_0S>_`{PldOqAkJ zjiyIIpGPyli_(JXs{XykA`NgxL(Ineu6w4|g^}HTln#JI{??Elhn%`?@vU#5;L$f*qHc z^G`Hd-Tf-NPB#yGiST6`{uq`*BB2&h8M>`HspL z>(XmB2QIK1=w09ywBvZtISMUZ&K-4Axc--!(YnrH6@@TTfw7CEJQW zUJ)tjV0Mo7=QM&z4zUx3z&DxrYFs$Ip|TO0Gg#u6t;fQBfeLsPR8+T~} z)*WGY?2tbwNDlJ33NIYm&TW`3bPZ_o5qn1Su0=rcJ8j#K(eS|tsdZ1`kKG?w+a@5c zlFuRR4^M|XAJA4xCTd$e z9=mcY?Jme`TEk(ca8X;dKdF5V{Luo{rG$3SfJe=#^x6_0aj8lGN2*oN9X1+ec!s}L z^^eY#-qA4?sa&Y54dp#qaZa^TcCdLPBVkO$B;3jkdDsG+zpWYmTefo9B$U%VZ)53U zVbSY?#zm{!3V?_0YKb=6T`c*zCkjX&tb zj7L-6kC?s`NbEfgf9Uj0(_x6YSJN%@-zmO4;MeV$nf6rWWd;3$H$;7=M;Cc%7`A+^jA0S*v=+L6F@S#lgAoL^B z5vI7Z-{6w_Mf}gvlF7G=OC~wr<6lLpQld;7U7509Mp_x;5PvyiOqeOxo^d9>cdv?} z`AdNZMBQ?BR1*KQaigG5x?Kf%PUtu|b6*;OtuQdO>>pQFA$BlQk3H~=!)t8RZx{K- z+`u!{RaagbJAEn7Vt3=*5>V~=Y_tEVBfr?F^P2;#g(=}<wj<2M(ShXC; ze)pMIHO=icFLp?~nJ^yq)sWNZCzPo1xGqRcOY$~l9)hF4CX8_m;y=Wkaoqwk7;Tfz z!S7{7ndHM&>+or^+wG=X0j&G_`N2W0=$>^p%82U*C%4yNkJNuKkYvE%>3v~umU5*H z6%XR`5V-P!Nle4)ivKh@(ELxj^OSbemAP*csk2}1#-1|4N@P1H+qPBiJbddpx_mOO zkbmoq6vt*g)Ss{XV{oqMooY#~w{E%%K@L}dsSD%sTQh$YTZbmKSO)?1-)?F*Y}#5Z zhkb7(y=10;iYiSE3+2!-cd%s5p{y(5w3~|ec+ZY=Lh!CD3d3*a`!3s0cnO`J?XsNg z^lAQVBP44lmc=M-#H;b!?_mM||)&sL0 zWtE?^0?!u=)T@tPffWz)4bOtxZ1EDQlcOQOD+OzMlos=vb90yoNRxpg=WFSPMR047 z&`^VZEnsEGf8Q8qGnu8vogesYi+PL)GKy98vu|oPehI2QS5q7js2pz?*P7u)^9x_X z+uqF+rv#LSmKa(7tTDL2{-R#i4!#V16mrt<-M*%bd+c0JVfZ&&2bD`$AX|8js1wuY zi4m*YrWm&Qy>%Xoc6GJ!U^Vh@l?@8f5f0qRI>=d6AMulPmgQ!=O+Cx&R;2Yeq}5z;yU zSo~;Ee^zQl4|{dj?|87_$*3w*xojN--4uU(=vE_1stLWVXj42ZlkDc{^U^AVfBV9T z4_lyLQI)jseY?}K=<*y1TVI8y9kL&N?cXRwEu_im%} zGsIjdxydy?1&_|%Tvz<_G&NI2NI$kqu5>Tc)QMt^N=n+yp zLS}4fy~C$;45mAQseBr)q82T6(y$N@wANeERg(r54;oKc@08yzSM&x8uASs7E;aam z1>~q2ZcBx)R?YH|;Wi#FsXeHS1#eaa06!BllRa+uM7Oh)_xAZ!?d9Q1lopfDzf2F+ zjBBqa`C_9tDKmRwOxUN8s6PO>Z% zMS0M55?`J2IaIPv=;Y@0{$N{zHxgq`NZxt)9VR-jocsDGj(t z99cT>?-k)+h0N4caWlvj2Hg#9>IG=NxcH$r6ZGDH_DAQX}G_FdDb4w(`-O3wv{jB^{~`qCQAKSOYtZfIzfJxX2P zFY9cLPlm~sa8-})KlAwghz^zA{lDvEc$kSUd9kgpop$m(3Jk74F18QXJ_!N4#0NN%Uqe0<7oq))`rUol2;naXPH0D%xwyZ+n5E9AzJ$B*`5 zW^~D_+`F#%txsBrvAzSoiTRM;U{0)k_Tt%DbIyBjuO*WoeYB9Bb^~4V_~M&Q4$zL} z_15@9A)is3eOR*xh?=>GFO~LquX}IF54MJG*KqO7zVsS3G!ozW{Z!WJ;uJZlQ1?Tt zJY>~Pu*gGbvlrnV9a*RSXL}ea9LdvZ8=m7JGH`{?a=Fp=?3sbjQ6C1Q%I^oOmh3q% zM?7xtl@FNUX%YdJ25bJfsL8gK6YV%IEjarobA1gmIp<&iIc$FBXM*1W83-xU*d^_6!i&f1-pat~@PNLLBCJ+2~!= zAJUu;n5_8TzQo{4Bs7X3#A#C2uxrm8=!i^^;JS7k)3SZzJIs5f-=m~}P~)_BY+0pz z!ZK~jFwYwby~=Vv*TTaQu*B1uapMqd9zadG_7dke;m0N`jrlK7H$2|nFPJ^|Q)b;7 z0$wlm9VMO!2gKflk_CRwN0toF5`Hu32NCo#UAX+p&g^(l4*Di#kftZ1ads<^P)>EcR$`AO=To zV(v1gO5_6m>p*R2&{bSm8ckoh5@C$ir+w0$z(tSF%rN7cCpV9@Q4D<}`3@~Fgzni46d&yXSKG(BE$utF92a3V$4Eq^0exwYsKX(|ch&@Zbaug5 zqnK9A-l{xdKn;~T=PMzK48{RgO*Cq#FCODtiED`Ynj7^(n{@Pm#L-s)#bdo!Sxud~ zGm#xzpj8njbYIW2ZHKy8^amOVJqcW;`!KejlW5J@`&FU{17RF8_4qSJv(KyP!Og&H zQB|D@Prh1f!4{zBX|Dsd_5y@g-Ll7hB`*Hp*dw{XC|`b1Mbw%n?_28tnIuYL*R=gn zhac-w5h98|5rArxEs`;6(L?SO6ix)SFJ}*Y&EaI4J6TqEi8Cyi{S!H~8OD#vE2WLQ zQ^!kek0;K|23&g(gS1UbpESHQI~(RX=d%S&rPwddhcX6oRGfY1;W(uiTpoxLfUyHr z4NQ*&_F^i`Fkik2k~Bv-!bEqaVdG*GZW6TYbS#J6UMX}$jE(E?1+(H$$}zS;7tjnQ zww>68I&1ehmTO>h){d9+vMM2F)H1E+I~B82-g7Y0`493}h`Ts%6##lfcGqVJQo}KS zXZS>pV;>w={kplyzexW_UtjZB3>hoaPyba-TdyW6nV*fk+50-MM{1AL=xD%wzpp{9 zcb`rLL`vtiD!7rv-KBW5;S>8NT*tGl3uT;p{6ET<6>)@F{E25isj;S7O3Xk>S*ot{ zyW?>*?X5KkC1+GL3$`jk3E&EvP*4gm05q><(`7{K$uCi74}UwmhRbUM2X6sZ7={M< zf*4a`s5}yG`~oN&RLw(r#6Vb^Vp1&L;^DFPFdht8V8|4$zSd$TXrQCTLq7Tn>ZlM} zeHW9N@_s9?x$e2{KciA%S-w8urA~-r^njv5Hm7Q=ldsdc2){lY1ao6~G#DQw zi&(#Sszw{ze;Btf8h%(CQg?)2aVzt=@1?qVO4Fvg_aIW0iK4H9Q%KMs+C21ZU zRG@X-JoYd4Fa*r)K_f~!xbRVJY?OV>U$;8R0L`%-mSPRtBbMHsOA_-i-)^aW9uqk0 z-(B-l5X>Tf2g2X%o$SndP=sN0TJ1wu2NoNhR4xtNXyU$>Ngh}DMeqM;v)?)t3aQ=Y zWGKTz#FdE(Ld3$lw68iXfW@T9s^dB{Rr(kqSd7u@QX$M6y}7>vq*xO*5Q^DMNxmi^ z`T)bI%6k9dcf9WEF6Gzplu;zrUF7Qql#FythL!*0l?0ZX59I1xn3oWXhInjiw9z3V z2?G~LYCFnec%*o%iA z-Kr8E1x{|fRDhh2l5T^bCccPV;e)%?^*iCdY31$3EzeZD?k+cXLbUoI8E$BX>}2$T zM87Fo&ODF5?ALJ~ z={I9AU@lSXQIM_Y1rN~xf-y$KLC-M;Wt7CHFaFFfw5tD?gSl0lLFHsWOEjZl^MVaB z7cX@{gZOK3=SgZ#{KqrJV>j@6!OLY4oEAMiZ1dB(w%uTx zeP^#OK)?JmMHWr^X8IVYho(gX`7c4wy_Eg^cgCh3MMaS)j&dL~9 z$+n`XGyH8a*NfVC4_+F;Du#DRA_b|H^NChZg|IEyqDwH`d(umhRmgQ0My}5JmD+n; zm&yJ5P+^=wF1xNQnA$7&=CGcOY345hr(wI_KfSDd5&6PW?Vn5ywNZxhp(;dKAX-f!Wdx>E{5;C@7zwK{>#yBR2cqtWWEB+Pb z)+9B!_6Dh9Ir3C@;c~zH_NK18;wD#H>&V9NhamWSLJ5M_S`WS>k!nMm zGk|mz^_^YvQ3V9Szh`^xx8{l<*AunpQ|!Bn1EwO~P|>)BW<9;XZu%EB%I3#zsR~TD zK+62q1)(RNd#wpv$iI(RQ7jR9l^0fS8#zY#qjdAkVrC3qjA_zv^Eeedx=&_R&(`&MOPTt7*gKPw&fD!nvX&4P@fjDz?oLc_=Y`@;IOt9^KTTH{*8UU+| z-={Mh2Pu%{vJ<4Lu+zk1Frh$1N+I7_)6AqeTHaN)iA~`fNw9;%VPv;A;-0pTiuICU zq{VD0t@pp7z+d;ia!hca?(=X8aTi5DTc$h@$xo>hdlg=kOL{L5QB$s6BCy~#kcV!U zdXZ-r_7+HbRr)Ck`lrjn%%{7%V^+?E7kb$9d`h>||mp#~|B-#MRv%j1J}4_e(B_le+mBlxC7T@b0?(7WA;DuBg zcX1rrI0;f-gKgnq&=3~AuKDKO1)>_vFUP;avnr^0jHlec)S)PcRNA`dM;Nf_nnT&5tn8Z7RDLWFRv+}PpW*1x^tIC6q@Xd)ZMJt zSG|STtOR{Hnr;=#ohvrdpOf24J*-@G7%D#O@Jo*%3%o%Kd$%^ZM$s6$Zw(piX5G1_ zt#cY}#T|l{I>v6PU$+dSb8L$3OSRL2;iTc&h;wm4z$w)T=jxvG!>by_#vz~Yt+fJH zh_C4D7C3bmoBG-O(F}& z)4n~4I%E6diKoLNJBTFm8xb0~A6a7P@$vDxtQGE-y9h&l=CrwX&3|ALcHYs4qpbcC zR6};|(^K6L6E`sWTXu=G$^mi$-kc``J)%Xs(43mxd7tegyXt;5=g1wl<9~1ZPvpfL zbP{YLxrZ06m;EQWC(?&(qgI=!2O%iH{1&6&8JMR^ry!2?&5pVh9O*Pe?Y@01e7x`r zJPPTE*!m763t{GPcQ!&Yz=+tXnMAdip&4e?sLfUIj=>;QrZvFrYQhD_q0z2?kzUCw@3J=ZEzNu>#hAZ z6=%=S5gO|#4CLX1B5l0Krqv|SlNFGERI@or_OhthlI3)A=C6Oh=qUNvluIQ0RGq#0 ztV1nlTp$<#_BOB1o#PbH1eNT|xkVG3t|~B#dKD*mIXFICO8dfc@R=joc)XO6hjoa7 zd@*Tr;^vVv>EOYmz5(i?4D6Om2aFoDH96p42I}vD?q#Q*t`50fM0$-#-_?~1qVH5< z%5^o_?+WotEP`tp3T0`@-my<#%z`JM$IO>?1m4j+mSL0ydjdT|SB0dbW@qrXE*Pb` zLTy02S{K$F`pWtBsSS0|i77!kv<)}8X%(cFXc=5~=GnwD0++8P{fy871NI%H#ffK* zgY9%*IovzXxHU8r@+&IY5-uflnRo8oc29aXJn+s2L(3&0SoFde?J(2Ro++Y>e7`s^ zII6#Gzbl>?DBjf~TSQLLG7qMaxJb``0euWflIGb`klQX$?IP)Z`e|V8@tvGUUYk~7 zK0Kw}b)Q0j)Az1Xs<71Vh0psrUdmMXKJr{UXRXIiskfIZABvo5Oi7*X2h9|+Cf&^#5?$d`q>FYu(wOTQ6qA@F%iQQgH=@NHuw_TvU znhkr-B6eMWqh?|`(7hu(5eCT{Y;D=#wY#0BFdGKvVE2gpZFd`k@*~@ZD@x=K#s%7@ z6hF!ZQsQ&jTdpjVjGy{^{oaF5_Kn;}etxv{B|$--46A;8ID4~1W}{a$*+~k8=~ss8 z6iE~D>|JC{w$k=R8H`9k=j@~FiBCsBD5JKNPG+!V2_+#U@AFsQ;eno-Of^%z&imXs z_eI@Z#G^pL_~xEy^?A*d+0cqJ9!r|6WPh8Z)XvKfI5#i$*2QU>O&NYOckt8wX4i40 z)b@|N(){HhQIar?q8-mjD^`M8nUk&_!d*Rrq%_|(!B^})EzhL|fsJF+dU=5qNYj%v z1m7zyYMKgp(LJ9Ppns$}qGxvc;M?4|Ac^b|7wQ64ErP!{CH|vUxEy#)S>PYx=Qaf+ zWsx2sYC1954Z)B<(`9%aWlu&K@vB_R(E_QI#$!<*Z%~~`V%b2N&qMdW?ClqJ?yk<5 z&x6KKJ?p+Q^e^Xd-c{?%Dslqbi;*q>_QZ?q?7z(Q4u13Gt=&r8j_Ou-uP4T9w#OJl zJ7jibOF1ZAj;t!PKI00$>O5YuZV!)k?)e=Q@y|X?$H!L3EZ+m^rOD%14gs=m=X&Qa z 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 z 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%0Dq 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�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 diff --git a/docs/figures/neorv32_bus.png b/docs/figures/neorv32_bus.png index 2c1b9c86f877cf99b2620db84838dca0acd7fe19..1edd413155444674ab2c9810a0f592a6e15ea190 100644 GIT binary patch literal 56290 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

V< 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 G?Ee5c8bP)I diff --git a/docs/figures/neorv32_memory_configurations.png b/docs/figures/neorv32_memory_configurations.png deleted file mode 100644 index 85cf1fbded06a9a3a7ab9ce8c4bf057198d98ecc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56965 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

GQ&72x=?Wro;FFD|z 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 g|6j9~d@*xQ({*)pvfOun=}(P@s Date: Sun, 16 Jul 2023 21:18:37 +0200 Subject: [PATCH 24/31] [docs] update docs new address space layout --- docs/datasheet/cpu.adoc | 6 +- docs/datasheet/overview.adoc | 52 +++--- docs/datasheet/soc.adoc | 155 +++++------------- docs/datasheet/soc_buskeeper.adoc | 36 ---- docs/datasheet/software.adoc | 8 +- .../userguide/customizing_the_bootloader.adoc | 1 - 6 files changed, 75 insertions(+), 183 deletions(-) delete mode 100644 docs/datasheet/soc_buskeeper.adoc diff --git a/docs/datasheet/cpu.adoc b/docs/datasheet/cpu.adoc index 3cbf98403..e5338e7de 100644 --- a/docs/datasheet/cpu.adoc +++ b/docs/datasheet/cpu.adoc @@ -69,7 +69,7 @@ overlapping operation of fetch and execute) at a reduced hardware footprint (due As a Von-Neumann machine, the CPU provides independent interfaces for instruction fetch and data access. However, these two bus interfaces are merged into a single processor-internal bus via a prioritizing bus switch (data accesses have higher priority). Hence, _all_ memory addresses including peripheral devices are mapped to a single unified 32-bit -address space (see section <<_cpu_data_and_instruction_access>>). +<<_address_space>>. [NOTE] The CPU does not perform any speculative/out-of-order operations at all. Hence, it is not vulnerable to security issues @@ -821,9 +821,9 @@ The processor-internal modules do not have to respond within a fixed cycle amoun However, the bus transaction has to be completed (= acknowledged) within a certain **response time window**. This time window is defined by the global `max_proc_int_response_time_c` constant (default = 15 cycles; the processor's VHDL package file `rtl/neorv32_package.vhd`). It defines the maximum number of cycles after which a non-responding bus request (i.e. no `ack` -and no `*err` signal) will **time out** and will raise a bus access fault exception. The <<_internal_bus_monitor_buskeeper>> +and no `*err` signal) will **time out** and will raise a bus access fault exception. The memory GATEWAY keeps track of all bus transactions to enforce this time window. If any bus operations times out - for example when -accessing "address space holes" - the BUSKEEPER will issue a bus error to the CPU that will raise the according bus +accessing "address space holes" - the GATEWAY will issue a bus error to the CPU that will raise the according bus exception. .Access Boundaries diff --git a/docs/datasheet/overview.adoc b/docs/datasheet/overview.adoc index a6b6f3017..5a3e82206 100644 --- a/docs/datasheet/overview.adoc +++ b/docs/datasheet/overview.adoc @@ -128,36 +128,36 @@ of the user guide. === Project Folder Structure ................................... -neorv32 - Project home folder +neorv32 - Project home folder │ -├docs - Project documentation -│├datasheet - AsciiDoc sources for the NEORV32 data sheet -│├figures - Figures and logos -│├icons - Misc. symbols -│├references - Data sheets and RISC-V specs. -│└userguide - AsciiDoc sources for the NEORV32 user guide +├-docs - Project documentation +│ ├-datasheet - AsciiDoc sources for the NEORV32 data sheet +│ ├-figures - Figures and logos +│ ├-icons - Misc. symbols +│ ├-references - Data sheets and RISC-V specs. +│ └-userguide - AsciiDoc sources for the NEORV32 user guide │ -├rtl - VHDL sources -│├core - Core sources of the CPU & SoC -││└mem - SoC-internal memories (default architectures) -│├processor_templates - Pre-configured SoC wrappers -│├system_integration - System wrappers for advanced connectivity -│└test_setups - Minimal test setup "SoCs" used in the User Guide +├-rtl - VHDL sources +│ ├-core - Core sources of the CPU & SoC +│ │ └-mem - SoC-internal memories (default architectures) +│ ├-processor_templates - Pre-configured SoC wrappers +│ ├-system_integration - System wrappers for advanced connectivity +│ └-test_setups - Minimal test setup "SoCs" used in the User Guide │ -├sim - Simulation files (see User Guide) +├-sim - Simulation files (see User Guide) │ -└sw - Software framework - ├bootloader - Sources of the processor-internal bootloader - ├common - Linker script, crt0.S start-up code and central makefile - ├example - Example programs for the core and the SoC modules - │└... - ├lib - Processor core library - │├include - Header files (*.h) - │└source - Source files (*.c) - ├image_gen - Helper program to generate NEORV32 executables - ├ocd_firmware - Firmware for the on-chip debugger's "park loop" - ├openocd - OpenOCD configuration files - └svd - Processor system view description file (CMSIS-SVD) +└-sw - Software framework + ├-bootloader - Sources of the processor-internal bootloader + ├-common - Linker script, crt0.S start-up code and central makefile + ├-example - Example programs for the core and the SoC modules + │ └-... + ├-lib - Processor core library + │ ├-include - Header files (*.h) + │ └-source - Source files (*.c) + ├-image_gen - Helper program to generate NEORV32 executables + ├-ocd_firmware - Firmware for the on-chip debugger's "park loop" + ├-openocd - OpenOCD configuration files + └-svd - Processor system view description file (CMSIS-SVD) ................................... diff --git a/docs/datasheet/soc.adoc b/docs/datasheet/soc.adoc index e516af53f..5d3c9c70d 100644 --- a/docs/datasheet/soc.adoc +++ b/docs/datasheet/soc.adoc @@ -337,9 +337,10 @@ enum NEORV32_CLOCK_PRSC_enum { }; -------------------------- +.Power-Down Mode [TIP] If no peripheral modules requires a clock signal from the internal generator (all available modules disabled by clearing the -enable bit in the according module's control register), it is automatically deactivated to reduce dynamic power consumption. +enable bit in the according module's control register) the generator is automatically deactivated to reduce dynamic power consumption. @@ -456,54 +457,50 @@ A pending FIRQ has to be explicitly cleared by writing zero to the according <<_ === Address Space As a 32-bit architecture the NEORV32 can access a 4GB physical address space. By default, this address space is -divided into five main regions: - -1. **Instruction address space** for instructions (=code) and constants. A configurable section of this address space can used by the instruction memory (<<_instruction_memory_imem>>). -2. **Data address space** for application runtime data (heap, stack, etc.). A configurable section of this address space can be used by the data memory (<<_data_memory_dmem>>). -3. **Bootloader address space** for the internal bootloader memory <<_bootloader_rom_bootrom>>. -4. **On-Chip Debugger address space** for the processor's <<_on_chip_debugger_ocd>>. -5. **IO/peripheral address space**: for the processor-internal memory-mapped <<_processor_internal_modules>>. +split into six main regions. Each region provides specific _physical memory attributes_ ("PMAs") that define +the access capabilities. .NEORV32 Processor Address Space (Default Configuration) image::address_space.png[900] -.RAM Layout -[TIP] -The actual usage of the data address space by the software/executables (stack, heap, ...) is -illustrated in section <<_ram_layout>>. - - -:sectnums: -==== Physical Memory Attributes (PMAs) - -Each default region of the NEORV32 address space provides specific physical memory attributes that define the allowed access types. -The according access permission are enforced by the hardware and cannot be changed. If an access violates the PMA's permissions an -exception is raised. The access permissions can be further constrained using the CPU's <<_pmp_isa_extension>>. - -* `r` - data read access -* `w` - data write access -* `x` - instruction fetch access ("execute") - [cols="<1,^4,^2,<7"] [options="header",grid="rows"] |======================= -| # | Region Description | PMAs | Note -| 1 | Instruction address space | `r(w)x` | Write accesses to the the internal <<_instruction_memory_imem>> can be disabled. -| 2 | Data address space | `rwx` | Code can also be executed from data memory. -| 3 | Bootloader address space | `r-x` | Read-only memory. -| 4 | On-Chip Debugger address space | `---` | Not accessible at all by "normal" software - accessible only when the CPU is in <<_cpu_debug_mode>>. -| 5 | IO/peripheral address space | `rw-` | Read/write accesses only. +| # | Region | PMAs | Description +| 1 | Instruction address space | `rwx` | For instructions (=code) and constants. A configurable section of this address space can used by the internal <<_instruction_memory_imem>>. +| 2 | Data address space | `rwx` | For application runtime data (heap, stack, etc.). A configurable section of this address space can be used by the internal <<_data_memory_dmem>>). Code can also be executed from data memory. +| 3 | Memory-mapped XIP flash | `r-x` | Memory-mapped access to the <<_execute_in_place_module_xip>> SPI flash. +| 4 | Bootloader address space | `r-x` | Read-only memory for the internal <<_bootloader_rom_bootrom>> containing the default <<_bootloader>>. +| 5 | IO/peripheral address space | `rw-` | Processor-internal peripherals / IO devices. These devices can only be written in full 32-bit (word) quantities. +| 6 | The "void" | `rwx` | Unmapped address space. All accesses to this region(s) are redirected to the <<_processor_external_memory_interface_wishbone>>. |======================= +The entire address space layout can be customized via the "Processor Address Space Layout" constants in the processor's +main VHDL package file (`rtl/core/neorv323_package.vhd`). -:sectnums: -==== CPU Data and Instruction Access +[source,vhdl] +---- + -- Main Address Regions --- + constant mem_ispace_base_c : std_ulogic_vector(31 downto 0) := x"00000000"; + constant mem_dspace_base_c : std_ulogic_vector(31 downto 0) := x"80000000"; + constant mem_xip_base_c : std_ulogic_vector(31 downto 0) := x"e0000000"; + constant mem_xip_size_c : natural := 256*1024*1024; + constant mem_boot_base_c : std_ulogic_vector(31 downto 0) := x"ffffc000"; + constant mem_boot_size_c : natural := 8*1024; + constant mem_io_base_c : std_ulogic_vector(31 downto 0) := x"ffffe000"; + constant mem_io_size_c : natural := 8*1024; +---- -The CPU can access all of the 32-bit address space from the instruction fetch interface (**I**) and also from the -data access interface (**D**). These two CPU interfaces are multiplexed by a simple bus switch -(`rtl/core/neorv32_busswitch.vhd`) into a single processor-internal bus. All processor-internal memories, peripherals -and also the external memory interface are connected to this bus. Hence, both CPU interfaces (instruction fetch & data access) -have access to the same (identical!) address space making the processor a **modified von-Neumann architecture**. +The CPU can access all of the 32-bit address space from the instruction fetch interface and also from the +data access interface. These two CPU interfaces are multiplexed by a simple bus switch into a single processor-internal +bus. Optionally, this bus is further shared by another instance of the bus switch so the DMA can controller can +also access the entire address space. + +Accesses via the resulting SoC bus are split by a gateway, that forwards accesses to the according main memory regions. +This gateway also implements a bus monitor that keeps track of active bus requests. If an accessed address responds with +an error conditions of if no response is received at all an according bus access exception is raised (see <<_bus_interface_protocol>>). +All processor-internal peripherals / IO devices are attached to an IO switch that performs the fine-granular address +decoding issuing accesses to the according module being accesses. .Processor-internal bus architecture image::neorv32_bus.png[1300] @@ -513,72 +510,9 @@ image::neorv32_bus.png[1300] The processor-internal <<_direct_memory_access_controller_dma>> has access to the same (_identical_) address space as the CPU core. +.Bus Interface [TIP] -See sections <<_architecture>> and <<_bus_interface>> for more information regarding the CPU bus accesses. - - -:sectnums: -==== Address Space Layout - -The general address space layout consists of two main configuration constants: `ispace_base_c` defining -the base address of the _instruction memory address space_ and `dspace_base_c` defining the base address of -the _data memory address space_. Both constants are defined in the NEORV32 VHDL package file -`rtl/core/neorv32_package.vhd`: - -[source,vhdl] ----- --- Architecture Configuration ---------------------------------------------------- --- ---------------------------------------------------------------------------------- -constant ispace_base_c : std_ulogic_vector(31 downto 0) := x"00000000"; -constant dspace_base_c : std_ulogic_vector(31 downto 0) := x"80000000"; ----- - -The default configuration assumes the _instruction memory address space_ starting at address `0x00000000` -and the _data memory address space_ starting at `0x80000000`. Both values can be modified for a specific -setup and the address space may also overlap or can even be identical. - - -:sectnums: -==== Memory Configuration - -The NEORV32 Processor was designed to provide maximum flexibility for the actual memory configuration. -The processor can populate the _instruction address space_ and/or the _data address space_ with **internal memories** -for instructions (IMEM) and data (DMEM). Processor **external memories** can be used as an alternative or even in -combination with the internal ones. The figure below show some exemplary memory configurations. - -.Exemplary Memory Configurations -image::neorv32_memory_configurations.png[800] - -[NOTE] -Any access to "address holes" (addresses that do not belong to a specific module) will raise a bus exception fault -due to the missing access acknowledge. - - -:sectnums!: -===== Internal Memories - -If the processor-internal <<_instruction_memory_imem>> is implemented, it is located right at the base address of the instruction -address space (default `ispace_base_c` = _0x00000000_). Vice versa, the processor-internal <<_data_memory_dmem>> is -located right at the beginning of the data address space (default `dspace_base_c` = _0x80000000_) when implemented. - - -:sectnums!: -===== External Memories - -Any CPU access (data or instructions), which does **not** fulfill at least one of the following conditions, is forwarded -via the <<_processor_external_memory_interface_wishbone>> to external components: - -* access to the processor-internal <<_instruction_memory_imem>> and processor-internal IMEM is implemented -* access to the processor-internal <<_data_memory_dmem>> and processor-internal DMEM is implemented -* access to the processor-internal bootloader ROM and beyond - -[NOTE] -If the <<_execute_in_place_module_xip>> is implemented accesses mapped to this module are not forwarded to the -external memory interface. - -[NOTE] -If the <<_processor_external_memory_interface_wishbone>> is not implemented, any access exceeding the internal -memory address space will raise a bus access fault exception. +See sections CPU <<_architecture>> and <<_bus_interface>> for more information regarding the CPU bus accesses. :sectnums: @@ -632,10 +566,6 @@ providing an initialized external memory that contains the actual application to The NEORV32 processor is a SoC (system-on-chip) consisting of the NEORV32 CPU, peripheral/IO devices, embedded memories, an external memory interface and a bus infrastructure to interconnect all modules. -The processor-internal peripheral/IO devices are located at the end of the 32-bit address space at base -address `0xFFFFFE00`. A region of 512 bytes is reserved for these devices. Hence, all peripheral/IO devices are -accessed using a memory-mapped scheme. - .Module Address Space Mapping [IMPORTANT] The base address of each component/module has to be aligned to the total size of the module's occupied address space. @@ -647,10 +577,15 @@ All peripheral/IO devices can only be written in full-word mode (i.e. 32-bit). B will raise a store access fault exception. Read accesses are not size constrained. Processor-internal memories as well as modules connected to the external memory interface can be written with arbitrary granularity. -.Unimplemented Modules / "Address Holes" +.IO Module's Address Space +[IMPORTANT] +Each peripheral/IO module occupies an address space of 256 bytes (64 words). Most devices do not fully utilize this address +space and will simply _mirror_ the available interface registers across the entire 256 bytes of address space. + +.Unimplemented Modules / Address Holes [NOTE] When accessing an IO device that hast not been implemented (disabled via the according generic) -or when accessing an address that is actually unused, a load or store access fault exception is raised. +or when accessing an address that is actually unused, a load/store access fault exception is raised. .Module Interrupts [NOTE] @@ -679,8 +614,6 @@ include::soc_wishbone.adoc[] include::soc_slink.adoc[] -include::soc_buskeeper.adoc[] - include::soc_gpio.adoc[] include::soc_crc.adoc[] diff --git a/docs/datasheet/soc_buskeeper.adoc b/docs/datasheet/soc_buskeeper.adoc deleted file mode 100644 index fa9894b93..000000000 --- a/docs/datasheet/soc_buskeeper.adoc +++ /dev/null @@ -1,36 +0,0 @@ -<<< -:sectnums: -==== Internal Bus Monitor (BUSKEEPER) - -[cols="<3,<3,<4"] -[frame="topbot",grid="none"] -|======================= -| Hardware source file(s): | neorv32_buskeeper.vhd | -| Software driver file(s): | none | -| Top entity port: | none | -| Configuration generics: | none | -| Package constants: | `max_proc_int_response_time_c` | Access time window (maximum number of cycles) -| CPU interrupts: | none | -|======================= - - -**Theory of Operation** - -The Bus Keeper is a fundamental component of the processor's internal bus system that ensures correct operations -while maintaining execution safety. It operates transparently for the user by monitoring every single bus transactions -that is initiated by the CPU. If an accessed device responds with an error condition or does not respond at all within -a specific **access time window**, an according bus access fault exception is raised. The following exceptions can be -raised by the bus keeper: - -* `TRAP_CODE_I_ACCESS`: error / timeout during instruction fetch bus access -* `TRAP_CODE_S_ACCESS`: error / timeout during data store bus access -* `TRAP_CODE_L_ACCESS`: error / timeout during data load bus access - -.Access Time Window -[IMPORTANT] -The **access time window**, in which an accessed device has to respond, is defined by the `max_proc_int_response_time_c` -constant from the processor's VHDL package file (`rtl/neorv32_package.vhd`). The default value is **15 clock cycles**. - -.Register Map -[NOTE] -The bus keeper does not provide any memory-mapped interface registers at all. diff --git a/docs/datasheet/software.adoc b/docs/datasheet/software.adoc index be41b583e..23323ea79 100644 --- a/docs/datasheet/software.adoc +++ b/docs/datasheet/software.adoc @@ -293,7 +293,7 @@ and packed into a final executable. After all the application sources have been compiled, they need to be _linked_. For this purpose the makefile uses the NEORV32-specific linker script `sw/common/neorv32.ld` for linking all object files that were generated during compilation. In general, the linker script defines -three memory sections: `rom`, `ram` and `iodev`. +two final memory sections: `rom` and `ram`. .Linker script - memory sections [cols="<2,<8"] @@ -302,12 +302,8 @@ three memory sections: `rom`, `ram` and `iodev`. | Memory section | Description | `ram` | Data memory address space (processor-internal/external DMEM) | `rom` | Instruction memory address space (processor-internal/external IMEM) _or_ internal bootloader ROM -| `iodev` | Processor-internal memory-mapped IO/peripheral devices address space |======================= -[NOTE] -The `iodev` section is entirely defined by the processor hardware layout and should not be modified at all. - [NOTE] The `rom` section is automatically re-mapped to the processor-internal <<_bootloader_rom_bootrom>> when (re-)compiling the bootloader @@ -330,7 +326,7 @@ __neorv32_ram_base = DEFINED(__neorv32_ram_base) ? __neorv32_ram_base : 0x800000 The region size and base address configuration can be edited by the user - either by explicitly changing the default values in the linker script or by overriding them when invoking `make`: -.Overriding default rom size configuration (setting 4096 bytes) +.Overriding default `rom` size configuration (configuring 4096 bytes) [source, bash] ---- $ make USER_FLAGS+="-Wl,--defsym,__neorv32_rom_size=4096" clean_all exe diff --git a/docs/userguide/customizing_the_bootloader.adoc b/docs/userguide/customizing_the_bootloader.adoc index 8dc3496be..c4dfec948 100644 --- a/docs/userguide/customizing_the_bootloader.adoc +++ b/docs/userguide/customizing_the_bootloader.adoc @@ -37,7 +37,6 @@ minimal base + privileged ISA `rv32i_zicsr` only to ensure it can work independe | `SPI_BOOT_BASE_ADDR` | `0x00400000` | _any_ 32-bit value | Defines the _base_ address of the executable in external flash 4+^| XIP configuration | `XIP_EN` | `0` | `0`, `1` | Set `1` to enable the XIP options -| `XIP_PAGE_BASE_ADDR` | `0x40000000` | _any_ 32-bit value | Defines the page _base_ address where the XP flash will be mapped to |======================= [NOTE] From 5cdec300ce6c66a2d97eb556212e2c734112de5e Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Sun, 16 Jul 2023 21:52:50 +0200 Subject: [PATCH 25/31] [rtl] minor edits --- rtl/core/neorv32_intercon.vhd | 9 +++++---- rtl/core/neorv32_top.vhd | 6 ++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/rtl/core/neorv32_intercon.vhd b/rtl/core/neorv32_intercon.vhd index 271b580fc..f161f04a8 100644 --- a/rtl/core/neorv32_intercon.vhd +++ b/rtl/core/neorv32_intercon.vhd @@ -383,7 +383,7 @@ begin (port_en(port_io_c) = '0') and (EXT_ENABLE = true) else '0'; - -- Bus Request ---------------------------------------------------------------------------- + -- Bus Request (enforce PMAs) ------------------------------------------------------------- -- ------------------------------------------------------------------------------------------- request: process(main_req_i, port_en) begin @@ -538,7 +538,7 @@ end neorv32_gateway_rtl; -- ################################################################################################# -- # << NEORV32 - Processor Bus: IO Switch >> # -- # ********************************************************************************************* # --- # Simple address decoding switch for the processor's IO/peripheral devices. # +-- # Simple address decoding switch for the processor's internal IO/peripheral devices. # -- # ********************************************************************************************* # -- # BSD 3-Clause License # -- # # @@ -617,8 +617,9 @@ end io_switch; architecture io_switch_rtl of io_switch is -- module configuration -- - constant num_devs_physical_c : natural := 21; -- actual number of devices + constant num_devs_physical_c : natural := 21; -- actual number of devices, max num_devs_logical_c constant num_devs_logical_c : natural := 32; -- logical max number of devices; do not change! + -- constant lo_c : natural := index_size_f(DEV_SIZE); -- low address boundary bit constant hi_c : natural := (index_size_f(DEV_SIZE) + index_size_f(num_devs_logical_c)) - 1; -- high address boundary bit @@ -670,7 +671,7 @@ begin bus_response: process(dev_rsp_i) variable tmp_v : bus_rsp_t; begin - tmp_v := rsp_terminate_c; -- start with with all-zero + tmp_v := rsp_terminate_c; -- start with all-zero for i in 0 to (num_devs_physical_c-1) loop -- OR all response signals tmp_v.data := tmp_v.data or dev_rsp_i(i).data; tmp_v.ack := tmp_v.ack or dev_rsp_i(i).ack; diff --git a/rtl/core/neorv32_top.vhd b/rtl/core/neorv32_top.vhd index f7a47f2df..79445e332 100644 --- a/rtl/core/neorv32_top.vhd +++ b/rtl/core/neorv32_top.vhd @@ -323,9 +323,7 @@ architecture neorv32_top_rtl of neorv32_top is type irq_t is record wdt, uart0_rx, uart0_tx, uart1_rx, uart1_tx, spi, sdi, twi, cfs, neoled, xirq, gptmr, onewire, dma, trng, slink : std_ulogic; end record; - signal firq : irq_t; - - -- misc -- + signal firq : irq_t; signal mtime_irq : std_ulogic; begin @@ -884,7 +882,7 @@ begin -- ------------------------------------------------------------------------------------------- io_switch_inst: entity neorv32.io_switch generic map ( - DEV_SIZE => iodev_size_c, -- size of a single IO device, has to be a power of two + DEV_SIZE => iodev_size_c, -- size of a single IO device -- device base addresses -- DEV_00_BASE => base_io_dm_c, DEV_01_BASE => base_io_sysinfo_c, From 1cdcac64bbe929f44b4f0b566a55765bb738a71e Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Sun, 16 Jul 2023 21:53:05 +0200 Subject: [PATCH 26/31] [docs] update cache sections --- docs/datasheet/soc_dcache.adoc | 7 +++++-- docs/datasheet/soc_icache.adoc | 14 +++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/docs/datasheet/soc_dcache.adoc b/docs/datasheet/soc_dcache.adoc index 9be026bcb..588881376 100644 --- a/docs/datasheet/soc_dcache.adoc +++ b/docs/datasheet/soc_dcache.adoc @@ -23,10 +23,13 @@ The cache is implemented if the `DCACHE_EN` generic is `true`. The size of the c equal to 4 bytes) and `DCACHE_NUM_BLOCKS` (the total amount of cache blocks; has to be a power of two and greater than or equal to 1) generics. The data cache provides only a single set, hence it is direct-mapped. + +**Cached/Unached Accesses** + The data cache provides direct accesses (= uncached) to memory in order to access memory-mapped IO (like the processor-internal IO/peripheral modules). All accesses that target the address range from `0xF0000000` to `0xFFFFFFFF` -will not be cached at all. This also allows to attach custom IO modules via the processor's external memory interface -when they are mapped to upper-most 256 MB address page (see section <<_address_space>>). +will not be cached at all (see section <<_address_space>>). + .Caching Internal Memories [NOTE] diff --git a/docs/datasheet/soc_icache.adoc b/docs/datasheet/soc_icache.adoc index 8ec9dca74..31f25de80 100644 --- a/docs/datasheet/soc_icache.adoc +++ b/docs/datasheet/soc_icache.adoc @@ -5,9 +5,9 @@ [cols="<3,<3,<4"] [frame="topbot",grid="none"] |======================= -| Hardware source file(s): | neorv32_icache.vhd | -| Software driver file(s): | none | _implicitly used_ -| Top entity port: | none | +| Hardware source file(s): | neorv32_icache.vhd | +| Software driver file(s): | none | _implicitly used_ +| Top entity port: | none | | Configuration generics: | `ICACHE_EN` | implement processor-internal instruction cache when `true` | | `ICACHE_NUM_BLOCKS` | number of cache blocks (pages/lines) | | `ICACHE_BLOCK_SIZE` | size of a cache block in bytes @@ -26,6 +26,14 @@ equal to 1) and the actual cache associativity `ICACHE_ASSOCIATIVITY` (number of set-associative) generics. If the cache associativity is greater than one the LRU replacement policy (least recently used) is used. + +**Cached/Unached Accesses** + +The data cache provides direct accesses (= uncached) to memory in order to access memory-mapped IO (like the +processor-internal IO/peripheral modules). All accesses that target the address range from `0xF0000000` to `0xFFFFFFFF` +will not be cached at all (see section <<_address_space>>). + + .Caching Internal Memories [NOTE] The instruction cache is intended to accelerate instruction fetches from **processor-external** memories From f06377acffea8206df29a875b8ddc5c179d848ff Mon Sep 17 00:00:00 2001 From: stnolting <22944758+stnolting@users.noreply.github.com> Date: Mon, 17 Jul 2023 20:48:58 +0200 Subject: [PATCH 27/31] update PMAs * write accesses to the IO space are no longer size-constrained * the IO space also provides eXecute permissions (required for the on-chip debugger) --- docs/datasheet/soc.adoc | 7 +++---- docs/figures/address_space.png | Bin 143869 -> 143980 bytes rtl/core/neorv32_intercon.vhd | 4 ++-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/docs/datasheet/soc.adoc b/docs/datasheet/soc.adoc index 5d3c9c70d..429ce2fdb 100644 --- a/docs/datasheet/soc.adoc +++ b/docs/datasheet/soc.adoc @@ -471,7 +471,7 @@ image::address_space.png[900] | 2 | Data address space | `rwx` | For application runtime data (heap, stack, etc.). A configurable section of this address space can be used by the internal <<_data_memory_dmem>>). Code can also be executed from data memory. | 3 | Memory-mapped XIP flash | `r-x` | Memory-mapped access to the <<_execute_in_place_module_xip>> SPI flash. | 4 | Bootloader address space | `r-x` | Read-only memory for the internal <<_bootloader_rom_bootrom>> containing the default <<_bootloader>>. -| 5 | IO/peripheral address space | `rw-` | Processor-internal peripherals / IO devices. These devices can only be written in full 32-bit (word) quantities. +| 5 | IO/peripheral address space | `rwx` | Processor-internal peripherals / IO devices. | 6 | The "void" | `rwx` | Unmapped address space. All accesses to this region(s) are redirected to the <<_processor_external_memory_interface_wishbone>>. |======================= @@ -573,9 +573,8 @@ The occupied address space has to be a power of two (minimum 4 bytes). Addresses .Full-Word Write Accesses Only [IMPORTANT] -All peripheral/IO devices can only be written in full-word mode (i.e. 32-bit). Byte or half-word (8/16-bit) write accesses -will raise a store access fault exception. Read accesses are not size constrained. Processor-internal memories as well as -modules connected to the external memory interface can be written with arbitrary granularity. +All peripheral/IO devices should only be written in full-word mode (i.e. 32-bit). Byte or half-word (8/16-bit) write accesses +might cause undefined behavior. .IO Module's Address Space [IMPORTANT] diff --git a/docs/figures/address_space.png b/docs/figures/address_space.png index 94925415e6d35f9d3fbca66be6009f94f17dc0f4..8fd7c23e3a9d99a9c41e24aad70b52a72c5fb6d1 100644 GIT binary patch delta 141194 zcmYIvdpy(c|NfiEDW{yvS(2QR%Gr=oIdyVACrOUW+1ShZP$4OlnIfqi<`9Ol9HLT2 za-PFB%yDxbw%Kp`d>@bBpRXP6*L`>%uj{($1kRON&gVtP1fmVDIAyVMm))FE%r2i} ziO$JpF_v47oOpQQM8?$;aBVQ*mAzY3`)cPQ)xHvZpEC^~|50peEII`+4zmf)7@Z?{yf<>pe^4dYz#EE!M~MS4-U9qGC3QC@)(1?GXvrujY3=RdG9g!awhZOFehLvbiaP0FBo998<)AhHv21DF z(oC**!UjZv|0LUjo513jIr1gaAdi^f@dUBpVsRF>Yxx zT42eX4I4S!`VSBjTxLp5LHb`*UfY;y4F+fivXL6;y*8E8YRT#RRE8)gd_$RNr=yMJ zcpPUl`;I-Dxq~YTdaIXE+i&DUi5ew17C z4D&f>E=nXJPjpMlQ5HzBS6k4pHQ>-zTQFO1$a}@1!F;Y9NoF^UESsgCjC#oPe;ZK3 zE`=wz{|498lJVau^@%?JEGwzut&F+>fO48@HGySaTVDHClD5&a3B@@K>E43~b-3>y zt1E0BWzPTbT+=V@GEKGH=pFmMoC&8-f_@%Q734G}h579P@}dX+XQ85^;#aLWoJ8S~ z$6{H$n*7~Pgmj>pf3>#29?WU*lKP$$Q~{WAYE|^yX-cWHB;*fs*o>=$z7)}gRF1?e z2FAfbqdZc@1;LGG5P>-b>GN)zX5??u+v|F=$XqAF(@ouyw}<}Xniv;DISB@?z5NZ|&I7oECa-W2W5U5ezV$x8LH$PMQF+Nom)Z z@;1wK96raZ^dS{Z$I%@79no9?QRCH(x*bu0=r7B`tkJur)kJexP^9e%vwUo#`jq!v z$oTG2Pf&Luq<>j1T%-Vq6u>gS0M&8yvj=saVrSE!ye&`VRYED{t}RK2hF#LWUZaX= z;&3(69+FYL9x?#Oh2KVuO?!0y*kiAYn$$3pe%VNQtDT$h(9L_O4MWE`Lprp8`=|-2 zz=K)yktxatd%hx>%|i2$KFHrj-XgO9IYDr*kCAT7!4~fbFTnS=DB2&Z8>}>%*j7^a z;Bc8Wk^v^5_i3Ofol_gT`P83|Kj^oLL>`oQ^n&*7*+yQ3n_^__u$6AVFQwHgRymP~ zvPB^%;cvaNQ@T^U*#Ik4f|KNps@xeZkjy81IOBHo9wbxADhzcD@@YhuPe~)ATe(v^ z)uU};5hDR$$0E=@Gv<~brWN3S&0YP)mVVD38OgE#-*)c}u+jzO*<@I5TstvW`&Dls zw%6Y8TS)HQmyP2vvnmO4Uf?(0$V?FNl4F|E^KQwY^0DyszICMSp6jcT%AdMDxCXt# za9cNfPmOK89-NVM)qsw744Q-n&Yk@eboTrtCb_7?Xw$&| zHyfsQ4PU^cZ>2qm&0KJO)nmJU-)L5@2$O7swhh$Z^S{8y$vA^0cDRb;DKh*<)VN#M zgowsz&JBU34-6Yi)qy*hYUcn1>LDs2QU=5w4OU`$7&G?~Ue3Jd3@z4GR~=sb`c-zrr}P+k({WGhJ4 zz7%tL#!b|P4pnOQOS3r|FO8({7frl_snv~{q z`UInQe{y^}4Lo4(Rk78WC2bf@9thI@h<}|^EpWnISK1PX7N84?7R7V!qVLhYm~jJk z0>&K=wf#sCOWEvvWAP*{1oY-4TNo#)F{MS$Mco$Tmr@5{E0my4eYiP62AtCAp2H_7 z$}*p$D5%6r=FG7cR06;cxI+>5TjHN$ngG}6+&>yxq{C=>z5SEG0zwL5>_Tio#kO6N zbP+CwEnF&J?D_k6`-$gp=$Ge2&$CdMRo$vmtlZE z>VGxFfR2}7$BvcerRe)Hw6D#W@yQNDWvn|7MOAtN_;%*Sa-?S7$CD~;q4LFp34K}l z?&5wOwsIiX!q*9ggq@fZ9}Yvco^`UZd)!yPp5nee&q@&T!M#oML0mBO!sN70iq&pS zmBl+%0D+0fP%zKbc{B3VpK)DhcvHWl-TjFVI%;pf<-%bx#T=>cVORb_%RT?C+}-@L zCZO(v&~olq21I&-#UesSk|-j9sqrV~UiC5&C9`yND_*JByjKs?&uGo$SS}x}_!>GR znRitxX7RA5Q~stbvY>VCozcwC~XmmklWReIAilA`ko=;~6M&3x zU;~-dayc}SF|FQ0&|S(X`0XHmKo<@BN#Ucl1-1pqL0_FQ2MevW8WnTsb=QV z9oD3momNFwK%_R7rd63@H-*Q|Xm{TeTO&&Cd-Z1NfB$7$J!_SCx7;S;vxS0=tcCeJ zPI~?)7H>$=zy_uFa9mm=jv_I<-#YhFZB5 zIjn=P-Z0M}d>h>C*e?f&r*B|G?%LeP05bldkI?VQC!xx-Q2`rR_U#*^5>tT!^+%CwDWecF|+WGjRVqz8R4_U;$tO68Fv{*!^t2Zm2+ z_7M)_A&vbzBW-&_m)(Jx6A{rdlt_Ay=ILf{8p`h(tNu4_0gNiHtEuKaF)@t~>{^L` z3if!bo@`SNc>?(wg29!Ue1}FA{R`0dFs9qP=@fG#CHaZXmL8j<@|eBMUn6Gl5Jy^- z03fRx#wf#09S5zb{W%#CZC0fHwh1>toc3N-LLiCFL}_6Cb9taEgnF^DGPYL>-WX0w zl)khNj}}NlZ#wsMw?rB27Ly$yYXtcDsY=42woBtq4F#px_479m7)pxbe_Czh2w|pP zDUv--fgCwFu4J^fQ%}V*Q1wa%o90)i!x*4v$g-P0?lS9vN~FY&ptcP&BaP_&kR6y< zSP?5g)|`$CT}7G4POR-!#~CwbET_k^jH-erL+Oy779jxyH2m!HPqw7=w5}ZJn$j={ zT!fG!pXi;5n5UFr*c?(fw`8uEEMo2m>?Cf-(i;XI=6n_v0jPg|za^y_Q_PJ~)~w!ikZ;NDpCjO?0E;CSYXj-XHtlv*9GsaNg6josBjA+S{U73gnqhcxtD5zvBxK z$f-AI@0XHT>^;zar1gwyr>Sq#o=Z=v5{+b)L<8|C+)&8K&r)W?G#<}vj z|Dgw8s+M7$H1QpDyx!YqQ!cagz03fxo(@_JZn~`0Z|<3kkb9kI|H5B~&08aF>;0>` zfnJZ?@rDHUgt9&{vWjcG6)>9U=RRte!`ekoq2FsC>~`i_wF(e1fcY}=JK5VO&+Q3g zE5|!q9DI`LqKoRQciQWUtS4_kxc3G*`0l?@{bS_CrZ>B>5`I3@tI~;p$lW~JP?6(Vr`rqB2T49{4->!tG(q`@#bWkt@?v7~ zsxtaWV3UMWLdM}&qyNMzV$|JK}=9y4$eb=eFR!F%^I73EZyjX z%)-g0BZ)+y?CVhd)k+opGS53wL+QJLRA)*UDdibot>mm!;ZX$_n`Ipye zw@$s0gyj{7=RC)%$y+Tdmxa3Z1|2QR*t+Bpm}t-59HU-$3gg&+=WU(5v&6YnU5iNW zP$A*vM~}4TH=L3;K3~2!zwu_fb9zcU>P5uFnGKIOD_@9eqfxf7bw zv(EOt(pt8Qwa7s?H_28}Gp{k89bZUq4$b=yuI`sgaozq|Ul8OZw$&w={qo~5*;~}} zUcz&s9__Bppv+(q+qXh{T&Qwj?pr6Z$wxbO*RY^#Li@@=SyZ(um2wqVrnaJ@^fDb- zeH)vNx$bzOGSUCwlXs6cjMa2u$b&5>QHMJaRpy{AP#8xw(LVxU`+7)1fT^=wS< zZg&=n@cD{9r{8&Rr@XhVfsCJd@>LcbPaA7}q;LXgk)JB=jkEzP9-Ptv2Z*G9sUkEV zFU!6kT1z}EuCEkY51#m`^C?0_de*RW$mlB&Se{TjQ;_si5BQ@EV!XEDD-zn?lbqjw zaBrW^vi*_we8nz?+1>OFx7Iq<%i3HF47<46Q+CAZ?O|S27+{UfN&{IdIluLZW|I(X z6L`A*OXhkY3R52+NybfuvZe3kl`a;=1Y|CzB8 z=adAVbG~cR4)c!W3@?A`%__CTa({XoB?O6E?)uN<^79W!nEE@!VlM%pVHN~S#L5NE{octb;?8}H(F)xA@q-)uYmR>Z@|e(2ab@M)Ek-~5 zHAA($`3R;?&1%=O_wF*PLH8Xz*0YLXqgl}>j^-G{)PgJ3Y=ITzfr8p{(y=i$IV)Y**#FB$m(I;wZTKW*sKmXrO1p_8~aJLn40n zj+X(?GlO1&A$t1wyRm$aipGjwD|yHV!wmtQ@0d=mIs%b9AUj~ywW{;JMVt=h^%bb6 zt&JJ-?2Of)`;r+)x&y8N3wGJCnVzNQV`kU5a|_d4J*=$!9*R7)U8@s+&~|&&Sj0s{ zrz_WRjm@gtxw0xr9Q;iXIgyNX2%j^Td@WP_nY%J+R}1x6RkgUZPi>-)YHqOi=ZYg( ziyWdflUSYG^wc>@jbZbbCh!jKgT1L%6ZT^M?z{O)`H85HS-0MD0|laMPL!~)Yddlu zJ^%U|%9y~$#A;)6;};OITGZFH1^zz>c_#;71d-D9E~LZTsa|G!=T%0Ib-nfbJDZdL z3d6-isD?+mK~-d0cIm3;1K*G*THi-<1Qu0^KYl2VrDIjprY_fgAzk?I9jqg&bAx_M zyqp+)BDPTcM*{$BC>i1#E_*DYJxlZ-)P-MaptU~PU=GNp?7*41s*3jJomW+}?mZ`W z``at;2@l_(6rzK;&`vn!oq8+>BF$^80w2~WVE^riIx?7c0o@$8Fu|>yITYVqF=q?? zzAS9}B?0sEr!HG{0`kifSwfWxx3#^%kZu%snRpO+8JPTg{ppunp&!aIj#WA30gn?N zjHl?E6mEUoZaZe(&LQMt$9jJ%RYcaS;H-VI(^|k-wFa8x`mebngfdah&Sc?8KHZbK zm&81;9y{(;@!6MU+C!ONU^?>0bx)AP_>qEKOPe^KPdlfzjogzR-H>NZiE9_NVC@;0 zJkOCRAmg09DtNGz@$|>@N90(gg>tI7Z)(VaQVlq-lUW&MMz+{(_8|x z@>X?Lk7V3Q64pIe{~nSnYD~7B=I*F_6QcZ(>vQz(t8=gC_mAVY*A~OM<#TtZ`)1oe z89(WD(q0Td`^&-M)hi3X^2l^kBBwyC1SM30_6fM^`T|a`u(n*#s1N*{jFP9md+b9m z%^w+gY}*ldb2CSXrTn>&)oG4LQ%x%bk+Ea{f5VTA;!qJw*WRkXNI2 z4S+YQ`KJe;Z#$eBmzBSmBaf9^50&k^g>%zcz36k?oW)ZtfV1@4rQ9o%c>dLstH>?a z)r`c;^=x)Lo*lIlUyST{WCVywN0-S>M8lXZ*9>7fnBljbv0;O|0wYbJ$ffXR*n#ZL zE4i)vka#_q3UQ{}esJ}uGN%c3Y(ljUXm*_mHC}~Kniz@QHcGPSf+g?JdIpU0U5GBP zl=b*Lez^oROrEb1`AcRHcn`9sJH;(O=y(5r4;B%#QqFD5+WJcd3#ktppc0di`cC<`~=F=Gj;Pg z)&fkwq(+~r9^9`qgcY~hI+?YG&!k1K#1S1$`&( zm-tcl#W=|PTEdavs13iq(gpXUzQ5M(T05Fx3Mz@bw| z!Bs}ztj>(=f8WXPMGWyb*|_SropWip(!g&y(ZjXc^xkz6&*$0wBcUsNyuOC*==$Q> z+`Y1)Y_$C?$H0}k*q>3{7fpItU(4S7^TeStm&($?{yuwnIw@u~%qDP{#on|2D~uue z*UIT3*GDI9eG`!knaE9`Tw8U!4|NyaI%CmTL7wobJov6pv`N8SC=2t5qQDq|*}N_W@eV6syWhU2IZy?`ra=6=Q7GpOo08a=k>_aa|PUJ02_g_Osn1a@Gwa@I-}52 zPucWq!GHM;Jy!_z`$}RMA98w;_2awm3b8*4W%M!&oMG?IPMX(V%+9*>8z2H9A*_ z$Laq-nVpl&=py!c^v$G}k(13GSim?{5~G%GV*;l&9qB*e+DsI3 z0994ET+EL1g*43Ll}E0pzv!?o+;uvxCG#9HKEBKnYW7Kyk#4ClIA%eAnRw%2#XPE0?2G4)|TC9(>-8Qc`I8D*vMb*T+7dDs); zJu*E0WKAY_BWjJ7dEwOdt4j5kc6xfuhXvL*X3-=+U zJ1;h534b;7<6dXEm1kDliudU77?55cd%Pq0%l{)~UCXUu=-wh^?ThUc2-I;S;_LUp zgFoLO0myD?Ph<3}f+IiCvO7-H^u*P6n4P~fz>exxn@Ci6TR#F*)K{Z* zU=21bi)VZ_3Gon!aB|IYTu)!B{<`#rug1xYM&a! z&EY=aDIBLPn*J+5Lm8dZVfO8OqsiOLe~b3#|AGc!t1L^=J1=Q#3U6D<26>HyQudh9 z1Od-WtC})|KOD7EDmJh`6B|-X8FzScO(9iH4J%Bpp)-YvLL2C+Q@AM{hYTy37k&sn zk7_x+B@0HhOiUUb&*M*~z6oZipmX8@0S`Co++7*d3@`RZOu^yYC}!|#7xnDvIL^!c z-ub-LHw1}wxNpG8oKS79zqXttcJSECyh;IssIG!K2aPLhX_LQ}&uTko&J^sfx#<7h zaR~np8y9&A)vRuGHmG54O_!#fzG-IAqUn-bzp>&oeU4@DA&jqjcGM&o8wgB?9g-XT zF3`O>N`{5?JbI2dD6(^hPwro7ox4E4OpV*Uy!{a=u(+lr_Z<3|hJA=#6rjgCI2EOK z#nSFXR7`Hd>gzeML6ptdvQ0VgVN&kbu}tmCz+)jw3@0Q*lyp6tXw&sS!9iTZTk;V+ z|KK)w@AY;IP%qXagK+1KxSiXgeWL7y4CAl;2%NE@Q9-XqGxqA;4R%UR{Ly=^?h;8< zv7p~t!iP{kIDdV`2Slw9pNN6P(6)oS_J|$y$fui!`|SROJ+^4A!pCs=`#PZqP&GPe z4J*R&k1Th-KF)Y-0HM@)^%$*~FvrmJF<}7qXz+4{ESjimJ}kZQweINhek*>HPL8<0 zx@d!%*xh3LlR%1{%r#{;{@t&WY=D(!TwE|!Xvt5w8{cBg0~h1Ebv+GZ2*7EfQ~A1 z8Vl)9_rFI~7Ml)R9V}|~%6X_X%J`P0yBnc!`yc4w<>S+^BG{(|c33>!71^qTqwC^lLPeiQt8? zGySd7?60tOz9$w&o*OwLOIwrUY)U&jmANyVXGSa`b+=Vfi@IZaCsZ7pQRpW0a>L zJCKYFqnpY50DKfgN9%S)UElsBQ|wSqNhexQv?%}w0#KK@C%Xy@+YTAsp7DyLAehjC z>OAP+vqnX$4oyY~BUG^fqQBAL6Wvngxc!!LXkY}(E~^o=&uSw2VudJ0G;^%6Qd0Py z3w|3`AmEil?U}Pl-7ElZAxm(F>=lHzyN-@wGBL~D)PH*1CS9M2g{pNYZW=dg-a3d)hLC3LzP(hS{J<+HD4s()N|h z>7omVbGa(AAeV2`dk0HsoMw^7@KK%w+Z~1Kne9h3Tsv&k=vRvHZRSZjjYMW{m=kdO?}QZ)>H1eVMi2Pf5{h*QImUx(OwKmMl*f_4LGpLzx`!@8X$u`tan zDuk0VmG_sq!PGR-1<2Qd67#}vZ;URDu-myUbMPCzr%iYJ)GfhlF`)+bQH;0=GhC1y z=vy+X|3~K#)@DX)yo$K955({#R-4n}eJA}-s4~5&#%4j01Tp5^;>lu4XBbbjROk75 z;}2fr+OL0|%X5dKkq(bw)Dc8_4oEG5L#9u;982xY`K|_Ms-t|=TUau46g1AW&~xlG za#?QFt!lWl0IkZAy6fj2k^Eso=e zoWY*mB^dS)8agCX?~rVnau?^hFpYeREd7tDCqP7IPvK*oGkxi+i%?P%<?Lvmhj=kh#N!q;`7BgcJOuR!ZGOS=E&uY@nf?!xg0GBhB2$F$A zZc%n~x_o7{miYYy-KQ77V_c%Kb~!S=OJOQ1$RUmp6fYt{f2^8}YTLxNgQFsWL;me> zIVA%QnQr(t4j1V0Jmlr~5%{i3#oj*(mg?W&zwa0*T~J%JE+>7Ue6oLezC&VLdg}>i z9yx#ddD$99kwll?`VV|SK_3g=^*tuJE+p;WQEyvjDhHy|AxOZrPjmn_x+bjd*9TzDZ720boXF|q1s*)VKj~fIFAw4OP5v}1LcL}p|J3e~2}}sj z7SramdKt&?vj@Ca-Ra$VJe>-bdSCjWf_QT0RTe9@<&WoRMBg_byGWQz;H0=<*!-)|Cag54ukEc z@~)14gU?4^je|%zKcPh5baEOsa`906?!XHEj;{Tz>((>c9Md13 zqE#U(==d6qO8Rbjn*gOJ)tiKg{-GxK7j2*l{{KsH_Of9$OqtZ+q#UI8D*i1Kd9V?6 zMy*@!xRi8`JmBi8VlI96>PrZ5=bpsQnLfvO$NtSdQ&f+S#oXrKAXA2==({eY?NOIN zk?IcP!ho>bbP1kZFyd~Aw=#mGtL8o9F#EL&uCYM~eTfrjTB%i4O=eRw&RQE*wf6|t zbS_Y$N4@SlvAhFTCB7L8)*+|`4(@bl{-SnD@%I48T4AqItH2oS!wY=MJDmxnp3-K6 z_bZ{D7mBcM;J!%1PbCGn-s@k7DPqruWyXba?}cW4ky&a?_EL^mqJB^u$C)QRxs$&* z6^`2r64;qYGQg2SryCMS*TVO2Tv$97B}HoBn6t7DbBmpqZL6Hp2%3mrYodF!j0Uvw z<){KB6QO+VpAt%!ck(Cv4$3u}Fu_&>f$n-L&5CP5(2)QI!rwT7y+3LI>d$JPL(^W4 zj4O2%GWEDj6hwv$s*F?}yb=ovCPz+UGHoa+-T`5sm+$P44}Y2{UrS~3fS&?&u!CIW z-4T%f?DDua;x9{?Fl3Qq%nqwo)a1Km2*i(LK7gyDhaG0h31RL#8X5RMOZ5eW&GVO^ z{0J@U;i;4HYGNrt*4M8Zvjukbek}Hv?Bq62Ye77R=K7VRH;-{&cD*YGe(baV`8zWj z-?KqD>bD&z{Lr%yFHK&rV=_L;*m#AFH$oiHE!x8$#0Ix-^~cr;6bxZwq=Wt#NUI?7 z!85uGB?ri{c@Ny{8ji8;XB0JiIq(5z-RmAyTi>nfxQt%Kq*6)iff2I5Ks#{8xtO+D z#KEueL;cd)USG-~lzu549zxoz_p>=@FA^t*XE~+bfkCD^hoxf%?hH!@w|kiv<#3qp z49c~ULl~RG@U>qu60zDP0P2$85$i^KuH(e6vS!r6;ym3NbYHrx|0oeoS*vGav=Sv4 zu7@T3Xo8hrV+ykBYgAW`y6cztU|n6!)t0g0wV576?@NXB4ms%W@l^cA$6!Elqm}3g zPs50-v6t69z7+QJR^Uw24( zReCj()8aYe%}t%V^iKm1E4-$6-lmQ+f&a2Xoz!3MF<6AmMo-rqb%Z<&jYVBL;bX93 z&WKD~=jQkp#lO$YnOgWACY}#%4oNh=$kHxoq{PFN(hisy6mt7*g{yrc8ZJ$UhHd7P z4fOUe?FgMtH3HV-8xi!r`|?SnbJ`-rIIkC(wlUneL3jOSpA5Bia?djKH)(d~{OH!D zH-f&d2P@F@O+g9rMXGY2`Rs&81-x#2po>-E);wr1OTbg7 zB4&nuKJ#Akc+Vecl6S=@PMw!B9J~{celsoZKf&220^qu|yL6*B(eB8+X9v1G&19YE zt%XGVMlX(b?x1HkJ0O1QA)BgKM6tf#t}xsxnfl{s`B;P@S?s8NWs$1aqI)Ir=%Vd& z-ozb&WMA9z@6{I#usg4W4hDTh;OThOs_v%9FI^Izlt_3yOZ#xX~whBJRRcBQo+tPkR7Ks8{_*^SoSUE$@IKzL9mkD8rG^3SA- z;xE#q@|V}JVo7y(C&L_!q%*x^l<|8aUirdxyZG_1Pa%*VslI~sHcf1<*KbY*wDMQ? z0z8P8A$P~aUJgFjqS?X6YSeLKf~8^O)m}yMfzx^>xDHviHjUwW#;hY=1m8!IxJv*| z>0G3_nMGc|nNII3+VkC-!oK+${|RzSfLRQ*ziZLlzn!1ath%s{L;KEac6{d`Rplak z_z5|LjS!rRnp&-S)R<~e3ApTX3`Y$4K^{^F$Cn5h7=Tp7E|>I4$BuYPv=FDB8h!iW zgm*LXcPQp%i1tEse)2kP&L|13k*_HW ze)LR7%CAp7FZIQ|u(d5*y>K*^*K^s-_JYT1w>FbsYB z7^82*6MHb)-b?J-3ls!}yNi)9$y5*_SD_CSb=V#VfMV48PG)e;yH)PQQKckk%gW?b z_C{dN!f)iDyIH&{VK}atyL~cF$0pl^+1ePdRE=veNZK^KJZR{}!?&Ps%!VXFK%xTM zbymO^=(1<`yVrd^KUhNh-~#Q_*UF+^Flqc~yE&{}X#0cJOSy>~jziw{^ZT#>?v4kO zX_s9f0TYFBvUhtnKKE&njm@InY6ctLJOy=P;&pnmyQ_&HJZ4`mj<_%Jy&QUmbPORq zc(1i6->=BurW(|03jgfx+5tZ}9ntlUwgHfVKYSUbyHwo4kNuu{_sp6{ zlAyzvtEPqMMVBWVvR`5;^78*!GwbbP0Z<2w_zF`N0;8S_Ub)ti_Az)-u^i$O3dg6 zJx}=8Y#C*-WBT!7>hErye9WG zy61@}>RPZP9>?iK)9X!yxq%lr67ep5lF!)Q-~(PiqN z9>QJx?0Ym`%l(2wW9(7S^6#GUFWtTGbIr}_CJ(z{m5y{>FcZu07{guyl1>c`XYS8VRb?2)_9Fq6kPIM5C;G8$nV%IKHy$csHOGk_jRS5PU zr|Zo`u#GRP-;(MkUB5NutaACBHD!Y;W2c{FRV*~7*7@VqG@<)uNI-zZad+``N+!VmN?&qk*oucdt|DyylZpOB)n|69jg-*d6eUtK(QuI1V2o z0E9qU=ZtEyy?sw-s|L`uH_Zn=_;h$| z+-V^e6X}~pQNQz2=nKmTd+N_%_S~&bPFB5d-AyIp{~g(5tLdDqU+LM=r4K6pDYm#a zdpk-1;C}aLyHbaoJ$)(od>;hs6Whb5X_SmitFUaDN0TbOv*FGuFw>s4td2ZbIniAnsL>9017u=W5xn~U6q9IVAIWCYoQbe94U6vrwn9Vd?%8p7s7e)`qW!$ zVt*CK>or#1SDwXi%{$N8?*6i=|J50lwLgq|blcN9*n&}@zMsjiM18Zn6CGK6{iwyF zT9nTxv9g^8DNjEAfE+zAdz)9rszO%@eL)qg9FA6&^gPhQ0d8GhJa^mo*4LZAnx)zE zKt!gxLh4ThMHu9RE&1VEJC^M&qadSu&S3MlbRU9)@66vH9CqY4jI&#g9U=a`kJ}tH z1tbrC5Q1!#%T_vi>*yQx)+aN%<=UBUbyA>n%df-g3biOH1QgZ_M)AWLb?RdqyXr7qSyS#A7$z9SO1>Q7q@Qh_Kapeov4z6a+#Z}Oelkw) z_^nMR1uKTHq$2uiqp!WYaHalFC&4tX?upU7zJ^S!bzJ0hm4jTLgOZ=yQZ4Qdi?>zY z+{fMubZGDIr_pcx%7hm>IGx#-LnSWUmkh~~;)n-UIJ#EvhWbq5Hgm#91D$P`_rmwr z)qv2BTK_C)2HI(!$kw=D;VrwiZK1A|y~D#+PsfJ{iRdRs@9qDwvHT<16>-q_OkB)R zU7aE8B9h!@W+w*?MmlFyT5BljiJ3;DSXp3^-y*I4qQor%JI*}Ua*?`YYWT}judSjZ zdJsrrHN$S?TKp}=+zWJvRQ)Gn9*9Z$)f0-m_V@JTt^GVH5XE8NIqvkPwNQB?BUv|MeS^oB~@T z?Z5Gp!yhD_%+TU9+keWGHOhXMVWNn@QA%tcHXt}d=%bx=$LD76ju?qFVOCYOk1g?~ ztvlXz*25^6>bvG+6+d%dhwzWw#cAZU z3MU-~tL2vGPb%odMx0Sh}7eC#+S4~Vruv=%9Z9iPl z6w5!1zljWP8t7LU-HGi!$3_(c@EqGCrXN9if$k!Gf{m%skGNFmn=Vy<`hO<8+feu)vW8UyxT4QY>T@C z(L0mB5%90Dw^p7JwcjAFT+cuDe%B%^)m47*IdivhT6BFiu3!6B-Dt`hfXjevl4F4& z6Ib&hje4*ydJ-qx7Dlb8(9ZGPtHYYbRFVe20AZU z4Z9jkjrKa7`IF1Ze3c+52aCpjs}anXMkWjZ4`GYJ|6x-DX-m}|U-%TjZID=dIV|RqIHJw#j!Bl`Id1sg2X_l<9WzVKJeZ}biE_Lsmr~fc^I@OMQ zxMU)&DhIDK`)NNc(KxClGqQx1`99La+uPjRGR=j-0nJq zuU%?W6`KaFF8TgNPeMp7aCqqKrw02gm5EFxpCx03htJjmMg9!vCH>g1e zCjH_2EJv}w@GohSSe`4s$_D+_)#w=%9kX-UU^f-gXW}>@2i>I!?hi3p9p2P5reH9bxEhtO=JpXwN%;>p; z*puZ0N70;P8~jV~kHTf=bREBbE)ZQVYT5(K176l4Zn;M46Mqn=D77oqU*Ww=6GaPEdZYR1ivA342GD;k_|983>Q z?TO-@5QaM+57JnLof+2-IPO>Kj30dN}T%YgTgIxye4B_GIO%JKqUbol3Rt zcm3)OhU~|@ClLt^m2_9sn3yrOm$EhFSIxvJd?V-nDq;OB_C6v)6K5mg+sZblIX}=3 zV(nWW14yHpcPEuhcaF6Ajr+VYhc@9^9?_{)1;;)`75Pp0m-#xM>MEQLQ|gux{?d}3 z^wm}qt|LrPPD688YXHGWa#{@9Yt0~CJTI&)nU4M5DeHg8%AE5;vqdK>5+5A1Q89BP zOdnlIHP${+>+-`*POE~6_DPqs=?MnvQlA2uQ(id&M1H7dE)5p8t4LW3pxFO?-(yWw=xDR9%kQ$}+*X(A0-kFV zZ&)o8<)m55g#(R9Tfdl_|EVnt*9BkdbsB8erR7zbN<{s1-&}m6ZLgsuf@uwnUHo_i zcgPE?O0w`#u)DeC|CoyKXJFHDXaGbvyfN?JRk6#kip%&D05wU#qp33Pzwn#sT-gQ} zlEqK``F)zKeUxYQc;iq-6Ok!@d-W~vVpL}57^UHuexKi835yG0f7`BeCuOWBA4dic zM7qjGcKATP2Q{P`qz(Exx@dd&msr}2TB_I!M+W>noo%$i`I!FI#~0__CzU$b0jJ()w|g z3!HT<1g(T1fq->?_Xjx&ZulH=>@5kUsL6ppjWc+h{`H}i-39@Jj#n2U<`$Eu!<34q zPtt^c@|YnlIzZo=Avj00tM=?gxZuiu3Q~K>^~W;sVe6+>@D2ait6!Xzzmk1(d~}dA zWAX^*g?WFAJfuywQVWEA;yifjkUr{u{mc!2c!@s4te}=p3=VQzz37$}BF;EBucA|x z26}Vg!FTUT@JXo}Bv(i7Ig7me)9LTrhVmpL$rmP1^~ur760|EvJ4Pa2%}?!b)rCTD zA%Jy9{rCR?ix*mv+D$Kp^> z@IWiBX65s9T?OYB2afe7mwTM-$dvD+zH+e3TfOC@NWpGDd&45Ltgt-vGqLa`Xxe#u zeCD?rq8z&Ix@YGW*D!W}PI~j@!D~SK`y2&7xm8tNlXd?#sjw=l0E39DOA2QmnyVQaT)By4m-v z`QA)DAnbvTy~t0k&<)l_39`bmCTH^q{2A|A>)$Kp>eV$<0vw+Qdag1M>!c$_BqbUo*Bpf zU3&jMx9>mxI4;LI*Y$ip#(g}V*KIGiDJp925BGlkq#0Rxg~2~pRM5up$#wG_>Y0;I zsllqp6NO-*wQO{Ap5^=@5!W=%_VU0XKXdV}n`4^${2kxVGxB5)6Bc+ zlLZnFmRqmC;u|;|@MAN8?fU=y|L$Ke4nDw7X001X@A_w)=w2^fuHwpMbm?@f94TVV zS;}?k49%#X-_HH})5S8WfAkI}b`$UnQwQ16Cn07uWhQgHCwXZ)`<)Lz84*+Bm}M34 zBr-+6Uwkm)GFXn2BD3ZGiryIi;)Zm&$>FSZI z;F_rO=*gCPzuEtZrVcjEy>IUzLqDs_@gik6__xy*WB2zVW2k1q$z{~Y{$>^LiY&;v4sK@yoQhd1cH2W{^c z^(|N}>~QoJRS}r>LVT2$WEXL-rJ6T!g&6!@NGRvC7GlADBH)Kz&%e!k@Tk7tJy;y= z>doP9jy-kmF6W4EpxlscZUHF<(t6P#KZP~0xkfW&yl}+JIz^l&p6QGymi%G=r z+~F`C!vI>|^o&<^z$SRgLD|jXN`2ano0c1uOQp7Oa6F5$t^6e*aBu5d$Vi z1Acgk1pdFL1Tp=14he~3R!x@+s$@GiOFtFC$BgPvp9Io6hlOv;|3M5h{GgxHUnM`k zK0@^1j)hoS&_3a#;OyhHz8~V$wS{G#;`$>r@r^-ojc2b*xn2$HW+Ao<$f#99VqAk`WP4Eq^SO2}!b z(QNt6{=h@K!ZnS>`a1dV?$l(PSHK%G;zg6DMMcH8-KWcco;M;5#vGrB0FEi8?k+vAvoz&-~Yc){2B7wr%d3+FvKqt1g%80$ALfU zmMaL2t>Fmg+zP9t;ppIIm>wgHCM2Uu95( zvc0L(I&ASDgC}wG?4cR;)VM#hP8jQlYn|_{Gz&+Muol+^j2@17$k#vT!hE}6f=77w z>cf05U|2hih!|UiSgziuD~J6C&-;fV_`r&vTJwC|eE#EG79>lRx>?Mr)Y{2?YTJSi zAiObbN)~Zy{NFctDXa+l1G?^d%%?%JH_^It!3PWEpNw#kF-xgCu@F@;7QC&6^gq;f<#$T8OSs4?EMM402w03M3y2?eg-dda-RzVUR()CpHGUYF%#W z<)NiZS+#<;yo8E;`p6ZHna2EIEir3vLTyI64v#Gj9QT^1j8~ddwfV{6DcNw|`O<5* z+s;Y{5#X(uFOqmx12km0n_i?Xs-%g}&PPtz=S27fv`1^lh{ z5KXMQ{%23=m1e;F8U9DdaNt&j_Jsd~N!=-zOiw5drHWKeZ*3F=EmaUU{j6R{m@TCz zMvm=!zUbT+=wdx1LmrFT*}Lg*5H3nApyzH8sb>#@>dN&;m5+56M+5{^Le%XJ175!c z4Y^q#+ercAa_Tfr;EzMa@|C@Ty}ik{>X#pPcBS}gIzRRWLAn#D(l+}#efkG+7g8(I zArpM1s;&TiOlZM?0vz6;3XknjAq`)F^gmDO!RQxVD&!OA(}ljT9^ut~a}^n6uQ|6j z<)Im_gh*m_?Ts3SnpeW}B)cEA_VdpxiV7jwqO;?+A?G8G7CHsX`{FY^=-JV!$>GTd z0}GEgzBAWB@nK=^K=JmHcpRUYezfJ+NwWIykWQ8Qoi=I{V`+^thvazrlrJK{X=#N! z{UBw{$w0wNhWhF^F{%@^z92$se9OePW+GN4AeW zgl-u2J|tKBU2@}vg_FQUTwp+l#M1!JN@uQ(KjW)!F$WjuLwA%fQt#%*GrgO7LK6Fz zDgz=u56=csM#UDIDMeb)omFomhQy*;_KDhBNl+F@89nl#X-}i z&L?)XO|Nyah%bedRgbQ<rVf z$;*0?%~Xq}5v zu=7*$Ql3T7{dwqF+miU#pYR2a6A-RxKK;=ZNWzjI7iHNR+m~Erdi%Pf7P{43qwqT5 z+nl_f_b_Y(vnmnhe<^9K_4z5}7CkGUbECvUk z=r6J9@}Er8a1iWBUT@y2eS`ZnlD+#e7=>m>{r+k2uG|MVy7LG6{!>QWy8$dWPVFisoZO6WOa7^;7?;*l+iH?)G>4y3fDbXS^EF{hLhY zzPY~hm+Z{Fav%^a6ZNdY3Qq}C`$X3tfwD$xJrZ^^5m zhml5_^4tpe*PGd%TiJ~gbt?(Q+~D*$tbL;@30dvK+r0`0SKuj#iqXfjP%*R|l>h|u zJ&rC}(X3;%sub;3?5~gAMS=`Gh~Nyn1Na!J!b~z!5v&nv)@QJtN)-jWdyD&f4Ke7$ z6q3}R55MBaplGfqj2L6Q9IJd(Q9a_m)Fx#{yG6>I&-S?b(7J0Ncpe-m8rk35kl1lK zHW^3Up-D0xk-CG8Rh&)x6j1x^x@;X%AKu69Ubb~#f`WsOASx|S3z(*{ zetm?PO!exDM$@M(mn-hs0Pc>ha{M0(%j(ak;f5z}6MOi|M7x3(yoeOL(A>S+vF%zH zwcDf^LV5anGpRcVq>EwtUM~KK{~Mta=yH!}1*~0#-~LoTamp24G;ZQde6v2XC1%&p zx0a{*W#uL|YDU~J69cuARCe#ud(YYY5gvBX!e^n?i_ z6L!n^H3_oEn@C0n1N@3jDK~N?271|m`Gn|95+znhTWKQw0N7Grte^kC%0~AF( z=aQX228_IMQyLi_x70$=%mt>i^qVcwE}UF%~m?gN%f={4eWPpU!3cV z7V@`VtmSrrT0mF*A0=eZy4kNmJ%_WND{)}z8;uP_G(fII@+R%VO4XNaayDz5_$9#U zfjY$(i<}@t0MtKTMk31=FO3-+f3`Zsf>y&Kx>BBR`QVQjS6C8a1db98rdsl`FG&_1T~CPf@2IgNsD=|NBYphM zc`30?_I?{3{MMR1otiQGG?-FP{P9y~OJY+`OYkQ7Tt>FQ2+;MDsg>Gs6>kVQbZ<;C zEjLUaKJ-`wZ;AG2bD@c#^sa40FRx6-X7XKh6+!LNKO+g+uJvH}96VjVc$?Hw-cO*i z*i0*!(oL>AeJb3%vy+giMDrna_wRfL+cPh60&DWho4LD~!5j>yB`|;_c+=oR=36US zydQGE@8p|KUn4w9nebEA>#_0NX=Pa{e-;P5L|%E3sZ2YB@{gc6BY%7B(4o-JBEisC z4)BDOO^~a|74bM~TO6}VPpUtoob+@XF4eW)KkhF8o4)i{gklB@@u?m@A|pW*3tZ>A zB?8R=%!w0h3@~s=uL`a>s=>Y(0Zj*NtVSsNpZczFYIf@}U4JR^s|{p{5AR(Sg3|~- zn?|#~DdXXT1E=$Q$3N^(LceP9%Eq$#R;+z^0mA#e$P?y`0pA(^WBmTMo8qh5g+b2_ zdOVJ|d(VUlo+mwXpzdYrZDlt1Tw$^6jGa}xWi4lF$nzuOOgkIPL(@lG&*b4rXD4j8 z-n?_E06J~C1SxU18k9V*V`<6iJeaIzbL7hH48pDH!bY8O+NZ}&%<%tM8YRVCvQw*! z!BN~zW^QZjjKC&I>f~tyIpxzSXhIaz^uyK|SMnj0ru>^f2x9os zcawS_ieQs+?AoT0C{0A7zN_f?Jrad!DIxXRItsYlsO2BG>TpD7|lWT5bGa?%G};BAJcbj!@oFVMg@o(k~>`9#cz`*tT+BP z)~iE*4L$d*mCAeDUzVmlQo+u}V1uBRJN=>Q0YAoeiiY}&c1MN=beHqA`uAvm+Xm`j z?>9Dm_lIl-Ag6<`WA#|A#$iTjhTgoJg(&+^V;Bef_Ztm7?4QHq43OQZaL(qjapBlF zX(i%!Y|EVt;_~NI{-Zr@QYV<&ZlrRm{jwl16i|WTmN;7DIC08b1w74LWKeyMv-GHl z$W#5l1-O<78L^v+9Q)x!#-E-mT{M_ag3;K->rYxSQ?dlXap*sXeQZEv`C6UP+4_WqR4z;Okme3FK(>XELu zNtpP&v@`3Qh09V|pq)yop}c0mINF8&2Pj_11P{&jcE1#pVFxb!ZI(ZCW@$@oAnZcq zUqx!{qM56|?gnXXAX8f@m5ceq4XwoABjfKWS!XA$mFDX;hXMT14ISbkMF>f`t}Z1# z3ZXi4yPr-Es}Do=|6fAJBa`hc-+?^-l$k38S1uCAcI8w6AZksc7Nyl;uh%! zD7K$G5Qv3QPR~MI$4rD4dj%g<(Q%w<`qU~5d}>j+1KaI>73{t0IH^77!gn3RJuK)y zKA?uSe-U>}^7~+|7{LH>65oFQlzwM2u77Mo0K?aa@OUTCqNmU4&B!%_ZHNaM&Vp!F-$ z9W!1ql$}$E<2L19MQK)O6hAo;%P9r)lfuuN5^x`mG{gk2^R2}-#4K6?i5ADF!gX`e zXFXdqZjW+a1%gh-0Bf>ov{QI*4DI=QWaGOoS@;?H$8+$4r?y|Q_oT=B7C}zJVuu2u zT+T!Abi*KLPPsZk^YSainpP|j^f^0oH-Q76Fx0|5{t-Q^hfo*W)#>F=ieheXVQcFi zqf5Q5f3AXD(~?$}z77@xyR|sZhbDx@NVR_5h|GfDIc9f5#`pxIg9ZCQ`jpl`@J3$+ zJ0@%Rk-r()Bo%KH^%2y$Ww!VfQ6i0ZTOv`cc#OyN!^WK`ua;`vXTvV3jh~MW zg*W|dlsQomG0xw#>BKk^T3wjH6}KYTD#u=KyoCF&$u-Q2T5Bjn{c_%VGOu>T+_OW+zL^Xjm;$d z{O$k>B~_W`p1lbYWW=WBUG3k$#c6j!4~Vy~H9iguveC2T=vWqu;awsJpW+2}F~@SC z%J|CH!Ldz$b~&CE-@`fU(3rk;@}3>>f8hV2S@6FT_(SWL1fR({e=D*bcptG0=%nND-KB=N zmC!jrvbr@5+-4mX`(oUT`l+FIL`TxgegezHhVi;Gus1K>6v-m$g!@UWc#U z>~9#B)K>E0dKZCEodVTw6g4%Br>LqfjmX3KvM<4q9WHAhnnKw6ZUm5Gc=1NUv=A}8 zU+bA@i$heW6ILN+NcK&usd1PjqJ{NPG{6GVvCa{^=)-BH3$k#frwi}n;tnO;y6Qrb zI(L=R0?B$9eXI;&e1v!Z=)`Y6Y81%7WQm$Ac)?w`>Nh&lhGw7YQcA6=Io0KbPE{n0h2ZlWDA(6cbE8i3u!T_xgtQsizHf z2mqp$X@8{xBmHHxJLwLaN@&ftm!|24d(Swl3-3@|55EgO?V{oTb^$$Iw{Vt?eTO_RoK1l?TcLh8L)Qp^S1{p%A` z5=f~yK{G_zBD!~3tRsrJB^HBTZ?@-1)|fAQVU&vQ?H9!E!^WmtFtY)7vhbs z!E?%e=u<@bxwr|)aSwF-8zcSSxQ;`!Dby2M z7a}!oYM9@J-{Pw(&6-}jiC+2R+EKOJTQCv-l%?%z2T#WqnphD{VMcw5;rw5$K^ zqKd(=IzgKFs!%GW z?|g&C>rozfgiYv@ROzE;DUh8(#&X`hscXQ5vm|_!Pt5_`OrD2G?!_9Z`ahK+&uGO+ zKRAXzwXXe^$4ns-&*&|0u(&P=hti78?|%KAb`HWPfhQqx(u%Et(#S#kT3LMiRqJSU zqNQGo3)cu2eB;@J2WyFdPu}Q_Y9Q{ge3K#+w=@9Cm+&YBV2mI1(P_Ivmdh0AM6~3s z+qLqSulu?rtu@b8H(f$KmMrkj(x96d*&}8oXR~pUH{&jG?Oqt!B$(vj`kq8_0CATx zcuI2~rQx7%pw$Z4wG%su(p%*|$QaIB@15wb1vWBGtsEC7`&{_gTK+jk3!Zz=aV?Y2L+fQ|aND zagUF6c;X7ZF`!_#cUA2>kAKAYLb+4I6+3$Cr)~LH)tZ$Y{Sq=z4M(o!2&!n`$k3z9 zTZpiKMB1u1+{rtcVGC(Eh*8gvvayq*`%f7rG2QAG5VsIs&f*;9LW$ef#L9Rk7E)pH z2@_{|K^L`P02>LKYEnM{!Bj8L8?O|(u|~pv9vDwal^1@SDigOgS!KX?obbO6$ey-k zv(fj>W49YT5G&EZh6AoNrG`JS$%?l`k=zqKc2vpu#V4u>2PRxb-?uX+Tg{DwxM_}T zg13Dpbv&A|eLE5sXkzN$*9hQ2x`_;OMiAwP7QIb;1Fjp9p)G%Bzu`*TLgUZcMc%GY zdsmQDAL4vm>ca}!wU{qrgy74_8ENE-2bCEEEu|#24=N3<9V@SeLujx28uEf{zHr`M zHb+uBwOzHWyUvMWI%RKkjJtcxHPRnaFlyCeT2O^CE8XfJ%dT>Wtj^_VVBN&`j zl;Bvv+A{Mb&UdOeu%`~^DDxaQ$pyeL-+-%ew^Y-&`|N(>L29Xv@Yd&ZiH`aA-LKW3}T1Xp@%iFSWr z8f95IpBR_;!wR6Al_UYw7ZI9DX&HNE>QI-Hn}J(>HD?(OEKl6l>(hJq6KqJsg|{`A za8$47jbKj43`jg`>ee%3owAgVHGnW?p8^Z0KE!^qxR|64xDMuglK2oOkJ4=Ud{Myt zO)k*CFo#EMy(v$}eOg>d%v^kPIfS(AX!>01q^p%)UrxOG+ZT!LuEedR{T1i+2mJ@N z#F>nwN(u44pl_^cI)8e>+V65a4YwPI>s*^YD5pId+_vugM!sh(RlW9aXFxoO^Dkt%A}z4g{1@Kqlr1Pi1iYV(}Bu%fHfY2Aag%$ z6N2pLa3gxVV2o#oCkD-V2%<+U35Rx#B({EtdC`=R;jr;j&%r7gAgWXz|5}>Yc3FQj z(iZ5yd{Y(4`YehU*h@FUMJl@4@OH;FS!}HwLa=hb4VM`U=QByUjJ1e#PcmZ2!jrfs zB2E3{EVqxM*I&uw@2P)rxhjdAA=);_pcBvjy?YZi_IhFp-15M!@~tHU%E-Ytkk*0 zvbd|wFK)eA3>zyS^bPWi&D7mpKPaIy4=Mcs`S@0ToW0qdzKra|E%-iC{muS7m=jA) zL-@9e@xD1ygAMGzmx>df6CD?n^L(e%XC$E9L6Ny zlnvYr{Q*^OX!{ZsVu$hXUxZbBLacXAYgt2ycv+d5ALu zC9k3F^`qFx3aF7vfq41KL-^O@IXtnMbr zbHS-abV{yGDGC&FJ~mw@fktjAyVSps z*&XzlG1F`5?w7y6CckU$$Pm9q*o(@nw;|}tily44qX~5(6LxeH`1UpW)Pt>fH3bV? zmJ**OApqM^9bEasvh&|58D|gXWAWic&YejMC>0VeocJQ~c){C~qX?vXb$+mWs>CAX zto+>547T>63&(uxdgmX}Y7Xqp25q=K_Y0l{o~&NOI~dO;_oWBpT6EzM(Nls-#%wTg zVasVHmd;}>D2%cfW;M63MtaAXokXlwqKZeqUT9tP1s}JSc zXot~g_EQ$jD98MOIK|)W@|UAj;}BZ(dy|?^qJw<%y%kVnmj_rstenhQ_my^ZHhaz8 zJ=)Q+_f~?MHC_}Xgc_6O#eU+6m3c*SMmBX4*9X`kUU38@@h8<)zsO8us7%=EIw9p0 zFj+rzLhDw0SHeN1f^JrovSZM_8vD({nYL zkH;Dz#;-kj6Z-5go$J>k!d(y|EC@%k~rAUYK5kb zo58X1Ho=N0?T#xN37M%KdH&5(SCg=%U$!g=<#49B%n=8vzki+?0i;zP&s+UvZ_l7YCZoSyhN!<=WX ziQXKYviKXH7ezVyN*T}`E?UssEeQyW?3Y;oi02_rBEosm<{bY}#-%S%g9uARtXEqT zYQDhlNAXA!dhC_btAt)Nl~f>+@|WX`LST1&R8$Ye0yjaqqtqn1kDC5i0`JE}3#DPiRuLmMbMd~!YaAox#^AHKu^1Z7*VqmkkP*+ZjnCAX#gaaC-e_2?N^ve=8YN!z-rf({>3oxXDU zi&m?Xzt<*mRnkv@{S!MS99`C){ln$G4B)kN1Ofw91&?t7(kF84ZQ|m><{a)mypax2 zmIcC9Q8dbJe@rA7@XlQXubK-q@#j4Amh|R~b~vxoCS|CI2ho!4P;zCbgDw0v&yF`p z+4o`ToGB1CqCY~r9kO-tko4&*sK|R2NM5~n|7krbkLTsZCia_PZoHmc(Q3OQWIX-| z(Ss(`{Ddf-Mfu#=Oec)KW(Pn1;wy;wgE+g7FN|0R_FR~ykWk1s>a$r+Rn#m^dTdH~ z{B6Yys!MZ%QQ4_ShoeEjB|pLW*Ou5tQ%z14uoJPBS(hkima&7_x^|2_*t2oTG4cWF zV&lBsG4hr=!TUZ`HCbX*CYFkWE=e?8xiHpCdmT^GeXl#a7+*;XBK;di%<`yqTK=hM zi%VU<0@mD^!C3z57S^tKA|%C=VNX=Y~PC&ZuuCP9qWB0I}9tl~3kz@hDyW>xyIr-eozl<0e0x5XOm* z8!s+3yL2a@*Yiku(xO>~yqMAy#qm?G9^d&bUq>$bv5M_el;#mP--h` z$!iyeLjIJvhJH523cBUpTC>~6*BM=Yz_J!S?g>Wi0Vsbn+{GN6*`p~uVkRV-4OrtM zeHJ9_UEO}`{oVqz`1I^Ne$d`-B;NwdOsH(hvv4D(Vd9rxdIsLAzgq~!pc5?p`_C4b zRqR9)_x{w~HB3@p-b(6{xcul6zyFn1G0HH3;)=o zf<6O|6?MuhC#8F8)JLX%-UATt7Wu|@IffSt%5t1)bjQaOM+0`}A3(Y?F{-%n=O-lw zb&aKmlp1elm@?jH$Y^pu=J~~gi!=Il*eHB1QO4}B<}|!5V}!|}4zt9ivzHKOgT09N zGb1n)A=5H(+7l{bn>N$_JPQy1ZV zSscqO7v7(aKln(|9* z3Vu@|kN*+F{#F41{jcclV8bUS?GD4pk#V$0K~$|jgsT51Du76*voepL`n;5i>-5Bh z)18s>gqBwMob%1gc1R5E%4n?2XaN~Y%NH9R;jq5A$r-iTULCj-7VDK7mtz4MRl}pm;{!f%G@+iu($4Inz-0X9G-AbHnB=y@0)BH2vOLaw#ep z#jt5C)ZIKHqw7EM2eDJ;(;uaq1hvr;f6bh5R98~Wz8Q+KLoh+5_dQv(DIX|ZTqz#o z51N6L2Mr$$C4VsguM?ibgZlOA;R|HG^r433akh;slqGZ(U85&qQip35((t9K?!U+M zXY4gIZf)uAK?aDBu%lDp0(tj~%f&o{Gp-?NEOt!|`u+M!Z0m=Tmr71p+ zg+{B?$S7vHOU?#dTC9+)C|qQ;LKF9l4l(=lvxzr=zeOX04m$&q-T;?fArcjls04?1 zCQ~C}Qqma2=21Sv<4fJ4anxK~_(g&{t5s>%k1N3r)15*D)s?T($hH{5c@qLOwfxSn z-~GS!vMkvWmZ*PQ94)0hQof=xM5&c^Yf1D-356e)rz|m4*$CF%V9DdO_Cw`+5 zgIGeQcCtn^s9{p1OBdOP%Ftk*4*o?oLa?M*>NiWeS-s54Y;x85!=gpGw%SQQUDr_s z)Rvr7=}U;=b)2_HE|dk~BJTpbeL?iw$j=hYpnK|AD=9{ZqLUwF18vROX6pE&|GGT6 z&m01_W@;f2;-jq0|J`|jA-^Ei?koT<{K2RkK>cx?5!klE;)th(`-YtFOV+$N!2Q}JH8*CdFaxf49qH>d7&;o5<|ib8w=9;dfp?Ai zdQxHpPW!JVNuxLPq|#`=P^rM$dtC^q?-Jw)e_BiGkP_E!zCuipQIn;xa-ErfXN6$(}IO8}4{JoC((oa2CyJ!@gU?sfP;hgfE z1=E+um1G4pT^;U-A)0YGCzpo#{Tu+}p$36gjf?z2`}pk=q#uioQ-%UfLMHJfDzHZ= zy>n$egt0QS3CY}mV8je!+a)_ENIOZwCvn$^ArGH5)SQuoWKA8E3PFPQHFUWmx^#9;^R81a&5uc#G;&Nvl6=8GZRRvZ$Kmx_}~FmL-U!La9*!^_tdK zmlAZJ9=i&hsXaP^3 zU_-55vc=q3c>_v^Ija78bmFYkO(v(pN<@J@Vr}Fb!if@}djDdZi=8RqklsmrB&^O} zRS|AsivK3cJDb+%-_&Ac-_zEd!9Jd~)-~Oo&@6yAI+`06ekiyu1+vOreU_=s1r&EO z`^)eOtXvp|4Na&G9a0wq-YLfbO(qa0I-{TV@wD}WG7u-AHRw-@@tl9}K@;oCti0N1 z#p_b>%&6f*5{cgeHEUyH!40$^43t|Dd}BH@y*b-iA+hH+;Ur44%)+Xxw0?5C6Y7@=G>dk1 zkaFM`+pNzLmu&R<*ayKkggrtgL@(-wWG-6s*3)QQv#NBz#PKBm-humi-)hXatE1S) z@*#lfV1n=k7IY$8+UNd-X{mI)51z80xNJCXR+ON+k-{ zLM}@fZ%^o6E=uP#BH)PmrePPdh}_Q&(rKt~`!Mx6OY zLvwtqv;af@9&HH!13p%nqB|| zSveuFclIyyrQaFBAXY4q$z1>{(AXzi#+mfZ*|GB#?(tKybD$SMc^?Pt$_$-A4IO?S zruf2j#+}4JdNvmzZ$1DmH!niswj}@1Z!+L!%EXc{5pcn%@%`qDST?J@2x%6S$)5vL zKgmK0&b^tFNGc2t72kut2I)aW?CJ(B(#DBFx%Z0H?bH!dR3nGdOozt#$7ZVJg;gCs z`8U?zl;BGJzGyOEoh$_GPSo!W?7tDb?{07~o$)LH?+pdJR%(C2gow@p3(TR9S1n4+ zUO>mePDo~@Ri)c<&cyspU8|M?XuH87OwJkssZ4)+ou55v*fM!{FhG~vmMiXl<87Y1 zwQ5YRBj))z2Fi-@jjL+BjU9t`Zg3+CR$3YW{MyKkH&zhbYOug|H>#lDB+(?XhnDre zPg1Wi-4Z;Kz2souGl^(|3NhQ`=E_iWCWo?9K-tAdv8Aw;;QC%FJ~&BLd$MBZkmH3OK)(ISv0fWZb)-mn2w-! zdUKYB*GyX)Tb4a0sqik_ZogeA$;!`!)O**#*6#i-6GN?8iQYYE-#$NEmi53j$QT^Z zi_NsiV*%Wz{zC1{rdS@}6LNOm64BE=wwAU-fTaxHD3YMI6S)#0A-MIBd0nIn;9jV# zPwZiz35C=?4-mh{AYNV;+H{5QGhbr*4Cn_nT*8FbJBy3g13M@-+b;b%0ej$9d@y1p zEdbqWA_T zy?zz3?N-eeZLeYWXKzVt|FZciL4Fl3WI4n}5f|G4H=2&91fsNk#~m}V7bucSQ)sM( z>05(*10~pza5XT@ZG(Ls+~LmVc{+(;r?a=R*Y8B}d5GYdFl3M&7Q+ilm*Kb@ z;$(`Opv-Mv|`8lzT#ZtnVuwplw2l zv?gceDPw8oJ6^z@L@1{aR6DK+r9W9}%01BBUq=3xfCA#^0cogLX#rJ${7HK;WBkGC zc_p!d~|CJe(5a2z2oG~%mw6i(u`&?%d{fxXjvmJV?jS#eTFrQe6Qm5!quQUwx zvL(xlD$aV{Pys$C$jJisE3;T1ufPBD+^@Ut(ywiEIn`A;@5-8?%c!4*OA08qx>YYM zH%e?2rO@`(7+Y0(368r?5zqD+XG@JdnRvE|7h}6f+;)C&QhyXd-2p#?M~4W7RdkG#D&^DiLp(OvYv*c zbXMA=SRY&$eAIK1fH;J&pKQ58hj}Lxs`4N*2|X{-W8Duq1e}p_X{8#3N2ZFnKjzoR zuN~1q&s+XnDHvH*vR);1cWp@%bcTQPVQDX4r+vVu_k+yW7kW2`KH`b^pb?YT!OGOC>V7k&e zL^e%sUEAH8u|%FZ==@)Poj&;kKViz^#$TbLqqOklTM&#Y)x_l&(C6qZ-c|Qk``ki< zQ^|4Z-Jmm(j6V#9DCObpfM&j(2EKxN)iP-Q$=ng{+ho1{9fOdMepYXdm`;=mvT6)t znpHWUlB9GM@b~OmrDDU2fu?&}sS4hhtp7|#{3c!=A!s{d8rfLzuPskqpm6S(N4gGy_S8D=15LC|{box2=F4UL zMsdr07?p2fqPzMruMqZzVzoFi=T@)c!4bfry#^ zgaLXZMG`Kbh|SWYo1m)Akx*v!nfF@Hb2z3-=WJeXyQ1-1&o(K}a#nKUyEk<25M^NQ zWFcZOo^9|m?OwoMI%L&Lic_{E%sxVhfai9$IsG<)~nihTlaYlW(Ay=BDyt=p*e zd|k>35!_HVK{R94SgT|wn?{8xiF@5qn116yJo;R{Zd08ia0VS2@F<9L8FUs;Di0{G z!a#HH`sd0xxAV?eWPex`BGyU-m7LV&-wP0!`iI?AM40ezI3M<1Y}5X8W?y@!e@v_Q z-f#ytnpuY`e%cFyhv(V9v43R$5*-#0HgQxiU3BNf_=K>qC_^+*^i&Q+H#L5m?4X3( zeZ{Jz<-LYIeLW5>=??Hrdoe(aYqk)V0c}eic)Yg`*y;F9WGvq%>>7= zK|ebRY!(47oMNe|4VQHR3S;69AW248g^b^>>A;eoc+=cP;In6Y+2|cL@_Ytt=>Zoq z@+|_jmzUwWn1js1i_%=lRK~``;bPgq@{A?vEW{0?!DCG;RR4a+Koo#TSDNVC>mpCm zDupB<<3~quQmR6_;{#%>1Q|;+&_;-$aG!XzEeKG3HLn2QZUa!lYeav@^5KMBX|Sj} z>o{Iq%Lqsh)k5wlww;|m37?fj4qi{`2wQ^CIRH_)u<7dDdW9oFW|Ven0I$3H*5&;r zFyr5GmZ=oZplYob0kvYWf4me=BA_m+_B=Snf|g0XRo2bV>S*Y>p$?i-nI+(F-KU9 zlm+jomzkY6FtfYxFhiGa%lm-oVP3xMC|9Sql8jSp32h*jW=yByd>YQ=o{uJikorKd z-d7Qh|MB_siMHFUiuam&y!-F4_ya8du=7d$i{Z`EsHypQmM<+jQ1A3rZG@Ive8u+R zxXFNkQ&V`x_uU2k({7gI76nWMdaLnsKb$%n42kG*{OU5Fh-a0eix9LswZat4`Ck^ABPxuGC)BdV-MP{+OJfk^6$m!mG-Nwi3@NK@L>V>K`^Sc}` zuKcJ~Po?iz0~pfkaC>j-w$5L1Z15@Na`6J3#4B%&v~&r7*#-Jf5$0r@d{tDBzb}{5Kqr3f1@p#{lg7)`-+C`!6(5GD(Zt032iQG-8;5GwA&1Wu>m9Gr zOIDO%C3AKsK7V6lGwpandvTfgAIAB(kn5@39J9YYR&i}{Nc?VMc|M9+3_8yg-%sAOAacohPl_YzXR5Ff{?UR*}j%0;{ zij0htEi?02Av@dQkj*iU?Y{N>-TTM=qkkMu=X}Qd{rbFKkLUBLxSi8D6-O`rUb+?T z?aPM_yU}`9WGP7uN@ab`)(Q{xoYJjOaiLD7iQSu_e+IarDToDYWl}Lqe-5{yH8OxB zBiu(cOlbg~h)b3tQb-q+)3fw9n%rHqm^+a#yfUJ>?@u`I&V8Y_-cXQQY zE6_Z<`eoae={Xr(Z+URzZ|DOLG@@8%NZ`%`d&l0zOQ;(Juqz+kH_nWAoBj|3s?^1$ z(=M)9H2pKG)4*@^^e|n(swgM&r#bA4M-C^#Agr3vfglh?pz&e(+phhou^Y?LPjcxm zSLXw?Btv1>NFS!w)#qnAx8;FAFT|s0LvQrS0nYg_YtH+x;agK)e7`z#C0<0)MfuZFPvmLP6?hLovCy=U%vfix z?1#CkAh~=)ucNBzOfQ41Mg(oW-2G_w4b6j}7R7T@yd=h5KNBQdd4;I`DRc};o{6nX zW$S#_Lm*mHUC4vmK}N0(ZIMFqOvaS9PDFU8srfkvPDf?kGgD!WelFCVUyJooZW2QD zbg8+;wrKf0!P_LXQ}nX!L6GV&c_SS>L}!p@0}kL2_75=^^}35_Vs&LlZcWT;Ufy7o za($iT-s(a@8_q|Y}e%p@#s4kH*3vz5(XloB`Ct_XO8B%A`1Zh5~ z_VZ;?N>Af&%gW#$q=6BDC4v>>qJwBp&qro*n_u?(C5bdZxyeJhXlhA(zhY@5nD%N( zH%p>qTV1ZHquUsCJmpUjx1RZmcTfzubowR#XkS+xO}Nhvpi&hb^QGuCknj7s8pmKcz5+ z>R=EFgJjg&?_T;F%~!7(#_%-3^pxbcqz&9E-0k8V(;8xggu8(GuM)=s|Geqb zv4?7m&V+kEO$v_CQ?-H(G$c`BeVg?JwlqsN|F^Hgd<02k{2@M1!*|sl6m0%NW4I%i zUE%omSV`ONYFzlGwIt7{-ygd?r5~FvzkC?!We!y{aC&yLdX3o!**{QA=~yB~auAhR zE-{^JKiQpn>SK1bdrRDlw>MwRNN6GI2EI9i;hFlj?5xySxB70trLHF(x5mgs^S256 zy;DcOqOnIV>k^ozBhk>wfUUML(|t1To-{&imXMCt&G%BDq~B|Qe*8N1QGRtO>@VXL zHGN8mgaq;>u?0F^>hFSZvTZQc&N!8MxyHquJFAY4{BnK)}ogeog9SyZD-2Hf%BDv(B1^EBy5klLYJR_g3Y;B-2Sbq5dF6^3xm$b-C~cD+}399d@V z!nHc!7a#5nqpuchsCnrYJir%xLe(-aYJBl&=zCooJ$8yV8ZVma8)p0Xs%8Dxb2So< z&(b#(iFTr%JVl*5kxtO?q#}Vpb1p%rU4y!cgV6psa6Wib>#~CwC+@zY+3>@b3TdzR z2NRc8#2c!P>lL@D^`j5yMA`f9UN80?yIhTq%=Vo29DhI5NUrI$5-xS7d_Gp=Y>=^! zCC%#1W2cJhnSR6g>5r{?(m0cr4WVfKUE1jLixv|lY-cSILYZxPT|krJ zGAkFrQ)>XjKvuahKORJH_p#pQn?~L(ep_Ccp!&(r4fDiW9qp5!nqYi;i{+FqTgSG6 zCjg3=5juMagWkVVx#HrB0eT%~og>t1LT**3DL0}wj#iwy51@eOupV59R8_pzK`6zi zS)l)kl|=L%b4}|1Gh?_C-nRgd^Z^i#1-WyMW;SAPwK6n^Yetaso)LaKXA~iAHOufm z6?!Fb!y{Zkd7kgqgKE_XGtM5wu-ko;*@0rAp(C6>{bwYLC8hDB9h%Ea+;sXu0v5#< z30J>AT9WFx(9723QUL;%KMZYRnlmVP(Ps=)|Y2uC#?%6=MsmTgvH4}qjIJmj?uqBj%us`13eAe-{ledw>9TzLS>53 zH&tK^MEY-={V8(<`< zGuQ3$&z5Ghd9q!}A|dM~+f^zRqUSfRldgPzW$QJ8VWCf?8>PI-+52QK<(EC@?VD5^Z(K;DvYV4B z_q`1UX$Ci^!XZhzZ<-GaQ=glBs6AV6AZ@JlenGi~3&R%dx1O})VLM0o1kCqXd0 z6T=&xG!*%m$*D6}bzWjsXz25~-!^AbZ5lX}rfz=cSFQkhGb>q3SBOjM-=*)Rv?jB@5N<%Cl{7n%X0iU+Xi zeu`jORx#{ds;4@f8E3eb!!LZ{MFfiheb2{?@47k>^X+#*J7qmfLl^a`IXaYC_>f$$ z$I%sL1I9__2m|@#F|J_eS-FFUE@0O@L>j#U&wlRwKuDWzaaO%92h5nbo(h{69I1|9 z%hDl*p4r(pBf0ltRRKl`dRky3)`u4r=|0CGQ2t+Z4N$&&B9yrk0-?iZ&3agwQjR%~ z^I0an$k@=H=C(FbYu5%XpTRcKZLKk;hPZSTvS@9v?F`Hz_Ed}YyG(|^SLI~=>Ti!F zwfHrS9o1ulVNL98N6FfvUFq6fhI%^aKi#-;iiSRL7FJuk-U+hVpBh++Hd&KvTqKrg zn6{_hilX02oJuyGsCnF~ZzgeExt7FYY+<|-JzuWi{{=I!TPhLgr+ovwH<5zHU<-j2g3yVWL8{{0^# znn?wOq~}j9a)&YU-P)wBxg|H(Y1zWUORVOU2d4%r=h^ zsW6;8qBrNC3WPK+U7mjo`u2=#M9Vq*v3m^6I_7aN*KOHsN%sUavwDL-)>gkZp1xEj zII@~I^gB_@{2AEYjvt{77ChsB{#H!XVX^N0ofRh5&A3lZ8$YGvzbEc^N1vTg^C__=(+K*ZMwncl61biRIiSS}N-A;aARO zn6y%dg)5Mll8lvjUvXnQWMpc>#y%F)roRmNg4Rr7B08rhx(k*?xoV4kVa^i&>7LFn zHgK!)XGKs1(oqxiUz3|QpGT?Gh6f{P12SrzUC!}@oTZJ{L$q^4{4cU#z-dL@k1q>M z%ouNxIrj>rqM5t(QQoc?`GE#ur}ILnU7&Lme1gBufl`da-vz{2IHUV}2W271_JngM z3$`Me(o}!9{+<5qN{PjE08m=vpV@hR>`0bpdLR6~h|dM5ZiHUu2o^*6bNjAT$?R)H z%)cbD{)*v<$aN{=c+oMU6w3p2c0887CM|lva%5J;<;BTQFm~2@*}rD6L!7<#fuy$$ zjF<&ZQR1RHUBrl_VZcKjDCIrakQpwaj`iSAoSWw5{xy|Jfsvsv=U;M3%_QTyWY!mL zoaH+DE`>&gG?LwN>0@7Hr7!OolgPN8=*-LgRTBM*eJGBcT`wvtuXlH1C05+C{Z0v= z?p{UQEd(dV{ccrB|I#Z$QoOg<#4DfkP9KFR;1~itt^LP09WH3|-f$zZSah^DR>~9m zd(%o<=4P1G?ymsE*=O%HgAMfFK3>-@nF8do#^u*cvhm)cGyS$dWJveh+P-GV{5ULk zq0SQw9Vm7Q6N8<*-h7_+Y+$JB%clta`}m@u(IZk~K%>3Hwqr?kIRoXRhJ!K-+5r zF9l|?_fl4H<*4%0ZqY%ZyG8Rdh;}4UvIgZarbrO z746s8Lf>z*ovcu0k4o+DAe`cy6e{h{MKRwvWB-ZkQ+BMI3 zqo>ebK0KHyG_Ke#a<7dds8cXNq4YY_ZxWnwyfEDh&FJS6pDFRdzN(q}Ug+?*h_^0; zH~5(i7|0_soHoP{)NW`=&cvt6WsQ?0YM)7Tcr2yG@rlwJAL5=q9rLx)-x#nM|Iw>soB1Q%`}Cx3Z5K zGl1S*X*LU(9?-7E(0$S4unxGeHy)wdvk1m3QGcrdW20uZL+6+7vPE2R-rD0=XImlz zV}<0|hxPAb0)0?3-wweoX7}OF!ILz`y6WfU3u=P^kj~*Y_uMmW{+(r?_P`(JcgO3) z<8ycGTBa=zVt4xQoIVVk)*q**qVBG7Dp@bGD|5S#g^EM*xle$kV z^wC+_`5IitA$GzuR;;P7!ikrbkdTAcPn6xrF>0D6=BMXX!bCu*E%35!tU@%Ghpb(yO3Zm8St!#_;w%^hxH7`r7QH=h}ND*dGp*ve#>s&fMw~#K9N48P1*%D}RG0o}@95CreZ%w{Q23ufyzwZrbWma{|Z!o_cmqm~B zp}@s*9{uwt;0)r|rb{^5(~dtoegN91CWC`2U+61+Dlnt*&XuV(jEeydOvyXMPBwse z%w{VAX0PTLSeSsNnJ=;|=MfTi6g0U7oJsI`pu9XRG1c+@$FrTP^FP&+=26z2P0#MY z&nD;1Z;UA}j1@2U6wBXO!FiTVaw}}!6UwwQv+B&{9l1{@#be{DR+baVa}ioIqD$ar zhF@4OB0`$Fl`^INE?*w&D{>LqEyq=U*{5*+5x`JwC|XEPx)*)s-lTM8x}1P=uQ)pm zuZ?u=JD8#)p{~sRI;b3P@Jo4UYLru&tgZ=NFB;v3OZakA*#F0kA7EYd4O+;TahLey zVkD;DkNX}w=Q771YHMZ`UjZ>Q$q3cSke=`>1Fce+JOk4Yd6@cDBb(gAIMp-L*_apO zynGov)C@9ME^0ybKZ5WJC7)Mp-R<0_i9Mx~>JzwZOv7C&jk2V+-jr+6;pq6s$P`SCrP29o6l;)l-%7)e3A54k0{t2qs3MJ^-xCM{ectt0z|u zdCbeS|AndsPN&$X1;;gVYjyfeBhAm|^|CrzSHhj>?b2JdP@cUKDF?qXVPd-n7kqMt zSn7Q(w6A3tSu9rp18-t?l)M9dEmHToXz-ER*3(4k>ZPkKo~d>IC z&t$&mv?SCS^_+DPZY0Jei#esTw=3({VpU~u^c)5mOc&x}!0~CK`dt*Ms`U_6&6_nR z9D@4Z+jdq?lS5~f1=EmvhO0lWaRNX}b*qnc>uLDioR=SC(7y9OiXMJe&0uokZxDb$ z&B<@4lfe|Drs+b?%=sM*_;Q|cnFxXj(NYZ5sF>ip-Q2s+s|+ZN3SQ z9RxX@$AHi=4#(TCzoX}u zf;vw0rc*DcO)~n!Z%&goh+ddY#u>A`)%+|HNSxmFyfL=7u@~Vy|E5X?UG1wY5Y64^oi=I!sr8XZf0JecQu?DW<`O1k#t5>I_vms}g$a(RhtJ0(rXiho11Q*TkcZ!p*n8f;)HW1nQ9a`8QqXmH1Gy$qIoA0wysRDk;ICz~_{W_; zXE;LXnFoLRpdNqtP90{7ntZ|sf7YpKyMA&=$VP)+3RU;C27@d31Yao@>3HWphZkK7lhPz zM+R{Tv?#YdA5^zx&A@TA-wPB^%Is8!Wo9~BA5}foTI`(*TeznFqliZ0|-|Fb6En5D&IhNl%#z#H2bS7bn($Eg*NLxz6H8tQ_q znh|dDfrnR|k|7ux&c?}LI-1Bdj9_g3C_9 zl3wCkIuFmUB~1zQDK$*nTErRG)Cd-^(aQ(^Q5NXy+{yMDx8l-0Pt>kwfpi4=tM7FL z|1`6}(6WE!^@RvB>G!>wC5@3*Ae@==+!4R7S9?R{OHTWrj-1K2uxAoJ5jy>7hh0C} zzfKA4`h>Wh5>QkzCqvp17ZbF<;!K?v0=V!W?RNuS^ML2LJD$gcB@gytTdwcqf1yiGsr=MS<6g+ zHRy=(0!0(4q96xgNVj6pW^H0>OegKp7V+4)Pv^Sv@KF;Pd9U}<{_T}utTdKo#oXct z5Q6L75~#BHT7t$U_yN6=m$NACl&;J@yY>y^t266Nkjw6p+@e%Rf}ff^0SL0BVaKc% z6;P)szV)$7f0obQJ(PE1ral6f2it4<|62AhgHBuanO=?4Yl?_Of4nDZK2bIsZC~)? zsgV@Zvr{8U;3H`?bEWF1ZG!nL;%<;|xLLI3r!|8EQ%5aeP124SO`XmK6ZG-eoLg*jW<;=^Qae^cn`H{u8*&o+4cxr^b z#M%VkR^2F%G2G73R<`*1BY&UL(PY{qX=paUc4ZW|!V+Du|6}_1{G{y)9Ak8e+NU|U zpwfM1WoWEy2Y0E?b45JLt8)r_>ji6mK>pWU(qiQ&Mtm>UA$y8%Ux!F5?jwFMUvd^2 zkP_>{SG5(EB#cHp=6AG_Lz~@6{a!NU;zQyRL+=XfFn3K~ zt;zC%-{Xs!v=4y#(xpxGAqqdvZ=q7fU=o~Z2O2teQt#_HyqhsDW1E(xO!^9YZhD*w z2vxyDEFIAR5PKx3%6tu=SQE>jEjeUG)Qwj;vvSuvB5$3F;}3pir=q1 zP6iOv6dF3-Yh-bDteAfDndTKRS0)~!mg6^183dcj81lSB=SyB{wEY?UV?^RU1_o@74_>g6W%}Kdl>xTes5K28-1Ye- z3u5J|-+B7)%ik3xUMy2y0)Cn5I6`^jA0OZHCBQ?Jzaay`LYK*YG^K2hDaW7TW)C|P z_}Y^v5ZJ5@gB6?F#rTP_Rg5Y%c_WADT6qUopiy3B=u0LytBwyQ$ZR7~GY!Rha;qnU%s+(`0P4p}Y zIB2&XU^WC{kL|xvi$IuSAzMHYuw=b60YEYR1U?^;U$g7oWrI3|Ygf@Djxx9;mws)R z%p=f7?QR1D!0wKH<^*6D3k-X^@Bwwcwo2C)o1})aGGXqi4wXVz*QuTRIUq-XgZo`a z6!cDua`a-{r{szv(+^W;DiX?yc-3L4yx7fI^7&LIzRh?dC-oFqyk>QM51ljem&Nec zi7<7xxhKJ5i>Ysl!T?CrNNo z*$S=k;>jz=sNF;D>0`fL49ED$voQ()eu3lsvkYkK%t@x0lY#RZ>+;-GdBg~{s&9sv zhPd_p$Qf20+J4Ct0lqOdt(nVa-4rPT%1v?S&ZkYrHYx!dHCGrO>hyV!ss>HGirH)q zyrzx?GE4_>s8_S--9`QB`7VUXwi9wfXFcaE{CMF@eFHVsRE=$;vHG{E^par?E&S=S z?{{vb7@z?VGJ8I7N0X{*y**~($)0jexKf8|aKJnaf~7U5cg4X+t=btpcE%B?U4T5g zP8%Y}1Ua4@KzG#>fo$>msKZFsspIo>%uM2b`>T#!d)Y+|3x%{DP^+im>LLNw%pSwT zv0BW56Py7Kr18k$`e>);Ek@HPuCvUd&c{x+lb6z7Om)?Fby+jf z_L!PiM$!Lol?LAT3>%?aBVf}m#Lhrb>wUN#-OvM5E~{F`RXUN%zh6xK56Yo~UHb38 zD`KWNFYJ3jL=U=0jwEIpXKj@2#X5SQ^q_+*gUr70k~QB)q|RK{+LT_OBhQ|_tjy*X zqzxC(@D&hoi1+q)<+pq-KdxMC|CYL|LK@?|ExTK2vpV7EIhAz#p8!&-Xb zL+dIvfp?Avp}gKDS-CI*>3%60WK5?Ey%Y2*XM&=dnG9!Ujm>p3~q3aVtMnlgHf^hlCE}-;m-M1W9}58voKd?e^sEc*6Rz8&pKa($ z>k;J1FcNDK>rY)P@%qFRD*H8&!a^pLU-l;_$j|$62HrkW~qaf*O>tDs4AHHvnHP84t#e zQecUV#3yx#_QY+9CJ~h?wyqN0#O#flz@ypqO`+%``d5w7{$*0YF`y7E5su(gj%%o& zd~_+O-CrzS!f;sp6tAZ34~+?f%sI}1z`QH(j?}5P{F<(p)Nn5|1Ys#;5)U>&oHcnW z@re?2RPe7WerG1bdZFG;Tyf71x%Z+%H~64?dVa5P)_h?9DJkdB*am5`71)hAEDpz)bU8Kf(PHsZzql3L&T>g@rN>}ZH z!rc*D_yiUcydqs#lJ zxWcmF>0QND&`pCpBI0IT8^_tZd>;7k?QYDRtb$Bhg^sa`J}%OiWIIWvWM=EbrEgP@ z(Z9>Vr-r(y$J~y51{HTrvA**87R49qh>*0%&P5}xUAqRn+(x7mAn0tZPX{_JiZ(|f z=y&EkO$h6*@r$e2TOXBpj;(4wH+zB40Dhq{@^bf~Zv_VpF=4f02BpMeaq_srz7Zik zpP>4)?pnd=_BE{jZ&{`53qkJv2KkSr9N|h4liNgz%*ncO6R=CF_99$Ere!%Pi%*r#J6IwXzG}JoESZAab<56!mom(UP$+sceRSlmY~dm;!rxaG}C3A zxQvpK*4J*MZ_x!gXT*0KWUg`-2UEEFl3h(}inqT`&v}jsysZm=gP;XjT^*cV2wJ#k z?k6FTvK8lUWnf{bJ(2g#(2-@Xfo}Cv(|;Gpg*q{d7482nrBA|ttJK1*p!k;Uy?*-&N zmD>8Z3x4Vjtl+10VxDaAd;h)A=WTA(6XbEPwk|rf>=Q8XY*EC~oA%U6iL6l&6I+QS zpq@OvX($|2lpwQKkFTZ^3UE(LaSKuQ+x?uG4K?m=O*;VO;pOdAF`7JGH9_{`-qd!H z^N#1K_v&fp&(V9%V9B>GtL_sePh?Ylc7Vq`$(x#Cu36#FWiWKy?ga+N#`-5nC*CvD zio5E&exr5&FS!o9!wLv%npR0=cHD!u-_-P^|1DFiGO6Q`un2d|iqBdv3$1C8u*WG8 zZ~f;!dU|i&nPL7!{ItfHj^E2zQHk0je|``zjsD1fd?@6Xz`<>%Xw)se?7+ThU$;ds zlIpj1eVO8we{oiw`p2;#kqKL}yu0?^j6UN*I=kJ%Z65dbGJ}Q!lYM$1yxq-TQw|ZL zo1&edF+SH8bbqUf$~f6Ppf!TOxYTsI;O^kH?%RoGc{L*=4# ztr#Dp;M(rx)J>~GqGR8+tuM^UnC*oBw_<=(gbV|1e0uKlmX!Am2aN}v;Hj9Bq!w3h zdEwqB@o2eShi01ZTS@0Xf~%Lr;!57MzOd$TPESBOvb9HZ%p?4_fVV(=MNmnGlM@12L+`>MG8yCVzH3@gL&0#T zw(pyd3SO7N+8A{pWv@v;=KpI%5jehq6Di61-)eCsybPqIRXbGkkvGgk!O0Q!IEtqi zHm*}IeOMan{^tzwzi*{~8tHbPt7!>zvYL+g>{p)s(F#yx*-9;Dp0DcP2=`f2o_v9E z{crL8_cyec0Zeh}L58SY?62NegUBq;(YMtFX@PNw&V zb$AEKKNq}z`vq8dAWhKueR5s1Z-t{=C)ez>nY^_LpwaqtNQke57CQ{Zoth#7jmNOssJbK7`eFWtU z!~?ECQcJ*YY@nPi4R3F>HC(SXuFVQc^!j`5QxAQY6;7--pykFj-@d=2 zMsG|NUHiV&P7pKSaYtA9dGurK_OpGm-K#rojc}f;UJ<=fHS@x%6*W^qC&a=(H+uJ0 zrB;1qKz%UZ5@mN)!F$VbW?q5oykN9eNhZF!;Zb!$WExW+%Lf)})`1Txw?smRpbAY*LSlp~$JX~!C(r(JnzVt(rA?Fc zx8x5NRO?o%hE|bjn5&9wmwf5MjuwIkRAxTZ?MqS(nUc^-9h+7_rVZmnP%i4S`tH!$ z#8Qb0{B(7%V)!fcZ^(tJ?=EJV#cwiqq$&uXKb&baPVH`eNca1fXYT9CYdt)4 zxDM&1hde#>hVt-+n0c0pUR*}nMv~{p(yr4bhmK67NA-t=HJxY0rQj;JLtpu^UxzJL zqj#LUIA%cPb`3<oFCK8@>c zH1H?iY06I`!L7OFCSPqdcVW_j?k@e>{x`Nvl8$C`3n^d3o zr#XpywiSnxR>?j-eYc*Yl~PN$3o}! zQVLFysN@9fjQK7J#7d37(p&PAb|^L1+37yYj*^o@f!J*yvx)CuEJV1>vl7ZOZe4aM z_}R`N#Ogy>612|Z>|w&NHX4@Gk3~y!BN9^N?i=og#K|d&?tD@=+ITu9wGtXR1jdV9 zjqc%V%zvfhD{`~z;!pm@+B5i91HbB)yM><)0wk-R?dggb6Vjy)vqL@>__&pU1V0XO z9rSJ^ou!#1&5-@x3Op5r)upj0H9a-7T)PROCFG_3t(2|~f&GR2y^X-_yR<)*jtbqQ z|Gt;~NQ?Yr$bYZqZUDtPMNs+RBy7Hkq%LwPDw6Oi4uJDjfBfKPvcRw+KS}xz`GJ#`7@Ex_%FQTK0 zRvNK&TUNh(B%?)pYPJ09UiGtdGRv*2Gvnc9a#ueWEO`X?JsNqeW{4lg#TgMRPilhl)2s@Y=~5Aqsp59fN_@1q3MK? z+tx=K113@xYtaigr8+l!SI)fdzDRgD7V%a} z0)Cd<5UAXmFVRQtuxJK-)%|z{rTmd8f>YPCx2x-4Q zlHxslp1R!eZ%T6)#ZaVSj@}uHJ~Hnw8xfVqwRIcK8cw#C%-V}Olu*v664y8S_OJCV zP`V>`##alUWudiZF!=(&|2`mqX(bWnXpl^S(FM*`$w$NKklmd~DCDxh@jh7SBtbrB zo(Hz#xl;Ev?m&Gpwu8claFHvROX^9q(QLFIsLH3~3Xx8}t*=SaSVRhF!`Wy9-X0hn zj2QR0cK)DWeT?ScH*Ta@WvydL-Q8iwqscgzq(Vm%hBu1sKD&aJT1#%_rR{?RxJ+;e_K~A;XeW z*f!qwU;%mp|2bjli*pp+htXUq%wIa10z4^DaK+8rK^=!s#`>!??#JGLQwSNmJQh2Z zm_)qv(u3Mq{lu*IY4D>dU25BhQRr$r#e@~}OLl_?F((9Fq4saofCG^7&1Z8@nGUbe zjbysC`1=DA4OiREJ6L90kM=N=ie(7KIFzP&KAGj>Qt&D~Jo@C^VW)`jw`ranDu1#f zSQ1s%x%LUNFX+9m>n_pkq0I4`Olei_B6@qre9foh6Gmgc?YHjc!M8NqQRz7b?xUd@ zLWZ*?HI{zUlX zfJ+=Osi+Q3i&%HhOZ;MzG=>eWno_HnZA<7*t-A@0*~qgQ8MTv0MfHkJzu(h~k1F4; z{{8GB`e6WjgZD-dOIk{v|24A|+wI4;gRYDI*T+cDcSl{(l$~Y#Y<}+Yq{6uZ!#U?NWtnifDpQ8@e5Pg=$6kgV^%v>e z0>49`7+;I(|jC<6b(`ImzgYebgsm@RZ9Qa!yticM$qb zetowm#e+%qG_9YWyHK(w43$jK&Bp!gSU;eFyt*l&mq4m9kE}2WUnZZBSm8F zr6((-uG{wwpLhDHD_4$cn~o-Vwz(BqioUHXWDvi(58-g3+wRk-(1YS>bl+wzk2>m5 z#SD@dD`U7dJS<|U9%wr?;7v6 zepF{BcAoipZhINW`$s!eVhe?7=k%2B-|1*DmlTenb)5|8yRfJ{vEBSK%NEMj)RM(} zsLI(HhotFb8hpH;?C-%Q_eK@xuQX=&rYdj-8^zQ#dMmQnD6xk2-D{~bADytN1qrv9 zbE0(f-=)c_kqr-*+$mRHFktW2*DS36&|rf%zk1Ul=vg-0%`Q@IFtm&|S(=ZI z?_ht%-r*bm^$IiqknrZ`ygkrNLULS+t>5C!6@DefF4=-fVgJa<%g1}F74W90EMD~! z!wO4EqG3Y^`3C$=sJ;CO2At_?UbX!o?7``leLrN#YMPyFMn6E_4$1RmJ$F=eIrKU` zS%AUqi*?Mg{2FBT>mNPv6AmMNvh8k}7rnOQ&-G3C98?%P;NeS!5M^&nh=8{w$7ox( zf60J=?`+BvX@i!!;(VFj@&#j^9?P&z*~H>YVcj?1BBynQ=hQI%+ zre}&4!y^URPtMYz+&9bakdMNfZrdIGcBTUcUs7b}}Qv6 zc(f#~e7R!p;`{M&<1}=BdqeVJt_Qmq`U^WLiJtSf_wX)PV-zou)w0C^PJYvPfa-hIZz7JKe-e%5Rzen|?^bnetIHGiyFudbaXQ(2Z zyZB(A!)reIO)g>BH4UjNJZt)y@^4kwvU}Q>!L>2Q1Cy>Cxx^ktep!x<3?{M`JDT57 z<>J{g@4#}eG5zqZ6_Li+$X#%!^qlDqU|JA>TFfV}J){dWZTgyr%z5rqG<#ZnUkZKj ziNn%VvT70A6NT4|%CmIk_}x6SNuqN2*%_C0snQ=Y2Is>+yxnfGTr&ncw)oU|;c)>Cb#om0GUN=myTXda!b0lj&-kXvx!VwZ8E8MzPudN$h8=$M`m8nQg({!MxIc3-c$(i zFYlQfffPrTIy_~0453#0)sy+MVnTz5x+PElQgHvgdi~_EoDIzF1YGg-^LcYlry0Vx z#UFX=S1^~1hS;ubf4ccyX*6ef;f>!Uvb65-XcgOy7NrPCv-0Ye7ZO@va2(zQ`DpOw z3R?mz-=urjh{Xl(BWl+{*X-$U!wH5Mk77vHD(Mx~7U%^0Y@`3{U)^c7x)thuk*oIT z6GJo3_jcIkw7PJ?Q*p$x(hZRSCHf}19EOpTGEm1$W9`9ZHe1m>lrlU@O-kfP2}fyD z!I#*|2d1B!29T2=M`l*q@eeGVDYq@6Lz~0pn!AdE#&)Rs?uJy-p{;J}y~lUSL&7BD zaqb0IU07bnW|16YlpH_eUZ;(7j8h;wPSBc866LbdGd@Hzud zHg!iCGskM3+peW8qgacy`H%V|LCSPoBBJg>FKo}ik8Vi(X)q>!0he1#J(b%5w$Yrv z%U*hiI?y*VYSfB9>R?T{JF_Echh;eu+Vc9XCH#TYu|b1>U+ z2+sffrfcSdTQ5y%sCVT58P+O)7-2+W)4QMh(gy!m2dl;e98q*(6@u*%aY9LBu zJ?Z<4`Z?WCwqp$@DAW9EPL3b_URSV>-X}0$-@kUtGU3=;6xhS$lEk`t z`kD8a1KIkEn&Q`d9OZ*mab!Bv7|kt@D~bW?O@`6QeyS7S&RlAFemqjrlI$QsQ)m9f zyur-R#CCme!whN|MbMQ_m$otQtTps)Oo^M+XAk zmMkhq8gsWExDCDf)>E)}soWn!@R8N-`xfClqv8i0ji@M_@EM*nZ1xO%CeIvJ*rWPb z=*e@e!!$e0>!g4E)4!%{3+UoR*mF1d6~?Z?xiRki`Zl`f{Lr?)Y|Z9VL2EJ7Auayv zv9ZWPGEEu$#U$U|mXe7I|8mCO@rP+VlSPu5-#T*-Z7mW8O`StL!Xk1#e|8qvIP4aa zL#egT|0IXArm1+!9~wt`m2P$BK6qjAE6KF0%)mm}JSNk#NP%#aU3_`-TjYr3<~Q~l zlx=SHJ>5#gS>CJF+D;0?x{+RrvFDDoF6cD|{=N4^emYS!i6u9S>D$yqS8#()qx6+5 zCfZ!(s5-La<7!YFIDuer%+YBkwS)<-EapZk(qNqn1ws*vPF#eucZft?y~9R zl6-8q$k(&GObxW!IfA4+B)xyyf!mf#SE%vP&`=JV>?au?`3*@D-un}wUmPZv4nEo#``IGg;X?p#!z ztnbK2!z>e9i?5}3#njD4ZdufGNlN`P(^Jmq=sP!~z$M(>KvOOLtK_w%cuU>S)|e=? zTDI4(pr;}z=ftcQR!SeYl^VYxHh*LxvuwgIu-yD>!RqM3+K2K|axO#7#}c;atN*_FXFFlK-ibp$;?BL3 zJWt!>@}0$_&GIO5+Uk4bwXSZzp2or2C9gWMij`&f$Ym%BYQU%3@dgkPJsW=-eSqeq*#IcfX2qFGuOM@O^cG+_U+OmFP4I` zKCuAKu8P^FhN5cRFMKKTO}(P)mpJ>=*~q^!0xf9eoBbc6-UJ%T_YEHx%2*mRDU`9t zR6$nZ%xJUJwElB>+)&b0ixL;lCCck(EOa88?JG>i)OBk>! zT&4X4UlO0vb)anKiGf;PvNj(P;5$6-)>>b}!~ORdG|_A9t?6EO4llz-eLRlg9IsDw zSb5Juk%BDnkQuicRDkUyIm5P%>y>_T#k8ZCZh$_rb{@0x%sM?rU;t*=cQ*UK$Mo-M zAz1(WST%RA3fo=tI~JpBvAFOu^tJF+$Hg%GR-Y8Rou9#6jz+gdMao=y@HqRrO3`(h z(N$^2DLb>Ou39~w-a6VFa{0NugM;}!?qU~nbJ4A=bFbA}?!pg$Gm<>ko>x&225`o? zBOkat7!-c>(O4bnU+-RewM$@Ol+#_Vk#cp$fNtyA8GQ3@^po&mr0hm>npQg5R`)FI zMnYL%BJ3KYf0PVY4ys=G-@qo=L)P40N&n7En{RmF9kX-p zCeJZHZ)w#BucsyPtG`#}VCC%7_xsKraj^K?>nvqiG;r#88|h*V&}y*ZJGlK}ur}_D zNa9MD!vGQ+$Qr^pYLh3PiOS&rO5U(2N!3g%NY4 z#az39T*N`Hld$0bM)B?icII}-Fm0aa1^GfgTL8lDS~WZ<H@{57qok2y(uG(Hqj-eB&6iER#F8DgXgu#P3zHbKVA5ZmpC!rsKuZtjr za(IZGo#k${u6i8w=spkXS~A=J8*yh}YH8XKwMF5|v!?L}KRbZS`G_yp8i47{o; zWXa8Rwf)~1Mc6{tRzu~AA&S9S;fBQ5L+aEa z-IATfvg`zk+{MSnC+#-s=m=k!?%N%*%r5_QkvwLjLXr9EE86@C?P z-EQ<*-wb{Abc_YaW-TlG(Htkdu%=j(6j$HSGxWoDDAuF#-i)Tnb~-v~?hf^F=9K;D zy{+?H#jAD$kI3G;;=Xp)WOHW$?zfcElarJS<{`=cKDNjZJ+bxP;1I0^z z<&J3Rzfetr>!gy86^;1J5$2Zj(Kc>>E>ma0FOquq*OC<LB;zw^UrZ(2d)TPK{;gJ*HxqzG5)rAGd)_9jaf5xjg zl0ZjN;Ta4Slzq`|$e$TI0RaYGzWem$d0E1SDxt|!P zgwSfpzgu-qv%K$_@kINT+Uozt)oOv?O`DXapnpS=_Gak4|L2b(^ZB#OF=(p)=CJbH zCrhr!L>@ zD{hq4PW?r|A>#v}VBb%8w`+wpo9ztz;E&W4Z^hd8ke!$;P}9dX!I0w!g-yT38mo|^ zUA43)TD;kgv2GE)`rotK#Py2$IW5(R`b9-q-!5fd>#>v z23z!1_}0r4c00I64}X@IU-Voc{}*hQXTWb0WCUE<(UvNx%14(j%;kUiRZ&6B9@SjL z$oOIQBv-pEIE>02jxQPQR##7w!o}PF+sfq5j@)&N(MjYoV%_7I%h}-jrg^tUK5@5o zuj{`@&mAV-F3)oFp=O?Lp+)(A%wGJ=pGB8LJIx@Uc4IHw=kNF3$INrDe64V+LX)73 z6aA2YGsoUbA(uYiYBrIaO;CvSH#c#r8~iLg71Y6<38ZGp=2P;1UpiBL6%~el zG(O*|gPoq5mW;!6lG-8`wBSW;RvqkZimavj4&YBwl08RCHglu=otWj3tJNH6>@(Np zj;H|lrE$?Ba}QNYo#rxE?0M#64iX%;^hQ4IRNwPwdfhSXcy;_L^I!{t7{%JkB z&5w-yQ^BjC?hR9u(d3u*P7%hbWN`nQ@?)k0%n|=ZH}Z@kF)rW~WpB~5s)9pvtHy0! z`=GC}f6`ZNLfvy4;Ag7q}~=isN;Iu#f~K3Q}%zR8JQS$idj*U$DCQhJiS*H88* z>eQc6r2Trh1=5_0(m54LKCCeZHV5lA}K7OGJY+53(`6WwjPV!X>nGhts&6WyEsbGcT2i$k;f;3ON?zcJmQ&MseaG=plE z^mhDyw5I(ZP3&6R4OB?M65II87{_`~C<)z5A-W^bQcmN$T>#T?)1_=d$vAGZE%Wat z8tG*aT4g!Ldw1(js6gD0@ofN{k)R;%2;W#Lhe4?PK23gucdksvuei4NujY4A-@(BV zd|UxIYj8vVS(Am-s_72iGW^nv@=$)bH-GueM%l*5UZvrJ#+-TE`w&)fr_K~k7raWC zG;0t<+-TtfUzK#VBjTxaLnnkQ#&w9IpiPQbcq%Q@oj(DSm!6visEy*meW8T9$5$lO zyeM@F#>yQw<7aF%q?t~C4e-ANpuPnPh>r#udZa)d;R#9H{l3(`qH9}CLX3r6IVeMRm z_D;`}j+6Pfc6tC5^S%Z%)opG2RFm0U5%yxwn4mmE&tM>pHx|KqU&D*Z^=XwefS7i) zg_CeF_T+n>TGQo^nOnz6ZM)dWw0TR@Vcws7P4OF!A$wP{WEd-iG(W~5s$~vQ_(am6 zDy!4bj{}K5LE61ib!`iSYWXcVdPbR{M{>9SLM;Vy_yElA$|>CM_56w5`L_M})7{)f zy@=ZIUQiGJmgv{z?Ae_IAk(DCU^kcRz&g1qjRqK}{GVO!1$dMM3b~du#MgN@fv-`8 zr}rO+t%|-scH~Hwt)+g@enGm1^T6b9-Fp{u7g(zwT9>==J@>wqBuUZ_NY-nT6w}YS z^`#d;C0rorbi0$9)!;AfYh6C3`1DDl5#T3OXMg8I#BA3pbVRkk7BzgY&d(N$m>J7x za+thsZ-L@JEFt|MJU|kmN^pkXDTc$D*F`+!RYDBtIY((lhBpo~GHi%96=J*2F40O2(L{+xBKW)>1^V#4eDL*=s*!KT%ZYdQS2;G zq~x?ew8%q)eeVm_f;Oh->c`Dqn=?PO(bgQQu3$|t(^3K=bFPxZL4V06Z&V8r z2wDB23{=cmLe@rk55_ci+rB3QAJIM&Gw?^NpZ#0{{^cpJ8oiF}@f0%}g{lhowf98V z88-h?48xJAic9fiwt#D)dpkm#8!j?J*2+MoScdBEr<*NH%RQ#@dHt_wv@y}ccu_NN zs2^64KRW)f*K_-K?hQrwSkDgeB}Jj; zo}n#`OmEdFOKet$mJwgZfKG+9x_o+27?2{0K1&dsX=8OnLOW7z)B(|)P4FlJsP*t{ zn?uMVLfPMPP3}zB70Ya<3a z_$q}VkJhKJX^2+i{PE;hqQFYH6h@m76; z1?N1Pxh+mU#?oXZ!bBzkyHN*>5uuUgBh7J>iqno6D(#~3nzn1Mrd#uQzPrbp{w3&# ztM?=9M(<<*`a1_Da|g?Q<9|dGxd0VW5k2-qC+5Py@l$f>wA{&RAAx@)Y_T4o76d=B0!0`ZslI;Bg!5Alz}?$tv`oF0KXYw_nX zse#Sz*59rQo>u{8YZMM4ZN(9+NLDH0RwG0It9x~rAY56~RrQ0L{&XB7I1=)jA9fRz z8R@dF7Dx4w(tc>8;86TEZR^^XXTq?MweYz6V^5F@Tqqi+;)4RWh@chhdG)?wcEq~H z=^8kz{f{3g{@Xn$mvnyCbwL6aVpiQjrcBaJVFwTb;GCQ$f_^miVdwZD@%x(gYqafm z1+($xv+L}Q?`?UT1P_rm@_CWmM(rx_ia`6!F#XE@>}V+@C`ykzQM6|DphGY}QaI3F zeLJeOOq6zgT+dGx5g-U9-)Cm|)OKVC+Vi|EY3%4lG4tIbemd$N$nRN^Uyk1o!bXsn z60rqpc;*q^e9w=F?O+1ZOvKwmLU+e<(js<-a;a z8qD1Hmp^jVpFJ@io9CLn+_~*{?7f=q>QlQWb1P2#3r?*<*c@g-V(`zxt_XDgx_nM% z5n;xormaPF5(x+Vz*>6%M5~5_kD8(_)L(qO&xIq11bZr(p(_`yt>1{UpEk( z7l}^Xka4?8W3^cbpYAk_*eFYb(3x}DWR$KR-7JC=qXAA;_@R0?fjf=frWz>rb0Q%+ zpH`*(VPuI)EOy;oU}FW-m;YmDOb$w}omqE>!mmfL8n74TUizX3&`owFE5Gwx=@Vq+ zQ_PtzyRas&QpwYRga#tqfMJCm_J7qkp*g#V{)`Bi_KW1B4mX-J@6@lpNsDZ;7|-cv z=>w_s5*`H+-8*@~kq$;E#k=sde3@$oMQ)zYK#!M^%JW^YYa z>A1|fg~SH(;k#c-yS+2Y&EF1cP##n(%Ct=t&fY9CTb|m>uaN&ykQTx?($G+Muun4& zMDf3B5>e|ymR`lWgeN+&VCL{t#1guC`iYnWfU*MRcyVWV>2 zNv5n2P_X%Nm?i>0t^kYANX$w6l-T!vi#13)Ct+fd77yXmYFDXeIRw`Y$;Rc)33nWl z9;Ef6{EIs3Q>IxE>t^m|&-J@GdCZcVdERdH>7V2m`FGvxr9D1WJC@7S{DLJjz*%|VUmZcQuG0q80G zurF#BeQ^oZaj^YgX1CCHu%v;ter@r2kBv%n%W(U6@xjL7eB%3hFlYZ`=aIgH@{Y}5 z5^=Q`AK({a!33T!C{O{eWRA3au6HJW{yik|Ng^U~O(!Mor(|JxmuInB)2E81K0Z!% zEJ_>CFPTy+ehtjp4t@BPLImE=zZvWMD=86+PzxVK(QtV(BE*<4{)4CxoovE%cQ2|% zqF9XfY5_HH3U;Cs@|Gh0QVm%vijB}gwOXV`s*qr#4?n#8GX_(etue;XADV(HJk=e& zBt0k<(q!fd6&E(xTXHsm*a$doScQo~ zFp|?;RgwE5(DN!ZT)lZbC!y^L@8}u6+q{~?jW~*HZJ1%GPR0?2)qYS+?uKySc5 zEDyn}nPP9tkU)HtLQH-abvS#UIGTohi0(<}Y4bF}IZ6iwTk1U9(}NwVIE31*+nND= zTO$KF3C<DBSltdC zoa}*+*ss>>d^M-?{DF0ejb`{_%qXzF3Mc*CL0`x@8p0C)Yv2ck@<2MzHdv1(ehW;q z@|$e0kaUa^{5(I{uiUx=7sP86;g}D!P}1A2!<*Q7k&OnHqE-v7YMh=c9oB}y5!WcW ziQ1~FbS@dP9K!q0HbOnuaJOpvXYI9IqMPTF4^E}Zy3p}XJ(}$xsZyZRiT_-xm-h{X)A&<*P$-f1D4MO1p}q-Z@V-intFKX7TyM~L zeXl$M=``-m7z*+{dfavOO>wPKN<-{Z_|$_`r}mNXl{du#<)epvZPu>Z6u_%&--ra+ zVOm@y;@SB$rK!@3dItCb{nv&-El$J^im%k~t`jeZnD;dp^D1bU>ps-cbNYz0N|IVN_7*XZUrnehxL`CSECoyE6aCX-xYvQ1}c5*&23zNxj>v;c)l4+vsd+)0VX@+asn_sc9m93y( z=<&fd8M7xf(OL46dD<#W=g2zG^|?-}T2pYGBv|S^$6QOb`6L`Su7>P|B=!|HZaW;z zlNa{B1MAtkfj?eV6`h}S94D(t$&_vG=<(GJyp+M0yX z-4nzDNO>HSU~QLZn`kssFM^w;iC=efEK{ysnn-~Uwmfce6fd=I#cs`}?_&)#8MSEW|AO+wAZL<1Y_(vH>pls$wz|*fgoss5SAnezBWh; zBH=UfHw7!P@-r@@J3S~s{93KCDC{BpX8jYoZgn60u^UQPIZ-%_K@snXtdk?{Cfgf} zB`pG?E00apgVl|qUV}nYd+C}xiZcUmgcnE1s78)L9Ptmjhd-!*kYjR>zWf#Iqrs@N zO8RWrK+S*hZjK8X&WUQgRE?9pkA<~Cr^CS>rd;(H2RzLYQ90Oj3sHuP(B4hXxf_dq z;7VWKbVlrj)lqlAq~Ks0u`p4_|56nLROJX^fT>eq&Ln@+Ay3kNRMmLBXI+Oti(2|G z*1av^weZ0Ab0u>fZFG@2q`OR;-c-4Ob9BJy!;IVuaf%K_+i#D?wz4|u#iz-!KZ#K` zP1yeXHORyk2=g7ibB12_R&5$FB9N63HyS>04uPxahiCcqU$y@Ev=XxF=A_jJWbeCd z_~C?qz8LXrkv*<|aGakp?$E=3#v0#lIHA@sIG-x8WL*-_`ZB!m#r{7%qW8P+N98<= zZ#~lx)xVH1zcG9_*f!F>a}Iw8G5P)s#~6&Q{uavWx2y`>ybL8h)PMHy$B=lUAf$=% zfZdi3)34_>klq;6{oSl%`BWYSn8vP25o{m4Q1^bwl7xAy`}Sp;i?h}E#KwpfqG;){ zK)-j2iVex49u0T1Bq=E3QRGc;a?w}OrX@qZC@@QV?b8D`_U)T<1?vi}&_BcT*P^z% zasM`4B~JBmK7&oq-b0#)leW6E9P2;c+dNy@2*e`L_5@!62k*#wPXPB^4>fwGbv-aG zg#~lUX}mZq55n4if@6ty8Z1lOem?shVFe>K2qg9WmR~!nY56=N0oT_s_QFqrD4K<< zT-vF0T@nbe8wfbNc5R8D`coLQ2wO^+6GshJnGDFX0>WTs5NBUJh`YIAK3L2z&Zej2vfp5w zS0~$}qbu9ZI@%MT@TsS|_-%8577_@wccdTZFB5sS-pXYo#zcmIs zJC-AkC|h!>wsWJybmqkneJ}$&Czz1-t7wB0gquT*U#mZPv4S_#Cs-93EQ}1l0VCn%vVmyq*4wzv(D8xaAasxmMF#r|G+pjg*~JQB z$jK(Vz|=Tk#9vPEA!5f^F;PM3-8!z@7oE*Fdxh&Y-*!PaC9(K6fs=&IReRp>%^m)40 zy}y>P)lBgmM@Za!<`06O;C;UeOJ68K21}$!@@T1(Zn%<p2!|<^ISi|6W24# znQpj(Bc@^{qywKwO4r{2&C{U_AoYBiua+fDvBh%y3@>r>GSoM$JFr4G^=#@NHEchJv|W+q=Ii zv~5-cQAhM=bz3)j&dDZ0L9*5`LxexpHpO>iLA)aE+2d!#YY17R>Sr<=G#cWAN`gcs&P;@ zn_i6&&14$Lvb@sE1RVx5g+SMw1aisX;u)}yNkdMJS66V;F7N-`4STqX^VG#3s5K9N znOYeuec^V}`o7(Z7FW2IKb)E+<^9}wG8wb$)MAnp;BRJWHWfM~3&4eAw@QN!wm&=1L7Hb2#F~{%Vf9Eq?b7V+3_ogsmZw zSyB66BO)D0_M=tDEq%VypIRaBvsRZi?8`j5QxuhQ!nJfStHQHt$;8)&al%G{^V$V- z4%T0~Db*4WIg|A#4u6bz9YhhoqT0l+&Ok}G*~XDl@5El>djcU`xTD!Y03ii&K@h{Z z6!ZL1vpkgGjOXh`%}2G*A-rqFuk^DuO9lvGyrqGIu?!tF;v?0;`KIsfD0?Ox$$FBo z)#b@92~GTT=mR^7ovREx5u=HC@HCPQ1grK|zPHjZLoIBD2z`G!UqW4hZKs6p39 zUcp8D+zs~Ytn0Y8?tWn8f@*nds7^w|+FnXwfR}vKcSuB`2kANP?FsTMVml6OPz}}r zW13FY#&N44prruIPAR~Y`V>$F>uuJey!Huc=tpd%N~!yQt0tb5<&}bU%G^z~e?o37 z5SjL8*8F*a3S#{9(TTVeM_gpud9~4DP#k7oj^eOj9J@b@{#?OSO;WDf{?lc}8p^kK zP>L`*;M*OVwaFNzTOEjc>?{5S{d5l6Y;@ki4{5~*_`XZG2{FC*{-8f$OEZ-Q{cZTn z<$=L!Fc)b`-jjms{Y$^0j>@icJNGH6=uWB6(rbV;_h{H?Y=et8WBKk0k$c-DCwm5t zY^6P1^mn`N@&2Xk#Qa+s1#{>2ub$|BN}-1{)HY2vt*y3soq`MUTr&!kdpZCEy6N3t z2<$n)rLJ!4Y#R&9!P*U7?K=;bc264a35j3smEAW#G2v~xCH&6NUzy_l)_W)ElASRL zt=Ob;$Dk>AJYS&?`#3Q@_j?=Da4!*^oG)Dc+j#1d%R6~=j;hPMp25%iX)B0lJEzW3 zWj!u@^|IP#Jf<|psup_;#aCtmwfX0&Kj21Qo*OhvESr^yDx%lz3j_4e%9-ZW6*IzipraFAIrTR4d# z=DrB1d`-_KTM1a~f7Q=$JIGl{I+p7kMIf)JMy5^Rl1oYrfIfCNcJMh< z@$#(dMm~*=ZBUD6b6C2}hdn>6(&8x_pHC6b3#%)9!z@h?Pa)f~ub`wS@YA&l#)WS9 z@m2YIPnwhfb#>in* zNQ;sI^+r?fiv%AC5^SF9!l8Bo?ocp_i?m)8x|8!v9FZFSu+fR0C-(V`3UW@|Yq>tP z3fF=Z+C5SEW{F@^H|9FenmL}jb2)FK-cx*^)HV2`%m1cNHBd+#TP)kvf6sU>9KuI! z=#U@w+|Caz#xkKr%+ITJQpoi+i(cFcik-CdLTh;76p8VIGA5LqCJ$nEl`Kg^5^Wr1 zOSI+heukl4{=HVvVb4f6dOdHO0GYxhg)Uv+8$sXzkzO0S&gbWKzaH7(!J-{_&Q zu|XB8GA)Emss@w(2qC-a-Cu{B(|&&yoy|yEGX`1`D7ZNxEUR!TVN)R+YER_3pf{Bo7#)a)@`v zbqaja1LwZT+ai29DzHz=doK*e56+LZ%d>l&@4T1YaL&YUpz>#CP!~v*T|F$|e($57 z!WM9Qqaj+}%7$I8lkGuCr~i$uD~IHPX?gcwtyI6S&XuqEmk&>c8yQ8(E85^^-D;R` zW^697v84xxWi~$-xFg+KlH9MCFL7?+^<={X=@n@ZYAbJ+&uu>}0cB*ST!w024U7i? z?!eK$6N+|Av|kg0tXEJ8@#A0#w$5%uj|V2kVUMj?VB9VLx(D@`X?N0L)~6v)fR}2l zx;`M9{X~XTIa6z`#`%F5i=B^use{7f9`Y1;f|}G3!ee$rs!iN^SYi^TLw+ptuMPsP znr#0Y+gEyz7g{qc0K-D2KVuaeQH-y0wOeAOawl$r;R0=0$JRG_!p>az* zo`fDP+f9?d;5`v|{Zec)7>F~K;r8m1o$myoniFa$zfyUA_+J!gEM+Naz7_2dSx1-X z>_xTa;v;h;leRvTx)J`o;j8%}FMB;COXEn2OOJLGe^t*SRh0Jc7+b*vC z@bHJGb^LE-NYM>jfr%UF)e|`i(YM0no=mvOm1j9gsS|UFe2f*MGBuc@8JIv;Ie9vJ zwU3_lLMy@i{4{>^aLCie-WCH|L78IjA<|oZj@l5x{L}xT?kl26L#l>PkiZX<9 zo1f`FXsJU#I%jd;iM{-7*-LfS_j$aj^VhBXBba@{p+~dlejYzy~+kw0Ivk5GspnF2l~f1)j5;>u>jXt?Bq{)WW{-1e0gfqRv2Khwh> z)$SgKYcJJO1S|-7t5;_w46Wo^#3>wdg2V{OHwa8DL*l;v^Rg!jHB#=(EL8k14JPYf z>vAO}?yjt-B`zF~x$vaoZsl zqKn*!l8Ar@hd#*f_SIa1Iz6yp@?k_#-|U;mO!c5PT$ugJWj^X80c_utxUJ=vZs~9G zF0?D70A}XShYg`LDdav$veK>I;yS!n;6enq(3(nOFUqgw^09i}-YmF%^5HL+p@3OW zmr4tF{f#;}HCx91&&K(ihvyq|m+iGr2mI=B4j|SQf^AHT!5hjHzh{y53SzaDJIA5q z(ql$$hinA#v-?G7ABd*h0G@@)lPM&E9GAocKq;Pnx#rSAJY6oKYShwZW6OV|(oP|a z{0eEr9Q+Z+zkQh2W{IqIZ&8c;8~RI5{De3sdvfV=+4aP&M@8Fr@XCLM%N8<^&=lKd zALV2E`LC5u&(bs(jG|O0?`}ALTdce=T5(POYbv71k^^6|E`#p#PhPoeO1CBZ6kZ1 zTqeJ%ZFpze3(=xPy7~&QAIjbSR27|~fcuTGvWSz{nD;O4Z&uzvF=W+VH?WbmY#P@|eSf;@2Mz{}4VWngno225jrX%d}hT22pq=GM@d z+;|OK+P-L0v2|`F&K8B-t_|ud^ZU?f+%Dj?7rt}-?T`Hg!$KFwHmD%?kk0osOm&>P zHCY|OF`M9&Ov$sswWric$@ML46c^N|umOme zDJ(0()j?@{5fQUQ$$cUCDMi08KM-c8Wi$pu9_n~-F)A$?#AQGiaBk9uEC|f>4bFu< zshOdjSwF*<&V6oj6jqJm=N5aQm?XD>T{A@WPd3faGNLX+gRYN0F$7OeAFzju2v>s- z`F9*@5_~w8?pAtzNiA<>z#9r6?T@k-LfB>|u7qIG^Tkunm7}U_{05 z9Ad8@bW@K-un?pk7%+`<`SHWal!;ZD9ueSAgyO>BD1BL=74TJXuI{ zc9Hh_>kb0744s9BX#UabtsvB2>ATk2N$t;RG}eUX4y!b(AodFH0lcE~y%6BRsyF7= z{DGx#`K84+L-EuuX~@$XJ*Jh=(50`dr~$$UY|`dp|8X^{54HonMt3paO{%%MLx{-VRc8) z$zu6f_Tr;>rn8+8PSoMleYf0YZrvk^A2a_i1D+O}W1Q8l4dNJ(#cS^9V}tTJSR?2Y`E zzcROD((hw!E1@?X-<|mDnm$YJE&cf4i5ECPoCbxLl;mM)nm~Z%cU^ATpr_ zDl||}qqfff3iJUn0slPdCnR0)W^E+sj1pWf5_`XUY(>{s8K zP(M7iy0 zxs}YtRNSD!f!5@nN`))+H>toz-@|t0GekSJViMofis^#2J&NQVYC#Q0!!Tj0b*)B)tOoOE|tU6icui ztO1E}3sqzB$33+l-PR{2)F;NLr(pHL^Ag2HsICsfhQk`gS$7@;-asqd)Q6o))4$x(x+P~;##$gA!Tt^RLYN@ zY!rKu+94KX(Sgf20Hf$dkEooS!-BQ5Bf`Esyz8p!p~sp1pLl7aAz)G5zE2Tw@qGvfvV)_6D9@VtQf7ANoa{e5GHFJxEx$p zxG35JhD@VxvvH*Y1Y^C9y01RH@4^E{<1p{!U$SG;>Z@ZIJg6tTaCtrD@ao7=ygba-^?-r6%Nprr8g zS*w$0%c3PC_4mj~WjJ}aV*U?l+sUFTS#@%4R}Vfgc*ByfP0ycSUIRBj zQl9#w^XI$1xhP{Fr|0>DmG%6j0?L6;uglbVqpHZyA;u2Qg$$ZfU1@3m)u2^6#yzph6HMb}R zxAqi9x(G?8;5gW!+TT;O4m@!M_jpMg?8#}o5*sW{W?+5~Id&Dy<%t*63PX&k(U*@5 z)XB%z{t;Z3MTnzb*>`9Q`-4HtL;$sSJ0xu zT6Qx*S9kn3S0MtBvsCG53GQH(fup6;yLDk&4Pae4N^nfFlpI?=X%Dhm10tslAKmww zL-azR8R_z>Ygf?snm=xAYmmI2 zyBlM*a(;XC*YGeG=meu}&TV4%XBN_hfkM41-KyadAUs|QZI5=jFqoYDbb8_bE1~Um zZGpnCOGf>QZc+(K;W^{{F1epTF22rPz1-HR8uB&X6D(R+&ERXfAVP8h8h-;yj| zuc(wx!9n6cR3s=Zd2CupX&h#!N5WOxS-9M4v=buJgp#|+_DEedOjT%?KtO~We|RiH z!l;Z`7~uI5Oi{WjtLv3M@~3m#ZA%vaL?Y~k#WP)1G33bv_owi-vE{RmJV;xBdJLry zyXLTKWX?EyA;l4-gN-Wt8{bq@LsmD_xC{h_1|)?E!`ibQNRWSs#ascI8utU!evAon zLolK<%Y#D$_ahW>g4%tpBbVn@2o z*4G?3Ez~cCU-?{Q;Jie(y@#onoSP7Gud89NAm3Ws!uMbz6ps`Jic)~tsus;XU5n76 z_hj|f{RG`rKcC~!b${IY(nPPvKx^Tsc)+tkzu(!?B^3d+Ne*4W%H8&tw^FVEN2;j) zsk|B=N1f+eY6kIfH$+99V?}K=7!Kk5$z6l_3mrj0_8^u3(yCgINO#to0*vE~N1GAT z7F=UQ2ZY+44~)am*(gC@|#HI}B+YDxNel12-qaH-@NVa;$h z>Fs1m5zH`h62=FnC}vvKGqqxcXBE}LK~7Z|C&Te$X#BL=j8(xXiWS=NDe8G5F7*KS zwrvUvu~p*xrc27@j>yNMI0+d?!G&vJ%}VGJfRzGX(#0U)Q%p^+(S%%ZuKkyrXi7fo zMKyNDA7O%5RL^{OTRREu7*N6c72$|Rh=AgWC%ieby?197vi_wdmXeO)sM#?S$0WIw zUes_P|`SSxuhd$jkD#~NZO=MX_@8p;0@}N69x2@XOyzqSXFd-l2N(mM6 zS!ePt$Vy}8rE{!&ZX?>XMeHPd0VKWSj~z@kbX_|0uh&+Vi`^=X3*|g1FE(2ChwmKk zAhFgt>3q4njZyl(f`Pey0{$nxZ6JQ*y6MP0(KBmtWluFl+m-eb(9}NTnUtvB0Dnmv zfuBv+7~|xpZUd}g;ah(Lw#A*<%6ezq@Is1vZ_1eu^L?%SKWVgjvQG>=*9SD|v7Y!m z8AeN_vy(D^>d<63sY|}IXV+yk{{J36hv3%`{Tg#LVqf^EQq4kHigYCkFBg{t@r~If z@?SV>Jsy9?bv*tp#>m4UL<3qw6@cmY-I~Th(kac0J8yLKLv*G?bZlWD_2pSTyDl~x z2hlY{$H-Z$;&eX&FVhf{HE+@aKE{G=nQ(!z^JMv6<&a;`K|j#Gv-ZsjJt$oR`Z8~= zQc|}lNkQ`{fo0BKR`bBN>rG7VqQpN^e(RDgK__Qhcpl3%!+`IuzEcUJO-yL|;LGvC z8LULeA%Y=%!(UtmfwgK#mzbAb$tZJ+(4-#j)ut~4U$M-~wdq?VHwNP?Hg8!{w!IPC zO;wrYO_wLahO$bqG!yV*QutLS(ukL|gy{8iA~}OMU+m|xmf>TcL=fQ|S&gOVeveE2x;cz=rK4)fE@m%&7Ejo%Xr;ayJ!N{j(%AnXZ&>EHz)GD zzd#oe#)>S|trot*`21b@R|!*kF$wuPcBOkVf3TuohWc3Gd4tl76Q7^7OW7GvzviU2 zjEo20L-+_SPf_EYMbPz_#p$8e=8I6~si@Q#4ouQYk@gN~O>-;B{Fh6}7J}7#eefEB zve4}HB5mauq3i1Rw#G}_+9KSVGcgfm>cCUY#DXgBk;`k(dsDNV#n-=MV7+ts?P6JV zB}(2(BYlXBD$4MQ*Nnxd=3H!RpxViEx@sPDT$b&6`-C(yj-ndUS#ion_Oo#FI+ozPZy60DJ!@PRX_@3G=fljUm{|juT=za zBa5n+XwyOn?xWaKq^qYEPG1V^1I}M!`OxfwV2}dSG$Rk^KAsPzba1c>x|1-nA%X3e z@W?S(WH3HM6XE@Lsd!DtBg3(|xfV*o&l0rE2R>=ObAWT_nJk`CIoi~Boj2lE6dQ#b8S;!G0Brvi5=d(D*XR>1?`N|Q-EZ8bowvJYFp~S8 zttEImyvgXUwP@?pkPGV-SE^q?MNUCy(t1`*2g~&+*oJ>UXm+WH^*(PXS{`c2@w4y3 zT{OVI9&;s{vn*$$+_HBqcIpQGN0f>i4Ud;JZlHhsW^mv}tzpiAxUlna5}%_1BI$Zq zYq`_Jr4?n#Lq;KcN=xIfjWNPw^m4FidFabeQ2Pd%p|hlG{zv(?#5+_nX;?8{Mqi-^ z|4VT;4jd{ScFO8For;q3Gqhhe;t7Y4>^)s46%_@~c#%{L7ro`Eh%F;hY*7|$UP?o!My9vI=m4iwsW0yjLh0_|0 z!8AezwD3=nH6HqK`C8yc6g9rQMG)kSk_rv$K;|Y4X!qf(%s&cYkt|s&ri@arc=-Z9 zONWBswTUPjPhxC3Kcw+@+FDydN{*=gumax>NE{|r%9T8bkexUY7XKQQ`#3ZO!kRAO z)KSEVlC`%L(}hrnyrTp-QnTe;^o_}F%a-q6rBDc&p#*Wv7;o_JO&Ytx482C$Of-fp zLV-4gLw)Qp$~O)qE2MZQRg_~y|E$=Gz-(_yc95@o$9T_*zx)gj>JBTJp5c?$UVi4G zzeUHA|7^DIjqf#HeXofv=kPML)G|(~f z!bIRSFOUdVYT{2Q<1nitofSgXXt)Y0UQlBwLs-(*0JgE5V4`KD2a<*J9W_Ze90Fmx z*rW4ej!om}mmvWGfdHxx)DwrOuYwIuF^ zhh5u=mg`QVWk3xpsEM>to_wCtsM0ocQ+Qh*k5^OpI?4dkIBzcl5t=8wejGZYwg#%- zbh4sFsDsjr5Fzl_zhsYRwCT=ex0)cR?T!_@Aob8BEof5qVH2<5;hyPv9jCS^H-;#5 z`LqatVywX7tM+1n)BH%xhA&RN!6ZS6`;eB3Q_Vgzh6!Y*Lkv6{{oGZdG}P+b#yU4h zh;c-^1O(h<9Hl}{@&!Ae*2>Wr_zLAWCZ4hdC>o&dnCLN;t%c!c#8TQRr=svvH%zsR zTF`AuvnlDCMQWfFk3S0(Txm=WisFDP{>3M{gH<=N>4dF(#83NuMhmYM!qdN@h?0C_ zru^`iQJYg|qiabI`W|=^g>h1n>{l)23YAm(CwaHQ*L(IkTcW1_XsJDyT^6VKwbEPz z?7;QUm6$Q}`MBMitG_z)VaY4v->|n&-29ktgWP^q3<38d<_CAFnkc(VoB-n_Xckld zCo=k6H-1eX@0mypFY?E`BQk6JH6{E4Bm0-}P*g{ba%P%Qd>8Y^pf5>EL?88Kk6u9Vug^)XCYRCC}^5$|>*%cU_W+Ukue$ z$6zNH>rB5YPMaJu+P!0Iv0&pF{{iH^E!?!`Hai7x0`GFvWc5&vmHCl5$mV(DQN~03 zi3Ak!MS5&}ge-rZrzP)NYZfZfd}BSX)c8Bb7*rG2X}yR;FHHeo@?b+!)>Ugo{$j|7 zqMHi>O}vvE`mV#xb|nD~Q9u*_&gXa^XH!?xa!?}DKXlGbjC|3L|@A1u+ zygf2@eslfQ?e_B@5tkeluCP{gG`FQUXueJ)x_uN?1r1Ey{IN6>?^oJ zjr*55ApWHh%On9LjPd@c0M2h7w(#4Xc@E&S0ahk&P$2$IJkB<-Cgr3GG|iAa{Y0Y- ziGXNZ40fovJ>}a2EusE0V5uun*QA0hFVdB8s4sVeP+Mdm+f!KA$h=n46MP|9nHY)A z!`6Nl7`mDsoC_;GgnfT-9(Iz0+P4pKgIN~zqH!~4X*OJ{)mQ^=^D zyS2(<1iOa}o;U$6+5cKLD61*$J!Z4*^gHfQgGb6d<#5L}{hy#nXrI3FYtg3b6Hjqb zo2QU9H?K-_RfgvW#0pSRsuGeI+eX_*Siq z9Q<%UQyfYOcoiF*ubB2H{o5I2qRl_A9tUkW2E7mvp%4oM-EQ-Xy@S+6mC$_sJ*~WP z8n8(?){1n)%%=ber$K?AS3`9_2CfJ0-KgLr7XpI*`}a<`n9BDDMlD8|wAVL*vZw+9 zrTuc1a*c9pRwo`cxQ5oYNJ9+YMVx`gQ4}5;B*T$)sCcK)7+HXmn@?K`f71^pM<#va zNr{Xi*mZ!Yxsc+5m1n%DiM(OWTC+=n7qvY;mfO@?6xrS^h> zYbuD6Ch#MZrp*-jc4T|X^um$u?UNHYXIL#P;sY_h6*_|Iv~?C&^6jr6?y=Ce|cP9P6Hd z7}Oa)Ezuu<;!_-Y#Hhlr?e8dvBgJ8BkKQP{x3w8P2(NAPhxJ58bD#H*`~?~y6q*gG z0DPpB0JOo_AKfcIB}0BUH=TlRWSb^mnN+Y3h4mboe0$Cqv?54=Y&^xOzk|5FnO)gW zU68($5s?l!44*=3hSvr>W44@4ei;l~15X{B#4Xf__G`cL2qCdd9)>FGHB#Xn1er|y zSb!>xawGk0{DLaps}B=;`ousMHWLsSMy;abXKK7W11m9qJYX#biGG_WcewTZUlv^f zv22YLS$riyu#10+vi3wdDbri4DGDV1PK)-PWWPG(WFEUYnE_fQxV74)2Q-Vhct<(u zlDEFazAbA((~sbaV_vhUYOFz~mHE&w73UO(k@)mf6iDO)Kts*Fn-U1&`QLZt-zmPO zVeSnVzzE4JS8P=Z`=|7MVba8{RwcXGYfBI+to`yJf9vTXGPfRCZi*zJ-u@5-e7C86 z;D|yu$TAO-#qF+gjMLdTT)WAnDLklsKXvWcq2K`_Bx3td=26mF(3hXl5Oq-yIt=sC zN&$3XuDz-5Nh(ty&@%nQVrouRg`@}3CeIm@8Dhi_DLrKYU}t?BRr-fqn#H>^9p%<8 z^94l|F=@jlOJdXAA?P)o%1N+gG%*);73b&k6Kd6cAKgRC^a<0THWKVSU`r~`Nrl(P z*TYsMVQWR8l0tKof3SF(``SmJ@q55Ouy)~sns~G&ZlVPC3JFh0CKlibuUmW@Nv6*H zV3I(6c{Av6>w{a-K%{XM5#lz_G}2ihDzlr&~iZC^qbpW=3t1 z3WYm}qcdK<1m(ywG5HkP-$!^Uef`1!xgRH&~u)~~u`uNc{CrwlBC*QHNZk}u6Jsm8U%(E{9Rf=C2Yk}nCxkin@>w}l#jZDSkH z4416U6BTDbAeWU&uQ}xSzv3bA{{kX27thGe;sIG%Z521awSDW7E7ED=dOrc)e+EfG zSlt_nYI+<-db}VcyU?~=JPeatUyEoQ>(f2)eoNm$Uv4QyR@3dcIx@A_vkyNlAh0IS zZF39ho#;yWyZL)(>lMT*Ulj z5l7S}r?4pwFU!$1Q&>xbKMVmTogQ>LH)%z(R>GM8hr;KBzr|s#s$n>NTmWaKt>z%sLsxJp$H;-5+jV!{a4thwCwH zPe?YvD7U>kn9>Ul9QME5h9#J<)J?qyo?z1@ypvvWBn>qE26JNbr&165qIEe1Wal}y zqoPoeGHzC$)26YY@8FBL=W)&ZRBj1Lev-ws{gw!>nQjuH`Y654ivg9BuDt-bRLj;= zdK&r`hgVQUxwLgq`2}Wro@km_;5&%(M@_XBEtH0&0x%@&-ew|+yHXBDQH720DGdj4 zF=a$boD;~s-tL}&6HHfGChExDKYxqg!XoIFbxME_x3Ep{$JX-a&aXV*qzFXlK)}<*~Q-d zjhl>1u~^8H18zOMID+AeOd-*BfmPYfepn6^;=K*QRc6B4n>0XO{5Ckd9Et7|))p3% zeG1-{C24?|xzt`uV!4|$UW8wrak|J$}L~zARkDfOw zY)_k+wLcgtk8$`Gywcz%irjsZF5#a^^3gsM8$e50&y>8iSYfEB))KA=E)Q7$^~B7h zVXl0lAcYvsxva$6RmZ&dc}#L@qk_htJeM~YB_SJ&LOv(8wuzaN(c{wVi;h>qf3D@kbHpxC(m zwa6z9oa?c)n*i%h>C>W1maoiDB2$r2)RccS@U$e)OfUq_~nBC;K9ih7q+t+<2)ilGHDNe z0X4L*4Ae`=|j130@oBErZb(sw% z54X1T>6>F$ovK`Kmt)2o2u^QPw5~$a4jX>N`|fRWE|&w$blwgj224!7;MNU{nQ@6jrHMjBMV3tk!QS>p*pEXZWXL zND5Zg21eKjL+~RL>$;z#ronCK#{}gQAmi5vc3^+FY@rsU;U6)S=at7U5I50SA#|S_ z=)>e7Zq&|?&EpitpzOnT!W+>BA z1#J0qytK;C-75oV*I`xpKIlGUqJHCRyp8N=7IB<;iIw2lJoS_QKNty^{_p@!$L91_ zSay`$hkm|1;{$)F#X2Xqht!|K)9(6UJj9J-7_GEl>boBfZvgXdS{m2+j#!c&2+gsZ zwYKKQT*kMeZaxAgaK_8b6^hVOU?4xHo~jqf$%sp(W!$8_uh-GLt{2^=h(1kd8kxR7 zCv!o_Y1=Rx-m3SY=B5w%Q7Djq;ed35Z5vvG^jtUmqT0e6IlS%Xd~qpby$9q+m+{f* z5;~wMQP5^|tMmu;1(Q?`&=N}U?t;G7tpwvB(TgMjDSe}GoL|Frgxi}I z7K)a3<&{m<(w(kT$cN+;(I`$t(X1rrpPR7B1eSE{mEc?71mj^ncYyv=P?-x5^a2m^ zB=y{KJk;3*;uysX4OWP8TLayVwj)+di%e=60HVHKJoKsI6gTK?sZVGg>I^Fj8WB!x+|s z`c8RVLmXGbuL1J-V!8_+WD1_#qZ-&woNqPfQval%F@B$9A-|QiHgv4cw-3B1gN%3T zg%l_G!fgVtRJYB2Z0o(PPvEs-ob$AuINX|ejXgkNOpn1aQ*m)WF^h0S6?73{VbB+KPl%>nQ43hkF`mZK47r1=cOqqu}D593FtVnjYFA&T1r=H9wmcjCBgy4rSR{wAi-2R@l?3bTh?KM3M%iJYvf7 zR1$i-?~Uw@-hYBSF)H9;LVNAEJ@dm1=OXPOiQC+ZTEtKInVXvWMnUcG3($SCh^a4Z zVumJ+(A=Sz=C|?GsO4cI1Jr*GH$$mh`$Cn7*^Ok45e>&m?Ss44lg^dr+70O4ud#aI7WP? z!Ui@B=u!a}R5msM#T`H8IW5=)B9=EE!afGS3iu1xg!V*gs9b|BfGC2*az6sybGg5; z1tcsj9ETSE@rPMy6#PH9h6xKr+bRy1n(XXDYP|pvod&zcH;w$w@ZuQpHEvf6&v<#o z;g{FJ3hzc>U$7-^7j(G;{U5G>-yM?0t7Ha$Ea;VhG@QubJ;{;wHV#1vesvw{_h}h``>f{L~PAJ}7M}`MLyk%~BO9 z{%lLls%|=XGa2-I&CGZDWg-eWLr62jvN3E|$|3jK4WK_QO^g4C1ZNop@ z^n}{EAAzd)=}&=*L7N<#sjKgq1&LYrcH{J$Ji>T39YE_wXM5LT#-25#(O?n=)5$w+ zfC8peF%HL?Z9nhqSvB@fOOSmrWZy4-_5Ps4r5bt!@jYhhL+`#;uQ?JYZ0wSU&X`*G zeKJsZ@rEXh;@=f0XLkq|>;KE)OUfgNb4XhqqTb{_*$*L!9N8IXv(8CG9)>Jicp~FGeLPsNX5L|G94EHCPiL!Gpc& zVN30jUe0b)&?A!yHyb6AB9Z4SzpC!1)0Vct?V6EEvHZt)JUZ3%#(yo ztnN$A1(Vnz6!DAVJ}4$K4h`xDoCC=hf-AgeUa6Vv&hgz&T^64{pJctcwQS3szM-iHTv;BPudLKpW3L0X~q<#XA5p>XWiEsR_ zHfZ|eQu!(LspaZ+YcxA-Co2vHCBB8a-J46}QXPHTE32Q(W-_*75E#2o^r3!ngmJQ8?ek`);9Ac-A7mj#PLqS>fTceLs|xM zK6_C+kjUA?Q7(8pllSjX$CvTht(P`-`4fDL*lgq$e9T;b%#XC6m5-*aOB1HYh z9uyadX;(f7YO8TnKJFnDElb=4G>LL3nm*wq6D*3gvLXs~?H#F3zPNWP}aUJcsoqUa#ATnlEcL_N<_Pff2u{7$BQ-JK^5e>|xabtzqB0r2(UH|6~A-7b`|Q zyM8?ZPsL-C?vCs>)fMAgVU$X0Nbm4irkk!PQf^RgMXtjNA}A#HOHgXi{K}8zWQC_F z?hNi%eM0*uBYUq0z{0gfFUk#&E^u-GuvK-f3OkA8QMW6O>AilD4;?Ct0nS~Ev_`u? zs*@LD_x(-_-%onxKv#eq2tzeU%YDDWj|GjpbmSnsCm7tQ3m5cC1se1YPk`8rJ}!a_ zqEiz6RHowrR_K!uu1JO80x4gaJVAN(hNgJc|*P z&K%`OgNGhD3Uu+k0{VYip?vv<)mwGmDLnvzq-f#6?W3Tn>pZMQS?2+KySgr#^4!5v z9b`bH#9dED^zUjWuV7(8|BAI%ZLLV=3nnk2_E4aymf17d<$PzA@N}C!zA#-A5?mUc zo*G1+$d<$cPXX0~`GU-!{BR_&)_BHg&m_lopF*E9FqcXhWBj^1v;K?jaQ?lwMn%(l z-dlFo`7wp>P6;*jhNnI;^KS(@GOGi$Gk2UzT^4rB)fsBaIxO!>;jss3!gBo1;1w|JNtp|pdCg{g}Z>EDOI{f%Rk zVpnfTY?O47Q5Pg8vhiMh*ov0d*!MqvSWV5rw>LQEpfjy1w5jn~fEqxf2Bmkf9ML9S&C{Clrz+x(?b>@bCZDFZl+ML-utV*QuwaB>e zc(B>`prWJW{xHUg*0KWrCTN!lWGmB#k$Ll{Xv=@)shOI>1|LKIRx&-!wnXe=q<&DU zIP^s@;o@?dl4KOHJ+UY+u*n%_F%`_({5qAoj4iPPs^_FM;wyrAQG5Alm;|bGj9#;< z-Pw9%!S~}M&>)yF`tL>whdNShaCDC;3G$UfxwFRizYajfJO0uhkA_O1 z84srBB<+pijW@?91VUUkCJJM&g@N`g<8vD{GI2TI$7qF6SUu`n8B;>F1}!R=?LlLm zVE{$^M?l9__A&aqF{z0k-ueIw@=#npcCA6GF(sAzsIgmj$&sxjWu^-4{-O{PxbyyCpmxwaE#5f;codLfD8U7X;9ygx%2{=9axl{vY}yG*QUx# z#mMi73)2&~*FUT-nBf_O#BhvV#Nr|il;N^Xe+qd=-HQ>Ii_Q8L-dNz+2=a$_mF29wWjV#op^f_GCKkOa4)XJFjp zv%C2dY=Pks&lDcoCy8r(&eR$<_*odU51RN6^7(l!XeI_b4Dw-bh!z+)^hYG2-#re| zV_KDFr!9voYYROAWYMM3x_v&lx+an+Lyi>!Iva4MErcF!_4AlI;nkoNy`S-%I4imK zu<0h;A!$kljI0hHcQxeQN7S=+NGdp`Iml-bBv5r70g2x4{<`(IlRgkj*+hfzH3*5( zykI@*SOKnb(9de67^E^k+Aoc0_APlOi~~!$6JZ3PO;&n$^Z~ZfX^$Koa&B_4!I-@2 zG_&6*|8-yE<^_=mA-gVLG~;Th!*21!<-eK8?SM_%S&~NWTwbVC-SXpt&ug_+eAa9K zyd)1&b+dy&E{U|!(_ukqd6XAx8ozGUD~66(*#e2#%RI3BDLmV)WLn;x}R4TNnZWn{RfmU*^j_o}ZE ze5ngyt!MGT1aD}3=sPH=WefeCp(?d+05&*(AT;v*kp?9m=#2vhWMw?sq-PB#ebL-9 z_R>+y=ORBu8AD00488x#xv_ z5A=qb!3+{~k0iu0iLuMf2F2ab-hsXv`^BIIPhF-~q5ap_HV=JH+8BEeD(HUEF|3_|xaefNdzF1OGHtYpjqk>DynE+f#eZ_t@N?S7z|AESO(2-BXR^HwJze{?nc zdaEsZ`9JwNiOk(*$L}@xE;|In|4nGd)tT`qFe@72g{T6}MMu z{@ZVWN^aWD7(3OfVXqsO%jFv!#J<0+!}%S4cwn{jjJ1tPsEXG|-E3Oon85+2=;G?} zG*Le;wAK6v{yfs6e3#4lSokr#o7TcUZrY-3cN&Y9C0Xg>*g`i;^(eT^O>-@WT;riR zy}Jfj%_t=t))1R;a%Gbz*>UF{gBi%gd7y!I2J^75Vm?A-uDxAh>uGL4b5--Gk(yp9 zy|VM-vhX;Y$FGi=MD7y1o60NGy(rmUmd5DIV$m5}S@JcdoZo?W92{mExMOqU8*8!g zFg#^!J_`TaS#I?`U>Z?oQ^tNbBXxlJdqB&PqF=Y!?Fa|J9gVs^ zrCGrq85;%|_a%9r+Jw%kVQ+_SdS7Mx4P3~N&^>DcuT9EY+Z|NbXeV>I7ijpjjz(2J zG$xh3B?rS7s?vLGghDWlM^$TR=-9wy_({0Yo!C)K*ZHmHgUzS~-pEyQGaX-Gf)ax0!++7`?dc)4u$%dUTX`s)@N_7W7oTZgp@+i%a-O z2-qS)T}|huB^q1)>H3IYxK|L+b9KOS{pbc2pEHs6lAKmo6u#RBXz!gvX6g!U79;xH zLc@By1Vzd%X#I?kO4sGG$|#%Gc;6e(pqPuxGExOB&8Id4_4R)a!>7Zm(#$LxJU;(7 z=)*P4sYm}MyK`@{NR;;i)Q?GPmG`LIo-KH{*Q!BfPU(O*!9eLwr`ON*$pm40o8Xbn z$+smFiNH1tjChU9i(_Len?BX#3E%GJ)WGT;^!U=>CJ$=kb2wv1KRb{#iqD>?$_DPp z1n*Fu?pfejN>{#8p3%sf-W=!eEjcI zURcdKzk8nxe{M@Mdas{e`35Zqgjkz;C_1f|(tCdFRK$QE*3wpB3gh0{^|h)jIP&kvgAmhtN_yiIK%V;h!f5KHIq(~NUq@AKc$B?^}!Ju6CpE?&t}dTiagbdpnd8o>UxW2_hzxLVn{ z2S5JbhcL*}0O#?Xbaw%Ez*P*EYZ%`fvJgChtLE1TTOkivZ!H}%nEx+@`TL9o33TA+ z|3LC3uv_F2>YBbQYF-r;z(9xA<842O|O-cPgiUF zt&h{!21eADOQCN6^HIPc@!!7*Qy!^XQCr^wXG~G@)lP)H1JYn#4~{mHX~P3YMF_vSAK2wf@Uyp{dG5vf}E(k&tu zWD=pIuVrHsG5-?K0dx2`TxWSu?YFvTg?YGeH~&D5 zrvRb8{*2yz@Fv~6r!A=`Y@RyRd!_A+I1P|m;B1A6L7Cib&sOeOIsPU7vBc zvuPL}{^7PPo~p^-sld2yWc9Bds6yJX<7*YShdfdp4iR41Fy<}j;I!(lPN&7K1v2|j z?I8qBaD8xowS)~CS_W^0QK~+-8t(w5UQtj?bK2L{tKctf?WQhjZHKK7YF2{Nc3>Ox zPWMqqA|FR{{7`140S@iFlpHE1Fb1wcGl?DD@ntvId_b_104g|*X0u<_AZ?(#mGHT- zfHlHa3%15Nx137dg}RRfF2&W^Gc-^trRYGzPG}wGg~lO}Xf64*vGF_*BGy4qD*umLg1 zp8}y5x<3mt>6h$&=a+T2Zr_T)jBZ$=f9z2>_kveKy&y?nI+fg`br~bdd_&@AM~Tr{ zOgxSLWpzstGX$|vesk^#wQZ6o|Es1um{K4$tPX}hswNF3h#MHgV&IG(Cj=pWaVG(Hf0~?aU9* zM)+U?BTCy$%r$8#Oi%(P%{*K?+Htwyk%kwasQ8o!UD874#3`dB78t*?u0`d~ z>Y6MoaNd*Yy+DJ?3!h% zbnFZoGhW0z>3Tq?f+Rs-X=Z*9>s5eIf#Tpt3FZ})&r6Gu*p^)DjjvikomU5@KeNQn zKil1(`F(VHxyxUTEE>kZvG4f{gI^p~a2Wb36;=%<& zqdY-Wn=`NY4uuBzz8D?eVZ4yd;QKUVDu)Tr_?{8v6}a8F=m(sKIO=C+bseZc7~9mn zeWy}DEghZYH1Ydauy0|Dbsmd4o;5ld^O{!-A4idc8r0?icEO_T?C4 zID0lRXH9ir0C0`dU`%wEUClBcnBMjOj#;QtG;&2XtZjt^N$^Z?AS4Ut$l z_X?7~nNEu>yjve1?AREwVxX*n=|gCR4etPkBuKa-ZK zf#AU^Po4_y90MBE?vlg6blS&f#H7pOvfTXKZ%nV5|46(zcqTUT1LJGiNj~o6lSRQ7 zmmg%S(@YnLySmc(3$J{#6bGlg7OL~NTx}K6s+paZKizlk@64*4*Ok~fIS`-2Zq&?q zwpbU>(&V#O{#|LB+%OeU{Rv<>BSZ06n@J(soPP71q|NtB6@2o+e}p^@me$>#VU4U zXFB_qQ(A;7qlA_gd;|zvP1^~YI~G}^W;1#x=;Awk=q0KSybB=rdr(~;hBDWPF)ZKQ zqd)FUAXxgTDuX`{mJ{tL)l2%?fQNMGgX(w8xVm0`N!BvmAUKISbddLA$E#r?y!cwW zk^jVRI)Z9h(~|&RLta*Y$qL#KL?p!_KekIb5Qf!MgGpGB;v%T&))=9NB9O1ub-) z`Ogo-6=h7X-J8$S6$XAK+(#j?i?>G+PO8Zh!oIaZUWr>*_g_%NCqM^2su(_*QQKUb zXeHD5EN3de_%63(8TbkVXS=A+Z<(@l{>xvl??)TGVy9DrevWl2`p=DZSkoq`Vsm89 zxMvFJYQeFRv$B1N->L9-sT$go{XH^YBzH0twN{q`Q)9>FDhJoGb&NqVaJb&icCTQ+ zPu247%D4!-J}Qjgmo@gIrfIpSMZrD6erxQ&r<$Wx;$!v)fIzMF6V>FEyAPi8*OJA( z7PK=oW)^eD=o}pMga6ty$N!Mbg<1Ewy7Yq`BGS$mu|g7$1K%2)ttTJ(da30Qj3x;d zuRFk6+cqKi*lq8Z-H{*7bw#n-KIVp-5ei>rYMO_07DKX+#OJP{Qe1>cZ!XI~jH7A4 zrGKl^(|oeVfk-Qr5{KLe7gDcmPux(d;+Qvsx9EpRR12j=Jm>yRY+K=QOCEj;n<|Bb zm0sK^h>_1ur?jVWiiFr#GnQC~i(HNtxsa79_YR7c=Y$U|!t*L%QaQgM2S1x${p7-(Ot)vyasBC>iBord02__L`_>{x?`EpLWL1pv?)=7f zcO=(w%%*cab4zykznkiXWZ-CP*6<*ckFhnnz8(eUvLtNyqB&`Ek=wfKP2iX&X?%B_ z{)-DyB=bURnZ*xVwJaBRgwN~vyn^F~v{!5sQkcXyWMUUbq$97uP*R=MV(gh|^XGMd z?XkJ_*5EeDG=#j3=G5k9NC&6Kx79{r44__ph;!#=^MOaL@wa(A19x5vxygJypk(V? zl2CM1u!GaK2~r&up9woINtGgqKIRv~&&VDlLa0K75YMh>#9}#`X=~5H&Q`qzRE7AF}{YbD`a1MoFVQEI1uax**fh@ZU)KddB@bR>|8A<$xM=`y)^b( zY0}to(rxrmf{UF?iWj1~exiz5Mjr0HUWWi?KR`v~s#OFvVoPB-`e_(ZljG#XcS6leppx^K?rGxih=qXBfLYo5cQ*s63 zec>((oAUe+>0ae@IYR>}$(uD}btLF-wHK)1$75;DsR{y5&xl_7-uzImPiMdJbWA-v z8m^|j67jE7(Tsg#-r|JOK3-^Q3gzb{*Zxt_%eHx%Rd4Z!WHfICe*{V%lw5#!)qrjG zTYVXf*!~~NqHNs=?A=v^Ie`6;g#WfGdVaSAgo&x9hd^DarMTP*i!O8@u0-ziDt3p8 zma`P|cYC;VM;64<4iz|Ya3aA*ywqFa8KgK|7Fz$ye)?IxTPOA(`1Rev@Jj(``$2*j6ARHO4 zM~oWaPZZqqxt0&rRWvTe*TN&jShA~}UcCFaO ze*^eZjtbK#w6p)b6=io`jdwZ!`5Y`g;ZLubPcGaDs%D5Q zLIsF};$17=?2}jgXdA{U?(<#xqv}TMrcZJdw{&fo-lp4DP5ehj#ImDy&H72m^M05< zWqBa8!K{ySTkQPq=wWtg13s^^w_ZWL$hIei{99J!z7lyuYm5^J$iJ7}RV}wPE9EC> zxPaR61j3DG&k7z9#1@_}ef+3S0Da5VUt;rWNs5jLmr*nVYQC7nJsi2JP|is_v*f!; zSGX(ITTplb8oNI`Nx(3;D1vzPpkQ`~XHR~fqD9i8nY+kInwR82Y zg;GM(xb{q{1Ri@&bk_-3-iG|)n%yn97m&;h{n##R^mY)h=Y@{k`O#kDe^R$q#6sL* zQ6<%rXDqVQn#_AX1$Dn=|J`Iou^R3L!g}Vl`Y+;Q6ZdTO>k5PXoBB)9-rAog-{um6 zfGE;Tnv_MgmBoVEnWMe=OXa9@-M&EDE@iZG@Lb(Gy&r(@j_v!j>%nT)^m^W!&yA8A zsXgvt!7%@1Ig_^O9s$B5A?CLQ?)U)w;}1#auI8|IgfZ0!8}4cQlH6JL9NK+!14y(g zFc=#oSpC$nJ67Z;{3Q*YXipKGQ=?QTR4+wICCv)FO}KpoYuI4U)juoZKGT&3x8J$K z{;>!b^_T-Y%d3AOLyRJlL5{<}={q;=Ar(uFy&y&0EAp7NLN>Q@ zZZHO*eOUJ>a@uIaZ4kuAr-0BC-*gKoj4H$r`R`uT;ZDtoSKcc+^&4mCoo}@)J=AF` z_v_)PAHQa{)=)HlHMi1J7tVGi{Ij$GN+ql9p*Ubc0ppl|(RNPp^Zh{^o8-Q>{*hac zv`O`%jw!kN{_TIhAS4#J9LnY14;C!f6%M#YTtydLsG+%3T%AJy><9EC>hwXDHHJQt zG`a^_njgRzov56X(pg`(XFC2n_BeHmH>9TN7w=eKj)I*(?^7S!nRWZi)s1Z(?`qEN z-ubA=xy4gKoX8sP@7^h{&=)&a@Uo<#V<*x{7JG*AWbwG9lz79n#5m&YuWmP!w34FSq?LStDb+$G^`mb`66+A<^m1a`8?``Veu}OJseRHejxijm2 zD{?8!Z48f$H2WwJ_LD#VDBlc8QbM`r83fs z#jLG6$y7;->FxR{`qSlwXti8lRdaaE`{dXV#k-C8Ov)bz|z5g8Tley8$T zeF2YkV|xV$FW$lA3Rx!OMSGGW^;urgC%lqy@}i`79q_cd|AJnS1!Z7xh4`$Z^iQ72 zvy!4RzZO)0QNFFlyYk7RnSGQyKlrN1zcjJ#s+wERokl#=zyArI=&5%b@z`#YOg`vTaSs-o*o39!7TOe3*4R7qc%p;EGS}J&f&y z{R9#-ja;$8?y_0%4PZ6&#rpGKrjaEx?0((%&6oHD^@suyEMx%>Udrp8f_+$q;UtPx z^I__E(2Df!EcUjGqs}a*+UHrtk9_}yMX#StKrr7{#V7Mhy8MH_ zp%~P$_ll_O=Y>myR_LVdhhbMDFV=Q4V2->UtY^Az-_+yE^9c8jdnh|ypnd<73-Rjh zv}og<4QlIEYQ9%jnnV9{it&J^@`Z9N-^DwPGw6Wgy8n-cgQJtD5?8Ke>*o98?;#=> z2EgvD5zfIuL2>dk!(d6r#LYpq4!2P_B(cRo;(V{M*SjEyH zH93#);Gv+oGbc-qZadZ1C`)hPU8D2NBY=TA!aaPYuP~*4lIt!6-ut}nY`2?cUjeU0 zLNt%4xKF!g*oxr_K=oj=#%zFQB%Q^|lN{d3PXM0YV&4#2<`5P2e?64nO?`z7CLE_f zGuEoyS?HfF+x;PgpLE$wwVVvBa@pxdO8hdm4Iu19*-*3iriBZZW|Rp&|3U*n{h^C@ z`-2iCYONKax^ruRUOgAfp438Q`f4X%_KDb85ooTywwe$6Z2VBBil}_Q$iGFy8qZfR zbUZjna^+=iZZx^+GKPj(hYl)m<=1XL^v%%x(hvwXf>tC`WE2nlduN%g)p~zi`tEo3 zAEwb&v|jiw&L92mW?)nOv9<3&CcQi8(`0<^t^vcY9e>8a3)>R?QSI5S3f;4sVh3CQ zL6@ZuR2}KnaExA_>~(7Rw0%#XeuO;)S$IIShuWnM4?%yWWtE<@54jbqX=>B&KU5~d z=yG*ZNFGvcrscY*rZw<+(=W*^1J-}QJ2g7!OS^l&f`4p_uKt?jV$i!CrfJa@v6imch6g>4Busbx*X^_G)k8W zy=oq>G07?!R8b~(*o>YrqWjh2Y+Yp8NdFzjxknwJ^ONR{L|(S#TwOh7r^`D0q{iY% zf^UoQK=8=+bVIg>7M(Tl;D?r$pG{_2THTP3`6skpN5)9~uUj^yf9(%oYMz=#mSesB zQs|X7OR0?3qkNM^prp2`4tAT zb$6I`cUSTJvj!%0W~ug$kFiP6PD^7Q*L6mMZ};1*Af1!vl}-_2v+>Oz`ZHqf79duV zND7e@(D!@!-{8L)hxXvjE4DLpA=zSN<_*w|4X*9{ckN=7jKAdWooa6UkfQ4`UF)laEn*&5j?;1 z#{V8S@jmivG6Rb9{LXEbvP8?K-?D*@#4*~1E?I~)zMP23?&9gc&rxzENoj~vmQuHR zwfWSHyRe>;%C`OLyG*#9lkh|}!I=HhFgIBXV$vN(po65<1`bgH>i>1Z48(U4EeiJ> zUY7HrJszE|KmR*>;c@~pd$8otsa0oEiKV$$_w=TGot5>M641}i+~ohn?=E=NdFX=KeXn2E$7+Uq^*2I4%9w1= ztRA?eFA&?F=v6!0&#zmqD~M|sPn*AMaP6OiWW{g5k&NtCoEa#ns`igI=&>vdzh3eu zujF#&@4JleZgC|UIVQ=gfMJ$GpB6#SXxg5soZ(yOx~uys>|IUlJ9>WcYLuCfc$7gc zx2-+pYuylOy=^-4ZymN=t*mn1da2Oqf8D>$gTEwx+hau*OcIDc2Ru%{Ppy3F?Pg`0 z5R+Z<@KjQ~YVxsFLiy0IOp+ds^>DtgdEH;EvZW679;ZqOVIKO$;T3Go*BMVbM&jHF z|D|xcO`RcZ!beL(eCF|G7=Bce8f-(`v>Pl8y_mU*i_W=dar}Bo2X;DTlX!#*b8>EG~=vPO_yj^>`y`m1-^`|aH0XWiJqFwPzL&#JkDH#vf!CYgnm z-*d*6x5V_<)MvAle#*rZD51^AYbcNR8- zakXbAtoK#B$Vx??bmHcl;}XCt*VZ!_gx5gFk8np&@=A8Pw)ZL$bl~gHkVmF-mtF8NA z50#|DK5I`ddL0E+KgA6*UU9qf&BwdWnVSQU`8w_2P7Ald(Qb_u6WTEQbF*|#9FaMFZH}VLlMfO)boz3$<5nNK@ zKcnjGiyHa9kU-7p%j4g1TK|paPy8lKYp9V*4!z;d;R*58=Tnq~n-1 zqG+?Ghk0EU;;qK2|MH)XC6O7YlAw`*p2hqRE^Xjj7g+sdHiJpdj_~WJ=j;T8F7;H- zdqd<#%i?J}vW3mMV|ORE_;0UROqLdXJ!jV_WL%8`@W|cKNnf}C-?$Yt&9kf((II+oXCb0vXH>Wu(_^*IQ ztn~c+5$9=ttJYd`s*+}11^G#x+~O)OE(zy$lY0Hb^>Ne21xp3aFIAI66#E~`t#(%o z+PmSgdAPTmECe?f|3;!l$6c+G4dzg)5A94O-*k*IyW6u(L8qlyH~LGXEdPyR zho!s!zwv{{W0n>Ub@Him8be>_kWQXAZmbJD3Ho=4QwJ(l*A&3GTFd<5EMq0A5F4Va zw^A(diPs&y{z_e}zMj3>WX!S77di0luJl_&LxE}zS9_(LtzjLd(a6d73Svqn717n) z9>dz%vbMA{cz7OT`%TtRZ? zcfc&@c~?AI&EAVC__Nw`01f@lLM2iMqOWcH7+v3Gy)t3aQ6gadYNSJvSiwFxSy&5G>$u~ zV;OF$m8KnH9>~$OeJD1u=#4_LuHt{=Tb8bt)NqEFmeW zYNfjHow!Q%X<9q6_y)l%r!fD>(ucoth<4blrhjn9Av62BT7cw4P|rA&jjBDk`%~X9#a-;b z&jmh#-F5dQjyqdWA0Ens;Dwvs&%`E{zjI^Z+i&6JyYhtHN=8C;Z6Js`GP>x#d%yB^ zGvAc(zW;J}=^9m44S`@SWcvEH4MNuAW_Nu?qt!;Ye74#D_d^hQCZ?CLJ5Ae4KU$UE z+%e947*=aJ9+Doq9dGSFU;MyuXH(AS_z2jkEI^for}sV>>axAo%b?)vyHyL`py}(Q zIMaMIjvKz1v-HmL?t>$DtMEq_jaH}Y>U`_gGH8*@hiI%~wD4+-&P=}h++Kp}Z?Gnk zuIUeFj`;`t;=ZkP{F!S(z_+?(E9z@)5jWyAtsDaUY;lp}V}ij#!z zZp9u=xfy(R_vJyaKed~CXOE%rUnp%E+@V?O+Mh?v)!u{eCLY9HxV$hQSk%Bc(|-r^ z7q=m|pz=DAG%9usp;iU}pAa~_wqsps|D=Do*9%N}221`b=3S?jy{#J z+X{N&a*2n)@J;+yZ~N+s0Eu)L#~5rC2&Ju`>LQu@(r;%8zhQ6M5;;R(m!llM^=t2d z+zA1zTDU+z?+?h7bPH}%23KM9{EfN2K>uQr|d|Q{|`5vrC{D)xQ)4sHeI;ZpXF`qt9aJa!Aw$b{csDR{4j=V zvv!xUnNtZZR6wim;;SaOp$Sl0koX(78)(Y13umbuEsYC@bbq_kc6=8!F_l+Sp=S9% zPyt~+VMn&xCTodC{=Wn62@d!nA24j3rn3&FaNK|JvQ1+S<+I zxaH%w?k|n=LOzR(MQHc@^wHf^j`^V{m*ko0V9tNEQEVfxnn?deOd{_$(3bARPtr#h z8KaL_3IELq799LDQoLEu8-$wC49ZA(ftyx?QMSi8cG{?c*r2$e6FmO# z)dc*tWz-2U8w=fYBA%dvkGS=ulY60zf{lj4`wW&ipe2r5a4_g3@dwwy3g4>xCT6hJ zkJnK}!#;e?dC`BKedVfu9jn;cW_Wxf@1i$y(RzfM_mLO(o^qlS2b{-2o8HjoZJ52n ze9h)ph0TmbSy*3qzQs<8hTr8%-g~}!ClEL2KiHk3YSLix3F1pp4pYUXrx4x>@%V=V$RRHjg$n|cv0t%k%8J+xAlA525x_=O#QJFfaDp=X;1{#y zfioW1f`(2vK-mm>oUg!Qp&_=vIvVKvF!Rf@djv3JWYbVf1oVP=V3~G0&?Hm?A1k!` z0@W`c15o6QkNHBvSbIdf=3zVwY|Jq7_cGL~>}U*-1IV@?0noZ2zFbJE2|Xdvgigw= zZ7>3q#`sqN^^nd)ZQT|M{nC+{oV=Q$R_(Yrvba(4sd|XC0m!6&?E%NfgrQ|&q{T+S zmxkJJOEemDx8`-p$ZpZW6ye=&GvD@G4=fyaNkRyZB{YD$HxAW+(FbPl5Q(`V3yO?aTbhqd?Va1IO?BL=dN*4 zbWRip{$u*5M+V|#PA8aV;kZZe=~|-_dWezETS07_n#2ig5#cQ%<&=T8SJ%XcS5A^* z*nk-`|0cjsm)=AS9>wxujkGn3V_p8Jw?nt_?s0@lK0gn5d)ol)RQsGi4@PTkrm%k2YHV1S6g8-XLG zaVW|uW?c04uQYNA4dyDic-9lmCf!Ol36Q#Y?xE1Rx2oIPuk9OP*tYYZQ%6yASuT{; z+7^jJ%?^En_=%Aw>k~tOw$TuDAL~Qyx|pbYqH^65k$)JI5DT$m2PXRr_#yri%_F)XX$9IQ?gMI;uY^9nkYE zn>LmA;V5vYq@Hf|(EA7>fiL5&F)|MTb7%f`icTMU(ps38A{a*os%~-EvM~>si6w-4 zT*ql4E)gIJMn*C~KIG@_L1Jz7u+H2D7KD0gf5v>fah1E*bR}x*Ar(Ptc^I>X>WPj8 zWSO2AM7xI=R_ACYIQ8=OQH{tVw>D*VfNQPQ(hj*%_Va+>byemShSJtLZENnJ%}vq> zv>6{X9lwww0GI7`CYHvZ4{|_;?81l{O|K3-s4zu;56O0fu6LA9(CRQ-K@PNsNB4+ z+Mhm_P2-?t`M8d#4D^Q$z4jj4t|M!w^Nf1=A4##WQmPwBEu*R0mmVHa0 z>P0q)B@Km9Bps;6HmgEuP-Tj=qChIx9KbOKx*rX!ewNO+eV*um{pxVejXbOFI2{@` zM2UyRJ|_BoI`q=0z~QP%JGw`3%tt7}*7CWQ+Osa#(qAfHgSpD7CTOilSUyH7g-=r! z-^ued<$&}-`RjQ*=V9}85ePddc4Mp+NA*K%xjARvgwMVtboP0%trym?0_fh7p8* zEimg$YO$cbS1s@t#w!+;u#YdDq6lJ@?;^2uAKgt^;J0W}od~uN&KdTg|zzY{A)R%j$gt;Wa8J+Nv z%6ZkrgzBmkT~Zj>u}$lGS~Kqk_Bfi!RmQB=djI!;$2muIWjBoypzf$d(U3t(5$<+3 z#pA+tB%!|@)6)6(ra6L6Oh#SDqZ*(KBlzMaD_Z zy&Xc*>(Y7B1=7ED0l>4PDcDGXPn#{Y?LvP31Rtw@R$D%ontoKMeTdi>AO-fRv}@`H z*xp`sY5KUli&Rt}qG{jTH$yh{rf`W%r<+wFmIHQ)HTNidB(^txoCn0;G<3!hZeY-V z@WwntbpXT7JVaH4R@KyCAxd^fF;iivg2dVhpI^b^G9~AF^A%ue(uUgfboU}&11M6e zj0HwXhjZmb?H_Maodyo)%pC*aW}%=8mzg-g53maEO#5{GzY zI5E8W3N=ojFEdfJV@;~}o|7>aY=_8jTW1ZRlk3JGHqds~blcl!SwDsSem2f5JpErO z#i6BN7kTRHz9GkADALhjy>4N#`O04x^G^tw*4pYB(j1%liNpf#fWWV!{rTF5zh6s( zgllqG66x=UpL2}3)$aIy5L~~t9NzJ>Wyn`2&$x!W`L~OgS6@t^jPCMEVs7r4QI*VA zd)o!v+y*X-7@0^4vSuXHT~4RadUjru16PmuMqKwavv*e}L1cgqV9s`jemosOr@)ca zK~giL*k-4AdQ}j&)#Uh2%qJ-J&)IQne}6S+ioCbBNt#Oi?w$t7F+_B412a=}#`gpd zI@SnzPh9*SXB%;+ikN7>={+1YX&&@g;9KT6AB;`+ViVs*;9y9;X=fx}mQ%}2>A0_1 z#9`Vf0ZHyG$mL%`DB=e%HC2ulL$WRudHmo#0&&^YKGxbyyoNL5ROZh6u;4krkmd6^ z`l`Xg9ykp}462lGznM>ip!EJ@O{92xmtb)g)E>DFU*R6dWD>k<+yxc@eC1$V%?{SP z%6>)A&VrMCEA$jjg9no;?S-xxd-(D+bna8 zf8%qGOLc%llF;<&nD`dw`xh_j+ZLW72L3ikTnD49_|S6qYgwh}Yu_8EE3t^C%ZPz` zHdxvP&5d!sM~J3ZT!D!8v*V-|2|q7%cxFvug7u{a-P&w)_z9L%*Ez6Nq0bR)@MTe+ zoe&C&QzB6KDH5A6eY+bnWog;U1NvfklqVH1gE=LpgO|@=0gKc@%!`Gj@G~Ka;=D4F z$n`w!>oFclK@R));aHj`rWM~A-_DI^VHIh}f68BWrKk_FX+2F)W=|G`@ST~#HILMm zVh9o|=q+37F%?+Q(|p_Plv8*+Q$)^NRJa>6SPEHtP@csCx@M>?5!`ra^E{jS3J;4QoSj8$wCB=7RtIoac zddR?>L|Qe{%%p!PJJ5j(Rk_GsWMw+r&NmBCMtpe*%B6(9 zwGkv4gRt%)=K)Z9LzG4ZT%aD2qg&FP8I>5M;!5*v11^-7BKMw`=_!EYFb54a-!R*h z?UUrep&6m}bZaTZ;6QC=6P{P|e~8Ehz5@WyJcKYtH@T)|^)*Vv(jLpsaS4$*4g3o% zqxBFo+)0YV4H9QHF!wkOEGtsq!IhFYdr+JP%Ro$n>7T1?rNyQm1cse<_HQR7KAnqfE_;+yBn&2f^5JIMn5hZpuXig8Y8}VozZ4h6N7H za>=Bra&scc(FaIxgr*=>zB)1mSU~W0`%P=FpycBKN^6%BGxqP+h&MX?wrajQEJzHi zp@A_28oU=)QuL8B7YexgfxD#Rvh4Qud!3eP@^Kla7?#rBDZEL?0UiFC*W#Sc$JS3%0vgh_`z7?s#={pi(dCbQWIZIaO3>FD z{&t6%Qr9eRqUUS{*qvZxHVg_dMAsk1ze(LE=p`A&8IeZ})dt9|ID!NgwI;k@fTy!T z^$ijb&>9{KV^U|*PJxpF_rMN8$x7<{2H#{1wZ}a=)5OvaWX5qW5buHd#twfUd+ieLRXa-nTK8*|^2C_$+xq!c6Wit%7 zwQxd)`y5>xw!R`;wWj-mvZIF^YszfsQZ*5@B^&;VEd3XIX)-JmXg-1@y& zpQ@|#F&dVIZjjd=_!?RLopmS=CojsBIlTQXL`)Q1Y$~SyiSTq}+q|Mh+%9Z>bIz3B zkY5g)#}Cm$3ftr3n?5SL_&*#nI|6OravXdY-&CE^Fc{f4Ix-}5M9q@F-OAee&%!o^ zy}84f>@_e`zB@@agp6RL+A8h-OL1gTxxzAEBbX*sTFq&;D|Wij=eSDA6z&47VEt0+ zOiIf?yQ-55nl%*7jJBe-pGF$>umr22zXdx+@A*A!?Tjb-i!~JSCqLRYEC(Raf;_{sQbJ#7RqJL@B)8T=MA60YFRs^9yr`*QC)%D}xe?2EJcycqEa6j&!-p+Y#N zE1>~kOVQ^U>P3Wpyl6Nx3t0LbnUj2SG|fLkB?Ez{T)POI-b`KF`f%%OprXx5fg_oxfY z-*?e0jF5ETVu{KR;x<4QMAyRO?V+e`4pX5tmYVv^iRNjYuVTY4Nt~+}Oq&Agc(;2L z30@CKr_{x|6jTI*0+gb-^Itl z{l3co8ifUScB?rEr`o6Kx7M`OAGYm}c<81@qM1Ff314~jytINM;D=B;3i)2+EAVO8 zBrK>~j$Ek~Qmv$0+U~cDj*p*oVcqHV@ny3WA=v#W=<^x%sO4_Arf^l-4)-B0)o2k9 za~_MG7-n%%lRK+R;PGx^=QERT%bQ5x%tg;#d8Id;s0H+&6GI4nuo|2lPxvLcKUnk{ zSp+{(<<1#-foH!Up+HO$;=!P7Z7z!Q(VSq6SLq5f2RZpY`OUf-@(T^_g~lddwiV_H z?ouC6;E|~eeW4dMmN&$Yl7E5N7%?1UMKoosG)UM+@5g!x zG2UvE^GypHqzAe))BoA9#&foOGlPspF|fBNFL zbc(twUbWk2s#cZ{D3^2x{rvm&`E!<%S|etw26t?`ZOrs z`+1MTX)w=M#`-YYyN8U?xkowPXU%YuH}^eCm~@5MZx}!2WA_qM*^bUS_1>h)B!Ly? zh|u@bzt<$q58$uwasfKFhU*OlC3$g=Y7wP@d4qUeXmv>Ze!q(V&^R39=Lq&|=;Ywn zSb2@Ne$J^)z6kd=_1Z=CUoK+{J^KK`FFroyzMQPbNtrU6=fdB6Ms!pUH5GOxH|94U zhsOBQ+FNsc>z)M0`>{wG`y$8@4_ebWY!HCL^wi1rr&+ti`GIIDol*mDZ2m&h7DibJ z4&nKM+B~kbay14eDYqTAto#pg2{2K&iYowVlCwp~A5%v0a=thy)+|UU z7O#Gh_gQi(*1dEeX)NceJ2BJDq4I6C&^FOMG57qE-u=4aAoop&?MW56d)Fnxk>}wG zIjxniuXZ$a6K~gXE&eICp^j#Mr3a|3)tU9aF>1Jx=of$VKiN`HXElbDu2=-Dg< zE41fFt0oyB137s6L!b=`29>rBkil)NWD@|TFL z@*Y(XI?S7Rt^9M@U{-dn;%JAtPpR2);nNS87QPm#$~sLy@{lSuby*de`Mzt7IV1kG z!?+T-@0F_QjmnMDy_t0Fc}KIMx$mEfK8<}kmUuC;(BC1%?5v?wtNTvA=xG=WX6p@6 zF{v%DttdiE0@T!y3Nob%7<(2m9>bS&*nH@t?escevir`(XCx0^dm(FFQSg=0D)rzV z<%?LzjjD?NOMFiqsC?`O=(zQ8UISmCQ2B;0Uujf!C3k}oBZGGJ%`0R5<^2Zh`*