ACE(AXI Coherency Extensions) 协议学习记录1:ACE协议总览

AXI(Advanced eXtensible Interface)、ACE(Advanced Coherent Extensions)和CHI(Coherent Hub Interface)是ARM公司定义的一系列互联协议,它们用于在不同级别的硬件组件之间传输数据和控制信号。这些协议在不同的抽象层级上操作,并针对不同的设计需求和性能目标。


1.1ACE协议中的关键术语和定义


1.1.1AXI组件和拓扑

  • 缓存主设备(Caching master):具有缓存能力的主设备,能够发起事务并管理自己的缓存。
  • 发起主设备(Initiating master):发起事务的主设备,它可以是缓存或非缓存的。
  • 被监听主设备(Snooped master):能够接收并响应其他主设备发起的snoop事务的缓存主设备。
  • 下游缓存(Downstream cache):位于发起主设备下游的缓存,通常是指在数据传输路径上的下一个缓存。
  • 本地缓存(Local cache):主设备自身的缓存,用于存储数据以提高访问效率。
  • 对等缓存(Peer cache):与发起主设备在同一层级的其他缓存,它们可能需要根据发起主设备的操作来更新自己的缓存状态。
  • 主内存(Main memory):系统中的中央存储区域,所有缓存最终都会与主内存中的数据保持一致性。
  • 监听过滤器(Snoop filter):用于控制和管理snoop事务的组件,它可以决定是否需要对特定的内存访问进行监听。

1.1.2缓存状态术语

ACE协议定义了一个五态缓存模型,描述了缓存行可能处于的状态,包括有效(Valid)、无效(Invalid)、干净(Clean)、脏(Dirty)以及唯一的干净或脏状态(UniqueClean/UniqueDirty)等。

在ACE协议中,除了上述提到的五个基本缓存状态(UniqueClean, UniqueDirty, SharedClean, SharedDirty, Invalid),还定义了一些特殊的状态和概念,用于更细致地描述和管理缓存行的状态。以下是一些额外的状态和概念:

  • Modified and Shared (M): 这个状态指的是缓存行是脏的(Modified),并且已知在其他缓存中也有相同的缓存行(Shared)。这要求在写回主内存之前,必须先确保所有其他缓存中的相应缓存行被标记为无效。

  • Exclusive (E): 这个状态表示当前缓存行在所有缓存中都是唯一的(Exclusive),并且它是干净的(Clean)。这意味着没有其他缓存拥有这个缓存行的副本,因此可以安全地进行写操作而不需要担心冲突。

  • Forward (F): 这个状态用于描述一个缓存行已经被发送到下游缓存,但还没有收到确认信号。这通常与写操作相关,确保数据在被认为已经传播到下游之前不会发生变化。

  • Snoop Filter State: 虽然不是一个缓存状态,但ACE协议支持使用snoop过滤器来跟踪缓存行的分配和驱逐。过滤器可以有多种状态,用于优化snoop操作并减少不必要的snoop事务。

  • DVM (Distributed Virtual Memory) States: 在支持分布式虚拟内存的系统中,ACE协议还支持与虚拟内存管理相关的特殊状态和操作,如TLB无效化、分支预测器无效化等。


1.1.3动作和权限

  • 加载(Load):从缓存或内存中读取数据的操作。
  • 推测性读取(Speculative read):在不确定数据是否会被使用的情况下进行的读取操作。
  • 存储(Store):向缓存或内存中写入数据的操作。
  • 存储权限(Permission to store):主设备是否有权将数据存储到缓存中。
  • 更新主内存的权限(Permission to update main memory):主设备是否有权将缓存中的数据写回主内存。

1.1.4时间描述

  • 及时(Timely manner):AXI规范中定义了事务应在特定的时间范围内完成。
  • 大约同时(At approximately the same time):ACE规范引入了这个概念,用于描述在保证一致性的前提下,不同主设备可能几乎同时对同一内存位置进行操作的情况。

1.2协议概述


1.2.1Cache一致性模型:

ACE协议(Advanced Microcontroller Bus Architecture Coherency Extension)是一种高级的缓存一致性协议,它允许系统中的主组件(如处理器或其他设备)判断缓存行是否是某个特定内存位置的唯一副本,或者是否可能存在其他副本。根据这些信息,主组件可以相应地采取不同的操作来维护数据的一致性。

  • 检查缓存行的唯一性:当主组件想要修改一个缓存行时,ACE协议首先通过监听机制来检查该缓存行是否是系统中的唯一副本。主组件的监听过滤器会与其他缓存进行通信,以确定缓存行是唯一的还是共享的。
  • 修改唯一缓存行:如果确定缓存行是唯一的(Unique状态,包括UniqueClean和UniqueDirty),主组件可以直接修改缓存行的值,而无需通知系统中的其他主组件。这是因为没有其他副本需要更新或失效。
  • 修改共享缓存行:如果缓存行可能也存在于另一个缓存中(Shared状态,包括SharedClean和SharedDirty),主组件必须启动一个适当的事务来通知其他缓存。这通常涉及到发送一个缓存一致性请求到其他缓存,要求它们更新或失效对应的缓存行,以确保系统中所有缓存的数据保持一致。

通过这种方式,ACE协议确保了在多个主组件访问共享数据时,数据的一致性和正确性得到维护。这对于多核处理器系统、SoC(System on Chip)或其他需要紧密协作的多主设备环境尤为重要。


1.2.2Cacheline状态:

ACE协议通过定义缓存行的状态来判断组件访问缓存行时是否需要采取行动。每个缓存状态都是基于缓存行的特性来设定的。以下是缓存行的特性及其对应的状态:

