ARM 多核 SoC 面临缓存一致性困境

快速链接:
.
👉👉👉 个人博客笔记导读目录(全部) 👈👈👈

在这里插入图片描述


多核 ARM SoC 面临缓存一致性困境

在此探索 Cadence IP

ARM 正在通过多核处理器将其固有的低功耗架构提升到更高的性能水平。

如果ARM继续拥有移动CPU插槽,四核及以上处理器将成为高端智能手机和平板电脑的标准。虽然多核 SoC 承诺提供高性能和低功耗,但这些芯片的设计人员也将面临非常严峻的技术挑战——实现硬件缓存一致性。

高速缓存一致性确保每个核心都运行最新的数据,无论数据驻留在其高速缓存、另一个核心的高速缓存还是主内存中。这听起来很简单,但当您有多个核心并行工作并不断更新其缓存内容时,实际上很难。过去,内核上运行的软件用于保持缓存内容最新。然而,由于这是一项相对较慢且消耗电力的活动,因此最好在硬件中执行。

为了支持实现缓存一致性系统的标准方法,ARM 于 2011 年发布了 AXI 一致性扩展 (ACE) 规范,以添加到他们的 AMBA 协议集中。ARM 还发布了 CCI-400 互连 IP,它提供了缓存一致性互连来链接移动 SoC 中的组件。正是这些关键构建块、ACE 规范和 CCI-400 互连(将 A7 或 A15 等内核连接在一起)实现了多核缓存一致性系统。然而,它们也给验证工程师带来了新的挑战,他们必须确保移动 SoC 正常运行。

在这里插入图片描述

图 1. 处理器子系统中具有一致互连的多核 SoC 示例

 

ACE 验证挑战

验证任何多核系统中的一致性都很困难,因为合法和非法操作之间通常存在细微差别。为了了解这一点,让我们看一下 4 核系统中 2 种不同类型的读取命令的示例,如图 1 所示。我们将该系统中的内核命名为 M1 到 M4。在第一种情况下,我们假设 M1 发出ReadClean命令来检索某个数据项。该数据项的最新版本可能驻留在主存储器中或者可能位于M2、M3或M4的各个高速缓存中。

互连需要找到最新版本并将其发送到 M1,因此执行的第一步是监听其他内核的缓存。在这种情况下,M3 恰好拥有最新数据,因此互连会获取该数据,将其写入主存储器,然后将其发送到 M1。您可以看到互连“清理”了主内存,因此得名ReadClean。

现在让我们考虑第二种类型的读操作。这次M1针对某个数据项发出ReadUnique命令。互连执行窥探并再次发现 M3 具有最新版本的数据。然而,互连并不更新主存储器,而是简单地将数据发送到 M1。主存数据项仍然过时,M3 有责任在以后更新它。ACE规范中定义了近20种读写操作,因此构建验证场景来测试每种类型的操作是一项重大挑战。

验证基于 ACE 的系统的另一个主要挑战是验证空间的巨大规模。事务类型、响应类型、域和缓存状态等 ACE 规范元素的组合(被验证工程师称为“叉积”或简称“交叉”)数量巨大,每种组合和排列都必须经过完全验证。一般经验法则是,需要使用 ACE 互连进行验证的交叉数量约为 7000 x N,其中 N 是主设备的数量。因此,在四核系统中,需要验证28,000个叉积。

考虑到这一点,为什么 CCI-400(ARM 开发的第一个缓存一致性互连)只有 2 个完整的 ACE 主设备似乎就很明显了。挑战不仅在于设计的复杂性,还在于验证工作的范围。其他非一致性互连,如 NIC-400(另一种 ARM 互连)可以配置超过 100 个主设备和从设备,但是当需要一致性时,就不可能提供这种灵活性。

现在让我们更深入地研究一下验证问题。用 ACE 的说法,“场景”是以下因素的组合:事务类型、发起主缓存状态、响应主缓存状态和响应值。例如,如果互连中完整 ACE 主设备的数量为 8,那么实际上需要验证 8*7000= 56,000 个场景吗?嗯,不一定。许多交叉是不合法的(例如,不能存在两个主设备都在Unique状态或Dirty状态下保存相同的缓存数据项的情况)。因此,有效的验证需要将验证空间减少到仅包含相关排列。

不幸的是,测试各个内核和互连之间的逻辑握手虽然很复杂,但只是验证问题的一部分。我们谈论的是多核系统,每个核心可能并行发出命令。对于互连来说,将其全部整理出来是一项非常艰巨的任务,对于验证工程师来说也是一个巨大的挑战,他们必须创建足够复杂的测试场景,以发现系统中隐藏的极端情况错误。

