From db088159ebca1480b3c5f083f5ac4268ea6749b6 Mon Sep 17 00:00:00 2001 From: AngelaGonzalezMarino <135128652+AngelaGonzalezMarino@users.noreply.github.com> Date: Mon, 17 Jun 2024 09:23:44 +0200 Subject: [PATCH] Mmu design document (#2117) --- docs/03_cva6_design/MMU.rst | 2071 +++++++++++++++++ docs/03_cva6_design/_static/LZC.png | Bin 0 -> 52819 bytes docs/03_cva6_design/_static/RR.png | Bin 0 -> 32920 bytes .../03_cva6_design/_static/cva6_tlb_entry.png | Bin 0 -> 59042 bytes docs/03_cva6_design/_static/cva6_tlb_hit.png | Bin 0 -> 78362 bytes docs/03_cva6_design/_static/in_out_tlb.png | Bin 0 -> 64648 bytes .../_static/mmu_control_flow.png | Bin 0 -> 58489 bytes docs/03_cva6_design/_static/mmu_in_out.png | Bin 0 -> 109616 bytes .../_static/mmu_major_blocks.png | Bin 0 -> 8021 bytes .../_static/nested_translation.png | Bin 0 -> 118144 bytes .../_static/plru_tree_indexing.png | Bin 0 -> 157525 bytes docs/03_cva6_design/_static/ptw_dptw.png | Bin 0 -> 40335 bytes docs/03_cva6_design/_static/ptw_dptw_s.png | Bin 0 -> 42274 bytes docs/03_cva6_design/_static/ptw_idle.png | Bin 0 -> 21075 bytes docs/03_cva6_design/_static/ptw_in_out.png | Bin 0 -> 90952 bytes docs/03_cva6_design/_static/ptw_iptw.png | Bin 0 -> 34254 bytes docs/03_cva6_design/_static/ptw_mis_sup.png | Bin 0 -> 35227 bytes docs/03_cva6_design/_static/ptw_nlvl.png | Bin 0 -> 441274 bytes docs/03_cva6_design/_static/ptw_pte_1.png | Bin 0 -> 21586 bytes .../_static/ptw_pte_flowchart.png | Bin 0 -> 132855 bytes .../_static/ptw_state_diagram.png | Bin 0 -> 170038 bytes .../_static/replacement_entry.png | Bin 0 -> 193343 bytes .../_static/sfence_vaddr_asid.png | Bin 0 -> 53775 bytes .../_static/sfence_vaddr_x0.png | Bin 0 -> 40284 bytes .../03_cva6_design/_static/sfence_x0_asid.png | Bin 0 -> 52384 bytes docs/03_cva6_design/_static/sfence_x0_x0.png | Bin 0 -> 26869 bytes docs/03_cva6_design/_static/shared_tlb.png | Bin 0 -> 88175 bytes .../_static/shared_tlb_in_out.png | Bin 0 -> 80139 bytes .../03_cva6_design/_static/shared_tlb_set.png | Bin 0 -> 130603 bytes docs/03_cva6_design/_static/update_tree.png | Bin 0 -> 307037 bytes docs/03_cva6_design/index.rst | 1 + 31 files changed, 2072 insertions(+) create mode 100644 docs/03_cva6_design/MMU.rst create mode 100644 docs/03_cva6_design/_static/LZC.png create mode 100644 docs/03_cva6_design/_static/RR.png create mode 100644 docs/03_cva6_design/_static/cva6_tlb_entry.png create mode 100644 docs/03_cva6_design/_static/cva6_tlb_hit.png create mode 100644 docs/03_cva6_design/_static/in_out_tlb.png create mode 100644 docs/03_cva6_design/_static/mmu_control_flow.png create mode 100644 docs/03_cva6_design/_static/mmu_in_out.png create mode 100644 docs/03_cva6_design/_static/mmu_major_blocks.png create mode 100644 docs/03_cva6_design/_static/nested_translation.png create mode 100644 docs/03_cva6_design/_static/plru_tree_indexing.png create mode 100644 docs/03_cva6_design/_static/ptw_dptw.png create mode 100644 docs/03_cva6_design/_static/ptw_dptw_s.png create mode 100644 docs/03_cva6_design/_static/ptw_idle.png create mode 100644 docs/03_cva6_design/_static/ptw_in_out.png create mode 100644 docs/03_cva6_design/_static/ptw_iptw.png create mode 100644 docs/03_cva6_design/_static/ptw_mis_sup.png create mode 100644 docs/03_cva6_design/_static/ptw_nlvl.png create mode 100644 docs/03_cva6_design/_static/ptw_pte_1.png create mode 100644 docs/03_cva6_design/_static/ptw_pte_flowchart.png create mode 100644 docs/03_cva6_design/_static/ptw_state_diagram.png create mode 100644 docs/03_cva6_design/_static/replacement_entry.png create mode 100644 docs/03_cva6_design/_static/sfence_vaddr_asid.png create mode 100644 docs/03_cva6_design/_static/sfence_vaddr_x0.png create mode 100644 docs/03_cva6_design/_static/sfence_x0_asid.png create mode 100644 docs/03_cva6_design/_static/sfence_x0_x0.png create mode 100644 docs/03_cva6_design/_static/shared_tlb.png create mode 100644 docs/03_cva6_design/_static/shared_tlb_in_out.png create mode 100644 docs/03_cva6_design/_static/shared_tlb_set.png create mode 100644 docs/03_cva6_design/_static/update_tree.png diff --git a/docs/03_cva6_design/MMU.rst b/docs/03_cva6_design/MMU.rst new file mode 100644 index 0000000000..7e67fea64c --- /dev/null +++ b/docs/03_cva6_design/MMU.rst @@ -0,0 +1,2071 @@ +---------------------- +Memory Management Unit +---------------------- + +The Memory Management Unit (MMU) module is a crucial component in the RISC-V-based processor, serving as the backbone for virtual memory management and address translation. + +.. figure:: _static/mmu_in_out.png + :name: **Figure 1:** Inputs and Outputs of CVA6 MMU + :align: center + :width: 100% + :alt: mmu_in_out + + **Figure 1:** Inputs and Outputs of CVA6 MMU + +At its core, the MMU plays a pivotal role in translating virtual addresses into their corresponding physical counterparts. This translation process is paramount for providing memory protection, isolation, and efficient memory management in modern computer systems. Importantly, it handles both instruction and data accesses, ensuring a seamless interaction between the processor and virtual memory. Within the MMU, several major blocks play pivotal roles in this address translation process. These includes: + +* Instruction TLB (ITLB) +* Data TLB (DTLB) +* Shared TLB (optional) +* Page Table Walker (PTW) + +.. figure:: _static/mmu_major_blocks.png + :name: **Figure 2:** Major Blocks in CVA6 MMU + :align: center + :width: 60% + :alt: mmu_major_blocks + + **Figure 2:** Major Blocks in CVA6 MMU + +The MMU manages privilege levels and access control, enforcing permissions for user and supervisor modes while handling access exceptions. It employs Translation Lookaside Buffers (TLBs) for efficient address translation, reducing the need for page table access. TLB hits yield quick translations, but on misses, the shared TLB is consulted (when used), and if necessary, the Page Table Walker (PTW) performs page table walks, updating TLBs and managing exceptions during the process. + +In addition to these functionalities, the MMU seamlessly integrates support for Physical Memory Protection (PMP), enabling it to enforce access permissions and memory protection configurations as specified by the PMP settings. This additional layer of security and control enhances the management of memory accesses + +.. raw:: html + + Instruction and Data Interfaces + +The MMU maintains interfaces with the instruction cache (ICache) and the load-store unit (LSU). It receives virtual addresses from these components and proceeds to translate them into physical addresses, a fundamental task for ensuring proper program execution and memory access. + +The MMU block can be parameterized to support sv32, sv39 and sv39x4 virtual memory. In CVA6, some of these parameters are configurable by the user, and some others are calculated depending on other parameters of the core. The available HW configuration parameters are the following: + +.. raw:: html + + List of configuration parameters for MMU + +.. list-table:: + :header-rows: 1 + + * - Parameter + - Description + - Type + - Possible values + - User config + + * - ``InstrTlbEntries`` + - Number of entries in Instruction TLB + - Natural + - ``>0 and multiple of 2`` + - Yes + + * - ``DataTlbEntries`` + - Number of entries in Data TLB + - Natural + - ``>0 and multiple of 2`` + - Yes + + * - ``SharedTlbDepth`` + - Size of shared TLB + - Natural + - ``>0 and multiple of 2`` + - Yes + + * - ``UseSharedTlb`` + - Indicates if the shared TLB optimization is used (1) or not (0) + - bit + - 1 or 0 + - Yes + + * - ``RVH`` + - Indicates if Hypervisor extension is used (1) or not (0) + - bit + - 1 or 0 + - Yes + + * - ``ASIDW`` + - Indicates the width of the Address Space Identifier (ASID) + - Natural + - ``>0`` + - No + + * - ``VMIDW`` + - Indicates the width of the Virtual Machine space Identifier (VMID) - (used only when Hypervisor extension is enabled) + - Natural + - ``>0`` + - No + + * - ``PPNW`` + - Indicates the width of the Physical Page Number (PPN) + - Natural + - ``>0`` + - No + + * - ``GPPNW`` + - Indicates the width of the Guest Physical Page Number (GPPN) - (used only when Hypervisor extension is enabled) + - Natural + - ``>0`` + - No + + * - ``SV`` + - Indicates the width of the Virtual Address Space + - Natural + - ``>0`` + - No + + * - ``SVX`` + - Indicates the width of the extended Virtual Address Space when Hypervisor is used + - Natural + - ``>0`` + - No + + * - ``VpnLen`` + - Length of Virtual Page Number (VPN) + - Natural + - ``>12`` + - No + + * - ``PtLevels`` + - Number of page table levels + - Natural + - ``log2(CVA6Cfg.XLEN)`` + - No + +.. raw:: html + + Default Configuration parameters value for sv32, sv39 and sv39x4 + +.. list-table:: + :header-rows: 1 + + * - Parameter + - sv32 + - sv39 + - sv39x4 + + * - ``InstrTlbEntries`` + - 2 + - 16 + - 16 + + * - ``DataTlbEntries`` + - 2 + - 16 + - 16 + + * - ``SharedTlbDepth`` + - 64 + - 64 + - 64 + + * - ``UseSharedTlb`` + - 1 + - 0 + - 0 + + * - ``RVH`` + - 0 + - 0 + - 1 + + * - ``ASIDW`` + - 9 + - 16 + - 16 + + * - ``VMIDW`` + - 7 + - 14 + - 14 + + * - ``PPNW`` + - 22 + - 44 + - 44 + + * - ``GPPNW`` + - 22 + - 29 + - 29 + + * - ``SV`` + - 32 + - 39 + - 39 + + * - ``SVX`` + - 34 + - 41 + - 41 + + * - ``VpnLen`` + - 20 + - 27 + - 29 + + * - ``PtLevels`` + - 2 + - 3 + - 3 + + + + +.. raw:: html + + Signal Description of MMU + +.. raw:: html + +

Table 1: CVA6 MMU Input Output Signals

+ +.. list-table:: + :header-rows: 1 + + * - Signal + - IO + - Connection Type + - Type + - Description + + * - ``clk_i`` + - in + - Subsystem + - logic + - Subsystem Clock + + * - ``rst_ni`` + - in + - Subsystem + - logic + - Asynchronous reset active low + + * - ``flush_i`` + - in + - Controller + - logic + - Sfence Committed + + * - ``enable_translation_i`` + - in + - CSR RegFile + - logic + - Enables address translation request for instruction + + * - ``enable_g_translation_i`` + - in + - CSR RegFile + - logic + - Enables virtual memory translation for instrucionts + + * - ``en_ld_st_translation_i`` + - in + - CSR RegFile + - logic + - Enables address translation request for load or store + + * - ``en_ld_st_g_translation_i`` + - in + - CSR RegFile + - logic + - Enables virtual memory translation for load or store + + * - ``icache_areq_i`` + - in + - Cache Subsystem + - icache_arsp_t + - Icache Response + + * - ``icache_areq_o`` + - out + - Cache Subsystem + - icache_areq_t + - Icache Request + + * - ``misaligned_ex_i`` + - in + - Load Store Unit + - exception_t + - Indicate misaligned exception + + * - ``lsu_req_i`` + - in + - Load Store Unit + - logic + - Request address translation + + * - ``lsu_vaddr_i`` + - in + - Load Store Unit + - logic [VLEN-1:0] + - Virtual Address In + + * - ``lsu_tinst_i`` + - in + - Load Store Unit + - logic [31:0] + - Transformed Instruction In when Hypervisor Extension is enabled. Set to 0 (unused) when not. + + * - ``lsu_is_store_i`` + - in + - Store Unit + - logic + - Translation is requested by a store + + * - ``csr_hs_ld_st_inst_o`` + - out + - CSR RegFile + - logic + - Indicate a hypervisor load store instruction. + + * - ``lsu_dtlb_hit_o`` + - out + - Store / Load Unit + - logic + - Indicate a DTLB hit + + * - ``lsu_dtlb_ppn_o`` + - out + - Load Unit + - logic [PPNW-1:0] + - Send PNN to LSU + + * - ``lsu_valid_o`` + - out + - Load Store Unit + - logic + - Indicate a valid translation + + * - ``lsu_paddr_o`` + - out + - Store / Load Unit + - logic [PLEN-1:0] + - Translated Address + + * - ``lsu_exception_o`` + - out + - Store / Load Unit + - exception_t + - Address Translation threw an exception + + * - ``priv_lvl_i`` + - in + - CSR RegFile + - priv_lvl_t + - Privilege level for instruction fetch interface + + * - ``v_i`` + - in + - CSR RegFile + - logic + - Virtualization mode state + + * - ``ld_st_priv_lvl_i`` + - in + - CSR RegFile + - priv_lvl_t + - Indicates the virtualization mode at which load and stores should happen + + * - ``ld_st_v_i`` + - in + - CSR RegFile + - logic + - Virtualization mode state + + * - ``sum_i`` + - in + - CSR RegFile + - logic + - Supervisor User Memory Access bit in xSTATUS CSR register + + * - ``vs_sum_i`` + - in + - CSR RegFile + - logic + - Virtual Supervisor User Memory Access bit in xSTATUS CSR register when Hypervisor extension is enabled. + + * - ``mxr_i`` + - in + - CSR RegFile + - logic + - Make Executable Readable bit in xSTATUS CSR register + + * - ``vmxr_i`` + - in + - CSR RegFile + - logic + - Virtual Make Executable Readable bit in xSTATUS CSR register for virtual supervisor when Hypervisor extension is enabled. + + * - ``hlvx_inst_i`` + - in + - Store / Load Unit + - logic + - Indicates that Instruction is a hypervisor load store with execute permissions + + * - ``hs_ld_st_inst_i`` + - in + - CSR RegFile + - logic + - Indicates that Instruction is a hypervisor load store instruction + + * - ``satp_ppn_i`` + - in + - CSR RegFile + - logic [PPNW-1:0] + - PPN of top level page table from SATP register + + * - ``vsatp_ppn_i`` + - in + - CSR RegFile + - logic [PPNW-1:0] + - PPN of top level page table from VSATP register when Hypervisor extension is enabled + + * - ``hgatp_ppn_i`` + - in + - CSR RegFile + - logic [PPNW-1:0] + - PPN of top level page table from HGATP register when Hypervisor extension is enabled + + * - ``asid_i`` + - in + - CSR RegFile + - logic [ASIDW-1:0] + - ASID for the lookup + + * - ``vs_asid_i`` + - in + - CSR RegFile + - logic [ASIDW-1:0] + - ASID for the lookup for virtual supervisor when Hypervisor extension is enabled + + * - ``vmid_i`` + - in + - CSR RegFile + - logic [VMIDW-1:0] + - VMID for the lookup when Hypervisor extension is enabled + + * - ``asid_to_be_flushed_i`` + - in + - Execute Stage + - logic [ASIDW-1:0] + - ASID of the entry to be flushed + + * - ``vmid_to_be_flushed_i`` + - in + - Execute Stage + - logic [VMIDW-1:0] + - VMID of the entry to be flushed when Hypervisor extension is enabled + + * - ``vaddr_to_be_flushed_i`` + - in + - Execute Stage + - logic [VLEN-1:0] + - Virtual address of the entry to be flushed + + * - ``gpaddr_to_be_flushed_i`` + - in + - Execute Stage + - logic [GPLEN-1:0] + - Virtual address of the guest entry to be flushed when Hypervisor extension is enabled + + * - ``flush_tlb_i`` + - in + - Controller + - logic + - Indicates SFENCE.VMA committed + + * - ``flush_tlb_vvma_i`` + - in + - Controller + - logic + - Indicates SFENCE.VVMA committed + + * - ``flush_tlb_gvma_i`` + - in + - Controller + - logic + - Indicates SFENCE.GVMA committed + + * - ``itlb_miss_o`` + - out + - Performance Counter + - logic + - Indicate an ITLB miss + + * - ``dtlb_miss_o`` + - out + - Performance Counter + - logic + - Indicate a DTLB miss + + * - ``req_port_i`` + - in + - Cache Subsystem + - dcache_req_o_t + - D Cache Data Requests + + * - ``req_port_o`` + - out + - Cache Subsystem + - dcache_req_i_t + - D Cache Data Response + + * - ``pmpcfg_i`` + - in + - CSR RegFile + - pmpcfg_t [15:0] + - PMP configurations + + * - ``pmpaddr_i`` + - in + - CSR RegFile + - logic [15:0][PLEN-3:0] + - PMP Address + +.. raw:: html + + Struct Description + +.. raw:: html + +

Table 2: I Cache Request Struct (icache_areq_t)

+ +.. list-table:: + :header-rows: 1 + + * - Signal + - Type + - Description + + * - ``fetch_valid`` + - logic + - Address Translation Valid + + * - ``fetch_paddr`` + - logic [PLEN-1:0] + - Physical Address In + + * - ``fetch_exception`` + - exception_t + - Exception occurred during fetch + +.. raw:: html + +

Table 3: I Cache Response Struct (icache_arsq_t)

+ +.. list-table:: + :header-rows: 1 + + * - Signal + - Type + - Description + + * - ``fetch_req`` + - logic + - Address Translation Request + + * - ``fetch_vaddr`` + - logic [VLEN-1:0] + - Virtual Address out + +.. raw:: html + +

Table 4: Exception Struct (exception_t)

+ +.. list-table:: + :header-rows: 1 + + * - Signal + - Type + - Description + + * - ``cause`` + - logic [XLEN-1:0] + - Cause of exception + + * - ``tval`` + - logic [XLEN-1:0] + - Additional information of causing exception (e.g. instruction causing it), address of LD/ST fault + + * - ``tval2`` + - logic [GPLEN-1:0] + - Additional information when the causing exception in a guest exception (used only in hypervisor mode) + + * - ``tinst`` + - logic [31:0] + - Transformed instruction information + + * - ``gva`` + - logic + - Signals when a guest virtual address is written to tval + + * - ``valid`` + - logic + - Indicate that exception is valid + +.. raw:: html + +

Table 5: PMP Configuration Struct (pmpcfg_t)

+ +.. list-table:: + :header-rows: 1 + + * - Signal + - Type + - Description + + * - ``locked`` + - logic + - Lock this configuration + + * - ``reserved`` + - logic[1:0] + - Reserved bits in pmpcfg CSR + + * - ``addr_mode`` + - pmp_addr_mode_t + - Addressing Modes: OFF, TOR, NA4, NAPOT + + * - ``access_type`` + - pmpcfg_access_t + - None, read, write, execute + +.. raw:: html + + Control Flow in MMU Module + +.. figure:: _static/mmu_control_flow.png + :name: **Figure 3:** Control Flow in CVA6 MMU + :align: center + :width: 95% + :alt: mmu_control_flow + + **Figure 3:** Control Flow in CVA6 MMU + +.. raw:: html + + Exception Sources with Address Translation Enabled + +Two potential exception sources exist: + +* Hardware Page Table Walker (HPTW) throwing an exception, signifying a page fault exception. +* Access error due to insufficient permissions of PMP, known as an access exception. + +.. raw:: html + + Instruction Fetch Interface + +The IF stage initiates a request to retrieve memory content at a specific virtual address. When the MMU is disabled, the instruction fetch request is directly passed to the I$ without modifications. + +.. raw:: html + + Address Translation in Instruction Interface + +If virtual memory translation is enabled for instruction fetches, the following operations are performed in the instruction interface: + +* Compatibility of requested virtual address with selected page based address translation scheme is checked. +* For page translation, the module determines the fetch physical address by combining the physical page number (PPN) from ITLB content and the offset from the virtual address. When hypervisor mode is enabled, the PPN from ITLB content is taken from the stage that is currently doing the translation. +* Depending on the size of the identified page the PPN of the fetch physical address is updated with the corresponding bits of the VPN to ensure alignment for superpage translation. +* If the Instruction TLB (ITLB) lookup hits, the fetch valid signal (which indicates a valid physical address) is activated in response to the input fetch request. Memory region accessibility is checked from the perspective of the fetch operation, potentially triggering a page fault exception in case of an access error or insufficient PMP permission. +* In case of an ITLB miss, if the page table walker (PTW) is active (only active if there is a shared TLB miss or the shared TLB is not used) and handling instruction fetches, the fetch valid signal is determined based on PTW errors or access exceptions. + +If the fetch physical address doesn't match any execute region, an Instruction Access Fault is raised. When not translating, PMPs are immediately checked against the physical address for access verification. + +.. raw:: html + + Data Interface + +.. raw:: html + + Address Translation in Data Interface + +If address translation is enabled for load or store, and no misaligned exception has occurred, the following operations are performed in the data interface: + +* Initially, translation is assumed to be invalid, signified by the MMU to LSU. +* The translated physical address is formed by combining the PPN from the Page Table Entry (PTE) and the offset from the virtual address requiring translation. This is sent one cycle later due to the additional bank of registers which delayed the MMU’s answer. The PPN from the PTE is also shared separately with LSU in the same cycle as the hit. When hypervisor mode is enabled, the PPN from the PTE is taken from the stage that is currently doing the translation. +* In the case of superpage translation, the PPN of the translated physical address and the separately shared PPN are updated with the VPN of the virtual address. + +If a Data TLB (DTLB) hit occurs, it indicates a valid translation, and various fault checks are performed depending on whether it's a load or store request. + +* For store requests, if the page is not writable, the dirty flag isn't set, or privileges are violated, it results in a page fault corresponding to the store access. If PMPs are also violated, it leads to an access fault corresponding to the store access. Page faults take precedence over access faults. +* For load requests, a page fault is triggered if there are insufficient access privileges. PMPs are checked again during load access, resulting in an access fault corresponding to load access if PMPs are violated. + +In case of a DTLB miss, potential exceptions are monitored during the page table walk. If the PTW indicates a page fault, the corresponding page fault related to the requested type is signaled. If the PTW indicates an access exception, the load access fault is indicated through address translation because the page table walker can only throw load access faults. + +.. raw:: html + + Address Translation is Disabled + +When address translation is not enabled, the physical address is immediately checked against Physical Memory Protections (PMPs). If there is a request from LSU, no misaligned exception, and PMPs are violated, it results in an access fault corresponding to the request being indicated. + +---------------------------- +Translation Lookaside Buffer +---------------------------- + +Page tables are accessed for translating virtual memory addresses to physical memory addresses. This translation needs to be carried out for every load and store instruction and also for every instruction fetch. Since page tables are resident in physical memory, accessing these tables in all these situations has a significant impact on performance. Page table accesses occur in patterns that are closely related in time. Furthermore, the spatial and temporal locality of data accesses or instruction fetches mean that the same page is referenced repeatedly. Taking advantage of these access patterns the processor keeps the information of recent address translations, to enable fast retrieval, in a small cache called the Translation Lookaside Buffer (TLB) or an address-translation cache. + +The CVA6 TLB is structured as a fully associative cache, where the virtual address that needs to be translated is compared against all the individual TLB entries. Given a virtual address, the processor examines the TLB (TLB lookup) to determine if the virtual page number (VPN) of the page being accessed is in the TLB. When a TLB entry is found (TLB hit), the TLB returns the corresponding physical page number (PPN) which is used to calculate the target physical address. If no TLB entry is found (TLB miss) the processor has to read individual page table entries from memory (Table walk). In CVA6 table walking is supported by dedicated hardware. Once the processor finishes the table walk, it has the Physical Page Number (PPN) corresponding to the Virtual Page Number (VPN) that needs to be translated. The processor adds an entry for this address translation to the TLB so future translations of that virtual address will happen quickly through the TLB. During the table walk the processor may find out that the corresponding physical page is not resident in memory. At this stage a page table exception (Page Fault) is generated which gets handled by the operating system. The operating system places the appropriate page in memory, updates the appropriate page tables and returns execution to the instruction which generated the exception. + +The input and output signals of the TLB are shown in the following figure. + +.. figure:: _static/in_out_tlb.png + :name: **Figure 4:** Inputs and Outputs of CVA6 TLB + :align: center + :width: 100% + :alt: in_out_tlb + + **Figure 4:** Inputs and Outputs of CVA6 TLB + +.. raw:: html + + Signal Description of TLB + +.. raw:: html + +

Table 6: CVA6 TLB Input Output Signals

+ +.. list-table:: + :header-rows: 1 + + * - Signal + - IO + - connection + - Type + - Description + + * - ``clk_i`` + - in + - SUBSYSTEM + - logic + - Subsystem Clock + + * - ``rst_ni`` + - in + - SUBSYSTEM + - logic + - Asynchronous reset active low + + * - ``flush_i`` + - in + - Controller + - logic + - SFENCE.VMA Committed + + * - ``flush_vvma_i`` + - in + - Controller + - logic + - SFENCE.VVMA Committed + + * - ``flush_gvma_i`` + - in + - Controller + - logic + - SFENCE.GVMA Committed + + * - ``s_st_enbl_i`` + - in + - Controller + - logic + - Indicates address translation request (s-stage) - used only in Hypervisor mode + + * - ``g_st_enbl_i`` + - in + - Controller + - logic + - Indicates address translation request (g-stage) - used only in Hypervisor mode + + * - ``v_i`` + - in + - Controller + - logic + - Indicates the virtualization mode state - used only in Hypervisor mode + + * - ``update_i`` + - in + - Shared TLB + - tlb_update_cva6_t + - Updated tag and content of TLB + + * - ``lu_access_i`` + - in + - Cache Subsystem + - logic + - Signal indicating a lookup access is being requested + + * - ``lu_asid_i`` + - in + - CVA6 MMU + - logic[ASIDW-1:0] + - ASID for the lookup + + * - ``lu_vmid_i`` + - in + - CVA6 MMU + - logic[VMIDW-1:0] + - VMID for the lookup when Hypervisor extension is enabled. + + * - ``lu_vaddr_i`` + - in + - Cache Subsystem + - logic[VLEN-1:0] + - Virtual address for the lookup + + * - ``lu_content_o`` + - out + - CVA6 MMU + - pte_cva6_t + - Output for the content of the TLB entry + + * - ``lu_g_content_o`` + - out + - CVA6 MMU + - pte_cva6_t + - Output for the content of the TLB entry (g-stage) + + * - ``asid_to_be_flushed_i`` + - in + - Execute Stage + - logic [ASIDW-1:0] + - ASID of the entry to be flushed. Vector 1 is the analogous one for virtual supervisor when Hypervisor extension is enabled + + * - ``vmid_to_be_flushed_i`` + - in + - Execute Stage + - logic [VMIDW-1:0] + - VMID of the entry to be flushed when Hypervisor extension is enabled + + * - ``vaddr_to_be_flushed_i`` + - in + - Execute Stage + - logic [VLEN-1:0] + - Virtual address of the entry to be flushed. Vector 1 is the analogous one for virtual supervisor when Hypervisor extension is enabled. + + * - ``gpaddr_to_be_flushed_i`` + - in + - Execute Stage + - logic [VLEN-1:0] + - Virtual address of the guest entry to be flushed when Hypervisor extension is enabled. + + * - ``lu_is_page_o`` + - out + - CVA6 MMU + - logic [PT_LEVELS-2:0] + - Output indicating whether the TLB entry corresponds to any page at the different page table levels + + * - ``lu_hit_o`` + - out + - CVA6 MMU + - logic + - Output indicating whether the lookup resulted in a hit or miss + +.. raw:: html + + Struct Description + +.. raw:: html + +

Table 7: CVA6 TLB Update Struct (tlb_update_cva6_t)

+ +.. list-table:: + :header-rows: 1 + + * - Signal + - Type + - Description + + * - ``valid`` + - logic + - Indicates whether the TLB update entry is valid or not + + * - ``is_page`` + - logic [PtLevels-2:0][HYP_EXT:0] + - Indicates if the TLB entry corresponds to a any page at the different levels. When Hypervisor extension is used it includes information also for the G-stage. + + * - ``vpn`` + - logic[VPN_LEN-1:0] + - Virtual Page Number (VPN) used for updating the TLB + + * - ``asid`` + - logic[ASIDW-1:0] + - ASID used for updating the TLB + + * - ``vmid`` + - logic[VMIDW-1:0] + - VMID used for updating the TLB when Hypervisor extension is enabled + + * - ``v_st_enbl`` + - logic [HYP_EXT*2:0] + - Used only in Hypervisor mode. Indicates for which stage the translation was requested and for which it is therefore valid (s_stage, g_stage or virtualization enabled). + + * - ``content`` + - pte_cva6_t + - Content of the TLB update entry + + * - ``g_content`` + - pte_cva6_t + - Content of the TLB update entry for g stage when Hypervisor extension is enabled + +.. raw:: html + +

Table 8: CVA6 PTE Struct (pte_cva6_t)

+ +.. list-table:: + :header-rows: 1 + + * - Signal + - Type + - Description + + * - ``ppn`` + - logic[PPNW-1:0] + - Physical Page Number (PPN) + + * - ``rsw`` + - logic[1:0] + - Reserved for use by supervisor software + + * - ``d`` + - logic + - | Dirty bit indicating whether the page has been modified (dirty) or not + | 0: Page is clean i.e., has not been written + | 1: Page is dirty i.e., has been written + + * - ``a`` + - logic + - | Accessed bit indicating whether the page has been accessed + | 0: Virtual page has not been accessed since the last time A bit was cleared + | 1: Virtual page has been read, written, or fetched from since the last time the A bit was cleared + + * - ``g`` + - logic + - | Global bit marking a page as part of a global address space valid for all ASIDs + | 0: Translation is valid for specific ASID + | 1: Translation is valid for all ASIDs + + * - ``u`` + - logic + - | User bit indicating privilege level of the page + | 0: Page is not accessible in user mode but in supervisor mode + | 1: Page is accessible in user mode but not in supervisor mode + + * - ``x`` + - logic + - | Execute bit which allows execution of code from the page + | 0: Code execution is not allowed + | 1: Code execution is permitted + + * - ``w`` + - logic + - | Write bit allows the page to be written + | 0: Write operations are not allowed + | 1: Write operations are permitted + + * - ``r`` + - logic + - | Read bit allows read access to the page + | 0: Read operations are not allowed + | 1: Read operations are permitted + + * - ``v`` + - logic + - | Valid bit indicating the page table entry is valid + | 0: Page is invalid i.e. page is not in DRAM, translation is not valid + | 1: Page is valid i.e. page resides in the DRAM, translation is valid + +.. raw:: html + + TLB Entry Fields + +The number of TLB entries can be changed via a design parameter. Each TLB entry is made up of two fields: Tag and Content. The Tag field holds the virtual page number, ASID, VMID and page size along with a valid bit (VALID) indicating that the entry is valid, and a v_st_enbl field that indicates at which level the translation is valid when hypervisor mode is enabled. The virtual page number, is further split into several separate virtual page numbers according to the number of PtLevels used in each configuration. The Content field contains the physical page numbers along with a number of bits which specify various attributes of the physical page. Note that the V bit in the Content field is the V bit which is present in the page table in memory. It is copied from the page table, as is, and the VALID bit in the Tag is set based on its value. g_content is the equivalent for the g-stage translation. The TLB entry fields are shown in this Figure. Fields colored in grey are used only when H extension is implemented. + +.. figure:: _static/cva6_tlb_entry.png + :name: **Figure 5:** Fields in CVA6 TLB entry + :align: center + :width: 100% + :alt: cva6_tlb_entry + + **Figure 5:** Fields in CVA6 TLB entry + +.. raw:: html + + CVA6 TLB Management / Implementation + +The CVA6 TLB implements the following three functions: + +* **Translation:** This function implements the address lookup and match logic. +* **Update and Flush:** This function implements the update and flush logic. +* **Pseudo Least Recently Used Replacement Policy:** This function implements the replacement policy for TLB entries. + +.. raw:: html + + Translation + +This function takes in the virtual address and certain other fields, examines the TLB to determine if the virtual page number of the page being accessed is in the TLB or not. If a TLB entry is found (TLB hit), the TLB returns the corresponding physical page number (PPN) which is then used to calculate the target physical address. The following checks are done as part of this lookup function to find a match in the TLB: + +* **Validity Check:** For a TLB hit, the associated TLB entry must be valid . +* **ASID, VMID and Global Flag Check:** The TLB entry's ASID must match the given ASID (ASID associated with the Virtual address). If the TLB entry’s Global bit (G) is set then this check is not done. This ensures that the translation is either specific to the provided ASID, or it is globally applicable. When the hypervisor extension is enabled, either the ASID or the VMID in the TLB entry must match ASID and/or VMID in the input, depending on which level(s) of translation is enabled. For the VMID the check is always applicable, regardless of G bit in the TLB entry. +* **Level VPN match:** CVA6 implements a multi-level page table. As such the virtual address is broken up into multiple parts which are the virtual page number used in the different levels. So the condition that is checked next is that the virtual page number of the virtual address matches the virtual page number of the TLB entry at each level. +* **Page match:** Without Hypervisor extension, there is a match at a certain level X if the is_page component of the tag is set to 1 at level PtLevels-X. At level 0 page_match is always set to 1. When Hypervisor extension is enabled, the conditions to give a page match vary depending on the level we are at. At the highest level (PT_LEVELS -1), there is a page match at g and s stage (when enabled) if the corresponding is_page bit is set. If a stage is not enabled the is_page is considered a 1. At level 0, page_match is always 1 as in the case of no hypervisor extension. In the intermediate levels, the page_match is determined using the merged final translation size from both stages and their enable signals. + **Level match** The last condition to be checked at each page level, for a TLB hit, is that there is a vpn match for the current level and the higher ones, together with a page match at the current one. E.g. If PtLevels=2, a match at level 2 will occur if there is a VPN match at level 2 and a page match at level 2. For level 1, there will be a match if there is a VPN match at levels 2 and 1, together with a page match at level 1. + + +All the conditions listed above are checked against every TLB entry. If there is a TLB hit then the corresponding bit in the hit array is set. The following Figure Illustrates the TLB hit/miss process listed above. + +.. figure:: _static/cva6_tlb_hit.png + :name: **Figure 6:** Block diagram of CVA6 TLB hit or miss + :align: center + :width: 75% + :alt: cva6_tlb_hit + + **Figure 6:** Block diagram of CVA6 TLB hit or miss + +.. raw:: html + + Flushing TLB entries + +The SFENCE.VMA instruction can be used with certain specific source register specifiers (rs1 & rs2) to flush a specific TLB entry, some set of TLB entries or all TLB entries. Like all instructions this action only takes place when the SFENCE.VMA instruction is committed (shown via the commit_sfence signal in the following figures.) The behavior of the instruction is as follows: + +* **If rs1 is not equal to x0 and rs2 is not equal to x0:** Invalidate all TLB entries which contain leaf page table entries corresponding to the virtual address in rs1 (shown below as Virtual Address to be flushed) and that match the address space identifier as specified by integer register rs2 (shown below as asid_to_be_flushed_i), except for entries containing global mappings. This is referred to as the “SFENCE.VMA vaddr asid” case. + +.. figure:: _static/sfence_vaddr_asid.png + :name: **Figure 7:** Invalidate TLB entry if ASID and virtual address match + :align: center + :width: 75% + :alt: sfence_vaddr_asid + + **Figure 7:** Invalidate TLB entry if ASID and virtual address match + +* **If rs1 is equal to x0 and rs2 is equal to x0:** Invalidate all TLB entries for all address spaces. This is referred to as the "SFENCE.VMA x0 x0" case. + +.. figure:: _static/sfence_x0_x0.png + :name: **Figure 8:** Invalidate all TLB entries if both source register specifiers are x0 + :align: center + :width: 62% + :alt: sfence_x0_x0 + + **Figure 8:** Invalidate all TLB entries if both source register specifiers are x0 + +* **If rs1 is not equal to x0 and rs2 is equal to x0:** invalidate all TLB entries that contain leaf page table entries corresponding to the virtual address in rs1, for all address spaces. This is referred to as the “SFENCE.VMA vaddr x0” case. + +.. figure:: _static/sfence_vaddr_x0.png + :name: **Figure 9:** Invalidate TLB entry with matching virtual address for all address spaces + :align: center + :width: 75% + :alt: sfence_vaddr_x0 + + **Figure 9:** Invalidate TLB entry with matching virtual address for all address spaces + +* **If rs1 is equal to x0 and rs2 is not equal to x0:** Invalidate all TLB entries matching the address space identified by integer register rs2, except for entries containing global mappings. This is referred to as the “SFENCE.VMA 0 asid” case. + +.. figure:: _static/sfence_x0_asid.png + :name: **Figure 10:** Invalidate TLB entry for matching ASIDs + :align: center + :width: 75% + :alt: sfence_x0_asid + + **Figure 10:** Invalidate TLB entry for matching ASIDs + +The TLB fully implements the supervisor flush instructions, i.e., hfence, including filtering by ASID and virtual address. To support nested translation,it supports the two translation stages, including access permissions (rwx) and VMIDs. This is done analogously to the fence cases explained above. + +* **HFENCE.VVMA vaddr asid case:** Invalidate all TLB entries which contain leaf page table entries corresponding to the Virtual Address to be flushed and that match the address space identifiers as specified by ASID_to_be_flushed_i and lu_VMID, except for entries containing global mappings. + +* **HFENCE.VVMA x0 x0 case:** Invalidate all TLB entries for all address spaces if current VMID matches and ASID is 0 and vaddr to be flushed is 0. + +* **HFENCE.VVMA vaddr x0 case:** Invalidate all TLB entries which contain leaf page table entries corresponding to the Virtual Address to be flushed if current VMID matches and ASID to be flushed is 0. + +* **HFENCE.VVMA x0 asid case:** Invalidate all TLB entries matching the address space identified by ASID_to_be_flushed_i and lu_VMID when vaddr to be flushed is 0, except for entries containing global mappings. + +* **HFENCE.GVMA gpaddr vmid case:** Invalidate all TLB entries which contain leaf page table entries corresponding to the gpaddr to be flushed and that match the VMID. + +* **HFENCE.GVMA x0 x0 case:** Invalidate all TLB entries for all address spaces if VMID is 0 and gpaddr to be flushed is 0. + +* **HFENCE.GVMA gpaddr x0 case:** Invalidate all TLB entries which contain leaf page table entries corresponding to the gpaddr to be flushed if VMID to be flushed is 0. + +* **HFENCE.GVMA x0 vmid case:** Invalidate all TLB entries matching the address space identified by VMID_to_be_flushed_i when gpaddr to be flushed is 0. + +.. raw:: html + + Updating TLB + +When a TLB valid update request is signaled by the shared TLB, and the replacement policy select the update of a specific TLB entry, the corresponding entry's tag is updated with the new tag, and its associated content is refreshed with the information from the update request. This ensures that the TLB entry accurately reflects the new translation information. + +.. raw:: html + + Pseudo Least Recently Used Replacement Policy + +Cache replacement algorithms are used to determine which TLB entry should be replaced, because it is not likely to be used in the near future. The Pseudo-Least-Recently-Used (PLRU) is a cache entry replacement algorithm, derived from Least-Recently-Used (LRU) cache entry replacement algorithm, used by the TLB. Instead of precisely tracking recent usage as the LRU algorithm does, PLRU employs an approximate measure to determine which entry in the cache has not been recently used and as such can be replaced. + +CVA6 implements the PLRU algorithm via the Tree-PLRU method which implements a binary tree. The TLB entries are the leaf nodes of the tree. Each internal node, of the tree, consists of a single bit, referred to as the state bit or plru bit, indicating which subtree contains the (pseudo) least recently used entry (the PLRU); 0 for the left hand tree and 1 for the right hand tree. Following this traversal, the leaf node reached, corresponds to the PLRU entry which can be replaced. Having accessed an entry (so as to replace it) we need to promote that entry to be the Most Recently Used (MRU) entry. This is done by updating the value of each node along the access path to point away from that entry. If the accessed entry is a right child i.e., its parent node value is 1, it is set to 0, and if the parent is the left child of its parent (the grandparent of the accessed node) then its node value is set to 1 and so on all the way up to the root node. + +The PLRU binary tree is implemented as an array of node values. Nodes are organized in the array based on levels, with those from lower levels appearing before higher ones. Furthermore those on the left side of a node appear before those on the right side of a node. The figure below shows a tree and the corresponding array. + +.. figure:: _static/plru_tree_indexing.png + :name: **Figure 11:** PLRU Tree Indexing + :align: center + :width: 60% + :alt: plru_tree_indexing + + **Figure 11:** PLRU Tree Indexing + +For n-way associative, we require n - 1 internal nodes in the tree. With those nodes, two operations need to be performed efficiently. + +* Promote the accessed entry to be MRU +* Identify which entry to replace (i.e. the PLRU entry) + +.. raw:: html + + Updating the PLRU-Tree + +For a TLB entry which is accessed, the following steps are taken to make it the MRU: + +1. Iterate through each level of the binary tree. +2. Calculate the index of the leftmost child within the current level. Let us call that index the index base. +3. Calculate the shift amount to identify the relevant node based on the level and TLB entry index. +4. Calculate the new value that the node should have in order to make the accessed entry the Most Recently Used (MRU). The new value of the root node is the opposite of the TLB entry index, MSB at the root node, MSB - 1 at node at next level and so on. +5. Assign this new value to the relevant node, ensuring that the hit entry becomes the MRU within the binary tree structure. + +At level 0, no bit of the TLB entry’s index determines the offset from the index base because it’s a root node. At level 1, MSB of entry’s index determines the amount of offset from index base at that level. At level 2, the first two bits of the entry's index from MSB side determine the offset from the index base because there are 4 nodes at the level 2 and so on. + +.. figure:: _static/update_tree.png + :name: **Figure 12:** Promote Entry to be MRU + :align: center + :width: 82% + :alt: update_tree + + **Figure 12:** Promote Entry to be MRU + +In the above figure entry at index 5, is accessed. To make it MRU entry, every node along the access path should point away from it. Entry 5 is a right child, therefore, its parent plru bit set to 0, its parent is a left child, its grand parent’s plru bit set to 1, and great grandparent’s plru bit set to 0. + +.. raw:: html + + Entry Selection for Replacement + +Every TLB entry is checked for the replacement entry. The following steps are taken: + +1. Iterate through each level of the binary tree. +2. Calculate the index of the leftmost child within the current level. Let us call that index the index base. +3. Calculate the shift amount to identify the relevant node based on the level and TLB entry index. +4. If the corresponding bit of the entry's index matches the value of the node being traversed at the current level, keep the replacement signal high for that entry; otherwise, set the replacement signal to low. + +.. figure:: _static/replacement_entry.png + :name: **Figure 13:** Possible path traverse for entry selection for replacement + :align: center + :width: 65% + :alt: replacement_entry + + **Figure 13:** Possible path traverse for entry selection for replacement + +Figure shows every possible path that traverses to find out the PLRU entry. If the plru bit at each level matches with the corresponding bit of the entry's index, that’s the next entry to replace. Below Table shows the entry selection for replacement. + +.. raw:: html + +

Table 9: Entry Selection for Reaplacement

+ ++-------------------+---------------+----------------------+ +| **Path Traverse** | **PLRU Bits** | **Entry to replace** | ++-------------------+---------------+----------------------+ +| 0 -> 1 -> 3 | 000 | 0 | +| +---------------+----------------------+ +| | 001 | 1 | ++-------------------+---------------+----------------------+ +| 0 -> 1 -> 4 | 010 | 2 | +| +---------------+----------------------+ +| | 011 | 3 | ++-------------------+---------------+----------------------+ +| 0 -> 2 -> 5 | 100 | 4 | +| +---------------+----------------------+ +| | 101 | 5 | ++-------------------+---------------+----------------------+ +| 0 -> 2 -> 6 | 110 | 6 | +| +---------------+----------------------+ +| | 111 | 7 | ++-------------------+---------------+----------------------+ + +----------------------------------- +Shared Translation Lookaside Buffer +----------------------------------- + +The CVA6 shared TLB is structured as a 2-way associative cache, where the virtual address requiring translation is compared with the set indicated by the virtual page number. The shared TLB is looked up in case of an Instruction TLB (ITLB) or data TLB (DTLB) miss, signaled by these TLBs. If the entry is found in the shared TLB set, the respective TLB, whose translation is being requested, is updated. If the entry is not found in the shared TLB, then the processor has to perform a page table walk. Once the processor obtains a PPN corresponding to the VPN, the shared TLB is updated with this information. If the physical page is not found in the page table, it results in a page fault, which is handled by the operating system. The operating system will then place the corresponding physical page in memory. + +The use of the shared TLB is optional in CVA6, via the ``UseSharedTlb`` parameter. When it is not used, the requests from ITLB and DTLB go directly to the PTW, and the update from the PTW goes directly to the ITLB and DTLB respectively. + +The input and output signals of the shared TLB are shown in the following Figure. + +.. figure:: _static/shared_tlb_in_out.png + :name: **Figure 14:** Inputs and outputs of CVA6 shared TLB + :align: center + :width: 100% + :alt: shared_tlb_in_out + + **Figure 14:** Inputs and outputs of CVA6 shared TLB + +.. raw:: html + + Signal Description + +.. raw:: html + +

Table 10: Signal Description of CVA6 shared TLB

+ +.. list-table:: + :header-rows: 1 + + * - Signal + - IO + - Connection + - Type + - Description + + * - ``clk_i`` + - in + - Subsystem + - logic + - Subsystem Clock + + * - ``rst_ni`` + - in + - Subsystem + - logic + - Asynchronous reset active low + + * - ``flush_i`` + - in + - Controller + - logic + - SFENCE.VMA Committed + + * - ``flush_vvma_i`` + - in + - Controller + - logic + - SFENCE.VVMA Committed + + * - ``flush_gvma_i`` + - in + - Controller + - logic + - SFENCE.GVMA Committed + + * - ``s_st_enbl_i`` + - in + - Controller + - logic + - Indicates address translation request (s-stage) + + * - ``g_st_enbl_i`` + - in + - Controller + - logic + - Indicates address translation request (g-stage) - used only in Hypervisor mode + + * - ``v_i`` + - in + - Controller + - logic + - Indicates the virtualization mode state - used only in Hypervisor mode + + * - ``s_ld_st_enbl_i`` + - in + - Controller + - logic + - Indicates address translation request (s-stage) for load stores + + * - ``g_ld_st_enbl_i`` + - in + - Controller + - logic + - Indicates address translation request (g-stage) for load stores - used only in Hypervisor mode + + * - ``ld_st_v_i`` + - in + - Controller + - logic + - Indicates the virtualization mode state for load stores + + + * - ``dtlb_asid_i`` + - in + - MMU + - logic [ASIDW-1:0] + - ASID for the lookup in case of a DTLB miss + + * - ``itlb_asid_i`` + - in + - MMU + - logic [ASIDW-1:0] + - ASID for the lookup in case of an ITLB miss + + * - ``lu_vmid_i`` + - in + - MMU + - logic [VMIDW-1:0] + - VMID for the lookup + + * - ``itlb_access_i`` + - in + - Cache Subsystem + - logic + - Signal indicating a lookup access in ITLB is being requested. + + * - ``itlb_hit_i`` + - in + - ITLB + - logic + - Signal indicating an ITLB hit + + * - ``itlb_vaddr_i`` + - in + - Cache Subsystem + - logic [VLEN-1:0] + - Virtual address lookup in ITLB + + * - ``dtlb_access_i`` + - in + - Load/Store Unit + - logic + - Signal indicating a lookup access in DTLB is being requested. + + * - ``dtlb_hit_i`` + - in + - DTLB + - logic + - Signal indicating a DTLB hit + + * - ``dtlb_vaddr_i`` + - in + - Load/Store Unit + - logic [VLEN-1:0] + - Virtual address lookup in DTLB + + * - ``itlb_update_o`` + - out + - ITLB + - tlb_update_cva6_t + - Tag and content to update ITLB + + * - ``dtlb_update_o`` + - out + - DTLB + - tlb_update_cva6_t + - Tag and content to update DTLB + + * - ``itlb_miss_o`` + - out + - Performance Counter + - logic + - Signal indicating an ITLB miss + + * - ``dtlb_miss_o`` + - out + - Performance Counter + - logic + - Signal indicating a DTLB miss + + * - ``shared_tlb_access_o`` + - out + - PTW + - logic + - Signal indicating a lookup access in shared TLB is being requested + + * - ``shared_tlb_hit_o`` + - out + - PTW + - logic + - Signal indicating a shared TLB hit + + * - ``shared_tlb_vaddr_o`` + - out + - PTW + - logic [VLEN-1:0] + - Virtual address lookup in shared TLB + + * - ``itlb_req_o`` + - out + - PTW + - logic + - ITLB Request Output + + * - ``shared_tlb_update_i`` + - in + - PTW + - tlb_update_cva6_t + - Updated tag and content of shared TLB + +.. raw:: html + + Shared TLB Entry Structure + +Shared TLB is 2-way associative, with a depth of 64 by default, but can be selected via a user parameter. A single entry in the set contains the valid bit, tag and the content. The Tag segment stores details such as the virtual page number, ASID, VMID and page size. The Content field contains the physical page numbers along with a number of bits which specify various attributes of the physical page. + +.. figure:: _static/shared_tlb.png + :name: **Figure 15:** CVA6 Shared TLB Structure + :align: center + :width: 60% + :alt: shared_tlb + + **Figure 15:** CVA6 Shared TLB Structure + +.. raw:: html + + Shared TLB Implementation in CVA6 + +The implementation of a shared TLB in CVA6 is described in the following sections: + +* **ITLB and DTLB Miss:** Prepare a shared TLB lookup if the entry is not found in ITLB or DTLB. +* **Tag Comparison:** Look up the provided virtual address in the shared TLB. +* **Update and Flush:** Flush the shared TLB or update it. +* **Replacement Policies:** First non-valid entry and random replacement policy. + +.. raw:: html + + ITLB and DTLB Miss + +Consider a scenario where an entry is found in the ITLB or DTLB. In this case, there is no need to perform a lookup in the shared TLB since the entry has already been found. Next, there are two scenarios: an ITLB miss or a DTLB miss. + +To identify an ITLB miss, the following conditions need to be fulfilled: + +* Address translation must be enabled. +* There must be an access request to the ITLB. +* The ITLB should indicate an ITLB miss. +* There should be no access request to the DTLB. + +During an ITLB miss, access is granted to read the tag and content of the shared TLB from their respective sram. The address for reading the tag and content of the shared TLB entry is calculated using the virtual address for which translation is not found in the ITLB. The ITLB miss is also explicitly indicated by the shared TLB. A request for shared TLB access is initiated. + +To identify the DTLB miss, the following conditions need to be fulfilled: + +* Address translation for load and stores must be enabled. +* There must be an access request to the DTLB. +* The DTLB should indicate a DTLB miss. + +In the case of a DTLB miss, the same logic is employed as described for an ITLB miss. + +.. raw:: html + + Tag Comparison + +Shared TLB lookup for a hit occurs under the same conditions as described for the TLB modules used as ITLB and DTLB. However, there are some distinctions. In both the ITLB and DTLB, the virtual address requiring translation is compared against all TLB entries. In contrast, the shared TLB only compares the tag and content of the set indicated by the provided virtual page number. The index of the set is extracted from the VPN of the requested virtual address. Given that the shared TLB is 2-way associative, each set contains two entries. Consequently, both of these entries are compared. Below figure illustrates how the set is opted for the lookup. In case that the shared TLB is not used, the hit and corresponding update information come directly from the PTW, bypassing the shared TLB block. + +.. figure:: _static/shared_tlb_set.png + :name: **Figure 16:** Set opted for lookup in shared TLB + :align: center + :width: 60% + :alt: shared_tlb_set + + **Figure 16:** Set opted for lookup in shared TLB + +.. raw:: html + + Update and Flush + +Differing from the ITLB and DTLB, a specific virtual address or addressing space cannot be flushed in the shared TLB. When SFENCE.VMA is committed, all entries in the shared TLB are invalidated. (Cases of SFENCE.VMA should also be added in shared TLB) + +.. raw:: html + + Updating Shared TLB + +When the Page Table Walker signals a valid update request, the shared TLB is updated by selecting an entry through the replacement policy and marking it as valid. This also triggers the writing of the new tag and content to the respective SRAM. As stated above, when the shared TLB is not used, the update from PTW goes directly to the ITLB and DTLB depending on which initiated the request, and the SRAM is not instantiated. + +.. raw:: html + + Replacement Policy Implemented in CVA6 Shared TLB + +In CVA6's shared TLB, two replacement policies are employed for replacements based on a specific condition. These replacement policies select the entry within the set indicated by the virtual page number. The two policies are: + +* First non-valid encounter replacement policy +* Random replacement policy + +First replacement policy failed if all ways are valid. Therefore, a random replacement policy is opted for. + +.. raw:: html + + First non-valid encounter replacement policy + +The module implemented in CVA6 to find the first non-valid entry in the shared TLB is the Leading Zero Counter (LZC). It takes three parameters as input: + +1. **WIDTH:** The width of the input vector. +2. **MODE:** Mode selection - 0 for trailing zero, 1 for leading zero. +3. **CNT WIDTH:** Width of the output signal containing the zero count. + +The input signal is the vector to be counted, and the output represents the count of trailing/leading zeros. If all bits in the input vector are zero, it will also be indicated. + +When initializing the module, the width of the input vector is set to the number of shared TLB ways. The trailing zero counter mode is selected. The vector of valid bits is set as the input vector, but with negation. This is because we want the index of the first non-valid entry, and LZC returns the count of trailing zeros, which actually corresponds to the index of the first occurrence of 1 from the least significant bit (LSB). if there is at least one non-valid entry, that entry is opted for the replacement, and if not then this is signaled by LZC. + +.. figure:: _static/LZC.png + :name: **Figure 17:** Replacement of First invalid entry. + :align: center + :width: 60% + :alt: LZC + + **Figure 17:** Replacement of First invalid entry. + +.. raw:: html + + Random replacement policy + +If all ways are valid, a random replacement policy is employed for the replacement process. The Linear Feedback Shift Register (LFSR) is utilized to select the replacement entry randomly. LFSR is commonly used in generating sequences of pseudo-random numbers. When the enable signal is active, the current state of the LFSR undergoes a transformation. Specifically, the state is shifted right by one bit, and the result is combined with a predetermined masking pattern. This masking pattern is derived from the predefined “Masks” array, introducing a non-linear behavior to the sequence generation of the LFSR. The masking process involves XOR operations between the shifted state bits and specific pattern bits, contributing to the complexity and unpredictability of the generated sequence. + +.. figure:: _static/RR.png + :name: **Figure 18:** Entry selection for replacement using LFSR + :align: center + :width: 95% + :alt: RR + + **Figure 18:** Entry selection for replacement using LFSR + +----------------- +Page Table Walker +----------------- + +The "CVA6 Page Table Walker (PTW)" is a hardware module designed to facilitate the translation of virtual addresses into physical addresses, a crucial task in memory access management. The Hypervisor extension specifies a new translation stage (G-stage) to translate guest-physical addresses into host-physical addresses. + +.. figure:: _static/ptw_in_out.png + :name: **Figure 19:** Input and Outputs of Page Table Walker + :align: center + :width: 100% + :alt: ptw_in_out + + **Figure 19:** Input and Outputs of Page Table Walker + +.. raw:: html + + Operation of PTW Module + +The PTW module operates through various states, each with its specific function, such as handling memory access requests, validating page table entries, and responding to errors. + +.. raw:: html + + Key Features and Capabilities + +Key features of this PTW module include support for multiple levels of page tables (PtLevels), accommodating instruction and data page table walks. It rigorously validates and verifies page table entries (PTEs) to ensure translation accuracy and adherence to access permissions. This module seamlessly integrates with the CVA6 processor's memory management unit (MMU), which governs memory access control. It also takes into account global mapping, access flags, and privilege levels during the translation process, ensuring that memory access adheres to the processor's security and privilege settings. + +.. raw:: html + + Exception Handling + +In addition to its translation capabilities, the PTW module is equipped to detect and manage errors, including page-fault exceptions and access exceptions, contributing to the robustness of the memory access system. It works harmoniously with physical memory protection (PMP) configurations, a critical aspect of modern processors' memory security. Moreover, the module efficiently processes virtual addresses, generating corresponding physical addresses, all while maintaining speculative translation, a feature essential for preserving processor performance during memory access operations. + +.. raw:: html + + Signal Description + +.. raw:: html + +

Table 12: Signal Description of PTW

+ +.. list-table:: + :header-rows: 1 + + * - Signal + - IO + - Connection + - Type + - Description + + * - ``clk_i`` + - in + - Subsystem + - logic + - Subsystem Clock + + * - ``rst_ni`` + - in + - Subsystem + - logic + - Asynchronous reset active low + + * - ``flush_i`` + - in + - Controller + - logic + - Sfence Committed + + * - ``ptw_active_o`` + - out + - MMU + - logic + - Output signal indicating whether the Page Table Walker (PTW) is currently active + + * - ``walking_instr_o`` + - out + - MMU + - logic + - Indicating it's an instruction page table walk or not + + * - ``ptw_error_o`` + - out + - MMU + - logic + - Output signal indicating that an error occurred during PTW operation + + * - ``ptw_error_at_g_st_o`` + - out + - MMU + - logic + - Output signal indicating that an error occurred during PTW operation at the G stage + + * - ``ptw_err_at_g_int_st_o`` + - out + - MMU + - logic + - Output signal indicating that an error occurred during PTW operation at the G stage during S stage + + * - ``ptw_access_exception_o`` + - out + - MMU + - logic + - Output signal indicating that a PMP (Physical Memory Protection) access exception occurred during PTW operation. + + * - ``enable_translation_i`` + - in + - CSR RegFile + - logic + - Enables address translation request for instruction + + * - ``enable_g_translation_i`` + - in + - CSR RegFile + - logic + - Enables virtual memory translation for instrucionts + + * - ``en_ld_st_translation_i`` + - in + - CSR RegFile + - logic + - Enables address translation request for load or store + + * - ``en_ld_st_g_translation_i`` + - in + - CSR RegFile + - logic + - Enables virtual memory translation for load or store + + * - ``v_i`` + - in + - CSR RegFile + - logic + - Virtualization mode state + + * - ``ld_st_v_i`` + - in + - CSR RegFile + - logic + - Virtualization mode state + + * - ``hlvx_inst_i`` + - in + - Store / Load Unit + - logic + - Indicates that Instruction is a hypervisor load store with execute permissions + + * - ``lsu_is_store_i`` + - in + - Store Unit + - logic + - Input signal indicating whether the translation was triggered by a store operation. + + * - ``req_port_i`` + - in + - Cache Subsystem + - dcache_req_o_t + - D Cache Data Requests + + * - ``req_port_o`` + - out + - Cache Subsystem / Perf Counter + - dcache_req_u_t + - D Cache Data Response + + * - ``shared_tlb_update_o`` + - out + - Shared TLB + - tlb_update_cva6_t + - Updated tag and content of shared TLB + + * - ``update_vaddr_o`` + - out + - MMU + - logic[VLEN-1:0] + - Updated VADDR from shared TLB + + * - ``asid_i`` + - in + - CSR RegFile + - logic [ASIDW-1:0] + - ASID for the lookup + + * - ``vs_asid_i`` + - in + - CSR RegFile + - logic [ASIDW-1:0] + - ASID for the lookup for virtual supervisor when Hypervisor extension is enabled + + * - ``vmid_i`` + - in + - CSR RegFile + - logic [VMIDW-1:0] + - VMID for the lookup when Hypervisor extension is enabled + + * - ``shared_tlb_access_i`` + - in + - Shared TLB + - logic + - Access request of shared TLB + + * - ``shared_tlb_hit_i`` + - in + - Shared TLB + - logic + - Indicate shared TLB hit + + * - ``shared_tlb_vaddr_i`` + - in + - Shared TLB + - logic[VLEN-1:0] + - Virtual Address from shared TLB + + * - ``itlb_req_i`` + - in + - Shared TLB + - logic + - Indicate request to ITLB + + * - ``satp_ppn_i`` + - in + - CSR RegFile + - logic [PPNW-1:0] + - PPN of top level page table from SATP register + + * - ``vsatp_ppn_i`` + - in + - CSR RegFile + - logic [PPNW-1:0] + - PPN of top level page table from VSATP register when Hypervisor extension is enabled + + * - ``hgatp_ppn_i`` + - in + - CSR RegFile + - logic [PPNW-1:0] + - PPN of top level page table from HGATP register when Hypervisor extension is enabled + + * - ``mxr_i`` + - in + - CSR RegFile + - logic + - Make Executable Readable bit in xSTATUS CSR register + + * - ``vmxr_i`` + - in + - CSR RegFile + - logic + - Virtual Make Executable Readable bit in xSTATUS CSR register for virtual supervisor when Hypervisor extension is enabled. + + * - ``shared_tlb_miss_o`` + - out + - OPEN + - logic + - Indicate a shared TLB miss + + * - ``pmpcfg_i`` + - in + - CSR RegFile + - pmpcfg_t[15:0] + - PMP configuration + + * - ``pmpaddr_i`` + - in + - CSR RegFile + - logic[15:0][PLEN-3:0] + - PMP Address + + * - ``bad_paddr_o`` + - out + - MMU + - logic[PLEN-1:0] + - Bad Physical Address in case of access exception + + * - ``bad_gpaddr_o`` + - out + - MMU + - logic[GPLEN-1:0] + - Bad Guest Physical Address in case of access exception when Hypervisor is enabled. + +.. raw:: html + + Struct Description + +.. raw:: html + +

Table 13: D Cache Response Struct (dcache_req_i_t)

+ +.. list-table:: + :header-rows: 1 + + * - Signal + - Type + - Description + + * - ``address_index`` + - logic [DCACHE_INDEX_WIDTH-1:0] + - Index of the Dcache Line + + * - ``address_tag`` + - logic [DCACHE_TAG_WIDTH-1:0] + - Tag of the Dcache Line + + * - ``data_wdata`` + - xlen_t + - Data to write in the Dcache + + * - ``data_wuser`` + - logic [DCACHE_USER_WIDTH-1:0] + - data_wuser + + * - ``data_req`` + - logic + - Data Request + + * - ``data_we`` + - logic + - Data Write enabled + + * - ``data_be`` + - logic [(XLEN/8)-1:0] + - Data Byte enable + + * - ``data_size`` + - logic [1:0] + - Size of data + + * - ``data_id`` + - logic [DCACHE_TID_WIDTH-1:0] + - Data ID + + * - ``kill_req`` + - logic + - Kill the D cache request + + * - ``tag_valid`` + - logic + - Indicate that teh tag is valid + +.. raw:: html + +

Table 14: D Cache Request Struct (dcache_req_o_t)

+ +.. list-table:: + :header-rows: 1 + + * - Signal + - Type + - Description + + * - ``data_gnt`` + - logic + - Grant of data is given in response to the data request + + * - ``data_rvalid`` + - logic + - Indicate that data is valid which is sent by D cache + + * - ``data_rid`` + - logic [DCACHE_TID_WIDTH-1:0] + - Requested data ID + + * - ``data_rdata`` + - xlen_t + - Data from D cache + + * - ``data_ruser`` + - logic [DCACHE_USER_WIDTH-1:0] + - Requested data user + +.. raw:: html + + PTW State Machine + +Page Table Walker is implemented as a finite state machine. It listens to shared TLB for incoming translation requests. If there is a shared TLB miss, it saves the virtual address and starts the page table walk. Page table walker transitions between 7 states in CVA6. + +* **IDLE:** The initial state where the PTW is awaiting a trigger, often a Shared TLB miss, to initiate a memory access request. In the case of the Hypervisor extension, the stage to which the translation belongs is determined by the enable_translation_XX and en_ld_st_translation_XX signals. There are 3 possible stages: (i) S-Stage - the PTW current state is translating a guest-virtual address into a guest-physical address; (ii) G-Stage Intermed - the PTW current state is translating memory access made from the VS-Stage during the walk to host-physical address; and (iii) G-Stage Final - the PTW current state is translating the final output address from VS-Stage into a host-physical address. When Hypervisor is not enabled PTW is always in S_STAGE. +* **WAIT_GRANT:** Request memory access and wait for data grant +* **PTE_LOOKUP:** Once granted access, the PTW examines the valid Page Table Entry (PTE), checking attributes to determine the appropriate course of action. Depending on the STAGE determined in the previous state, pptr and other atributes are updated accordingly. +* **PROPAGATE_ERROR:** If the PTE is invalid, this state handles the propagation of an error, often leading to a page-fault exception due to non-compliance with access conditions. +* **PROPAGATE_ACCESS_ERROR:** Propagate access fault if access is not allowed from a PMP perspective +* **WAIT_RVALID:** After processing a PTE, the PTW waits for a valid data signal, indicating that relevant data is ready for further processing. +* **LATENCY:** Introduces a delay to account for synchronization or timing requirements between states. + +The next figure shows the state diagram of the PTW FSM. The blue lines correspond to transitions that exist only when hypervisor extension is enabled. + +.. figure:: _static/ptw_state_diagram.png + :name: **Figure 20:** State Machine Diagram of CVA6 PTW + :align: center + :width: 95% + :alt: ptw_state_diagram + + **Figure 20:** State Machine Diagram of CVA6 PTW + +.. raw:: html + + IDLE state + +In the IDLE state of the Page Table Walker (PTW) finite state machine, the system awaits a trigger to initiate the page table walk process. This trigger is often prompted by a Shared Translation Lookaside Buffer (TLB) miss, indicating that the required translation is not present in the shared TLB cache. The PTW's behavior in this state is explained as follows: + +1. The top-most page table is selected for the page table walk. In all configurations, the walk starts at level 0. +2. In the IDLE state, translations are assumed to be invalid in all addressing spaces. +3. The signal indicating the instruction page table walk is set to 0. +4. A conditional check is performed: if there is a shared TLB access request and the entry is not found in the shared TLB (indicating a shared TLB miss), the following steps are executed: + + a. The address of the desired Page Table Entry within the level 0 page table is calculated by multiplying the Physical Page Number (PPN) of the level 0 page table from the SATP register by the page size. This result is then added to the product of the Virtual Page Number, and the size of a page table entry. Depending on the translation indicated by enable_translation_XX, en_ld_st_translation_XX and v_i signals, the corresponding register (satp_ppn_i, vsatp_ppn_i or hgatp_ppn_i) and bits of the VPN are used. + +.. figure:: _static/ptw_nlvl.png + :name: **Figure 27:** Address of desired PTE at next level of Page Table + :align: center + :width: 70% + :alt: ptw_nlvl + + **Figure 21:** Address of desired PTE at next level of Page Table + + +.. _example: + + b. The signal indicating whether it's an instruction page table walk is updated based on the itlb_req_i signal. + c. The ASID, VMID and virtual address are saved for the page table walk. + d. A shared TLB miss is indicated. + +.. raw:: html + + WAIT GRANT state + +In the **WAIT_GRANT** state of the Page Table Walker's finite state machine, a data request is sent to retrieve memory information. It waits for a data grant signal from the Dcache controller, remaining in this state until granted. Once granted, it activates a tag valid signal, marking data validity. The state then transitions to "PTE_LOOKUP" for page table entry lookup. + +.. raw:: html + + PTE LOOKUP state + +In the **PTE_LOOKUP** state of the Page Table Walker (PTW) finite state machine, the PTW performs the actual lookup and evaluation of the page table entry (PTE) based on the virtual address translation. The behavior and operations performed in this state are detailed as follows: + +1. The state waits for a valid signal indicating that the data from the memory subsystem, specifically the page table entry, is available for processing. +2. Upon receiving the valid signal, the PTW proceeds with examining the retrieved page table entry to determine its properties and validity. +3. The state checks if the global mapping bit in the PTE is set, and if so, sets the global mapping signal to indicate that the translation applies globally across all address spaces. +4. The state distinguishes between two cases: Invalid PTE and Valid PTE. + + a. If the valid bit of the PTE is not set, or if the PTE has reserved RWX field encodings, it signifies an Invalid PTE. In such cases, the state transitions to the "PROPAGATE_ERROR" state, indicating a page-fault exception due to an invalid translation. + +.. figure:: _static/ptw_pte_1.png + :name: **Figure 22:** Invalid PTE and reserved RWX encoding leads to page fault + :align: center + :width: 70% + :alt: ptw_pte_1 + + **Figure 22:** Invalid PTE and reserved RWX encoding leads to page fault + +.. _example1: + + b. If the PTE is valid, by default, the state advances to the "LATENCY" state, indicating a period of processing latency. Additionally, if the "read" flag (pte.r) or the "execute" flag (pte.x) is set, the PTE is considered valid. + +5. Within the Valid PTE scenario, the ptw_stage is checked to decide the next state. When no Hypervisor Extension is used, the stage is always S_STAGE and has no impact on the progress of the table walk. However, when the Hypervisor Extension is used, if the stage is not the G_FINAL_STAGE, it has to continue advancing the different stages before proceeding with the translation (nested translation). The next diagram shows the evolution of ptw_stage through the nested translation process: + +.. figure:: _static/nested_translation.png + :name: **Figure 23:** Nested translation: ptw_stage + :align: center + :width: 90% + :alt: ptw_stage + + **Figure 23:** Nested translation: ptw_stage + + In this case (valid PTE), the state machine goes back to WAIT_GRANT state. Afterwards, the state performs further checks based on whether the translation is intended for instruction fetching or data access: + + a. For instruction page table walk, if the page is not executable (pte.x is not set) or not marked as accessible (pte.a is not set), the state transitions to the "PROPAGATE_ERROR" state. Otherwise, the translation is valid. In case that the Hypervisor Extension is enabled, a valid translation requires being in the G_FINAL_STAGE, or the G stage being disabled. + +.. figure:: _static/ptw_iptw.png + :name: **Figure 24:** For Instruction Page Table Walk + :align: center + :width: 70% + :alt: ptw_iptw + + **Figure 24:** For Instruction Page Table Walk + +.. _example2: + + b. For data page table walk, the state checks if the page is readable (pte.r is set) or if the page is executable only but made readable by setting the MXR bit in xSTATUS CSR register. If either condition is met, it indicates a valid translation. If not, the state transitions to the "PROPAGATE_ERROR" state. When Hypervisor Extension is enabled, a valid translation also requires that it is in the G_FINAL_STAGE or the G stage is not enabled. + +.. figure:: _static/ptw_dptw.png + :name: **Figure 25:** Data Access Page Table Walk + :width: 70% + :alt: ptw_dptw + + **Figure 25:** Data Access Page Table Walk + +.. _example3: + + c. If the access is intended for storing data, additional checks are performed: If the page is not writable (pte.w is not set) or if it is not marked as dirty (pte.d is not set), the state transitions to the "PROPAGATE_ERROR" state. + +.. figure:: _static/ptw_dptw_s.png + :name: **Figure 26:** Data Access Page Table Walk, Store requested + :align: center + :width: 70% + :alt: ptw_dptw_s + + **Figure 26:** Data Access Page Table Walk, Store requested + +6. The state also checks for potential misalignment issues in the translation: If the current page table level is the first level and if the PPN in PTE is not zero, it indicates a misaligned superpage, leading to a transition to the "PROPAGATE_ERROR" state. + +.. figure:: _static/ptw_mis_sup.png + :name: **Figure 27:** Misaligned Superpage Check + :align: center + :width: 70% + :alt: ptw_mis_sup + + **Figure 27:** Misaligned Superpage Check + +7. If the PTE is valid but the page is neither readable nor executable, the PTW recognizes the PTE as a pointer to the next level of the page table, indicating that additional translation information can be found in the referenced page table at a lower level. +8. If the current page table level is not the last level, the PTW proceeds to switch to the next level page table, updating the next level pointer and calculating the address for the next page table entry using the Physical Page Number from the PTE and the index from virtual address. Depending on the level and ptw_stage, the pptr is updated accordingly. +9. The state then transitions to the "WAIT_GRANT" state, indicating that the PTW is awaiting the grant signal to proceed with requesting the next level page table entry. If Hypervisor Extension is used and the page has already been accessed, is dirty or is accessible only in user mode, the state goes to PROPAGATE_ERROR. +10. If the current level is already the last level, an error is flagged, and the state transitions to the "PROPAGATE_ERROR" state, signifying an unexpected situation where the PTW is already at the last level page table. +11. If the translation access is found to be restricted by the Physical Memory Protection (PMP) settings (allow_access is false), the state updates the shared TLB update signal to indicate that the TLB entry should not be updated. Additionally, the saved address for the page table walk is restored to its previous value, and the state transitions to the "PROPAGATE_ACCESS_ERROR" state. +12. Lastly, if the data request for the page table entry was granted, the state indicates to the cache subsystem that the tag associated with the data is now valid. + +.. figure:: _static/ptw_pte_flowchart.png + :name: **28:** Flow Chart of PTE LOOKUP State + :align: center + :alt: ptw_pte_flowchart + + **Figure 28:** Flow Chart of PTE LOOKUP State + +.. raw:: html + + PROPAGATE ERROR state + +This state indicates a detected error in the page table walk process, and an error signal is asserted to indicate the Page Table Walker's error condition, triggering a transition to the "LATENCY" state for error signal propagation. + +.. raw:: html + + PROPAGATE ACCESS ERROR state + +This state indicates a detected access error in the page table walk process, and an access error signal is asserted to indicate the Page Table Walker's access error condition, triggering a transition to the "LATENCY" state for access error signal propagation. + +.. raw:: html + + WAIT RVALID state + +This state waits until it gets the "read valid" signal, and when it does, it's ready to start a new page table walk. + +.. raw:: html + + LATENCY state + +The LATENCY state introduces a latency period to allow for necessary system actions or signals to stabilize. After the latency period, the FSM transitions back to the IDLE state, indicating that the system is prepared for a new translation request. + +.. raw:: html + + Flush Scenario + +The first step when a flush is triggered is to check whether the Page Table Entry (PTE) lookup process is currently in progress. If the PTW (Page Table Walker) module is indeed in the middle of a PTE lookup operation, the code then proceeds to evaluate a specific aspect of this operation. + +* **Check for Data Validity (rvalid):** Within the PTE lookup operation, it's important to ensure that the data being used for the translation is valid. In other words, the code checks whether the "rvalid" signal (which likely indicates the validity of the data) is not active. If the data is not yet valid, it implies that the PTW module is waiting for the data to become valid before completing the lookup. In such a case, the code takes appropriate action to wait for the data to become valid before proceeding further. + +* **Check for Waiting on Grant:** The second condition the code checks for during a flush scenario is whether the PTW module is currently waiting for a "grant." This "grant" signal is typically used to indicate permission or authorization to proceed with an operation. If the PTW module is indeed in a state of waiting for this grant signal, it implies that it requires authorization before continuing its task. + + * **Waiting for Grant:** If the PTW module is in a state of waiting for the grant signal, the code ensures that it continues to wait for the grant signal to be asserted before proceeding further. + +* **Return to Idle State if Neither Condition is Met:** After evaluating the above two conditions, the code determines whether either of these conditions is true. If neither of these conditions applies, it suggests that the PTW module can return to its idle state, indicating that it can continue normal operations without any dependencies on the flush condition. + diff --git a/docs/03_cva6_design/_static/LZC.png b/docs/03_cva6_design/_static/LZC.png new file mode 100644 index 0000000000000000000000000000000000000000..9fdae0cf18cb64b62d3b1730f4cc880e52dd800f GIT binary patch literal 52819 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

t+(l_4HK+= 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

YutLdOpdD67cKFv@wJ`Om!3Xnc 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 literal 0 HcmV?d00001 diff --git a/docs/03_cva6_design/_static/cva6_tlb_hit.png b/docs/03_cva6_design/_static/cva6_tlb_hit.png new file mode 100644 index 0000000000000000000000000000000000000000..14b63d752d589c078108d917a2c7cf638591db3d GIT binary patch literal 78362 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

MW9PXpXZeYh96Y>|F8}P+Hw_in-!{p{JC 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 SGq4#l0D-5gpUXO@geCy$m0(%` literal 0 HcmV?d00001 diff --git a/docs/03_cva6_design/_static/in_out_tlb.png b/docs/03_cva6_design/_static/in_out_tlb.png new file mode 100644 index 0000000000000000000000000000000000000000..4d32048137f99c257c3128133b3ef2f47923bf19 GIT binary patch literal 64648 zcmeFa2V7Ijx;G37fl!oCq)7=KsR^O?UKHsnHXxJ$QbI4%Av7t{6i}L=f{GMT0i^~6 z5mc~%qI47#l_p)_U7;xIKIh)=z1#C{@25YvJDD|W$}|6Y`b=UB^|g0Uuuu>Y5$({` z(J&?=0z-(1h&iF8K#6Dzl`9dEx0a`-nWwWa#=*&!h!>^4@rhR)VUP9j$n0l|E_gH zfr&NR>F3fz4mO_l8+BzQH-|^4tz+w8XTQ}mu(TVabVhGg-YoF2N84b1Hr`(^+P*9s zgxn&hI~EJHw{6w7Ki;b3?5l3;M4ZAX!>r13^Od2N!HS6s>on5vqMgE#Qej_}dc9qr=bg!UxBTU-k5>>WI9O^+^GfNumA;Nj_xb+p~W1+dZ7FjyB)lg-w)zH6bK z9h?aGH+66Zpe&BixAg)3HO4xlfepOz$_DO{62NySw3V%s8rs^?Zhb83SSPGI@Ujcm z1sDWC0>XfS?eA&3xyk-w>DG(>J$}BSNZS_cZ0qUn2Q<6cq6Fa~p_{EuE4}&M=i3fI zN^O?eZ$rO0YO@f%x$Eq{woPd6zk^Jm&L*(`{rCy2{|Eg43(#%SXB+4+PF^1N77iP8 z+_v@rNeKY_X@P%O0zmdS{ZNE6Eb+g#n!N!IFu)oC9_lWx+ z0*HXQ|MvhwB4xe@kklsA-v*#9sBFj27SsPH!3O~D`i}d?vpg(3JS}Wp&{n{bu0Q(& zp}(I8{Rkm(q=cv>Quf=QO@#f1h?4#ZQBGbK-e?;e_dh)8*9kQwpyO{BYA6XwQRz)> z`u777peg*wmH-eDG@d^g`jr^k)NeKwBNPhpJ7Z{5C~wn@)&b;+wXm|aSXYv4|G?=N z>e)ZCBylOJ-x*F@u8D7&(uPp`gC{^K-(=Un)NcC;PcpKNu~8)? zegNTEYbUgahl4f1^0&owzmKlOTV?LHgtQ6o&D4s`MgOZ< z>VIbl-v(lcbpTSKzGerYWWINTBV~T*$ph=IuS-a^jznJ$3*5CyV7*Ei~K2%b$ox{bvUrd1LWWV>2m9Nawlv(J^eOwJJDXA*zX0ht*?Wp8Bh};DhWIwd^^1P9^tbF zfzX6py!9^x0YLb&LE&E_Z2vP-R0>FE*_gzZOcURfaa%&{?-!&0b)Ubl;FSDXGt~9) z0Mbke0+W#A`$u;EDh{~GR5x)fF7uapHBy__-*&zAADHeZwJG?w>0dt~=Z}E_Fkyfy zKdAlNbAA84HvC^``zYxjWvbL)hK+t5qm)2ya+57gqyGH}eqXjJ^>g6i58lQ9(+2gA z98~&i?BN$;oUjWC_T(1EWn@GVGTUtGO)Yk71ivxHe>RD>4ue<$AJz|@Xt`sZw+aCl zz}NDhHp3s2`xlwq$W3+l_p_R|T=L)P3>(LqzT!yN#nsCbIQz3v{0Cth`|8&oV-iPv zuSX#N0%9_o`rbcXE&VxmvW2Cu5Hs-d{DZOo^ieq})c3L*2^=T>(fRYcVC-iL`X`K; z0_T_iu(1E!NlfXV;PtbV{9WMnb7bQuEe>2Kl_l8lA^Mk*4lPy1=!)DTUOkbuD;zAC#d=V z^?~s9u-D%i$dcOhW`3s>5zLM4zU6O`+Rf9=HfRs~^~2YM#n`s?-}{(1X!T2+zuUCW zEhBI{vA4?pGd^N*iSJD`iLJW@w$}OYcM<>CC30)VTV4LXX5iK#_HBq16a)b2#+SF_V}N=$LB|7PF(UY&lmsYRX+bj`TAE5iXTjh zf070HpE4kk2ysz_^tQ;&rcZOzm_$m-h)Qf~P}|I#e_>7nN2(B;l4y(R{R6DYtrXL3 zyyGXW>i@q>|Gn?vzrHBvUo5?ZxTyFKLBD^((r=>q&(eQ?NgEP@0(SlPOD~NO75^&@ z_%9tt5`>(FjradaJN;)SzkmOMpEmm+6Y6g=p(KEtL%&B63IN8IuC`5H{3Z!pGC#YS zfs@&G8>b(E=*18E!XF&{O*r~75GKBL{&5?G{wjt3Te9Fki3$Dey#B+4fUWXf-rwKo z2$bGJ#@F}<5YzZM0`i-%AlaWa7Q)?Z*4DNj9)Hft{yG%>c>NIyFns<(kZoaYyPN4B zXzgyr`nKu40E&QXu7R+Gr^O#h_RE;jPm&BUiMQ;c-%*%tUBSK$NP>a{o#+pk2+H8E z4em>AsX<>Q8|wE4)24a34NL%(96T%t7vcZmO21CHNuf5iiY*{XBY$ro{hZMV013Em z{||_MC5XO{mx^y$%fF>u``J_EgP)Tn6#`>e#>!@oYGRwn;M+ zAfs?SAIMZs?T@$UR~h_U_a|-&vwwl2-^1PqeoN{n6#aypKf$T>95TX%>5`k|+9q>; zr+}3BR(Nz9)A+O800lO}&>N)K+SkA>ivRuP1`?UKuD|)`_=3d|e|370U^s3|Wd0}Z zZV@Dq#I$um#;-MQrGGeJB@Tq1k^k-84O~u+{KsV)h;IeM{@w2Wa{<72dcj|9*1z=v z02E60D;wGB?C;OS`|;5KU-kOiX1{+u3;74v+x`Ck+4NG>RvOcmc$EESJpDpk|7fzw z0wMq3ihP)quY7T`qQmnI^B4%`2yjWV>f;uv)=9c6Cxrwk*oqa}rDBxdqJ z)wRNs^ON&!H1dY(>dpzSUcU0a_b}CSiyYb`5zv@%;*<*w`y&^vcs-EFLzKZgrlGE>bG`o#)gS#wl?5x z@CRrVQ^rOe@zQ!}%mV45*FD$Naci0r?}7q9QBSORx(G*H$~Z2QGy(gGm{2a>sp+jM+0li=d;E_l>)(nEd-<#+3J1nl}R-Oi9Q|-~*?ypr!AHk=N}i?4)m>H_St$DCH^Twd#T` zlJARJuv7KgD8AHXhLXWL{@7T2&e%7ftXb=15Osy{>>iDZ z0ApX{O7(j4l~hC(qAnzU>1v4K3yp!h{UTPm$LWhMe;g&3CO4qWp);&ogYoT3zoa?4 zs#7mA6BqJ+X#O5aoZus7-eUrmI)i8?j*sd*uf;wH!bpcOq|=Df?47IO^<YQe;^==6Iz;9dSz%O zz=!5eP1s~s+~}H73vyq=g}aHRxhj>;bi2c-&YziZk>OEbTApDYyo>+X+5cjf3k~>V z-T+xoZCwcZahx#fGBm^|pYem#N)xX~YKRc2F>xOel@N{y58|dUAZ8B}gEF}n9%eyR zR=UDqE*Lm9cv)*=m~obl80Jqg34hH$P+W5ij!C2jV_X(Sl}*x32Go<8LAdu_AdZe` z69tPA!GsV z4m*0b6+2A@vsj;F2qMM{f;rHC!a4>_Q2&K+jXO-_R3M;D=jfybD%=KT5V<<(nLwv<_uv zQ#%b+#XoF|LX4L02t`~AX$hHU!jeoZgYdn6a__AluJeps8Y+a}sfUeC{EIGb@(1c* zQV)6d^dI%5z|bJ(T6;&9<8%vxHTxBD4bv<4M!G#g=we(QB4)3E78WV4AB4%VRtA2vy|gPppADSREEobItq_KXlFeONQ)i@v!|(l|l$E*a)X zJr|5oh8u6t&ipt*%`XWcYc0m-ZI2BowSmb-?^Kgn-+`;e;kr^7OipCCgCOynx*~+R zWhBlg7EyT#qC`K1p%K;4<19NLZGs<`iDU&;A0FXEJXLq0;?!uLgexsf@>w*b={E|9E4cDxFKEocrFe)EAk>&=%hmefO_@qoQE4-?pXt&DYNo3lWl*XJt zOzwpaqbN&!6W}CQJ>2v#N6eB*`qmU%LPaD@L;+Q%JvzL^<{xsOVOmk3XqW-nAxM$l z8Kr`;v_A84FMYG37K83?x5izOf^Xgwe0f>{F%^qsa=C`3z;SZ2%bdMo$mCkt>M{v1 z)i^4+sh@O4Jm*_?{?K_Eno~mF!1^&#`47otKo%T6?-YN9CzEQSTaIaip;di%bI=B; zOmgbkcgmovRcS#Frna@0yZb(c5I&3SbR&1kG$% zNLoni^D=yvQ8&Uk<0FSyBEL$ZV5A^gWTcelf!Y`~r>1Y&luL@hz93dV*TawaO}&qX z2FOo;D7-p)cyg#ee(x+GoQxaaJi^!ziP29;aXfR`=)sco!6TJpTz3`GRUcNo*G@Er zXsX7OK0Qq1@a^nrij$9!kQt#`A0t~ z*ACP!%xyI*;HtWl*pJjygo|Tl|5Gc{$cG`C4W-QUE2l6aHojLalL9oDk4ta03%n(f zO&lB6TnCEh28QaU{)tR#Qwm#>-a%R#b;NT{lKtJIPnM(zj1bb^UzCD8g&ra^X zWa8PQSCjR=oC0Hs=?&H&)E#UHTON8fYB!)P7jaAA^;bk=?{9VzUH~32 z5ra>Uy?&|XT5BNrbsn@#r2=CgZ$)c1Jd#_v-6uLosCmDko=R?RK1@?}=aYcK%|V0~ zQJK-(*uGzBxtC`t>&)K&iZ|da@JyD8>5?_aZGrm@>C{{8CWZrqW3{=(dIA^&R;i8Z z^8;WJOWGF|wy4Vt^m|{$7|+Q7shN6P-mX#twEp=)=HrdcOpHnl1)8AZIZXdqEBUcF zIM4=Ig3~rj##@Wo1JG#fV^(QFu5=$Tj~OZQts6d{WX)16z*ZV))v z8yM{~7o8QA@5|vF02+RM^@r92{3l0h&dN^T3|o?hc12 zM||55j-*a6ycr-4v+q9cDV(jlx6EFAoW8xF<}P#}r4P9>-742bXY5XsAmeYH+yFZ9 zWPrRaxKZNWFW1Me^f~bO;$HO8!2m-$H4JuF`KW-ZhELH(lWn0&(d(>U~frm zl;u1wO7E4qkJ6WbZ&Zx{U|1?pI5|FE{EcM5jG!48A!>=O;spRRoyk2+zkl=CbFkG~ZU-Q~gv6QyOK z$!h6Ha6yp%i>ved7WBRmk-!B$ zYtt89Z!4l@*5i0;aPZEG%_CI{^OkafuB)<-c3-!i(yBf`%*r9>PI`)EB5A&QUa0+| ziC@LU_zJDk({Gaz0w%-F2=RDF+X5{iFVGAd7+tE0tG`;oNZBq-cRna$k~=hGg*(rB zN+4kW!r9W?$%(NE@T|wND8|vK9_>onKJtnNWCy#FX_IfT`DvdRM8V{Z(z;1B`p#G& znqiF&AC6Cp@Q7%H^r=32d1N54VRwXGOeFO9eqT*9^%q)|dm@@;Z?1sQ1%(`YqWnBs znFmn!A5zgj4EdOlr(HiU4cQZqvP`)2C&KcbSO` zdL-n;)hlq_sMS zzli4sv4<#rP4ulg$_J zSb8w{Vr3$j9j{9FaXdINlsa%s(WB8j$^wQmG$#G>I70#9r_sQZ)X+pFJW7KJh1ZWQ zl}#qpJBgy!aCwMVd#y2ZGJ_@fVvsq`j|8tC#Gkn*vv;rty++=-vUlm^^Sq-U2h}y> zr8$*wvFH&FktWn!#XFyBV@Ha++7lfUvni!F7xR5=kSoXb4g?<4tvpo!wCQfejY+l( zCZd$BGu4h|E!P;puj->p1?&fM)7~VBP&^Q){S?KlW0xD37xGdEqmE^mqp9UOCZNap z#ZD(YLz^DPg`+WeEgc^~>`q=tC7}<$2nDmN?=S$7GU>Lqzc=opZ3t1-zE4(u`(_>a zZi=jAxrxpoE4=Or@7?TRV63PwrUm%&CV4t(9B-9?5QP}IBcPZembw}5A9{K0#X-1d ze07LCPLY7lmh#f0WE9;`mHKY&kJ2umkRT$c2`X2`GU5TT=A^JFfHLF(>*j?pf0&>w zp~Mv!YLexH)z3QnvDl&*8KE()PZ2kC&nl=dIDM8cn{Pbfr$MasLJqHmx1q6fYP43V zRz|Zm1=Dfi_=&9JN7X+klE~?Y92#n(QQ=8UcG7!6!>Og~JT%4>SL+d}d1``A+_1^F zDqOW!VV;`+=@KcsP z+G-M>MmmL+Q@^nN0YehlO1`xg!oZ5X$_EWtl#bf1_-l+ z$9`Ps9qoH*IacDwe3G$I&!?k7m}AOZmLXNoPlwJ;a-Q~CX|CL3U}Mygnj|{tafCkA z)$lbhs-s!uu0Z91W%Aw&nP_8m3B=6)Jl;Vn9DYD|A;mRa#jo8KGL%9CZug|iQ(2&D zy)8!39_B%Xe8gj*FA8I6l9WkMqB-=~>q;DcMFvwc#@|}eo=Tgio+(-W+4S9Fd}(+{ zw6Ez{SM4=$y6pZFOkp>L2M?GAG|){(xk!INE33sdjm*snIa_wUaGs>P$Alp4o#Eya|-kC^V^|8Ox}=nguy7pO}|>|%<u#I)onPb8TnJ~MMpTL_|Z zV<|sn$~(v(bE^GLOCRyj@C0LFoZ81gmPmzLPo|(veMAglYBC*_q}|-;w2a`m02VE! zU~bdGvBn`i9PbpQCD5!grqW)4!tY3(0>tmrJL_vLfIs4qGxe1hDO+Xpubz9IFf zZZG`GYJ3s@q714dlo-#r==2tq-kQOKEzu0MxPS-L3W2zj{V%9&Fu4clEekCxtt~60 zF#T6N66``wNl$%{i;2h4(8zgQRk5du*U*UbPfpQ2c~Ow!`mNjYls;}Em_>&#@zM4B zLKiIMN1s4>^LENVH$aRaSEuX;0&`am*25c3I!n&-7vx&ZfA+fCKy=N7Tc7;Qu;S=S z!54nY5L@T!$ELLB6vxRS98ub*PaG+V)bkRla2F4$IP=(8tyVxQL`LSurE3h3H>?#} zpC9Dq(lmaEDv|+T&kI=^$JJZG-90y-GAOBDVL)v5gmYi*f5|_x1 z_kxn+bNMmZHkSC{^oVoZatRcgxI+UsE|YMfV%lF=e@F}u38jWIbG?<68hZz?fr; zT(5UfzjOr2ib6r|C(P0lnta?XCV3`T6Av}YKWvvn`?1DqhkAjbGxaH2PZWbwu&842 zbtZ3~o|)iCeypkI$9P zQ1>oz9mi;|)k9MWm0lRjBJXk?)**5PW@;iUXl}T2kCzxj(J)Hhr7U_Fl`;QRh-G<) zC=Q^Fn*IF#hbp3^H+Y`By<@q5=WT()R+YIyWDi~Z<8Ddv3)V(=L`ZO=LKNkNFLl+b z--~4<87LcNT0FGW6dj!tQw^*Xs-$*9M|j|ZlL{9lukKG8QPx+{7zk|C;rEPz(O@R0 z2BzlwA!-X|RZLjcQ8bLJl6qI+QUqgyq>9;a*h^al?<@u}_0)1&X>;|8PgIGMyTd!K zb=5r$nrLye&i9{E>h$%=s6>ZFJn#ItXH3ak$x4Nw-$$ESbWwdy0;XUiE<&-ikbK~a z@yEPeN$Iz6#oeSbT%o0044L_#Ma{*h%?0@P74Nv@H&xF`nqFlq#gPA^W zqi0gE%8iwx&Z<;0-ect4*^b8KR1>VRNt_G_=#*e7j2*p~weE&WG)L>QuhL}c;K%%= z6m@7{<=pOyFY!h(heAiag!sYHChmABm{*UEdKdeZE(i<|$g1JQUha^XH^<$67A0Im1WiKcJ$beConb`W=M$5BNHCv}?Xss|dawl?fyI3XL;|KLg&G;dwVG|64*&|lBq+`R}6OMDAv^DC8 zM$f4q%mnB-LVQ!8a3NMP_Y)vlX$-;?cYx0y1K~ZJ$#L{(m6YY_%8;`C#^PnKP3P4R zh@-)2DmRqkClhu+Xg{a0JiiNL$Fbi#5UcaP;3Q3z#Fr*;!!3t8`bpyfVmMhe7ctZ4 z&*Y6sle?xV7-EZCgQn^4r|3AEQsgf&`q8+&u_01bDT8RJ9w`?P7=0m`cZdNJ&xBF7 zxd#{|I_xU3VW;X|fZr=|$`s|s8|hy$S3B{dnM!VIF13xfI0we5K-_+xn=3tnpVK!} zMNMI94L5I@n*wM8Mvm#)j`LIciG`0>WOAyBrfJMi?XhL=FHP?zVnfb6?teP}WJD7|SAbcJY#Wqlsp zFHwYoWpdgsps8z;6Z2wE!M-=yXvrp(>Uw7KhNiV)PJ;Ur82|mY^wSdr$4X%S6Gm|` z*t$Ls(0(n&4(%6xea=20FPq$e2raYXk}AcEtg1=!QE?%Pr_CRs{LnFRe*C1ve8DtL zHfhCsl%7S|)ok5F418D5`q$DVHu(G1m8MfHFAV9?8=l)56!;XwMJ z1*o;yd=aU5L%_b>a9LHTeZ5wMg@sQqpr5k>`)&l@7B!a!pk;OX-L;HRRlqM{X@rQL zf6y%f#^eS7HBzy9EKj)sPZQNGj+=O(02uGWEZg30HYExAbAc(Gz$*xn zq=!xeGwV1^Z#bcN#fawZ6E458$cs zTIkSuF;itra2n|4cb3)yP6ns?mC7>&n=-lat^T^1=?;u2@w|9WhZr!#rF$1ktVu}$ z+B6JQ&YoHKME~pesgsDKsCOhe^`FQkaH&*ti)uPx6hX=xBNtd>s*1WNKAxc*fO{)31;OD$N&z4%m*`1g+g@OK4X+Hk+sOm;8tBeP07Ie3?~|4SXAm%@ zcZS+Y0KAjq#8`dzWSI!X37NtJemt>ZSL0HbUlJ&LPGKp?8!&Xw5gd*wT6b+8pD;4K zLG0$!t^y(qNMzl9e@N(#dHC3af|~*YZ%QjoFav?WxECT2;4Eg>g~a~EJ3#k_X-P!` z9>6-fcD#Pm3=FKJl5-wBYEvK6EK5E!c!{t*ZmOHCB^;)I796*N+td}u_?d)(uEO7R zAL3vKJ~R&Z_?#f1zXZoDpbQke;ozPxH6vwJG8JB{^Pxu%D{3Zd2Ro&uSsngpQQRt~AD-Qtm#Z3n zd`A10K;a@$+Ts-8{Zx=sAAfa*`IF5nL9lMPTvHxA-q5c%-=5mHcCBZ)^-LvJx`6i-L zmu}~X0d9+wkL<+&{|0CtpR+Ps8B1y5?Ej%;Y=Sak4{q)AB>Q6Ow0LRW9dC1q+iTA6 z-oEZk$6m=flvc6)=`aUj6LDwMnkoULo}PMMny*|u8rYhbyI@puzVnrsmNjE{>B8Y7 zY;~6{vL;-!uHV9P4!&}32{;&>BNX5Q4J_;tA>F0)*@0#XJ=jT1Ctgq-d>avr56tek zt%(~YeNARjOW+o%)~qZqW6#Bg-Pm6gcv$Qu2M!AjcJ>>5a+`5Q{|G(3BB*mE%J%cw z5jT{Nb$Xtq`RoblQ07;v6^&lu!BFj+z0uSO`y;%_dP6D9gAHSv3!-B=D5-a(r%2|N z9l!fgi6gcz!eHmZYHffYL8E?bCQ-~U$q2E{H1jtXdufO3er109=10xi6b6Xqjed75 zAml>tb5rm=;Z2}l6+tX7n+$fPPGxb5-$%A*Tx(^e3oD7n3{nh& z1`Y6Nd>Y9#>%m>0Xtl`iQW#L!Ow+M^rW^#qYN3a%C%p!V(bQ;nG+=b0wXhVv2!!Aw z%;Cg7T1d{R%9DGQ8R^nvUP?#gUYxh)V{5DA;EJPL&2|^Hkbr98gD&rChF0^>Qyxq6 z8LA&+NqIl2gcrht@JI1)0WY2(Nps4u5A7q`T7fUe%=qs3EHBTtr7HP(cmXR|`02%g z+EK!M&zlX)zb8c}+-Br=_V1iX(^T!`hV}LXG71iupH!vRI9^DcqN!}Fxb8>!9vN$! zLYk`{6(Md5@}ZRzH*c4E!xaz%2We_~14MuTE@~?mKyJ-uMI)M349kp~=_S;>?lmdKbx%FbS`w^N|g*5l!GZc&oi zb4Q8poSvX~ReIM#!T>V|efpOX`L`Bq36Jl#<-x_Q!E$}TMt-4?M>PBqi_ggqX2G10 zU$I6WeXRVc1hV>)hLp+Cq5R%4%J9=Rh6+?nAxz%5EJXNYDsc|JV`(RJ+bQUznWDI- z4D_s!9HN;sF@+w!v>3+Qj4lbqvAI>kayehXzB5pG_Q|{`dqr=<^`aHt;j^8?F zZ0`x(39?bt+w-25)T>j^Sb07O7-kS((8?O+py;ObC0^iI4U}-1D(b+_O5VBgUug%LXXqpqXe;v5M?KU1Ylpi6!D}wSnAq4(OA~RT z^y|x2?di%X`ge_WXMs>VT_)^^P7_tbuBtcg1{Y+xgM0d^HG1Vi)@Qn4EY(rIexG1N zR}CM(_fe{6MpYB}M)J`}F}R|iLTQHg5gSnNVuOXfrWT`7vyQ80WC$aoN&g&lX};b6 zDj}wGK)aZ9rMOBUn!n4X+im{|Od&B##NJZL z+aKM{vwImJelJ)C$^iXjBfPV*&CuQCuCXXc0v)xS@z#e%A5TF7Fd2y*h| z!0bfKWvp22gNqRZsSqmmw1d1&DJ`vSU%2V!AJxEMOtAsEutN#c{LL`8`Y7_1VI`-6 zsljKTA4mYMMyBcZ%*oKo)Q~9BeC7SmcxyQL$9$W!m@nO&E4Od?Bx2p*-?(4!3)km^8Y%=(e z0kVs|`l?S&b6&{f_r6xnsX=we2K=oe#%8=2RsuL}zbphbzrcu-l@OyZ=zX3#{@8~q z2{J+&#|Ra|d+VGd8bW238uLY_e;Jk!C08!axykk_R3J?F8X2AJq*3T3FW*HSOTM@( zIS?IT3S;v`H1@WD4o2a$0MlIhVo;+kkf38}SV!X(Y8HsWrr&czfo%z1z7O1{!>iBD z=x^#5(VS|0}RuejZ(&f~m7v((B%*Do|of)AphVOsO`BbUtHTVLKT8BI$VO|9Ml z`l*p?7)4kM1Wv*gCG%}8^XmWD$f&r99mPmI8qstM2ooI`i z%(M%yl$xjl0G$w2M<0PSv^GM}>L2CLn3PFWR`KGfUc&7hJm8`R*psaSM}cTula7X} zZe&+46AavbXTY0RFZQCv`_-0-wh)(hZRbL30iCjgktHz6oXNgYz>+Jbw0BNRR81j9 zCyDx$4kAgT646JBH;C#ym7RM-fT>x)t}+T3yDkHS*_@rjinLwj5}<(;K68D3t$YU~ z#35X_f#yMUih)iaBX3L041Z1>j79EE=nCaAnYvN(-^h)m61<7 zl_#2@8|$D6O0QPnE*B>w!(^iyKtN8Q^_p3a3*eJYyPf|j9gzH!@`eWi&Fz7l_@yyG z*zbu%t6jeHifmnDKb1}(38fdhK0EAAoDC$WksvUoszr|iLDBI9AE3d4T%Hmuhr5H5 z7oO~lm**ojJI`YdzO);NUiUIhuZ98&J_2!K+!Y-gmK;9yWNQX` zGkEO1GiGPc7x^7Du?^)t_=NC}+a=FoWyoGVJN@ zH_QDXlkL5U$CkDQb^w>EY6!*8YKsi?1_zA2|3e?sM99ZB~=0or<&)~LSr7UN%&>@ z2YAPZvB!+hJNU)*m5jgDhK|sCo_KmbtWG$X#kbLF3|CZ8);Gv`iZQ z?l60t)Z4*=e(T}!GlWzI_c-;J{>X!DnU%Tv;^^{Jm4%K>BaZaS2AvBQ0i;g>JCg<8 zf6!%~x@O+%NXx{559E9r%7+Hbf{)DeolYU|u6B0Fa^2sTvgBK>smjsH+IngFi$@Uh zk$tEn1LoBzz4Cdw!o%iZNi3Qk`f1}k;TLcn~LYH2aM(V^({Wm z0I3>ddEEd6xoQR=7gGgvohl3bUMdMX2^pU9wYeDij>_drjxz2`M* zaFIy}r`zq0Pt5kgdt<|v;{4xaUwoT4ps@qWe&;Dk+)N4ymH!70%#hCqgeBA47V=Tb z8FCGC1o=LVd+wk}#ju=GCnwSm{P?Op?;iC-PoE~Qqf-(~?4D#K=A1q^i9^Is?n7hH zV06uxLM`=}*l0HYMM*w<@=_ztRr#EzsrWa4 zoEK7b1f^p7 zY^cUjgw$|6bfz(In~YXj=*xld`7f~YJtGUxdVG}6T7a%SF35Nol`}z1QPq(?8*C2e zPe~8vi%Qq9v5HQfsG~)Ej#;rYj+P0=hfdO3571H2m(cAR^}WGPzqSme!bjN)E45X< z5O#ZEd{byj`$(`{R*GGYrYiewQr{v#L{|YD>yRabrGKa-D+4`rR0l{GXb}PxD^^Ss zaQE!mwe$jBelqTCYB!9RFE*N-*F2?iKW(eP%Y9+YqJxqU4a~T|dbJ?=mv$g}`*^wA z!OL|zsFI(fTJtQi=$d`^-6#ggEPKDP^6_|0;z-5CB)!+LQ;ioNHG)vHxNgg5+$_l~ zRaOBB<(Kb+L5mPQCK0%yZnP_B^-c|LIK!l1`O1+{7@TY8q(p#;3Qq@hZO(mX-($H7 z@5=CToqho=h@{qwye;L0!l2MrJ=*+?0lgCrE4s1@^O)GM*Qq<+k^mN$Igm85O0y=I zNUw2>Ge*^6M;hCkBN?i$*Z9CScTV{o=^7u{2jb3p8HD+ytJQeDjZB$xzmaZqQ^3`O zlcGrLXG?vFjHR{p?bJhPvJ1T{uOA3=j8%J>UU7941*F|Wwq<-yb#q>>tBYd?upyJF z@-$VaRYrC}+DC>!tlYWN@{$a+_>g67-9BO;ZVoWF+b$1&hIG!(*h&L@w7qErTsHo> z-D%pwu@IWa!gMj1cJ^Df(iQKp?o_Vt66n(RpAaE?y{gf4dHT^*_8m!rfB9`f;GjXD zt5LnM!aeq$-GeIaU1=9+@bo1?eLWnt7L(@GHxAQNCHJy+13E3AP>Dcp9FwS`)n_@$ zg9`VYTZF|TvyUz^1D*($m}@dYM`}s5DBWbulb_I>sl?Ho2_W*ID$7s3s;+XgR=O#X zR{E3xob*hk;q6P3*~DTE6(sJAug?KKa#d7I4ZT6HtC8U;q<|YgLE_5*MhH0R5PhnR zOm93fA~DroA>`FUGRAU%;B3sa>W2ea4xqZ-Yy^)~>p0p7!DM6zIfT|VZ+HSEh8r0+ zEik@Y5?O)Y3Fic88$?3^xI}Xi@2|O96ZEZQ%?3+?rrO;*1_tXsk6Lm)3^>85vH+4? zF!{8*8R%r;IH19OnOOJDFZLVHcL2WmAcFo%%@7!$P4J?|+`gP?W1y<5)dPeY0A(-l zE}FExJ_OJlnGg-N0dinT2FSD3I>U6e=tIvqKLGl~cest-qCmjXts@0z64B+whhY z=+63>%3_&9Smpsf|5$7o*F0sBrCeUup8z&K83!fyEhtiW{CR2D z&J_g>CdOV$^&BNVp*WgH^ax-6Q^jrNWw&WxktYp}V)Hywf_P>N8V6OCHHovcUPYuq z6cpWn6C6c*oVbn&+9)PyjU-|))tZkr zv)zO0gtXId@tdoO0+v(vg(93G2ea%Bej!uqnWMWkVKpd0Y<>Qv9o6hd5=;gla`KUIsleNloqk8(@jq^<8YOp#XN|qM`uf>mX3(jy2+y475xx0# z5p>zRRdHtAo)lB5vz5LL#?3cw#Xse+mQyg{^?6ykpIu4`cITG9InHJDWE~+b(((mi zH=TFupHL(fgYlVd2<7whz>8_M+XaJQvPR-PKjJc{LV9s_;0i>&a5MHqZ5Yc_EXm zL#t0&SlRl}%6DPTWRxQz1D*9LYA#UrFf2uz)~KDL%P~(SS%}+tqq@YB5Z9{*$^{Ca zyDp(g>s1^V4EwIqgU1rY97sC)&gUaXgNz{B0^@m{T&vP^_ zBbBZo!`CQ7uWCk9VBW;6joKM=$Jt^-pN~7VFDZ*5miM=>9RR6W8w|FAP{T}1O{>Gq z@JBhWxhW8;0JTs=oI{y5i2)>sZe5ZG$3D{3X+rPoEN(zq>WPJ>Rrbef3AAFdXd$93c6f+U{dQ7w5 zHDjt=`Pz%jV;R6|WM7$y;kM1aoCi;kw!>t1uwWWF7}EV(qMLNIC3qw;rO4bX?h^Vk zrYaiMsqPB8b?rR{ybAC{3)fqvAu7C_Y8YsIgR7P>4AeB|2%)k`cA1hu98J)vujC7e zITqald5}Wu-Y6_HnzUQxMQ2_9F!q@N3H~ssY|&RU`N)xAaL(5a_^p7;UvOk9B!`AdhW#F%VB8q=E-xawP)4F#Ho;A4M(y%sM+MG^h(w5p83c)vs4{IJZyi&+-Ar;fcI`Vw~FR_H~G z3M+zOkDRA|{TvXj;6azvv!PuY!%w`Qu%W;k2LY0)nW?}cc_D&wJkDWV{lm_>%FAxA zUyNlJx$GNW3*9Tllbx-YUNCn6MTq+*6{>Pzj1cybfh$)DLH=19&oyhnyYoeqzFDPV zP`yZJpX}ZTA^O~}!IvTDOmkpo(c6l`af!vtl-(F7y{Zhu<4)0)1AF_if(WSiGvwajVDXNHfSnq@}V_8xBjQsSrI?pM?pMF_R-YXcf| zh`PK=NSm5Gt{UBe!rxZw=^>uwh;~=H0Cd)TFAp9FH(SUzIcg@K;l`wEokYXXmHS@B z@u*?2;UQV`D#SbXN|VFQna}5@r4Cv&9Y2LsPL4#^MyP-o>sqd%-d6Dm33C}2a%WZ; zT?t)!RAiRk+?mo-cCo%a@jSD=II#Bn*;m4HYAlUH;FSkd=qt|<)RN@57){kB6`V!x z@gAMUeDA3i+;Y#S^6XX2B@Kol9mk`NWaVFqGSe%rU!Y4Lw2+^Oac<$bP`Aca`hW{H zcg&+Vv-@I@#5JZHB!1a*d)VUO=knWh^Ka!G;Ap#Hxj)HV$j9^G? z*s;KmQ z8WM@Tlj=fOssl6G*#s1_yUpc*OTctlsmUKIEzKulB1f=m`xNSweIkwA2U& znAab@aW1hdsE|z2W%lGwj`u31J^&+$4coipP>tLxBBOdA20zMxv^UNHX_7Cm zIU6O;$1`_KF+komHRr*pwVAF9A4ov1q`O|O*HfzF;D$Aa`GmMKYBYr7DL}Dli1B#U zb~5nj%E2*Ht{qb5``qcOzWZd10G%UFCU1a;xU)PfB>JV%LV-#pwH1!~(OvG$yc{y9t5<}IJ)Igc zXTyylVSfEWhQQ&a5p_5Mrs5BEaJK#!(r>PoGUO=NSqX0FJFtgTP=um(>3IpM$$rTL zh{cfn$WP@w#<+HmFwSVOg>Z+gL&>AJ_?h(V${9%O}~KkbAt@9p@946xKFR7%)&r;_!^Mw-jHgd&&=xc+O2_fw-fBOdz%Qc*8Ju3 zv^6p>ZcpMV$^1XwI#k+q#L=s!(>Com1Kh^Gq;~0q>kD)g0!@VHO=fVW5^!$B(FL*{5YM+8;~_)q8DJ zkDGX1lQ+Je-CU!==ngCC$_3Dx z4UeReYP4gSD}~8nrZuLaFZtQ9m7tqJwEF6KqN8P0@~B}4za6+wlLq(oRU2m-qL|M_!Bqbb zW#1hQcNewGXrqrldhf&tLK0>45>Y}#H;5JlX@=-Vi(V2$ixNGeheRDUh!)X<(GzX- z&i&2%e&4;{y6b-TuKVAt-iFMZ-QfcnKb%uPB%qNeqHw$hG*^V}Cl>h5mR2=g3 zbE&$rY_oL zH$FCa&}Rk={X6zh&vmm$wM|Ky;Z5Yy8fOYMiQ~>`gu}Q}iDb=e)BS&Vf;2v}?lmmjtftZ2#7LiG78 z_idqp$=e+4`Zibu7iuBdFV2-HDfXubwU>wwgXcg@G_Z->A$ZF`^ohV5m`~#QlWy6N zKwv5{<>&npt!!@9-v!z`>GatK7wjW-HZJp67SzHA3?_tmXq~~H_B`DDi=b?iKE5qO_4v` z>!$?hZ!lTCFgy{Ou=2L@TnHu!Ukt|zs^qK!Ul?~;de#p_=Y%f6onioYYMIBrr=z`a z%{5A-Xj%j4pcVo)@!Gdy{93N*Hyl>C&NMXw8hifNnZksBKtaj-6j`okHpq98v|U*&m2e;(-jJDWo|FP#wmg zZmF6@)USni9SmtEij)NDW-o&9DLt9&4D7MVCmG|bqg3)NktB+c$m=z4+N_hJ!uVs& zOKmzvOICa}QwXQf0fTLa8;K7{{<_2PdXZYVa2)K8{uQOwW*;;%bhnp;hlBnZaoSef zu%LHPQ-o%iJ&{VuI(3f}fr`q(`nvVmZg6-;O6Suia!)`G;Qb(6T&-Q1gq@zv|6rtD z>1y}dJn+l!SL8RE4@P0*ffbFbWU<%jPT99jpEj<9><=j^r8#B$gxJU37LWr1e@L`M ziyZRoPf=*P<9p$Srksmq!S?ThIc$U5HqU>^U}WTS3_hk>`wBPg58mzY3#u8sBRc7n z;w@N@e5tAjvI&~}S?BQYR7yLY~=r8i_(3$3GdXC$ATw|#qK9|@X z^-U@P)^r4)HRWfe`L1QTVQlG=HkW0jwtUltw2DU$x$$*B9e6YU_ z8UmP)KnWB{hacb@@SU-%cWj(e(^v4 zE!(iua;~xqdpg^IO>4af^98^EIP8NI>h(Y_MhS+PIc3SvgJl;gi<6Z>H*jC5=M8i{kng>W#n3emrKy z$e~UVv+;DJ@<)Exi$p#7L2x+#bLu_XQ*EuA6FjMj@@mhBB-af~EmLPTn~s*LSEFd# zq?Av^H}Rg4n4x4oz3>_T@+*%^)QCWF5ZDnG^3>adA_CM>*HptsOO^@8nt>|OACoPa`?$3Y;8g2 z1Gn_6S+5=#edI9LGh#5m`Ku|1j&wgj%VU3tv->J}sB%3oI{dij9B$!%_$yQ*@U*}E zxb^yS0oy@MUD34Hw=ny>WV5`%FpTT|-L2Yoz_X#gR6->>bp>)}%(h;KzaEjK+64IY z1U$Ty0Z#FR?2yF*sNgx_rs6sqKaUy>2;~s553xf@yek04vZi?IM~55)3jqO9TvLU5 zH@K7O=$qk6{CLTj*Jbw4ZZ|`~bRnAIk`)o2T*NR5Rv`O7b2nR_gp{+Vf z(tqdmJb7~BciRtEftQE2paZEPT`ih(G*b&CoT@4o%il?8O_(kC$p$G@IwwYk?vj7K zJ6Dv|b1fCF@Qb`gnl{@0nB_L%^67npI!?E&Ji-RO)(my!R_3i;UtGRVX+fXxLYKL! zz}&lG)!-;gWXr%Lr8=isdi!3py=83kt=ZIu+hz)BQ{;Va2@Vq_A%^G8i*h|vuh$7V zpZP7kG9RFj75o{#>kCns?Ji0S?z?H=V(2;TQWWMx2n5R~&}`K~JmOp3av1nBVeKsu z3Ys%j5O&)2Gds&hQBHtw<@A%Xu$6m_jNwQz>0X*Pc+si{Spb_n%!Q7_S`SMk#Wc!- zg3pIX&%!E8e1RNz159hKCP_7}gf@aFJ^!K+fR-QezUf2YM;#}JY!^Ow3BU|8+FcJ&Bu9Tggkc*;HtZzU2u<#^I;c7htU2FR!9nz44Y zL8g%?Pqx2Xf-+a>LQdUzwig9z&e^|+%?4u5xd0Iz)Yh=XxWxx)kz;;?RP|mV)%RmU z&)39d&_tQP+_9 zp*sZ7iOr%G*xDez^)Ua^CH<=p6CT9 zL56vI3cbTPYsdR3FEZyEGKr`!e19Q$_hNxVL&yH9h}2;7?t#a2Qd+JI*^sUmM<{0#(kERK&Ha4r@06Vo>Cd4J!f-4=)yK6zbKLZ)Fn)q^K+3>1uuhGCBIF zGyDwHeGnK{L`3Tcrb8#U+3}+OBrJ#K4kRsI48AfsaG=EN1OWy9iJ`eE1-EuN?SK-) z#P@I0To@hbfIZP%Llw?9DAf|tleu1YV3= zx%f)`e`%;04A4z{Cg{;jcLEWO6@VcrS;x#%NmMcCmMJ8z(eaQ zP$@K%8^OVXD_SriPiuze?(NoF`zGyVzK;f>U(qZWfl)Q9F3s;22cO4Ra{}925{(Wm zQPb=|G3|ThYUiSaL}i6;tv=VIGJRmtf#%a5NoSX__o{qtq8J$zl`Zl!1A7D*%3mqM zEj5nAclzJxz{_Dn*#juW-=%FoL$;euU`W>D4I6caxFfPOq<>>9;LL#AY}7+n29t8C60` zlBBLM9@P#Hkqjqnl$S20!6X(WJ#yBi|09fG%#a~2zMTJD|EDm6IOlTHsiO|>?6>J= zjG50kSK5nFZ6!}16B$PahjEeKX}vpt3OvOLP2>uzI6&mpm#ea^q%EgEJYF?Zl!@j% zAH3bJLM~1(f3}_vR4rnAb9G;{Ef?^CCW7TvOjsdYV{W{J{@B?nCX#?qX@gV}69F%_ zz>z2;1)@NXu_c3Ok*a}~B%%ItagnzTo-Lknki`c{ey6bHdwEWl;Ymr!qGT=~`IdS# zxxZLPr#sT#v*>r-qgI_HsTmq5HS$e@WOfl)TIzmYO&`<7T2<2V~po8v%7)LaqX zyMJi^QiZmtgeqkWrjf?qej-$TxO98wd`E4GM|13Wumf-IYbcRQgdK0lBGE2dBW#r( zs8LukPtZ)(NZZQ2K0n>#B3t?$pghCa*>*e?iwQ@V2Kr|~FjVNX>1mam}G8-Qn8R5u@Sj zGt-I2Z!)lxpUI7hJBb&+Mu3+Hn~t?(6YS4aFw}0hR9;>`Jn~k(#LX5Le^kiZF4n?vO+c>MfhS!+;%njDEYc+}K>Q^4q zk8X<_(?dc!$U5WY_q1Re1fj4R%^g-|Gw5+of*v&N|n%u zAx`gI3OyYbVrA##DDLY#VY2b_a@NuZ(35r?mO5B}y_ecb@w5RGjtv-?tjRJEM0?gx zIc6*Xi7n-guaWDTUHW~`gAC(?&j+N2P`0W-5pU5jy^DirD)e-Pe*Su7!(M?Hc=LVB z9mwRV9dRhjdVWc9xrErKB;9pL8DHz=(ab-1E${{MxmEfWUR?|wZxbGw+J<50B1tQ% zaP`B)hd`h(KsJ=_TL8IYu%hRu`?sd}(trvzv~Jv76o;cR`ij)g`EKO4lmX^1_(pec zM~FY$k^19q7U0n^3pY*`&zb$Bqzd&BT6E0!)_g2Ua?Rv@U7>eC^^@`#m86EBQy7US zj|cVaETfx=qi#NqOY6{hb1JUudy} zpE80LjMV z>%-51VHz)8zX72GEl=P$9QC^uK%heWkER3>uZ#RU5AE6P%k6vh6;GFQ@iWI@n>}&t ztd>42Z`2ORxPW~eDayVBz`yM1%3M{d+k7$C zf~^Pu#G-7boqY`;9u!Vn>08&MsV(%rVp>=H@sb-&{M65Mo~g##?`D!o$lHO^7N{86B!m{Yqb0%=lS9%hDINa}MpasDV%1hLYM zPf^eXOO??Zf)=Ao~CH&VcP zK&@J5#A*^IAVOi=W^})}?xXw8=vI&mm*Z*t&MO2u09~7giC;>3-Jpgf%e6I@MDPD} z9pLvNYfw5x4E(I#yJgN4YkzCsa=zz%aH*t0u@Hjs5(f(as8*;99qv>kTtlK~SgW@S z=?`EDs;Ua^oQs%+P-?2!;|LC4A?dzk7LB_aay5Hpy1_eRlJ45%DX=eevqP?nzgOx4tVz>Qp!iH1+0^5eNuWbQC$1eDoRlnN zY-!ch)>(V=o`Q+91pn08`j&(6_v$C&pS9iHlS~^qfBB@H{=VOKKdxOHOf%2ZPc|U1 zCY-OWbS6$Fw4zP1!!x3~I2A;o2!TDtKvwi#=KLTk4c-)8`12uCP->!+3TPHH=&=uR z=IIG_(jzb7_KUtCL*|Fj~H;? z!g5F%P!p2@47&;`RlPiS*AA%DYIgeO$9Lu;vt4c{I-;NGeHp;iI@8BM`5ZP!C~}Gr zGWxZ?SyS~fcXk^AwA2y$jy_@&Hlw#B2*TrTkGYIcy1>95g^0i{o&r77E(YjKMpHyEO!-7A z$Cl%s4Ot>)=sDyL%9+dWji-tTzygKvJOZe$H26LC?bRu-Qfp=(J-r) zwe-iG6=~SLlyA70>u0Wx-@0_A;!usp)Gbo8-5FwZv_}(M$sSWX{vb&=19rGy*;Xzc z&h=e#DS!TUYIR{GkxKAlIQ~R{cuXr0g_mVN#N1A0xrYAaNO9-pic` z5>Z~};u0yQs=Yia`1~i-&{h#eu>}MK+ikpw`ByW8i7YsnrWc=Evno+H2MfZMgNe@6 z13= zn;tx1VF)-WT6>?x^77nlmOP%42gJ*{gC8r8uV^gbcP=0+PmWYbOB8$@^LjscOkA_z z@QL3!HfHy^Q&eN;iC}J)$2bXL_j@xcd3<9d@ksKM-lv@9?^%DeaN-{>PMb{*n!(>^wA#p_%DEj_Z;y?rvpx z&-rv91LX+@s(B$=)9xOq6NJ`&awgF;R40pzG9?5(9 zfm%X^iJQ@>7~qge)pO2gEv#EXyC1b`!1%V?O=+u})q~>vcgr?jt_o5Lw!RdOmq!g| z+7pCu3|tu*M(%y`RE~tqQK%7c(3UcIc_gK4Cl!7?#0=iup?C*)`7p2HV_>O-lE%Nz z&H%gzUNdz=IFhtx2pWWB^{kRSzh5#IP;ae{FGURfh5EYSllzQH3fwssG0y~uJ;gXU z;xFFub(>d)^YOVmb=fZxlr(gT1r%wlQ{_qy6x2krWQUz7Ufd7Ft^$-RQD7@%BIGR~ zC&>K8QnMV{IZ=?qr%1D{3U~?g>oV9lX}jGj!H^MKT$pAMR`f_p5v-yz0Et8aIoi9u z;+^Oz-MauqA(q+WGYdgjB*nBrkZ)HxWgi~7rGEVC+b`X zil3uLT`B}i9QNr`F9=DbHlXcWv1WdIc#E(?rOQA1xmxXTrNc3!(A#U7QkGh70C9k7 z=`#NAc7x{@!C4$v+qbq5dt;`&2Q=1XXBR(nuB7Rqd~*Ai&j%zm(;^_zISri1TMf6e zNzODIXyzz%qMva#@ojdT2c@-zhQPSTA_F>9#T*+1*tkvC1;sy6N0NxpaT~vJ1A4}I zg@xztxMk^t+AGnQUHAsJ1IKl16`!3<4CxWloT3IrOkVI9_FUo1r$Fsq7?bvcgBNBr z*w=E>&qN1~%Jmb;H9+05ZK%l-(M5u_;<^&_r}Z}FjZ9GAU${c|kYKE7!nyJ!&3uv= zOe3ea+m&+VNi&BXkvD(0Y@TZqoQV4gIF8}YN@T5d#A~`^eHG-pw0qACdV@b;NV#o@ zsFj-@+~f@JG<)FiCX;D;dqlqvW~a=zJ8u2Gq%QuGWX7i%i$I{Mhec}6T85a6hUg)0 zN%`evmqY-KB>?c-rqNJ(g?g%_8RyDa(i_`GzS+!IS5DmgGW+dK9>R3&P=pNZ&P^A~ z?8EZCu9Ggw9NL}GeeOcStrJNS~4@c@zh4CJwazhE`TA;xVhkr)M;0%XP1RR$b+Ja* zH@IZRB^WwfA_AN=iNrjx^{)k#yv~m2Cvo&BUj`z6=4pUJfMil}Qn^&b$?v|waVXbm zpzW91aDn+C%kYNUKl9gD$FQoeWB@2fmTzpzDUOr&0FGM@9RM?k72nj1;my?+OBkIi z4uJb9aVr}ui&V!R+-6raUS2<)yTtXt=eV7jHv&wwUiC*m0o5j;K%X&6P=u&QgT^Jf z2uYS&fy|S0S+pxgiCEFq__50}Pr}LNbs64$x#&I>u~Lm~LR%Ho?Zkx4IvS8VnC6u4 z+GYYaGu6Des0DTIhwd5s>+F#&H!||8Ylp1n za3m@}dM|v{nccE0Ty@5{i;r7B&uT@ zZ=zD&cy>SN62ZoSS9krM)7f z&9{=?ndJnlIZo$}$OLBXhb#*j{7rdDy;m#NRK>!F4hrc0fl>7_J*slRE!051(S8eX zxCNX5E6k-)M8x)c#!xdu0CL)&PF$mQhrw#Hsjp5!+{AT!#@Qrp*zlq(z14X(}ww98QL%IhnAO~qPtF+NvXtmgV?eF(HK{JvkpLM3< z41eq{<-77|TqW(vrD&@oxbzC?gnnwf7@eK+;^+ISWPMu(PAZUM#X>LA@MMwf4V)Vy zO#+@2w#r~sLHDNOc_U{mOyI0-nmm$=kQhx^amB^O7)K+du5$zApoL)>gz%^MbZu0{ zw5hm)!2vevfRt)|LZ?&FuMbNPKkkPMsK+mJI(`@ftTDwG`Se;8PtB#9jWQy! zreF)&<8}X9kNkxf>)DsDl~F-narkir&aw5R6e!hLT1_hAcI1Y)e_uVgH0nNRU9 z{~d+T&%w8!P=0)t=e6c_IQJJPDwI`KYNZbZ7ukY<4=gw$tYWd5I=+Ue)Z9R=1V1D& zUh>`*p46N@Aq8@e81^*kZQwmFMotfWsUzql-@aW#jX!I!Cp+48w0_Czqyo<7|0SGz zNLO+9V&H4C!M88)3kB|5U?z&i0u3cb#@@T|piG9t=zW*+JG#7yCyi9>+-lBx`1tC@ z40b`K8uo-p`|upofW9P5BNqkOgM3HG8YE8!E5>-_QT*yFak_$CYlC2_d@Q%e{2$C%xOQ<#2R% z4zj(wM*5R{pcBvp#a72Q1fZWqe(%9^e3jX0TcP?CB(;Y6Uf?chNm@n2x{_u6KqUZ{ zM*~eIMRH=*5X(EFkiz8g$RG2TT%>8|7#XDHNeui#sg;iGh1=Lp!3LHBx*rK)nLu>s z4D%B*gt#=pOAOH&$XA^s_du9?@nDqjh4GEtl;LhPzG^o>+TF9FQTp;y z+OflYO}DXc+93(o?Ta+@RHuFM#cpVv=)EJRM$%2s@J<6C(tA4i?2|Iv z&(CXYYV&^grC`p$G!y@*{G0<&qJwRyqznRZ^WGy=Ruq)LsPZ7vLGWpSVDM-f5)AfY z{vKkp5*S*2m{47=Pww^Xd3{ZvS4u}jpCr|GS1+zR>UKnnN<0uM4zx1$r3i3J(}?9f zL}bT`1w&g9T`W1*?=Ng%U^5`d{l)YH4REFz-}%Kb3%vt8aT|9W@pJmbE@H@=6DP5y z$~E-`N``xpJ0+_P@aNlh!v590`mL^9WGEfD64;|Ttr|fco1&a!!wCFsK*g7G6Oa`k zAo(3{d7Id6tdM%@Ewe^VG81>lA3*H@Xe@zA1MdshsPh;b1jaj0`tNxAlr*+;acwgn zIB|bIRNW?D5O|+&-Ved_;9OwAV8&nlYshW_eeGma@4sdC;^r#mzp9V|dUjF|6)STo z%#Yc z%E&o#NdaG*Ua}WViPJ6ne+(8FiI~`Fng}jng&CH*0IAxOJCyj;kiy9f?MUkNk5+e?pTloR!JAPJ-JA; zj59@tgi|(feo3O3tlSbKJJMr*2z1Duemx#@iJ(4I%g`6W^$7B_r4+sZ)VYLtx7NyW zMENXrW$S>JynZX3z;jU$(^CJ}wSTm=#22n!HhrXv-HGgO=aR3SBI=*@@cVMCN@#p*9FjZlqr+xt!R{u)SykJNN7=RiX_T9shiiT#F$ zp+SVNh=Oya6c+14`m?Ls|VuMJB58A-zSw23YLP`>g?z$1~GQ0~w&flgkJGnt@1m zyMmX&o^xmr2jRcuUiLx3wFORL|J~JNU^ol1 zJmdryoQzXPqd!PxmY;`rJN+;Q&2@Na&WMq{VapAl2S5wl9bv7sz%=kt8%g9L_^tkW z1~UgPUU|@PFvc+jNF>ZgJ8M1R6Rg=`4^CSkAY|0CP)V~v8ZPv6#N)ftun8`3FDRne zCF7QPHzi`?wzFR3MAhxik2EgdXaF1>qx$>y9*r{0gb#cDP%T4K)=G!VPl$^Dv0adi z(K-_yK2RC*X!IOY07j0D2JU|u0)o>X^pJV-P02 zJ_1k@Tv~s$oDSTva?@bjF(0=ZRS12M7uN3B+Iln%=TL5)uH63l`ReQrVBZJba7+Jn z-aA-x2}D(-j~*e6U;^DV_s(D^D6OD;aPx z`#LX(sDF^b6y=t-_3bP3+t?%LZ!XhEdj1(&cXR09(Q~k@s-9Tmdctt>&%uTpUTs6;Q~!-ynMvdHhq~@na2}?B}?<>XVP;%n`rtSEx@7 zoD=nVy()Vz=~k!#6ns*L8Dtw&jXyR22FQX1zxI~9I2fsagphUp8r1i8%<%nJ0frLZ!}vn1gVP-*9+13UQCtoXK$ z?I_V-JyhA&|-kf1Vu_) zR*Zlxk?qUix4KjHZ#-T5UO8Tu*taBBhPH|HM}95nR-lRaw3PGAc}o@`wjQa@rjgX* zgk4j2lmUTaS%K|DW@p@Nh|x2@|F*H#gSsYz)<%;-zvM7xGgfnaNs3djY_lJp?*0=m zNkm0zD>JX%sKgDgwMLiejro)d`MwVlYQwg`CvPkwdZ>o{5|1v85#a$I!L8Tg!2J(+ zbBx(^*xDFcY*P$luT>jCNBxvhy*-5M78YSCsw*g;Hkulnf9^h&`}zJ9AY_@6SaA)= z;R6by_s&s(k}Eq4po!Gf15X->7F-a0N71`~kPOQW1S7#M!eXpe{2N|NdHa&crCa#{+&00m zw|VB9lv-Z{>tE=!veESKO?oYd2TaBH~CG!olt#n^s%RY(P|#b5w+VaE@+vUbd#P4txh-{#}5 zwiJBK&ASv=)SX1(`x`)8a7}k-pS|B`HHYS&=qW*GWske~<=#8^pTV2;*3Zcl^CM1c z;MQ$I!O#FXz5^11*Nm7jD(V>QSL>5HIFx3K%2q!(pz!0vN_&HR|TAMFGtkA%ST*1d7(O*No7Va z?NokQ@XO&tYTD^vMfam@>Id`&?NK*BZN;iRZ6fS=;_#=ZGW*NKIgpqGH$sWxl%O40 z6NwLda2m2(nxAkQx!+Y~wG0iWQa|Rh0~o3*NlSRVyP-jc@~1vtGkRl(g4rQ~e**9D z^6~u8)BjG?_mYXoW`w__R5}c9_TZnZzu>rrRG|(b=~`-Bv_>ku!pW4aw+ekA6n^-= zc-lC%{`rBtSl@W0LN6tQ z!$#hZXFAW;(tO^*5m~+6?p;3y9F~*Edl<0Cf+hl9ZRt7HiN}dw2*Q36nZOE1hi-yC znm*dZ&KWYk;tYOJK@Kk0Zu6xwA`??Q3U33s6p@u%RKBUK$CktN5AJ4@G0L8QhJ9-L zN|cgjC3Gi;At|0Fj@~pri0G%O(AIcLzz>?=u7a0Md@E^p08P8%{q%b9x6p5=!C1a;F`sYZUDI~U1U_1s66%$?{ zS}>RJUY`h^?kOFJe<@d3@eOFYm`HS=dk)xy$H2Y)PGC-$$-Fx$3UDQ}?hh@s_8(vQ zs*e9n0I5ke!QSfK$Wbe&iSB+v$5oeBh6=i;5G>ii)GJz1z8ZFJnlGOY`$y5rphW^2 zn#D#}wyAdtQYs{#}3S#10X}EjZ3Znv`Ob$0MtmR zgOdF(;DHuLdm?ZR$*dEkSpFarmW8eG3~MWw!l-Gx`@7GYatQ`^t2iRbHApi^%j&XT zc-J<|Y_3gAYs|+pZAYH9xx`4Rg#9XJqRFNOYu|ylSyVdfwa*dNxjT5xgrf7wTnTc`Pzfb43#Mi7GzSP z`23-du=pY$LTLHqhmO-K{=WY^_d7kS`J2@1uYbq32L}&cL33xiw+@mg)sF{ z@B!n|@{YzT5jEe5ZQSR_d0z(b%-P8GWqCOx5xc9wqoQOAxymhZvbkiJmqYX~_MT~( z^d05?aoMPt7|Z*xAuiv3SR<6S(Csxc00(5ilsya)0e&UO+^TcdDWU0>yF3nqTFWu`$ImH(L zjepdVLo>)2$3AkK`1`GL;o`m_E}yj{pRAUXg32>k`pINBbESW=mrfQY4fr)E-LB$R zo;oAZHjyJ@kGYqqnYDO*hv7<0UI!UenTi#`oT6DZOzWgljJE8-sIv!XDHf%KN(Wn!u)1FAJ-2^RxdK>oIm;M=B z-U5SqGmTB-fq=i)XU`{;Arm8#Wu&RUPh-MhEh;bnlX&RY5gn1^&BYhdit?H#{w{a(cLr$7t=u%#n#?C}BnM7fYSMGb zuM#>M-GIc=LpTVr*i(L6BaASb3eA9C0;D=JDlskO zn792seuOy$wbEH07t#CsCOl6)w)Mmmy`<7*Gpe(u%&M<)gX*?xq~8N@3B#?JQeaXH z-b(Ix5Hn^6Ta&v?7W-Cfr~&O`+tJC3ht?4K$^zio&wmx^g2gREMd&g%zumxo<2;bvbM+ zF$j^fU0A{C!@eHow%IUI6sY09lR-_1pnsvsiOy`Fo)`DBbw0b*+vq*6_Zlq0`Pga8 z=+_%!{R5lLz>Dw%$kjYu!_&Wof`8$}Ebq;ijO(ml_A8VwrK$TBw8e-Kkgq&8go&(X zdDsBtkN{K)0va^Jf@Rwc(3*Y2|3}GymADq znDsT{kb7alu?vj=Ifj&KGWn2vgXI6YhCuJ@^J}1K@KSgSRDrEM5;6?IqjRo2S||sJ zSqez@w^0zUs6{T*t_VEzIfI;Xn}8vY=pkxjt{R9G`V9!FZ3krrQ3v)cDo=ib>727@ zfzZRM=F)qRT2|~QWk`N z!A8XRkY9vJ6jUgBi;-TXR3}T0Ges$y6#fEhla^=AW;30-(}ti{)qzUM%C@@D-%&da z-Tghb>G$5oZ&VB%x7Lc+Pd;3MRqQm(@#=Pb6*(h!Z4F>&=*~k}iZAV-{ZZWpq8brJ zL5MXd#aqK+tx%^eULhjUL+m!;rI=|~nf`~6w>&YEUNwSRf|YPW$XG&y?GG}sBYv6! zPgPAdSV(X3%T>YRxV><*1iB&{PD+_25K5F0io1`E$%%kgVXuWU_N zq?LSoFGlDmRSfZ6${{@el$Si`U_xw+F`e96eUFo_*+Au5l}UJjGN-Mhy9Sr1I>qRm z#pIW_^$3?%d~1j!6fblz zkMR>bHzo-C;thJ)Q$^;(rdtPO^SH*yy-ePAJdo)=qB-ZTzd3yo3~H5)BnSW~3f<#k zid9Zzvm^s;%TftszGh82h?^3yBz>$tRyU~aN|T&Wf{-aj`q>huaNzy{OK_rF2=wW~ zG94kYvJ&rwJpS6VV8h#+YMc^rwx2-360$His2BQ%szF;L=_;w^l{kb?vaHQn9GTDt z7UEsp)X&agNPD{wr5+RhfWuLxHv*yX7A>a2U>JnAKrAnaMe%ARF*g>(#B6rZEUx9F zn}QDUsT$0rMEY9@bs|5~=fn)t_Tukpd8L;O@@Ra+pxTm{If@*iLgecSu1{YN+G%7U z6z=LH#?{7F*8Lw0Lp+|s(>6i8$a{rup3R--n zjcCZjlBG$dhl*}Uhn6MZcIAguOLw@ID^1Z-pM?+3D(0&icZ3P3#SjSm3~th=&?b!G zP(KOLJMo%O*i*4q8z>M^7{i@%x+o|*;BP;8r|s8nP2O=Od-k%kzN1(a)K=n8A$@v~ zo7okEmzXXG@(KwcWW$#*$;lzbNLGuD-ZvXu6pDvur&q(syPY)Js)%+8#WcpW+pl`i z#v0$5@esL+jCTnMkLWs8e0F`^)H`mx?U#D$(s^?Nej#M#SPvOkF^e>A{vJIQ!b`}w zEww=-=3Ac3t)<64QRasm(k~3)sO5@SHNmTSeiCBs_g5So>*UK8SMIHMutM7~Xd+WnGw$pf-?Tv+_DHY%VWg(BtM@x$1z6p1!wrUe zFA#lp-2*H~>=l}hq-ll-!od2;K{vJ z0x9}|?nG0P4xu|dw|?c=iLyw!m&h;eVFOy^B&3}A7=QDURop+%zKKAH=*8;AOtsND)cFDZvY2DJC^xdBUP=Oy zYhS=TL%HEp8H6C^?ghqRno39OgJ@Nyu)A&VbwgQEieo@4Wh+o#ocu18{?(aPBI!H+ z@?c?ZR*R9!^N)KJJ+^E1%|!7$4nL^d`a-mRKWeKszUpXy)?7t)(;@_nprpBO(+ z{Tn78o*r66>d=DhbT0LipKciNwv^Zme<;URw;=KU;|@6w-TcKp$xzx<=c&)zW*O%cy@Avi+B$3b}qN3X$ydfn_6w{#;F=6&USo(uTRnHMJ=5MS2(60_`=}n>gTe~ HDWM4fCyfZ| literal 0 HcmV?d00001 diff --git a/docs/03_cva6_design/_static/mmu_control_flow.png b/docs/03_cva6_design/_static/mmu_control_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..766094481805391edd0dcc20a0ef728d9eff95b5 GIT binary patch literal 58489 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