1.2.2.1五种基本状态:

  • 有效(Valid)/无效(Invalid)

    • 有效(Valid):当缓存行处于有效状态时,表示该缓存行存在于缓存中。这意味着缓存行包含的数据是有效的,并且可以被处理器或其他主组件访问。
    • 无效(Invalid):如果缓存行处于无效状态,表示该缓存行不在缓存中。在这种情况下,任何对该缓存行的访问都需要从主内存或其他缓存中获取数据。
  • 唯一(Unique)/共享(Shared)

    • 唯一(Unique):当缓存行处于唯一状态时,表示该缓存行只存在于一个缓存中。在这种情况下,缓存行的数据不会在系统的其他缓存中找到,因此主组件可以自由地对其进行读写操作而无需担心一致性问题。
    • 共享(Shared):如果缓存行处于共享状态,意味着该缓存行可能存在于多个缓存中,但这并不是保证的。在共享状态下,主组件在修改缓存行时需要确保系统中其他缓存行的状态得到适当的更新,以维护数据的一致性。
  • 干净(Clean)/脏(Dirty)

    • 干净(Clean):当缓存行处于干净状态时,表示缓存中的数据与主内存中的数据是一致的。缓存不承担更新主内存的责任。在这种情况下,如果主组件读取缓存行,它可以直接使用缓存中的数据,而不需要从主内存中重新获取。
    • 脏(Dirty):如果缓存行处于脏状态,表示缓存中的数据已经被修改,与主内存中的数据不一致。拥有脏缓存行的主组件必须确保最终将更新后的数据写回到主内存中,以保持数据的一致性。

通过这些状态的组合,ACE协议能够确保在多缓存系统中数据的一致性和正确性。例如,当一个主组件想要写入一个缓存行时,它首先需要检查该缓存行的状态。如果是唯一的脏缓存行,那么可以直接进行写操作。但如果是共享的脏缓存行,主组件则需要通过发送一致性请求来通知其他缓存,确保它们能够更新或失效对应的缓存行。这样的机制有助于避免数据冲突,并确保所有处理器都能访问到最新和一致的数据。


1.2.2.2状态转换规则:

缓存状态规则是维护缓存一致性的核心原则,它们确保了在多缓存系统中数据的正确性和一致性。以下是适用于缓存状态的具体规则:

  • 唯一状态的缓存行

    处于唯一状态的缓存行必须只存在于一个缓存中。这意味着在系统中没有其他缓存拥有该缓存行的副本。这种情况下,缓存行的数据是唯一的,不需要与其他缓存进行协调。
  • 多个缓存中的缓存行

    如果一个缓存行存在于多个缓存中,那么它在每个缓存中都必须处于共享状态。这意味着所有拥有该缓存行的缓存都必须知道它是一个共享资源,并且需要遵循共享缓存行的一致性规则。
  • 获取新副本时的通知

    当一个缓存获得一个缓存行的新副本时,其他也拥有该缓存行副本的缓存必须被通知。即使这些缓存当前可能将该缓存行作为唯一状态持有,它们也必须被通知将其更改为共享状态。
  • 丢弃副本时无需通知

    当一个缓存丢弃一个缓存行的副本时,无需通知其他也拥有该缓存行副本的缓存。这意味着一个处于共享状态的缓存行可能实际上只被一个缓存所持有。
  • 更新缓存行相对于主内存

    相对于主内存已经被更新的缓存行必须在一个缓存中处于脏状态。这表示该缓存行包含的数据已经与主内存中的数据不一致,需要最终将更改写回主内存。
  • 多个缓存中的更新缓存行

    如果一个相对于主内存已经被更新的缓存行存在于多个缓存中,那么它必须只在其中一个缓存中处于脏状态。这意味着虽然多个缓存可能拥有该缓存行的副本,但只有一个缓存负责维护最新的数据,并确保最终与主内存同步。

这些规则确保了在多缓存系统中,当数据被读取或写入时,所有相关的缓存都能够保持同步。通过这种方式,系统可以有效地管理数据的一致性,防止数据冲突,并确保每个处理器都能访问到准确和最新的数据。


1.2.3通道信号:

ACE协议在现有的AXI4通道的基础上进行了扩展,并定义了专门的ACE通道以及确认信号,以支持复杂的缓存一致性操作。以下是ACE协议中定义的通道和信号的概述:


1.2.3.1现有AXI4通道上的信号(Changes to existing AXI4 channels)

ACE协议在现有的AXI4通道上增加了一些新的信号,以支持缓存一致性操作。这些信号包括:

  • 读取地址通道(Read Address Channel)

    • ARDOMAIN[1:0]:由主设备提供,用于指示读取事务的共享属性。
    • ARSNOOP[3:0]:由主设备提供,用于指定读取事务的监听类型。
    • ARBAR[1:0]:由主设备提供,用于指示读取事务是否需要遵守内存屏障(memory barrier)。
  • 写入地址通道(Write Address Channel)

    • AWDOMAIN[1:0]:由主设备提供,用于指示写入事务的共享属性。
    • AWSNOOP[2:0]:由主设备提供,用于指定写入事务的监听类型。
    • AWBAR[1:0]:由主设备提供,用于指示写入事务是否需要遵守内存屏障(memory barrier)。
    • AWUNIQUE:此信号仅由支持WriteEvict事务的组件所需。WriteEvict事务用于从缓存中逐出数据,而无需写回主内存。

1.2.3.2ACE特定通道(Additional channels defined by ACE)

ACE协议定义的这三个额外通道是为了增强缓存一致性管理和优化多处理器系统中的数据交互。下面是对这三个通道的详细解释:

监听地址通道(Snoop Address Channel)

  • 这个通道是输入到缓存主设备(cached master)的,它提供了监听事务(snoop transactions)的地址和相关的控制信息。
  • 通过这个通道,缓存主设备可以接收来自系统总线或其他缓存的监听请求,并根据请求中的地址信息确定是否拥有对应的缓存行。
  • 控制信息可能包括事务的类型(如读监听或写监听)和优先级等。