另一个复杂的因素是 ACE 支持 Barrier 交易的概念。障碍会导致处理流程停止,直到满足某些条件。当主设备发送屏障事务时,它要求在屏障发出之前启动的命令允许在屏障生效之前完成。同样,由于多个核心可能会发出屏障事务,互连(和验证工程师)的负担会成倍增加。

到目前为止,我们讨论的所有内容都仅涉及包含内核(例如 A7、A15)和相干互连(例如 CCI-400)的处理器子系统。该处理器子系统通过非一致互连(例如 ARM NIC-400)连接到 SoC 的其余部分。因此,通过非一致性互连运行的验证场景应与处理器子系统测试并行运行,以找出仅在整个芯片运行时出现的错误。
在这里插入图片描述

图 2. 显示 VIP 组件的类型和布局的示例 SoC

 

验证IP要求

鉴于上述困难的验证挑战,以某种方式卸载部分验证工作至关重要。正如 IP 组件减轻了设计工作量一样,验证 IP (VIP) 组件也减轻了验证工作量。验证我们一直在考虑的 SoC 类型所需的 VIP 组件的类型和布局如图 2 所示。为了有效,VIP 必须提供验证基于 ACE 的设计所需的三个主要功能。他们是:

  • 1)模拟所有可能的场景以覆盖完整的验证空间
    1. 确保一致性和系统符合 ACE 规范
    1. 测量覆盖率并确保验证完整性。

 

  1. 刺激的产生

验证基于 ACE 的设计非常复杂,需要使用验证 IP,该 IP 可了解系统中各种类型 ACE 主站和从站的协议行为。这使得用户不必了解创建合法(或非法)交易所需的协议细节。
 
旨在模仿处理器行为的 VIP 必须创建考虑协议规则的刺激,包括缓存模型,并在生成事务时纳入任何特定于设计的约束。VIP还必须根据总线状态正确计算时序。
 
2)一致性检查
 
每个主设备和从设备必须单独进行验证,以确保其符合规范,但这还不够。VIP 必须与互连监视器配合使用,以监视互连上的所有流量。这对于确保整个系统的一致性是必要的。这意味着 ACE 和互连监视器 VIP 需要执行两项关键任务:
 

  • A. 确保每个单独的组件(例如处理器、内存)运行正常。
  • b. 监控互连以确保所有块之间的通信准确且符合 ACE 规范。

 
项目(a)由VIP的主代理和从代理启用。一旦用户将块 RTL 与互连集成在一起,VIP 将用作被动代理,因此它必须监视每个单独的总线接口以确保协议合规性。

为了启用项目 (b),还需要一个单独的互连监视器。如果没有这样的互连监视器,就不可能确保完整的系统一致性。该监视器必须检查互连本身的数据完整性和正确性,以确保其行为符合 ACE 规范。

例如,只有了解设计中所有主控器和域的互连监视器才能检查由主控器发起的一致事务是否导致互连在正确的域和主控器中创建监听事务。

3)覆盖范围

如前所述,与基于 ACE 的设计相关的巨大状态空间提出了关键的验证挑战。简单地定义所有复杂的场景本身就需要大量投资。然而,这还不够。ACE 验证解决方案必须使您能够测量并确保验证空间的完整性。

覆盖模型用作确定验证完整性的指标。因此,VIP提供基于ACE规范的完整覆盖图势在必行。如上所述,有效地执行验证需要缩小覆盖范围以仅监控合法的交叉产品。覆盖模型就起到了这个作用。

