PolarFire® SoC L2 cache 如何划分成 lim 和 scratchpad
灵活的2 MB L2存储器子系统,其SECDED可配置为:
– 16路组关联L2高速缓存
– 松散集成存储器(Loosely Integrated Memory,LIM)模式用于确定性访问
– 高速暂存存储器一致性模式,可跨内核共享消息
首先,理解这三个术语在 PolarFire SoC 上下文中的含义至关重要:
-
L2 缓存 (L2 Cache):
-
默认情况下,所有通过 AXI 主设备(如 CPU 集群、DMA 等)对 DDR 内存的访问都会经过这个 2048 KB 的 L2 缓存,以利用其局部性原理提升平均性能。
-
但是,缓存的行为是非确定性的。你无法预知一次内存访问是命中缓存(快)还是未命中缓存(需要从 DDR 读取,慢)。
-
-
紧耦合存储器 (LIM):
-
这是从 L2 缓存空间中划出的一块区域,它不再作为缓存使用。
-
对 LIM 区域的访问是完全确定性的(即恒定的低延迟),因为它绕过了所有的缓存分配、查找和淘汰逻辑,就像直接访问一块快速的片上 SRAM 一样。
-
用途:存放对实时性要求极高的代码或数据,例如中断服务程序 (ISR)、实时任务的关键数据段,确保其执行时间不受缓存未命中的影响。
-
-
Scratchpad:
-
本质上,Scratchpad 和 LIM 在物理上是同一块内存。它们都是被划分出来不再用作缓存的空间。
-
关键区别在于 MPU(内存保护单元)的配置和使用模型。
-
Scratchpad 通常被配置为一个共享的内存区域,可以被多个主设备(如 CPU0, CPU1, DMA)直接读写和共享数据,而无需通过缓存一致性协议(因为它是非缓存的)。
-
用途:多核间通信的共享缓冲区、DMA 数据传输的临时工作区、或者作为一块所有主设备都能快速访问的通用 SRAM。
-
简单来说:LIM 和 Scratchpad 是同一硬件资源(被划分出的 L2 空间)的两种不同用途和配置方式。 LIM 更强调“专有”和“确定性”,而 Scratchpad 更强调“共享”和“通信”。
打开 mss config 软件:LIM 和 scratchpad 内存如何划分

为什么要把缓存物理上分成这么多路?主要有两个关键原因:
1. 减少缓存冲突,提高命中率(核心目的)
如果缓存是直接映射(1-Way,每个组只有一路),那么很多内存地址会映射到同一个组的唯一槽位,导致频繁的冲突和缓存行替换。16路组相联给了缓存更多的灵活性:一个内存地址可以放在对应组的 16 个位置中的任何一个。这大大降低了冲突概率,从而提高了缓存命中率,提升了系统性能。
2. 支持缓存锁定(Cache Locking) - 这是 PolarFire SoC 的关键特性
这是 WAY0~WAY15 概念对开发者最可见的地方。你可以将某一整路或几路缓存“锁定”。
-
工作原理: 你可以通过配置 L2 缓存控制器(PL2C)的寄存器,将特定的路(例如 WAY0 和 WAY1)设置为锁定模式。
-
锁定后: 被锁定的路不再参与常规的缓存替换算法(如 LRU)。一旦关键代码或数据被加载到锁定的路中,它们就会一直留在缓存里,永远不会被淘汰。
-
好处: 这为对实时性要求极高的代码(如中断处理程序 ISR)或关键数据提供了绝对确定性的、极低延迟的访问,因为CPU每次访问它们都必然命中缓存。
-
如何操作: 通常,你需要:
-
在 Libero SoC 中使能 L2 缓存锁定功能。
-
在软件(通常是 Bootloader)中,通过写
PL2C的Way Locking相关控制寄存器(例如PL2C_L2C_WAY_CFG)来指定要锁定的路(例如,锁定 WAY0 和 WAY1)。 -
将你需要锁定的函数或数据(通过编译器特性)放到一块特定的内存区域。
-
在系统地址映射中,将这块内存区域映射到 L2 缓存控制器的地址范围,并确保其属性为“可缓存”。
-
当代码执行时,这些内容就会被加载到锁定的 WAY0 和 WAY1 中,并永久驻留。
-
浙公网安备 33010602011771号