监听响应通道(Snoop Response Channel)

  • 这个通道是从缓存主设备输出的,它提供了对监听事务的响应。
  • 每个监听事务都会得到一个与之关联的响应,这个响应表明在监听数据通道(CD channel)上有预期的数据传输。
  • 响应信号可能包括数据是否可用、数据的状态(如干净或脏)以及是否需要执行特定的缓存操作(如使缓存行无效或更新)。

监听数据通道(Snoop Data Channel)

  • 这是一个可选的输出通道,用于从主设备传递监听数据。
  • 当发生读或清理监听事务时,如果被监听的主设备拥有请求的数据副本,那么这个通道就会被用来返回这些数据。
  • 这个通道的使用可以减少对主内存的访问次数,提高系统的效率,因为它允许缓存之间直接交换数据。


1.2.3.3确认信号(Acknowledge signaling)

ACE协议使用确认信号来表示一个事务已经被成功接收和处理。这些信号包括:

  1. 读确认信号(Read Acknowledge Signal) - RACK

    • 源(Source):主设备(Master)
    • 描述(Description):当主设备完成一次读事务时,它会发出RACK信号。这个信号表明读操作已经成功完成,并且数据已经从缓存或其他存储介质中读取出来,准备供请求者使用。RACK信号通常在最后一个数据拍(beat)之后发出,以指示整个读操作的结束。
  2. 写确认信号(Write Acknowledge Signal) - WACK

    • 源(Source):主设备(Master)
    • 描述(Description):在完成写事务时,主设备会发出WACK信号。这个信号表明写入操作已经成功完成,并且数据已经被写入到指定的缓存行或存储位置中。与RACK类似,WACK信号也通常在最后一个数据拍之后发出,确认写操作的完成。

这两个信号是ACE协议中重要的组成部分,它们不仅帮助系统管理数据流和事务状态,还提供了一种机制来处理可能的错误情况,如超时或事务冲突。通过这些确认信号,系统可以确保数据的一致性和可靠性,同时优化性能和资源利用。


1.2.3.4通道使用示例(Channel usage examples)