<think>嗯,用户现在想了解缓存脏数据的作用、如何更新缓存,以及DMA一致性的问题和同步机制。我需要先理清这些概念,然后结合提供的引用资料来组织答案。 首先,缓存脏数据的作用。脏数据应该是指在缓存中被修改过但尚未写回主存的数据。那作用是什么呢?可能是为了减少直接访问主存的次数,提高效率。当处理器修改数据时,先改缓存,之后合适的时机再写回主存,这样能提升性能。 然后是更新缓存的方法。这里可能需要分情况讨论,比如写回(write-back)和写通(write-through)策略。写回是只在缓存块被替换时才写回主存,而写通则是每次修改缓存的同时也写主存。另外,缓存一致性协议比如MESI,用来维护多核之间缓存一致性。比如当一个核心修改了数据,其他核心的缓存会通过总线嗅探机制得知,并更新或无效化他们的缓存副本。 接下来是DMA一致性问题。DMA控制器直接访问内存,可能绕过缓存,导致数据不一致。比如CPU修改了缓存中的数据,但DMA从内存读取的是旧数据;或者DMA写入内存后,CPU的缓存还是旧数据。解决办法可能有流式DMA映射,也就是在DMA传输前后,由软件管理缓存,比如刷新或无效化缓存区域。参考引用中的流式DMA映射和Vitis的解决办法,比如使用dma_sync_single_for_device和dma_sync_single_for_cpu这样的API来确保一致性缓存与DMA的同步机制,可能包括硬件和软件两种方式。硬件上,有些架构支持缓存一致性DMA(如ARM的ACE),自动维护缓存和内存的一致性。软件上则需要显式的操作,比如在DMA传输前,将缓存数据写回内存(清理),传输后让缓存无效化,确保下次读取时从内存获取新数据。 需要结合用户提供的引用资料,比如引用[1]提到的流式DMA映射,引用[2]中DMA改写DDR导致缓存不一致的问题及解决办法,以及引用[3]中关于缓存一致性的同步时间和机制。这些引用可以作为支持点,添加到回答中,并标注引用标记。 现在需要把这些点组织成结构清晰的回答,分点解释每个问题,并在适当的地方插入引用。同时,用户可能对DMA和缓存的具体交互不太清楚,需要用例子说明,比如DMA传输数据到内存后,CPU如何确保读取的是新数据,可能需要无效化缓存。或者CPU修改数据后,如何确保DMA传输的是最新数据,需要清理缓存。 可能还需要提到缓存行、总线嗅探、MESI协议等术语,但要用通俗的语言解释。例如,当多核处理器中一个核心修改了数据,其他核心会通过总线协议得知,更新自己的缓存,保持一致性。而DMA因为没有参与缓存一致性协议,所以需要软件介入处理同步。 最后,生成相关问题,可以围绕缓存策略、DMA优化方法、硬件支持等方面提问。</think>### 缓存脏数据作用、更新方法及DMA一致性机制 #### 一、缓存脏数据的作用 1. **缓存脏数据**指被修改但未写回主存(DDR)的缓存数据,其核心作用是**提升系统性能**: - 通过延迟写入主存,减少频繁访问高延迟内存的次数[^3] - 支持批量写回(如缓存行替换时一次性回写),提高数据传输效率 - 在多核系统中,脏数据配合缓存一致性协议(如MESI),可减少核心间同步开销 --- #### 二、缓存更新方法 1. **写策略** - *写直达(Write-through)*:同时更新缓存和主存,一致性高但性能低 - *写回(Write-back)*:仅标记脏数据,待缓存行淘汰时回写,性能更优 2. **一致性协议** - MESI协议通过状态机管理缓存行状态(Modified/Exclusive/Shared/Invalid) - 总线嗅探(Bus Snooping)自动同步多核间数据,例如: ```markdown Core0修改数据 → 总线广播失效信号 → Core1缓存行标记为Invalid → Core1再次读取时从Core0缓存或主存获取新数据[^3] ``` --- #### 三、DMA一致性问题与解决 1. **问题本质** - DMA直接读写内存可能绕过缓存,导致: - *CPU读取旧数据*:DMA更新内存后CPU缓存未失效 - *DMA传输旧数据*:CPU修改缓存未回写时DMA读取内存旧版本[^2] 2. **软件解决方案** - **流式DMA映射**:由开发者手动管理缓存一致性 ```c dma_sync_single_for_device() // DMA读取前:清理CPU缓存到内存 dma_sync_single_for_cpu() // CPU读取前:使缓存失效[^1] ``` - 内存区域标记为`非缓存(Non-cacheable)`或`写合并(Write-combining)` 3. **硬件方案** - 支持**硬件一致性**的DMA(如ARM CCI):DMA参与缓存一致性协议,自动同步数据 --- #### 四、缓存与DMA同步机制对比 | 机制类型 | 触发条件 | 耗时范围 | 典型应用场景 | |----------|----------------------|---------------|----------------------| | 软件同步 | 显式调用API | 1-10μs | 流式DMA映射 | | 硬件同步 | 总线协议自动完成 | 100-500ns | 支持ACE协议的SoC[^3] | | 混合方案 | 部分地址空间硬件事务 | 500ns-1μs | 非一致性外设访问 | --- §§ 相关问题 §§ 1. 如何通过内存屏障指令保证多核系统的缓存一致性? 2. 非一致性内存访问(NUMA)架构如何处理DMA问题? 3. 硬件一致性DMA与软件管理方案各有哪些优缺点? 4. 缓存行替换策略对脏数据回写性能有何影响?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arm精选

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值