#! cpp /* * Copyright (c) 2019-2021 Arm Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the License); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an AS IS BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * This is a simplified picture of the Corstone-300 memory system. * Please refer to the Corstone SSE-300 Technical Reference Manual for * further information. * * https://developer.arm.com/ip-products/subsystem/corstone/corstone-300 * * +---------------+ +---------------+ +------+ * | Ethos-U55 | | Cortex-M55 +--+ ITCM | * | | | | +------+ * | | | | * | | | | +------+ * | M1 M0 | | +--+ DTCM | * +---+-------+---+ +-------+-------+ +------+ * | | | * | +---+---------------+-----+ * | | AMBA AXI NIC-400-Lite | * | +---+-----------------+---+ * | | | * +---+-------+------------+ +--+-------+ * | AMBA AXI NIC-400 | | SSE-300 | * +---+--------+--------+--+ | SRAM | * | | | +----------+ * +---+---+ +--+---+ +--+--+ * | Flash | | BRAM | | DDR | * +-------+ +------+ +-----+ * * +-----------------------+-------------+-------------+----+--------------------------------------+ * | Memory region name | Base addr | Size |IDAU| MCC load address + remarks | * +-----------------------+-------------+-------------+----+--------------------------------------+ * | ITCM | 0x0000_0000 | 0x0008_0000 | NS | 0x0000_0000; 512 kiB | * | ITCM | 0x1000_0000 | 0x0008_0000 | S | Secure alias for NS ITCM | * | FPGA Data SRAM; BRAM | 0x0100_0000 | 0x0020_0000 | NS | 0x0100_0000; 2 MiB | * | FPGA data SRAM; BRAM | 0x1100_0000 | 0x0020_0000 | S | Secure alias for NS BRAM | * | DTCM | 0x2000_0000 | 0x0008_0000 | NS | 512 kiB; 4 banks of 128k each | * | DTCM | 0x3000_0000 | 0x0008_0000 | S | Secure alias for NS DTCM | * | SSE-300 internal SRAM | 0x2100_0000 | 0x0040_0000 | NS | 2 banks of 2 MiB each; 3cc latency) | * | SSE-300 internal SRAM | 0x3100_0000 | 0x0040_0000 | S | Secure alias for NS internal SRAM | * | DDR | 0x6000_0000 | 0x1000_0000 | NS | 0x0800_0000; 256 MiB bank | * | DDR | 0x7000_0000 | 0x1000_0000 | S | 0x0C00_0000; 256 MiB bank | * +-----------------------+-------------+-------------+----+--------------------------------------+ * * Note: Ethos-U55 can access BRAM, internal SRAM and the DDR sections => activation buffers and * the model should only be placed in those regions. * * Note: Alias regions means that secure and non-secure addresses are mapped to the same physical * memory banks. */ #ifndef STACK_SIZE #define STACK_SIZE 0x8000 #endif #ifndef HEAP_SIZE #define HEAP_SIZE 0x8000 #endif #if defined(TRUSTZONE_BUILD) && !defined(ETHOSU_TEST) /* * Include trustzone.h with common addresses and sizes. * The build configuration sets whether TRUSTZONE_SECURE is set or * TRUSTZONE_NONSECURE which sets the memory start addresses and sizes. */ #include "trustzone.h" #define USE_TRUSTZONE #else //TRUSTZONE_BUILD #define LR_START 0x10000000 #define LR_SIZE 0x00080000 #define ITCM_START 0x10000000 #define ITCM_SIZE 0x00080000 #define BRAM_START 0x11000000 #define BRAM_SIZE 0x00200000 #define DTCM_START 0x30000000 #define DTCM_SIZE 0x00080000 #define SRAM_START 0x31000000 #define SRAM_SIZE 0x00200000 #define DDR_START 0x70000000 #define DDR_SIZE 0x02000000 #define STACK_HEAP 0x30080000 #endif //TRUSTZONE_BUILD /* ---------------------------------------------------------------------------- Stack seal size definition *----------------------------------------------------------------------------*/ #if defined(USE_TRUSTZONE) && defined(TRUSTZONE_SECURE) #define __STACKSEAL_SIZE ( 8 ) #else #define __STACKSEAL_SIZE ( 0 ) #endif APP_IMAGE LR_START LR_SIZE { ; ITCM 512kB rom_exec ITCM_START ITCM_SIZE { *.o (RESET, +First) *(InRoot$$Sections) ; Make sure reset_handler ends up in root segment, when split across ; ITCM and DTCM startup_ARMCM55.o .ANY (+RO) } #if defined(USE_TRUSTZONE) && defined(TRUSTZONE_SECURE) ; MPS3 BRAM ; Shared between Cortex-M and the NPU BRAM BRAM_START (BRAM_SIZE - TZ_NSC_SIZE) { * (.sram.data) } ROM_NSC TZ_NSC_START TZ_NSC_SIZE { *(Veneer$$CMSE) } #else ; MPS3 BRAM BRAM BRAM_START BRAM_SIZE { * (.sram.data) } #endif ; DTCM 512kB ; Only accessible from the Cortex-M DTCM DTCM_START (DTCM_SIZE - STACK_SIZE - HEAP_SIZE - __STACKSEAL_SIZE) { .ANY1 (+RW +ZI) } ; SSE-300 SRAM (3 cycles read latency) from M55/U55 ; 2x2MB - only first part mapped SRAM SRAM_START UNINIT SRAM_SIZE { #ifndef ETHOSU_FAST_MEMORY_SIZE ; Place tensor arena in SRAM if we do not have a fast memory area * (.bss.tensor_arena) #else * (.bss.ethosu_scratch) #endif } ARM_LIB_HEAP (STACK_HEAP - STACK_SIZE - __STACKSEAL_SIZE - HEAP_SIZE) EMPTY ALIGN 8 HEAP_SIZE {} ARM_LIB_STACK (STACK_HEAP - STACK_SIZE - __STACKSEAL_SIZE) EMPTY ALIGN 8 STACK_SIZE {} #if defined(USE_TRUSTZONE) && defined(TRUSTZONE_SECURE) STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack } #endif } LOAD_REGION_1 DDR_START DDR_SIZE { ; 2GB DDR4 available rom_dram DDR_START #if defined(USE_TRUSTZONE) && defined(TRUSTZONE_NONSECURE) { } #else //trustzone secure or non-trustzone { * (network_model_sec) * (input_data_sec) * (expected_output_data_sec) * (output_data_sec) } #ifdef ETHOSU_FAST_MEMORY_SIZE ; Place tensor arena in DRAM if we have a fast memory area ARENA +0 UNINIT ALIGN 16 { * (.bss.tensor_arena) } #endif #endif }