在ACE协议中,通道的使用示例包括:

  • 示例1:缓存行的读取:当主组件(master component)从未在本地缓存中拥有共享位置(Shareable address location)的副本时,从共享位置加载数据的典型过程,具体步骤如下:
    1. 发起读事务:主组件在读取地址通道(read address channel)上发起一个读事务。这通常涉及到发送包含所需数据地址的信号。
    2. 监听其他缓存:互连(interconnect)通过在监听地址通道(snoop address channel)上传递共享地址,来确定是否有其他缓存拥有该位置的副本。在这个过程中,可能拥有副本的其他缓存主组件(caching master components)被称为被监听的主组件(snooped master components)。
    3. 响应监听:被监听的主组件在监听响应通道(snoop response channel)上做出响应,并在必要时在监听数据通道(snoop data channel)上提供数据。
    4. 接收数据:如果有主组件提供了数据,互连可以在读取数据通道(read data channel)上响应发起主组件,就像在标准事务中那样。
    5. 从主内存读取:如果没有任何被监听的主组件提供数据:互连会启动一个到主内存的事务,实际上是将发起主组件的事务传递下去。读取的数据会通过读取数据通道返回给主组件,与标准事务的流程相同。
    6. 完成事务:主组件使用读确认信号(RACK)表示事务已经完成。这个信号表明数据已经成功接收,并且读事务可以认为已经结束。
    • 如果在将来的某个时刻,发起主组件或被监听的缓存都不负责任将脏缓存行(Dirty cache line)写回主内存,互连可能需要在将数据传递给发起主组件的同时,将数据写回主内存。如果发生这种情况,互连必须生成事务地址,并将从被监听的主组件返回的脏数据写入主内存。
  • 示例2:缓存行的写入:当主设备(master)向共享位置(Shareable location)执行存储(store)操作时,它会移除该缓存行的所有其他副本。这样做是为了确保在执行存储操作时,主设备拥有该缓存行的唯一副本。在这种情况下,该位置的缓存行的新值会在其他缓存主设备(caching master components)随后读取该缓存行时传播到其他缓存中。以下是对不同存储操作场景的描述:
  • 情况1:部分缓存行的存储操作(Store operations for a partial cache line):当主设备需要更新缓存行的一部分时,它会执行一个部分存储操作。这通常涉及到修改缓存行中的一部分数据,而不是整个缓存行。           
    1.      发起ReadUnique事务:发起的主组件通过在读取地址通道(read address channel)上发起一个ReadUnique事务来获取缓存行的预存储形式。这个事务的目的是获取一个当前的、唯一的缓存行副本,并请求移除其他缓存中对应的副本。
    2. 互连传递事务:互连(interconnect)将ReadUnique事务传递给其他缓存,这是通过监听地址通道(snoop address channel)来完成的。这个通道允许互连通知其他缓存主组件,以便它们可以响应这个事务,并采取适当的行动。
    3. 被监听的主组件响应:被监听的主组件(snooped master components)使用监听响应通道(snoop response channel)来响应ReadUnique事务,表明它们已经拥有请求的缓存行。同时,它们通过监听数据通道(snoop data channel)将缓存行提供给互连。
  • 情况2:整个缓存行的存储操作(Store operations for an entire cache line):主设备可能需要更新整个缓存行,这时它会执行一个完整的存储操作。这通常涉及到将新的数据完全写入缓存行,替换掉原有的数据。   
    1. 发起MakeUnique事务:发起的主组件通过在读取地址通道(read address channel)上发起一个MakeUnique事务来请求缓存行的唯一副本。这个事务的目的是移除系统中所有其他缓存中的该缓存行副本,确保发起主组件拥有唯一的缓存行副本。
    2.  互连传递事务:互连(interconnect)将MakeUnique事务传递给其他缓存,这是通过监听地址通道(snoop address channel)来完成的。这个通道允许互连通知其他缓存主组件,以便它们可以响应这个事务,并采取适当的行动。
    3. 被动监听的部件响应:被监听的主组件(snooped master components)使用监听响应通道(snoop response channel)来响应MakeUnique事务,表明它们已经成功移除了缓存行副本。
    4. 响应传回发起部件:互连使用读取数据通道(read data channel)向发起主组件提供响应。在这个过程中,只有响应字段是有效的,不涉及数据传输,因为发起主组件的目的是要替换整个缓存行的内容。
    5. 执行数据写入并完成事物:发起的主组件在确认收到响应后,执行存储操作,将新数据写入缓存行。存储操作完成后,主组件使用读确认信号(RACK)来指示事务已经完成。
    • 注意,这个过程中不涉及实际的数据传输,因为存储操作的目标是更新缓存行,而不是获取数据。通过这种方式,ACE协议确保了在多缓存系统中,整个缓存行的更新可以正确地进行,同时维护了缓存一致性。这种机制允许系统有效地处理缓存行的写入,优化了性能,并确保了数据的一致性。

             

  • 情况3:缓存行已经被缓存的存储操作(Store operations where the cache line is already cached:如果缓存行已经在其他缓存中被缓存,那么在执行存储操作时,主设备需要确保这些缓存中的相应副本被适当地更新或失效。
    1. 发起CleanUnique事务:发起的主组件通过在读取地址通道(read address channel)上发起一个CleanUnique事务来请求缓存行的唯一副本。这个事务的目的是要移除系统中所有其他缓存中的该缓存行副本,并且如果存在脏副本(Dirty copy),则将其写回主内存(main memory)。需要注意的是,这个事务不会将缓存行数据返回给发起的主组件。
    2. 互连传递事务:互连(interconnect)将CleanUnique事务传递给其他缓存,这是通过监听地址通道(snoop address channel)来完成的。这样,其他缓存主组件可以知道需要对特定的缓存行采取行动。
    3. 被监听的主组件响应:被监听的主组件(snooped master components)使用监听响应通道(snoop response channel)来响应CleanUnique事务。它们会指示缓存行已经被成功移除,并且如果有必要,告知互连是否需要将脏副本写回主内存。
    4. 处理脏副本:如果存在脏副本需要写回主内存,相应的被监听主组件会通过监听数据通道(snoop data channel)将脏副本提供给互连。然后,互连构建事务,将脏副本写回主内存。
    5. 响应传回发起主组件:互连使用读取数据通道(read data channel)向发起的主组件提供响应。在这个过程中,只有响应字段是有效的,不涉及数据传输,因为CleanUnique事务的目的是要移除其他副本,而不是获取数据。
    6. 执行存储操作并完成事务:发起的主组件在收到响应后,执行存储操作,将新数据写入缓存行。存储操作完成后,主组件使用读确认信号(RACK)来指示事务已经完成。
    • 这个过程确保了在多缓存系统中,当主组件需要更新缓存行时,可以正确地进行,同时维护了缓存一致性。通过这种方式,ACE协议支持了复杂的缓存操作,优化了系统性能,并确保了数据的一致性。
  • 情况4:重叠存储操作(Overlapping store operations):在某些情况下,可能会有两个或更多的主设备尝试同时向同一个共享位置存储数据。这种情况下,ACE协议提供了一种机制来处理这些重叠的存储操作,确保数据的一致性和事务的顺序。
    • 约定:
      • Master1:互连选择首先继续操作的组件;
      • Master2:互连选择其次继续操作的组件。
    • Master1的操作:Master1按照执行共享位置存储操作的描述(参见1.2.3.4示例2)进行操作。这通常涉及到获取缓存行的唯一副本,并在确认没有其他缓存副本后,执行存储操作。
    • Master2的操作:Master2使用其监听端口(snoop port)来观察Master1的存储操作。根据Master2的需求和操作类型,适用以下规则:
      1. 需要数据的情况:如果Master2需要数据,它将在自己的事务完成时接收数据,并可以正常继续自己的存储操作。
      2. 全缓存行存储:如果Master2正在进行整个缓存行的存储,它在观察到与Master1存储操作相关的监听事务时,会移除任何原始数据副本。然而,当Master2自己的事务完成时,它可以继续执行自己的全缓存行存储。
      3. 部分缓存行存储:如果Master2正在进行部分缓存行存储,并且原本就拥有缓存行的副本,因此不请求数据副本,则需要特殊考虑。在这种情况下,当Master2观察到与Master1存储操作相关的监听事务时,它必须移除其原始数据副本。然后,当Master2的事务完成时,它可以采取以下选项之一:①为了在缓存中保留缓存行,Master2必须发起一个新的事务来请求数据副本,以便完成存储操作。②Master2可以执行部分缓存行写入主内存的操作,确保行被正确更新,但主组件不保留缓存行的副本。以后如果需要访问缓存行,它必须再次获取数据。
    • 通过这种方式,ACE协议确保了在多主组件环境中,即使在并发写操作的情况下,数据的一致性和完整性也能得到维护。互连的决定性和对事务顺序的管理是确保系统稳定性和性能的关键。

1.2.4监听事务

当一个缓存执行写操作时,它会通过Snoop通道发送监听事务,以确保其他缓存中的相应缓存行被适当地更新或失效。

通过这些通道和信号的综合使用,ACE协议能够有效地管理缓存一致性操作,确保数据在多个缓存之间正确地共享和同步。这对于多处理器系统和复杂的SoC设计来说至关重要,因为它有助于提高系统的性能和可靠性。


1.2.4.1非监听事务

在ACE协议中,非监听事务(Non-snooping transactions)用于访问那些不在其他主组件(master components)缓存中的内存位置。这些事务不会触发监听操作(snoop transactions),并且在以下情况下使用:

  1. 非共享(Non-shareable):这类内存位置通常不涉及多个缓存之间的数据共享,因此不需要监听其他缓存的状态或更新。

  2. 设备(Device):这些内存位置通常映射到外围设备,如I/O控制器或其他硬件接口,它们的访问模式可能与标准的内存访问不同。

非监听事务有两种形式,分别是:

  • ReadNoSnoop:这种事务用于从内存中读取数据,而不触发监听操作。这通常用于那些不需要担心一致性问题的内存位置。

  • WriteNoSnoop:这种事务用于将数据写入内存,同样不触发监听操作。它允许主组件直接写入数据到指定的内存位置,而不需要考虑其他缓存可能持有的副本。

注意: 在一致性上下文中,ReadNoSnoop和WriteNoSnoop事务也被称为Read和Write事务。然而,为了区分这种特定类型的事务和更一般的读取或写入事务集合,可以使用名称的扩展形式。这种区分有助于清晰地表明事务的性质和它在系统中的作用,特别是在涉及到缓存一致性管理时。通过使用非监听事务,系统可以有效地处理那些不需要监听或其他一致性保障的内存访问操作,从而优化性能并简化系统设计。


1.2.4.2一致性事务

在ACE协议中,一致性事务(Coherent transactions)用于访问可能被其他组件的一致性缓存所持有的共享地址位置(Shareable address locations)。这些事务确保在访问共享数据时,系统中的所有缓存都能保持数据的一致性。以下是几种从共享位置执行加载(load)和存储(store)操作的一致性事务类型:


从共享位置执行加载操作的事务

  1. ReadClean

    ReadClean事务表明请求读取的主组件只能接受干净的(Clean)缓存行,不能接受脏的(Dirty)缓存行,即它不能承担之后必须写回内存的责任。这种事务通常由无法接受脏缓存行或拥有写入直通(Write-Through)缓存的主组件使用。
  2. ReadNotSharedDirty

    ReadNotSharedDirty事务表明请求读取的主组件可以接受任何状态的缓存行,除了SharedDirty状态。这意味着缓存行可以是干净的(无论是唯一的还是共享的),或者是唯一的脏缓存行。
  3. ReadShared

    ReadShared事务表明请求读取的主组件可以接受任何状态的缓存行。这包括干净的、脏的、唯一的或共享的缓存行。

对于这些事务,如果被监听的缓存持有脏缓存行,即使请求缓存行的主组件不能接受它,被监听的缓存也可以传递脏缓存行。在这种情况下,互连(interconnect)负责将脏缓存行写回主内存。

如果接收到这些监听事务的缓存持有数据副本,建议它提供数据以完成监听事务。互连必须将数据传回发起的主组件。如果提供数据的缓存原本持有唯一的缓存行,则为了保留副本,它必须在操作后将缓存行状态改为共享状态。

执行存储操作到共享位置的事务

  1. ReadUnique

    当执行部分缓存行存储时,主组件使用ReadUnique事务。这种事务在主组件没有缓存行副本的情况下获取数据副本,并确保不存在其他副本。
  2. CleanUnique

    当执行部分缓存行存储且已拥有缓存行副本时,主组件使用CleanUnique事务。CleanUnique事务移除所有其他副本,但如果发现有缓存持有脏副本,则确保将脏缓存行写入主内存。
  3. MakeUnique

    • 主组件执行完整缓存行存储时使用MakeUnique事务。MakeUnique事务使所有其他副本无效。

访问共享位置时不需要缓存副本的事务

  1. ReadOnce

    主组件使用ReadOnce事务来获取它不需要复制到缓存的数据快照。对于ReadOnce事务,如果提供数据的缓存原本持有唯一的缓存行,则无需在ReadOnce事务后将缓存行改为共享状态。
  2. WriteUnique

    WriteUnique事务用于在发出写事务之前移除所有缓存行副本。它可以用于写入完整或部分缓存行,并确保在执行写事务前将脏数据写入内存。
  3. WriteLineUnique

    WriteLineUnique事务用于在发出写事务之前移除所有缓存行副本。WriteLineUnique事务必须仅在写入完整缓存行时使用,即事务中的所有字节都被事务写入。

注意: 与其他访问共享内存的事务不同,主组件发出的ReadOnce和WriteUnique事务不需要是完整缓存行大小。然而,WriteLineUnique事务必须是一个完整的缓存行大小。


1.2.4.3内存更新事务

在ACE协议中,内存更新事务(Memory update transactions)用于处理缓存行的数据更新到主内存(main memory)的操作。以下是用于更新主内存的几种事务类型:

  1. WriteBack

    WriteBack事务用于将脏缓存行(Dirty line)写回主内存,以释放缓存行用于存储不同地址的数据。执行WriteBack事务的主组件不会保留缓存行的副本。这种事务通常在缓存行被替换或需要为其他数据腾出空间时使用。
  2. WriteClean

    WriteClean事务用于将脏缓存行写回主内存,同时允许主组件保留缓存行的副本。这意味着数据被写回主内存后,缓存行仍然在缓存中有效,并可以继续使用。
  3. WriteEvict

    WriteEvict事务用于逐出干净的缓存行(Clean cache line)。这种事务通常用于将缓存行写入到缓存层次结构的更低级别,例如L3缓存或系统级缓存。WriteEvict事务不需要更新主内存,它主要用于缓存层级之间的数据迁移。
  4. Evict

    Evict事务用于指示一个缓存行被逐出本地缓存的地址,当不需要更新主内存时使用。这种事务有助于跟踪特定组件中的缓存行,并可用于构建监听过滤器等应用。Evict事务不涉及数据传输。

注意:

  • WriteBack、WriteClean、WriteEvict和Evict事务不会导致其他缓存的监听事务(snoop transactions)。这意味着其他缓存不需要知道缓存行是否已经被写回主内存。
  • 这些事务不像其他监听事务那样被序列化处理。这是因为它们主要关注于缓存行的替换和逐出,而不是数据的一致性问题。这些事务的处理方式更为直接,通常不需要复杂的一致性检查或多个缓存之间的协调。

通过这些内存更新事务,ACE协议提供了灵活的缓存管理机制,允许系统有效地处理缓存行的替换和逐出,同时维护数据的一致性和完整性。这些事务的独立性也有助于简化系统设计,提高性能。


1.2.4.4缓存维护事务

缓存维护事务(Cache maintenance transactions)是ACE协议中用于访问和维护系统中其他主组件的缓存的事务。这些事务特别允许主组件查看加载(load)和存储(store)操作对系统缓存的影响,尤其是那些通常无法直接访问的缓存。这个过程通常被称为软件缓存维护(Software Cache Maintenance)。广播缓存维护操作还可以传播到下游缓存,允许系统中的所有缓存被维护。


缓存维护事务的注意点

  • 发起缓存维护事务的主组件也负责对其自己的本地缓存执行相应的操作。

用于维护缓存的事务类型

  1. CleanShared

    主组件使用CleanShared事务对系统中其他组件的缓存执行清理操作。如果被监听缓存持有脏缓存行(Dirty cache line),它必须提供该缓存行,以便缓存行可以被写回主内存。被监听缓存可以保留其本地缓存行的副本。
  2. CleanInvalid

    主组件使用CleanInvalid事务对系统中其他组件的缓存执行清理并使无效的操作。如果被监听缓存持有干净的缓存行(Clean cache line),它必须移除其本地缓存行的副本。如果被监听缓存持有脏缓存行,它必须提供该缓存行以便写回主内存,并移除其本地缓存行的副本。
  3. MakeInvalid

    主组件使用MakeInvalid事务对系统中其他组件的缓存执行使无效操作。如果被监听缓存接收到MakeInvalid事务,它必须移除其本地缓存行的副本,但即使缓存行是脏的,也不需要提供任何数据。

这些缓存维护事务对于确保系统中缓存的一致性和有效性至关重要。它们允许系统在不直接访问缓存的情况下,通过软件方式管理和维护缓存内容。这种机制对于系统的稳定性和性能优化非常有帮助,尤其是在处理复杂的多处理器和多缓存架构时。通过这些事务,系统可以有效地处理缓存行的替换、逐出和数据一致性问题,同时提供了一种灵活的方式来适应不同的系统需求和工作负载。

1.2.4.5监听事务

监听事务(Snoop transactions)是ACE协议中使用监听地址(snoop address)、监听响应(snoop response)和监听数据(snoop data)通道的事务。这些事务是一致性事务(coherent transactions)和缓存维护事务(cache maintenance transactions)的一个子集,专门用于在系统中的不同缓存之间维护数据一致性。


监听事务的组成

  1. 监听地址通道(Snoop Address Channel)

    • 这个通道用于传输监听请求,通常包含被监听的内存地址和相关的控制信号。
  2. 监听响应通道(Snoop Response Channel)

    • 这个通道用于被监听的主组件(snooped master components)对监听请求做出响应。响应可以包括是否存在对应的缓存行、缓存行的状态(如干净或脏)等信息。
  3. 监听数据通道(Snoop Data Channel)

    • 这个通道用于在需要时传递实际的数据。例如,如果一个监听请求需要数据副本,被监听的主组件可以通过这个通道提供脏数据。

监听事务的用途

  • 数据一致性:监听事务允许系统中的主组件检查其他缓存是否有特定的数据副本,并根据需要采取行动,如更新、替换或无效化缓存行。

  • 缓存维护:通过监听事务,主组件可以管理其缓存中的数据,确保缓存的有效性和一致性,例如在数据被逐出或替换时。

  • 系统级操作:监听事务还支持系统级的操作,如软件缓存维护,允许主组件在不影响其他缓存的情况下,查看和修改缓存内容。


监听事务的类型

监听事务可以是读取(read)或写入(write)操作,具体取决于主组件的需求和系统中的数据状态。例如:

  • ReadSnoop:用于当主组件需要读取共享数据时,监听其他缓存中的数据副本。

  • WriteSnoop:用于当主组件需要写入共享数据时,确保其他缓存中的相应数据副本被适当处理。

监听事务是ACE协议中确保缓存一致性和数据同步的关键机制之一。通过这些事务,系统能够有效地处理复杂的缓存一致性问题,并优化数据在多个缓存和主内存之间的流动。


1.2.4.6屏障事务

屏障事务(Barrier transactions)在系统中提供了关于事务排序和观察的保证。它们是确保在多处理器或多缓存系统中数据一致性和顺序性的重要机制。在ACE协议中,屏障事务有两种主要类型:内存屏障(Memory barrier)和同步屏障(Synchronization barrier)。

内存屏障(Memory Barrier)

内存屏障由主组件(master component)发起,以确保如果系统中的另一个主组件能够在屏障之后观察到任何事务,那么它必须能够观察到屏障之前的所有事务。这种类型的屏障主要用于处理缓存一致性问题,确保在执行后续操作之前,所有相关的数据都已经更新并可见。

同步屏障(Synchronization Barrier)

同步屏障用于确定在特定域中的所有主组件都能够观察到屏障之前发出的所有事务。某些同步屏障还要求,在屏障完成之前,所有在屏障之前发出的事务必须已经到达目标从属组件(destination slave component)。这意味着同步屏障不仅确保了事务的可见性,还确保了事务的到达顺序。


屏障事务的使用场景

  • 确保顺序:在执行一系列依赖于特定顺序的操作时,屏障事务可以确保这些操作按照预期的顺序执行。
  • 系统同步:在系统启动、恢复或迁移等操作中,屏障事务可以确保所有组件在继续执行之前都已经达到了一致的状态。
  • 避免数据不一致:在分布式系统中,屏障事务可以避免因为并发操作导致的不一致问题,确保数据的完整性。

注意事项

  • ACE5和ACE5-Lite接口变体不支持屏障事务。这意味着在这些接口的实现中,需要寻找其他机制来处理事务的顺序和一致性问题。
  • 屏障事务的具体实现和行为可能会根据不同的系统和缓存一致性协议有所不同。

屏障事务是维护多处理器或多缓存系统中数据一致性和顺序的重要工具。通过内存屏障和同步屏障,系统可以确保在执行关键操作之前,所有相关的数据都已经更新并可见,以及在特定时刻,所有组件都达到了一致的状态。这些保证对于构建高性能、高可靠性的系统至关重要。更多关于屏障事务的详细信息和应用场景,可以参考ACE协议的第D8章“屏障事务”。


1.2.4.7分布式虚拟事务【陌生】

分布式虚拟内存事务(Distributed Virtual Memory transactions)是虚拟内存系统中用于维护和管理的关键机制。在分布式虚拟内存(DVM)系统中,这些事务通常用于组件之间的消息传递。DVM系统通过在多个计算节点之间分布内存页(pages)来扩展可用的内存资源,从而允许系统更有效地利用资源并提高性能。

DVM事务的作用

  • 内存管理:DVM事务负责管理内存页的分配、迁移和回收。它们确保系统中的内存使用是最优的,并且当一个节点的内存不足时,可以将内存页移动到其他节点上。
  • 负载均衡:通过在节点之间分布内存页,DVM事务有助于实现负载均衡。这可以防止某些节点过载而其他节点资源闲置的情况。
  • 提高性能:通过优化内存页的分布,DVM事务可以减少内存访问延迟,提高缓存命中率,从而提升系统的整体性能。
  • 容错:DVM事务还可以支持容错机制,例如,当一个节点发生故障时,可以将该节点上的内存页迁移到其他节点上,以保证系统的连续运行。

DVM事务的类型

  • 页迁移:当一个节点的内存资源紧张时,可以将一些不常用的内存页迁移到其他节点上。
  • 页复制:为了提高数据访问速度,可以将热点数据(频繁访问的数据)复制到多个节点上的内存中。
  • 页回收:当内存页不再被使用或者一个节点的内存资源需要被释放时,DVM事务会负责回收这些内存页。
  • 页共享:在多个节点之间共享内存页,以支持并行计算和数据共享。

DVM事务的实现

DVM系统的实现通常涉及到以下几个关键组件:

  • 目录服务:记录哪些节点上存在哪些内存页的目录服务,用于支持页查找和一致性维护。
  • 消息传递:节点之间通过消息传递来协调内存页的迁移、复制和回收等操作。
  • 内存管理单元:每个节点上的内存管理单元负责处理与该节点相关的内存事务。

DVM事务的挑战

  • 网络延迟:在分布式系统中,节点之间的通信可能会受到网络延迟的影响,这可能会影响DVM事务的效率。
  • 一致性维护:保持系统中所有节点上的内存页一致性是一个挑战,需要有效的协议和算法来支持。
  • 容错机制:设计有效的容错机制以应对节点故障和网络问题,确保系统的可靠性和可用性。

分布式虚拟内存事务是实现大规模、高效、可靠虚拟内存系统的关键。通过这些事务,系统可以在多个节点之间有效地管理内存资源,提高性能并实现容错。更多关于DVM事务的详细信息和应用场景,可以参考ACE协议的第D13章“分布式虚拟内存事务”。


1.2.5事务处理(Transaction processing)

事务处理是ACE协议中维护缓存一致性的关键过程。当主组件(master component)发起一个事务时,一致性信号表明该事务是针对多个组件共享的内存位置(Shareable),因此需要一致性支持。事务的典型处理流程如下:

  1. 发起事务

    启动的主组件发出事务请求。这可能是一个读、写或其他类型的操作,取决于所需的数据访问类型。
  2. 根据一致性需求传递事务

    根据是否需要一致性支持,事务会被直接传递给从属组件(slave component),或者传递给互连(interconnect)内部的一致性支持逻辑。
    • 如果不需要一致性支持,事务可能会直接传递给目标从属组件,这取决于使用的地址解码方案。
    • 如果需要一致性支持,事务会被传递给互连的一致性逻辑处理模块。
  3. 检查事务顺序

    一致性事务会与其他主组件发起的后续事务进行比较,以确保正确的处理顺序。这是为了维护系统中事务的一致性和顺序性。
  4. 确定监听事务

    互连确定需要执行哪些监听事务(snoop transactions)。这些监听事务用于检查其他缓存中是否存在目标数据的副本,并根据需要更新它们。
  5. 提供监听响应

    每个接收到监听事务的缓存主组件都必须提供监听响应(snoop response)。有些主组件可能还需要提供监听数据(snoop data)来完成监听事务。
  6. 判断是否需要访问主内存

    互连判断是否需要访问主内存。如果事务涉及到脏数据的写回或者需要从主内存中加载新数据,那么就需要进行主内存访问。
  7. 整合响应和数据

    互连整合所有监听响应和所需的数据。这一步骤是为了准备完成事务,确保所有相关的数据都已经收集并准备好。
  8. 完成事务

    启动的主组件完成事务。这可能涉及到更新本地缓存、写回主内存或者确认数据的接收等操作。

1.2.6核心概念:

1.2.6.1域(domains)

在ACE协议中,定义的共享域(Domains)是不重叠的,这意味着每个主组件(master component)只能属于一个外部共享(Outer Shareable)域。这种设计确保了一致性,避免了事务处理中的冲突和混淆。以下是关于共享域的一些详细说明:


外部共享域的一致性要求

对于每个属于外部共享域的主组件,所有其他包含该主组件的内部共享(Inner Shareable)域中的主组件也必须包含在同一个外部共享域中。这样的结构保证了系统中的一致性,确保了事务的正确传播和处理。

系统域(System Domain)

当事务必须对系统中的所有其他主组件可见时,使用系统域(System domain)。系统域包括了系统中所有的主组件,确保了事务的全局可见性和一致性。

非共享域(Non-shareable Domain)

非共享域包含单个主组件,这个域中的主组件不与其他主组件共享缓存行。这意味着在这个域中的主组件可以独立地执行操作,而不需要考虑其他主组件的缓存状态。


图示说明1

如图D1-3所示,系统中包含主组件0-9的共享域配置示例说明了主组件之间的共享关系。例如,因为主组件0在其内部共享域中包含主组件1,那么主组件1也必须在其内部共享域中包含主组件0。


图例说明2:

从主组件1的视角来看(如图D1-4):

  • 主组件1的缓存是本地缓存(local cache)。
  • 主组件2-6的缓存是同级缓存(peer caches)。
  • 主组件1-3的缓存属于内部共享域(Inner Shareable domain)。
  • 主组件1-6的缓存属于外部共享域(Outer Shareable domain)。
  • 缓存1是下游缓存(downstream cache),它可能与其他主组件的缓存相连,用于数据传输和一致性维护。

1.2.6.2Barriers

屏障事务(Barrier transactions)在系统中提供了关于事务排序和观察的保证。它们是确保多处理器系统中事务顺序性和同步性的重要机制。


1.2.6.3DVM虚拟缓存

在图D1-5所示的系统中,系统内存管理单元(System Memory Management Units,简称SMMUs)负责将虚拟地址空间(virtual address space)中的地址转换为物理地址空间(physical address space)中的地址。尽管系统中的所有组件都必须使用单一的物理地址空间,但SMMU组件允许不同的主组件在其自己的独立虚拟地址空间或中间物理地址空间中操作。

虚拟内存系统中的一个典型过程可能按照以下步骤进行:

  1. 发起事务:一个在虚拟地址空间中操作的主组件发出使用虚拟地址(VA)的事务。

  2. 地址转换:SMMU接收VA,并将其转换为物理地址(PA):

    • 如果SMMU最近已经执行过所请求的转换,它可能从其TLB(Translation Lookaside Buffer)中获取翻译的缓存副本。
    • 否则,SMMU必须执行翻译表遍历,访问存储在内存中的翻译表,以获得所需的VA到PA的翻译。
  3. 使用PA发起事务:SMMU使用PA为请求的组件发起事务。

    在这个过程的第2步中,所需的VA的翻译可能不存在。在这种情况下,翻译表遍历会引发一个故障,必须通知维护翻译表的代理。为了使所需的访问继续进行,该代理必须提供所需的VA到PA的翻译。通常,它会在翻译表中更新所需的信息。

维护翻译表可能需要更改缓存在TLB中的翻译表条目。为了防止使用这些条目,可以使用DVM(Distributed Virtual Memory)消息来执行TLB使无效(invalidate)操作。

当翻译表已经更新,并且执行了所需的TLB使无效操作后,使用DVM同步(Sync)事务来确保所有必需的事务都已完成。

  • ACE支持DVM:ACE协议支持分布式虚拟内存,这是一种允许多个处理器共享内存资源的技术,以提高系统的整体性能和资源利用率。

  • 虚拟内存系统管理:ACE协议包含了支持虚拟内存系统管理的事务,这些事务使得系统能够有效地处理虚拟地址到物理地址的映射,以及内存资源的分配和管理。

1.2.7 协议错误:

在ACE协议中,定义了两类协议错误:软件协议错误(software protocol error)和硬件协议错误(hardware protocol error)。这些错误类别有助于识别和处理系统中可能发生的问题,确保数据的一致性和系统的稳定性

1.2.7.1软件类协议错

软件协议错误发生在对同一位置进行多次访问时,使用了不匹配的共享性(shareability)或可缓存性(cacheability)属性。这种错误可能导致缓存一致性的丢失,并可能导致数据值的损坏。

为了处理软件协议错误,ACE协议要求系统不能因为这类错误而死锁(deadlock),并且事务必须始终能够在系统中向前推进。此外,对一个4KB内存区域的访问引起的软件协议错误不应该导致不同4KB内存区域的数据损坏。

对于存储在普通内存(Normal memory)中的位置,可以使用适当的屏障(barriers)和软件缓存维护(software cache maintenance)技术将内存位置恢复到一个定义明确的状态。

当访问外设(peripheral device)时,如果使用了可修改的事务(Modifiable transactions),这通常由AxCACHE[1] = 1指示,那么不能保证外设的正确操作。唯一的要求是外设继续以符合协议的方式响应事务。如果外设被错误访问,将其恢复到已知工作状态所需的事件序列是“实现定义的”(IMPLEMENTATION DEFINED),这意味着具体的恢复步骤可能因系统实现而异。

1.2.7.2硬件类协议错

硬件协议错误(Hardware Protocol Error)是指不属于软件协议错误的任何协议错误。这类错误通常是由硬件组件的故障或不当行为引起的,例如缓存、内存管理单元(MMU)、互连或其他系统组件的问题。


硬件协议错误的特点

  • 无需支持:与软件协议错误不同,ACE协议不要求系统对硬件协议错误提供支持。这意味着,如果发生硬件协议错误,系统可能无法提供一种标准的错误恢复机制。

  • 恢复不保证:如果发生硬件协议错误,从错误中恢复并不保证。系统可能会出现崩溃(crash)、锁死(lock up)或其他无法恢复的故障。

硬件协议错误的处理

由于硬件协议错误的处理通常超出了协议规范的范围,因此系统设计者和硬件工程师需要采取措施来预防这类错误,并设计相应的错误检测和恢复机制。这可能包括:

  • 错误检测:通过硬件冗余、自我检测和修复(self-checking and self-repairing)等技术来检测潜在的硬件错误。
  • 容错设计:使用容错设计,如冗余硬件组件和热备份,以确保系统的某个部分发生故障时,系统仍能继续运行。
  • 硬件重置:在检测到硬件协议错误时,可能需要对相关硬件组件进行重置,以清除错误状态。
  • 系统重启:在某些情况下,如果错误无法恢复,可能需要对整个系统进行重启,以恢复到一个已知的良好状态。

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值