PolarFire® SoC L2 cache 如何划分成 lim 和 scratchpad

 PolarFire® SoC 产品概述

灵活的2 MB L2存储器子系统,其SECDED可配置为:

– 16路组关联L2高速缓存

– 松散集成存储器(Loosely Integrated Memory,LIM)模式用于确定性访问

– 高速暂存存储器一致性模式,可跨内核共享消息

 

首先,理解这三个术语在 PolarFire SoC 上下文中的含义至关重要:

  1. L2 缓存 (L2 Cache):

    • 默认情况下,所有通过 AXI 主设备(如 CPU 集群、DMA 等)对 DDR 内存的访问都会经过这个 2048 KB 的 L2 缓存,以利用其局部性原理提升平均性能。

    • 但是,缓存的行为是非确定性的。你无法预知一次内存访问是命中缓存(快)还是未命中缓存(需要从 DDR 读取,慢)。

  2. 紧耦合存储器 (LIM):

    • 这是从 L2 缓存空间中划出的一块区域,它不再作为缓存使用。

    • 对 LIM 区域的访问是完全确定性的(即恒定的低延迟),因为它绕过了所有的缓存分配、查找和淘汰逻辑,就像直接访问一块快速的片上 SRAM 一样。

    • 用途:存放对实时性要求极高的代码或数据,例如中断服务程序 (ISR)、实时任务的关键数据段,确保其执行时间不受缓存未命中的影响。

  3. Scratchpad:

    • 本质上,Scratchpad 和 LIM 在物理上是同一块内存。它们都是被划分出来不再用作缓存的空间。

    • 关键区别在于 MPU(内存保护单元)的配置和使用模型。

    • Scratchpad 通常被配置为一个共享的内存区域,可以被多个主设备(如 CPU0, CPU1, DMA)直接读写和共享数据,而无需通过缓存一致性协议(因为它是非缓存的)。

    • 用途:多核间通信的共享缓冲区、DMA 数据传输的临时工作区、或者作为一块所有主设备都能快速访问的通用 SRAM。

简单来说:LIM 和 Scratchpad 是同一硬件资源(被划分出的 L2 空间)的两种不同用途和配置方式。 LIM 更强调“专有”和“确定性”,而 Scratchpad 更强调“共享”和“通信”。

 

打开 mss config 软件:LIM  和 scratchpad   内存如何划分

image

 

为什么要把缓存物理上分成这么多路?主要有两个关键原因:

1. 减少缓存冲突,提高命中率(核心目的)

如果缓存是直接映射(1-Way,每个组只有一路),那么很多内存地址会映射到同一个组的唯一槽位,导致频繁的冲突和缓存行替换。16路组相联给了缓存更多的灵活性:一个内存地址可以放在对应组的 16 个位置中的任何一个。这大大降低了冲突概率,从而提高了缓存命中率,提升了系统性能。

2. 支持缓存锁定(Cache Locking) - 这是 PolarFire SoC 的关键特性

这是 WAY0~WAY15 概念对开发者最可见的地方。你可以将某一整路或几路缓存“锁定”。

  • 工作原理: 你可以通过配置 L2 缓存控制器(PL2C)的寄存器,将特定的路(例如 WAY0 和 WAY1)设置为锁定模式。

  • 锁定后: 被锁定的路不再参与常规的缓存替换算法(如 LRU)。一旦关键代码或数据被加载到锁定的路中,它们就会一直留在缓存里,永远不会被淘汰。

  • 好处: 这为对实时性要求极高的代码(如中断处理程序 ISR)或关键数据提供了绝对确定性的、极低延迟的访问,因为CPU每次访问它们都必然命中缓存。

  • 如何操作: 通常,你需要:

    1. 在 Libero SoC 中使能 L2 缓存锁定功能。

    2. 在软件(通常是 Bootloader)中,通过写 PL2C 的 Way Locking 相关控制寄存器(例如 PL2C_L2C_WAY_CFG)来指定要锁定的路(例如,锁定 WAY0 和 WAY1)。

    3. 将你需要锁定的函数或数据(通过编译器特性)放到一块特定的内存区域。

    4. 在系统地址映射中,将这块内存区域映射到 L2 缓存控制器的地址范围,并确保其属性为“可缓存”。

    5. 当代码执行时,这些内容就会被加载到锁定的 WAY0 和 WAY1 中,并永久驻留。

 

posted on 2025-09-01 18:01  所长  阅读(26)  评论(0)    收藏  举报

导航