本章节对应手册中Chapter D3 Channel Signaling章节,详细阐述了ACE接口上的基本信道信令要求。以下是本章节包含的主要内容:
由于篇幅原因Channel Signal章节计划分为上下两篇内容,本片为ACE(AXI Coherency Extensions) 协议学习记录3:Channel Signaling(上),主要包含读写地址通道信号的描述。
目录
缓存行大小事务(Cache line size transactions):
3.1读/写地址通道信号
3.1.1共享域类型(Shareability Domain Types)
ACE协议引入了共享域的概念,它是指一组主设备(masters),用于确定在发起一致性或屏障事务时应该包括哪些其他主设备。ACE协议定义了四个级别的共享域:
- 非共享(Non-shareable):包含单一主设备的域。
- 内部共享(Inner Shareable):可以包含额外主设备的内部域。
- 外部共享(Outer Shareable):包含所有内部域中的主设备,并可能包含额外的主设备。
- 系统(System):包含系统中所有主设备的域。
系统域概述 -> 1.2.6.1域(domains)
表D3-1展示了ACE协议中读地址通道和写地址通道的共享域信号,这些信号由主设备(Master)发出,用于指示正在进行的读或写事务的共享域类型。
共享域信号
事务通道 | 信号 | 来源 | 描述 |
---|---|---|---|
读地址通道 | ARDOMAIN[1:0] | 主设备(Master) | 指示读事务的共享域 |
写地址通道 | AWDOMAIN[1:0] | 主设备(Master) | 指示写事务的共享域 |
Note:
尽管在系统中可以存在多个非共享(Non-shareable)、内部共享(Inner Shareable)和外部共享(Outer Shareable)域,但每个域中包含的主设备(masters)必须有一个统一的定义。这意味着,无论在系统的哪个部分,属于特定共享域的主设备集合应该是一致的,以确保缓存一致性和事务的正确处理。
AxDOMAIN[1:0]
信号(ARDOMEN
或AWDOMAIN
信号)的编码方式,定义了共享域的不同级别:
0b00
:非共享(Non-shareable)域,表示不与其他主设备共享缓存行。0b01
:内部共享(Inner Shareable)域,表示内部共享的一组主设备之间可以共享缓存行。0b10
:外部共享(Outer Shareable)域,表示包含内部共享域的所有主设备,并可能包括更多主设备。0b11
:系统(System)域,表示系统中所有主设备之间的共享。
在ACE协议中,针对不同内存类型的事务,共享域的使用受到特定的限制:
-
设备事务(Device transaction):当
AxCACHE[1]
信号等于零时,表示该事务为设备事务,它必须仅使用系统级别(System level)的共享域。这意味着,设备事务不涉及缓存一致性操作,而是直接与系统内存进行交互。 -
可缓存事务(Cacheable transaction):当
AxCACHE[3:2]
信号不等于零时,表示该事务为可缓存事务,它不能使用系统级别的共享域。可缓存事务涉及缓存行的共享和一致性管理,因此需要在较低级别的共享域(如内部共享或外部共享)中进行处理。
这些限制确保了系统能够根据事务的类型和内存访问的缓存属性,正确地管理和维护缓存一致性。通过这种方式,系统可以优化性能,避免不必要的缓存一致性检查,同时确保数据的一致性和完整性。
AxCACHE
是AXI4协议中写地址通道(Write Address Channel)和读地址通道(Read Address Channel)的信号的一部分。这个信号用于指定事务的缓存属性,如缓存的使能状态和缓存策略。在AXI4接口中,AxCACHE
通常是一个4位的字段,但在某些情况下可能会被缩减到2位或3位,具体取决于实现的需要。
AxCACHE和AxDOMAIN信号组合
-
本地缓存访问的排除:表D3-3不包括发起主设备(initiating master)内部缓存的访问。这意味着表中描述的缓存访问仅涉及主设备之外的缓存。
-
允许但非预期的组合:表中标记为“允许”(Permitted)的
AxCACHE
和AxDOMAIN
组合在协议中是合法的,但并不常见。这些组合可以在内存位置可以在需要监听的域级别被缓存,但事务故意不在下游缓存时使用,例如在系统级缓存中。 -
非缓存事务的数据获取:当
AxCACHE
指示为非缓存(Non-cacheable)且AxDOMAIN
指示为内部共享(Inner Shareable)或外部共享(Outer Shareable)时,不要求必须从最终目的地获取数据。这可能适用于某些特殊的缓存策略或事务类型。 -
外部共享对等缓存的包含:当表D3-3显示访问的缓存是外部共享对等缓存时,这包括所有内部共享对等缓存。这意味着在处理外部共享事务时,也考虑了内部共享缓存的影响。
-
系统域内存位置的缓存限制:被指示为在系统域(System domain)的内存位置不能被任何缓存持有。这通常意味着系统域内存位置需要直接访问,不允许缓存介入,以确保一致性和可预测性。
拓展:总线协议、总线、控制器三者之间的关系
AXI总线协议:
AXI(Advanced eXtensible Interface)是由ARM公司定义的一种高性能、高带宽、低延迟的片上总线协议。它规定了在SoC(System on Chip)中不同IP核之间进行数据传输和通信的规则和标准。
AXI协议包括多个版本,如AXI3和AXI4,每个版本都有其特定的特性和改进。这些协议定义了信号集、事务类型、传输模式等,以支持复杂的数据传输需求。
总线:
- 总线是SoC中用于连接不同IP核的物理或逻辑通道,它实现了AXI协议中定义的数据传输。总线可以是物理的电气连接,如铜线或光导纤维,也可以是逻辑上的通信路径,如通过软件定义的通信接口。
- 总线的主要作用是传输数据、地址、控制信号等,使得SoC中的处理器、内存、外设等组件能够相互通信和协作。
控制器:
- 控制器是指管理和协调总线上数据传输的硬件或软件组件。在AXI协议中,控制器可以是一个独立的硬件IP核,也可以是集成在其他IP核中的控制逻辑。
- 控制器负责处理AXI事务,如发起读/写请求、处理响应、维护缓存一致性、执行事务的分割和合并等。它还可能包括地址翻译、优先级管理、错误处理等功能。
- 在某些设计中,控制器可能是可配置的,允许设计者根据系统需求来定制其行为,例如通过设置
AxCACHE
信号来决定事务的可修改性。总结来说,AXI总线协议定义了SoC中数据传输的规则,总线是实现这些规则的物理或逻辑通道,而控制器是执行和管理这些规则的组件。这三者共同工作,确保了SoC中的数据能够高效、可靠地在不同组件之间传输和处理。设计者需要根据AXI协议来设计和集成总线和控制器,以实现所需的系统性能和功能。
扩展:ACE协议中提到的互连(interconnect)概念的理解
在AXI总线架构中,互连(interconnect)通常指的是连接不同IP核的中介网络或硬件组件,它实现了总线的功能,允许数据在SoC中的各个部分之间流动。互连可以被视为总线的一种实现,或者是总线概念的一个扩展。
互连的角色和功能包括:
数据传输:互连负责在SoC的不同组件之间传输数据,包括处理器、内存、外设等。
事务管理:互连管理AXI事务,包括读、写、响应等,确保事务按照AXI协议的规定正确地进行。
缓存一致性:在多缓存的SoC设计中,互连负责维护缓存一致性,处理缓存行的替换、无效化、合并等操作。
冲突解决:互连处理多个事务同时发生时可能出现的冲突,例如,当多个事务尝试访问同一内存位置时,互连需要决定事务的执行顺序。
桥接:互连可以作为不同总线标准或协议之间的桥梁,允许它们之间进行通信。
优化:互连可以根据系统的需求和性能目标对事务进行优化,例如,通过调整事务的突发长度或合并多个小事务来提高总线效率。
在理解上,互连可以被视为SoC设计中的一个枢纽,它不仅提供了物理连接,还包含了逻辑控制和优化机制,使得系统能够高效地运行。互连的设计和实现对于整个SoC的性能和可靠性至关重要。设计者需要确保互连能够支持AXI协议的所有特性,并根据具体的应用场景进行优化。
扩展:互连(interconnect)和总线控制器
互连(interconnect)和总线控制器(bus controller)是相关但不完全相同的概念。在SoC设计中,它们的关系和区别如下:
互连(Interconnect):
- 互连是指连接SoC内部各个IP核的硬件架构,它提供了数据和控制信号的传输路径。
- 互连可以包括多个层次和不同类型的总线,如AXI、AHB、APB等,它们共同构成了SoC的通信骨架。
- 互连的设计关注于优化数据流、减少延迟、提高带宽和确保事务的顺利进行。
总线控制器(Bus Controller):
- 总线控制器通常是指管理总线上事务的硬件组件或逻辑单元,它负责生成和控制事务,如发起读/写请求、处理响应、维护事务顺序等。
- 总线控制器可以是互连的一部分,或者是作为独立IP核存在的,它负责执行AXI协议中定义的控制逻辑。
在某些情况下,互连和总线控制器可能是集成在一起的,特别是在一些简化的设计或集成度较高的SoC中。在这种情况下,互连不仅提供了物理连接,还集成了控制逻辑,从而实现了总线控制器的功能。
总的来说,互连是SoC中连接不同组件的硬件架构,而总线控制器是管理这些连接上事务的硬件或逻辑单元。两者共同工作以确保数据在SoC中的有效传输和系统的稳定性。在设计SoC时,需要综合考虑互连和总线控制器的设计,以实现最佳的性能和功能。
3.1.2屏蔽域类型(barrier)
在ACE协议中,每个地址通道都有自己的屏障事务信号(barrier transaction signal),用于控制事务的顺序和确保数据的一致性。屏障事务是一种特殊的事务类型,它用于在系统中创建一个同步点,确保在此点之前的所有事务都已完成,从而为系统中的所有缓存和主设备提供了一个一致的观察点。
- 读屏障:用于确保在继续执行后续读事务之前,所有先前的读事务都已完成。
- 写屏障:用于确保在继续执行后续写事务之前,所有先前的写事务都已完成。
屏蔽域信号:
表D3-4 屏障事务信号
信号 | 来源 | 事务通道 | 描述 |
---|---|---|---|
ARBAR[1:0] | 主设备(Master) | 读地址通道 | 指示事务是否为读屏障。 |
AWBAR[1:0] | 主设备(Master) | 写地址通道 | 指示事务是否为写屏障。 |
这个表格列出了在ACE协议中用于屏障事务的信号,包括读地址通道的ARBAR[1:0]
和写地址通道的AWBAR[1:0]
。这些信号由主设备发出,用于指示相应的事务是读屏障还是写屏障。
表D3-5描述了AXI协议中屏障事务信号的编码方式,AxBAR[1:0]
是一个两位的信号,用于指示事务的屏障类型。以下是不同编码对应的屏障类型:
-
0b00
:正常访问,尊重屏障(Normal access, respecting barriers)- 当
AxBAR[1:0]
设置为00
时,表示这是一个普通的内存访问事务,它将遵守系统中设置的屏障。这意味着在屏障点,事务将等待直到所有先前的事务都已完成,确保了事务的顺序性和一致性。
- 当
-
0b01
:内存屏障(Memory barrier)- 当设置为
01
时,表示这是一个内存屏障事务。内存屏障用于确保所有先前的内存访问(无论是读还是写)在执行后续事务之前都已完成,防止内存操作的重排序,保证内存操作的顺序性。
- 当设置为
-
0b10
:正常访问,忽略屏障(Normal access, ignoring barriers)- 当设置为
10
时,表示这是一个普通的内存访问事务,但它将忽略系统中的任何屏障。这种设置通常用于那些不需要严格顺序保证的事务,或者在某些特定的上下文中,屏障的逻辑已经被其他方式处理。
- 当设置为
-
0b11
:同步屏障(Synchronization barrier)- 当设置为
11
时,表示这是一个同步屏障事务。同步屏障是一种强屏障,它确保所有先前的事务在执行后续事务之前都已完成,并对所有处理器可见。这在多处理器系统中特别重要,用于确保所有处理器在继续执行之前达到一致的状态。
- 当设置为
3.1.3共享事务类型(Shareable transaction types)
在ACE协议中,读和写共享事务类型(Shareable transaction types)通过每个地址通道的特定信号来指示。这些信号允许系统了解正在进行的事务是针对共享内存位置的,并且可能需要执行缓存一致性操作。以下是对表D3-6的假设内容的描述:
表D3-6 读和写共享事务类型信号
事务通道 | 信号名称 | 来源 | 描述 |
---|---|---|---|
读地址通道 | ARSNOOP[3:0] | 主设备(Master) | 指示读事务的类型,包括是否为监听(Snoop)事务或其他特殊类型的共享事务。 |
写地址通道 | AWSNOOP[2:0] | 主设备(Master) | 指示写事务的类型,包括是否为监听(Snoop)事务或其他特殊类型的共享事务。 |
在ACE协议中,读写地址通道上的事务被归类为以下几个类别:
-
非监听事务(Non-snooping):
这些事务不会监听其他主设备的缓存。它们通常用于不需要考虑缓存一致性的内存位置,例如设备内存或非共享内存区域。 -
一致性事务(Coherent):
这些事务针对的内存位置可能被其他主设备的缓存所持有,因此需要执行监听操作。一致性事务确保数据在多个缓存之间保持一致。 -
内存更新事务(Memory update):
这些事务用于更新主内存中的数据。它们不会监听其他主设备的缓存,通常用于写入直通(Write-Through)或写回(Write-Back)缓存策略中的写操作。 -
缓存维护事务(Cache maintenance):
这些事务针对的内存位置可能被其他主设备的缓存所持有,并且需要执行监听操作。缓存维护事务可能还需要传递到下游缓存,用于管理缓存的内容,如清空、使无效或刷新缓存行。 -
屏障事务(Barrier):
屏障事务用于在其他事务之间建立顺序关系。它们确保在屏障之后的事务能够观察到屏障之前的所有事务,从而在系统中创建一个同步点。更多关于屏障事务的信息可以在第D8章“屏障事务”中找到。 -
分布式虚拟内存事务(DVM):
这些事务在参与分布式虚拟内存方案的组件之间传递操作。DVM事务用于管理分布在多个处理器或节点上的虚拟内存,优化内存利用率和系统性能。更多关于DVM事务的信息可以在第D13章“分布式虚拟内存事务”中找到。
读通道事务:
表3-7列出了读事务类型,以及它们的ARBAR[0]
、ARDOMEN
、ARSNOOP
信号组合,这些信号用于在ACE协议中指示读地址通道上的事务类型。
事务组 | ARBAR[0] | ARDOMAIN | ARSNOOP | 事务类型 | 解释 |
---|---|---|---|---|---|
非监听 | 0b0 | 0b00 | 0b0000 | ReadNoSnoop | 这种事务不会监听其他主设备的缓存状态,通常用于不需要缓存一致性的内存访问。 |
一致性 | 0b0 | 0b01 | 0b0000 | ReadOnce | 一致性事务,用于从共享内存位置读取数据,需要监听其他缓存的状态。 |
一致性 | 0b0 | 0b10 | 0b0000 | ReadShared | 类似于ReadOnce,但不保证数据的独占性,允许读取共享或脏缓存行。 |
一致性 | 0b0 | 0b00 | 0b0010 | ReadClean | 要求读取干净的缓存行,如果需要,可以发起监听以确保数据的一致性。 |
一致性 | 0b0 | 0b00 | 0b0011 | ReadNotSharedDirty | 可以读取脏缓存行,但不会发起监听,适用于不需要监听的场景。 |
一致性 | 0b0 | 0b11 | 0b0111 | ReadUnique | 要求读取唯一的干净缓存行,适用于需要确保数据不被其他缓存共享的场景。 |
一致性 | 0b0 | 0b10 | 0b1011 | CleanUnique | 类似于ReadUnique,但用于写事务,确保写入的数据不会影响其他缓存。 |
一致性 | 0b0 | 0b00 | 0b1100 | MakeUnique | 用于使缓存行无效,确保数据不会被其他缓存共享或监听。 |
缓存维护 | 0b0 | 0b00 | 0b1000 | CleanShared | 用于清空共享缓存行,适用于缓存行不再被使用或需要更新的场景。 |
缓存维护 | 0b0 | 0b01 | 0b1001 | CleanInvalid | 用于清空脏缓存行,并将数据写回主内存,同时确保其他缓存行无效。 |
缓存维护 | 0b0 | 0b00 | 0b1101 | MakeInvalid | 用于使缓存行无效,适用于缓存行不再准确或需要更新的场景。 |
屏障 | 0b1 | 0b00 | 0b0000 | Barrier | 用于在事务之间建立一个同步点,确保所有先前的事务在后续事务开始前完成。 |
DVM | 0b0 | 0b01 | 0b1110 | DVM Complete | 分布式虚拟内存事务,用于在DVM系统中完成数据传输和同步操作。 |
DVM | 0b0 | 0b10 | 0b1111 | DVM Message | 分布式虚拟内存事务,用于在DVM系统中传递消息和控制信息。 |
Note:
在没有缓存的组件中,只需要使用
ARDOMEN
信号来指示读事务的共享性,可以将ARSNOOP
信号绑定到零。如表D3-7所示,如果事务是非共享的(Non-shareable),则将其视为ReadNoSnoop
事务;如果事务是共享的(Shareable),则将其视为ReadOnce
事务。
无缓存组件:在系统中,某些组件可能没有缓存,例如直接与内存交互的设备。这些组件在发起读事务时,不需要执行监听操作,因为它们不参与缓存一致性。
ARDOMEN
信号:此信号用于指示读事务的共享域。如果ARDOMEN
设置为非共享(0b00),则事务不会影响其他主设备的缓存;如果设置为共享(0b01或0b10),则事务可能影响其他主设备的缓存。
ARSNOOP
信号:在没有缓存的组件中,ARSNOOP
信号可以固定为零,表示不执行监听操作。这是因为无缓存组件不涉及缓存一致性的问题。
ReadNoSnoop
事务:当ARDOMEN
为非共享时,读事务被视为ReadNoSnoop
事务。这种事务不会监听其他缓存的状态,直接从内存中读取数据。
ReadOnce
事务:当ARDOMEN
为共享时,读事务被视为ReadOnce
事务。这种事务可能需要监听其他缓存的状态,以确保读取的数据是最新的,并且不会干扰其他主设备的缓存一致性。
写通道事务:
表D3-8展示了对于每组写事务,AWBAR[0]
、AWDOMAIN[1:0]
和AWSNOOP[2:0]
信号的允许组合。在ACE协议中,这些信号用于指示写事务的类型和特性。
事务组 | AWBAR[0] | AWDOMAIN | AWSNOOP | 事务类型 | 描述 |
---|---|---|---|---|---|
非监听 | 0b0 | 0b00 | 0b000 | WriteNoSnoop | 非共享内存位置的写事务,不执行监听操作。 |
非监听 | 0b0 | 0b11 | 0b000 | WriteNoSnoop | 系统级内存位置的写事务,不执行监听操作。 |
一致性 | 0b0 | 0b01 | 0b000 | WriteUnique | 内部共享内存位置的写事务,要求写入唯一的缓存行。 |
一致性 | 0b0 | 0b10 | 0b000 | WriteLineUnique | 写事务,要求写入唯一且完整的缓存行。 |
内存更新 | 0b0 | 0b00 | 0b010 | WriteClean | 写事务,将干净数据写入内存,不涉及缓存行的替换。 |
内存更新 | 0b0 | 0b01 | 0b011 | WriteBack | 写事务,使用写回缓存策略更新缓存和内存。 |
内存更新 | 0b0 | 0b10 | 0b100 | Evict | 缓存逐出事务,将脏缓存行写回内存并使缓存行无效。 |
内存更新 | 0b0 | 0b01 | 0b101 | WriteEvicta | 写事务,用于逐出脏缓存行,写回内存,需要AWUNIQUE信号。 |
屏障 | 0b1 | 0b00 | 0b01 | 0b10 | Barrier |
在没有缓存的组件中,写事务的共享性通过
AWDOMAIN
信号来指示,而AWSNOOP
信号可以固定为零。根据表D3-8所示,事务的处理方式如下:
如果事务是非共享的(Non-shareable),则它被视为
WriteNoSnoop
事务。这种事务不会监听其他主设备的缓存状态,因为它不涉及共享内存位置,或者因为它是以一种不需要维护缓存一致性的方式进行的。如果事务是共享的(Shareable),则它被视为
WriteUnique
事务。这种事务要求写入唯一的缓存行,确保写操作不会影响其他缓存中的数据副本,从而维护缓存一致性。
3.1.4 AWUNIQUE
AWUNIQUE
信号是写地址通道上的一个信号,它可以与各种写事务一起使用,以改善缓存层次结构中较低级别的缓存(例如L3缓存或系统级缓存)的操作策略。这个信号的主要目的是在写入操作期间提供额外的控制和优化。
事务类型 | AWUNIQUE要求 | 注释 |
---|---|---|
WriteNoSnoop | 无意义,可以被断言或取消断言。 | 无缓存的写事务,AWUNIQUE 信号不影响操作。 |
WriteUnique | 如果主设备不保留缓存行的副本,可以被断言。 | 如果主设备保留缓存行的副本,必须取消断言。 |
WriteLineUnique | 如果主设备不保留缓存行的副本,可以被断言。 | 如果主设备保留缓存行的副本,必须取消断言。 |
WriteClean | 必须取消断言。主设备保留缓存行的副本,不能处于Unique状态。 | 写事务期望更新干净的缓存行,且主设备保留副本。 |
WriteBack | 如果缓存行曾是唯一的,可以被断言。 | 如果缓存行是共享的,必须取消断言。即使缓存行曾是唯一的,也可以取消断言。 |
WriteEvict | 必须被断言。WriteEvict事务只允许在UniqueClean状态下的缓存行。 | 写逐出事务要求缓存行是唯一的,且必须写回主内存。 |
Evict | 无意义,可以被断言或取消断言。 | 逐出事务不涉及缓存行的唯一性,AWUNIQUE 信号不影响操作。 |
Barrier | 无意义,可以被断言或取消断言。 | 屏障事务用于同步,不涉及缓存行的唯一性。 |
在上文的表格D3-9中,当提到
AWUNIQUE
信号可以被“断言”,意味着该信号被设置为高电平,从而指示特定的写事务期望缓存行是唯一的,或者主设备不保留缓存行的副本。相反,当信号被“取消断言”(deasserted),即设置为低电平(0)或假(false),则表示相应的条件或期望不成立。
断言描述解释:
当主设备在执行写操作后不打算保留该缓存行的副本时,可以通过断言AWUNIQUE信号来指示这一点。这个信号的断言(即设置为1)告诉其他设备,该缓存行现在只存在于执行写操作的主设备中,其他设备应当使自己的副本无效或者更新为新数据。 相反,如果主设备打算保留缓存行的副本,那么AWUNIQUE信号必须被取消断言(即设置为0),这样其他设备就知道仍然存在多个有效的副本,并且可以根据需要进行缓存和处理。
当一个WriteBack
或WriteEvict
事务正在进行,并且AWUNIQUE
信号被断言时,主设备必须确保不会给出一个监听响应,这个响应可能会导致另一个缓存行副本的创建,或者让代理认为它拥有另一个唯一的缓存行副本。这是为了维护事务期间缓存一致性的严格规定。
以下是关于AWUNIQUE
信号的一些关键要求和兼容性说明:
-
支持
必须支持WriteEvict
事务的主设备:AWUNIQUE
信号。这是因为WriteEvict
事务要求缓存行处于唯一的干净状态,且该缓存行必须从缓存中逐出,通常涉及将脏数据写回主内存。 -
支持AWUNIQUE
信号的兼容性:AWUNIQUE
信号的主设备可以连接到不支持该信号的互连上。在这种情况下,不会损失任何功能,因为AWUNIQUE
信号的设计允许灵活的兼容性。 -
不支持
可以连接到支持该信号的互连上。在这种情况下,互连的输入端必须连接到低电平。这是符合协议的,因为除了AWUNIQUE
信号的主设备:WriteEvict
事务外,所有事务都被允许将AWUNIQUE
信号驱动为低电平。
3.1.5缓存行大小的限制
每个ACE主设备支持的缓存行大小是在设计时确定的。对于可以支持的缓存行大小,有最小值和最大值的限制。最小的缓存行大小是16个字节。最大的缓存行大小则是以下两个值中较小的一个:
- 2048字节
- 最大突发传输长度为16的乘积和数据总线宽度(以字节为单位)
这意味着,设计者在选择缓存行大小时,需要在给定的范围内进行权衡。较大的缓存行大小可以减少内存访问时的开销,因为每次传输可以获取更多的数据。然而,如果缓存行过大,可能会导致内存资源的浪费,因为即使只需要访问一小部分数据,整个缓存行也会被加载到缓存中。 同时,缓存行的大小也受到数据总线宽度的限制。数据总线的宽度决定了每次可以传输的数据量,因此,缓存行的大小必须与数据总线宽度相匹配,以确保有效的数据传输。
3.1.6事务限制
事务约束是计算机体系结构和缓存一致性协议中的一个重要概念,它们定义了在进行不同类型的内存事务时必须遵守的规则。
缓存行大小事务(Cache line size transactions):
在ACE协议中,缓存行大小事务是指那些必须按照缓存行大小进行的数据传输事务。这些事务在执行时需要遵守特定的约束,以确保数据的一致性和系统的稳定性。
以下是必须按照缓存行大小进行的事务列表,以及它们需要遵守的约束:
-
ReadClean: 这个事务用于从缓存行中读取数据,且请求的缓存行必须是干净的(即与主存中的数据一致)。
-
ReadNotSharedDirty: 这个事务允许读取除了SharedDirty状态以外的任何状态的缓存行。
-
ReadShared: 这个事务用于从可以共享的缓存行中读取数据,可以接受任何状态的缓存行。
-
ReadUnique: 这个事务用于读取当前唯一存在于缓存中的行。
-
CleanUnique: 这个事务用于将缓存行设置为唯一干净的,且不存在于主存中。
-
MakeUnique: 这个事务用于使缓存行变为唯一状态,即使它之前可能与其他缓存共享。
-
CleanShared: 这个事务用于将缓存行设置为共享干净的,且存在于其他缓存中。
-
CleanInvalid: 这个事务用于使缓存行变为无效状态,且不存在于任何缓存中。
-
MakeInvalid: 这个事务用于使缓存行变为无效状态,且确保不会影响其他缓存中的副本。
-
WriteLineUnique: 这个事务用于写入一个当前唯一存在的缓存行。
-
WriteEvict: 这个事务用于在替换缓存行时写入数据。
Evict: 这个事务用于从缓存中移除一个缓存行,而不写回主存。
缓存行大小事务必须遵守常规事务(Regular transactions)的约束。这些约束包括但不限于:
- 确保事务的大小与系统定义的缓存行大小一致。
- 在进行事务时,必须考虑缓存行的当前状态和一致性模型。
- 在必要时,需要更新主存中的数据以保持一致性。
- 必须处理可能出现的缓存冲突和替换情况。
具体的约束列表和详细说明可以在ACE协议规范的相关章节中找到,例如在页面A3-53提到的“Regular transactions”部分。而在页面D3-184上,可能会提供适用于缓存行大小事务的完整约束列表。这些约束对于确保系统在执行事务时的正确性和效率至关重要。
Table D3-10 Cache line size transaction constraint:
属性 | 条件约束 | 说明 |
---|---|---|
AxLEN | 突发长度必须是 1, 2, 4, 8 或 16 次传输。 | 参见 A3-48 页的 Burst length 部分。 |
AxSIZE | 如果突发长度大于 1,则每次传输的字节数必须等于数据总线的宽度。 | 参见 A3-49 页的 Burst size 部分。 |
AxBURST.INCR | 地址必须对齐到缓存行大小,即等于 (AxLEN x AxSIZE),总突发长度的字节数。 | 参见 A3-49 页的 Burst type 部分。 |
AxBURST.WRAP | 地址必须对齐到 AxSIZE,即等于数据总线的宽度。 | 地址对齐要求以确保传输的正确性。 |
AxBURST.FIXED | 不支持固定突发类型。 | 固定突发类型在此上下文中不被支持。 |
AxDOMAIN | 除了 CleanShared, CleanInvalid, MakeInvalid, WriteEvict 事务外,域必须是内部可共享或外部可共享。 | 适用于大多数事务类型。 |
CleanShared, CleanInvalid, MakeInvalid, WriteEvict 事务的域必须是非共享的、内部可共享或外部可共享。 | 适用于特定事务类型,确保正确的数据共享和一致性。 | |
AxBAR | 必须是普通访问。 | 事务访问类型要求。 |
AxCACHE | 必须是可修改的。 | 允许事务修改缓存中的数据。 |
AxLOCK | 必须是 0b0 如果事务是 ReadNotSharedDirty, ReadUnique, MakeUnique, CleanShared, CleanInvalid, MakeInvalid, WriteLineUnique, WriteEvict 或 Evict。 | 锁位设置要求,影响事务的共享和独占状态。 |
必须是 0b0 或 0b1 如果事务是 ReadClean, ReadShared, 或 CleanUnique。 | 同上。 | |
AxPROT | 没有约束,可以取任何值。 | 保护属性没有特定要求。 |
AxQOS | 没有约束,可以取任何值。 | 服务质量属性没有特定要求。 |
在ACE协议中,即使某些事务类型不涉及数据传输,它们仍然需要使用AxLEN属性来指示正确的缓存行大小。这些事务包括:
CleanUnique: 此事务用于将一个缓存行标记为干净的且唯一的状态。即使不涉及数据传输,它也需要通过AxLEN来指定缓存行的大小,以确保缓存行状态的正确更新。
MakeUnique: 此事务用于将一个缓存行变为唯一的状态,即使它之前可能与其他缓存共享。AxLEN属性确保了事务影响的缓存行大小与系统定义的缓存行大小一致。
CleanShared: 此事务用于将一个缓存行标记为干净的且共享的状态。通过AxLEN,系统知道该事务影响的缓存行的大小,从而正确地处理缓存行的共享状态。
CleanInvalid: 此事务用于将一个缓存行标记为干净的但无效的状态。AxLEN属性帮助系统正确地理解和处理缓存行的无效化操作。
MakeInvalid: 此事务用于使一个缓存行变为无效状态,这通常意味着该缓存行的数据不再有效,可能需要从主存中重新加载。AxLEN确保了事务影响的缓存行大小正确。
Evict: 此事务用于从缓存中移除一个缓存行,这可能是由于替换策略或其他原因。AxLEN属性允许系统知道被移除的缓存行的大小。
ReadOnce 和 WriteUnique 事务:
ReadOnce 和 WriteUnique 事务不受缓存行大小限制:
这些事务类型不需要遵循标准的缓存行大小约束。这种灵活性允许遗留组件在一致性环境中正常运行,通过向可修改事务(Modifiable transactions)添加适当的域(例如,通过设置AxDOMAIN属性)来实现。
表 D3-11 展示了 ReadOnce 和 WriteUnique 事务类型的约束条件。以下是这些约束的详细说明:
属性 | 约束条件 |
---|---|
AxDOMAIN | 必须是内部可共享(Inner Shareable)或外部可共享(Outer Shareable)。这意味着事务涉及的地址应该在指定的共享域中。 |
AxBURST | 必须是递增(INCR)或包裹(WRAP)突发类型。这两种类型的突发可以支持非固定长度的事务,适用于动态长度的数据传输。 |
AxCACHE | 必须是可修改的(Modifiable)。这表明事务允许对缓存中的数据进行修改。 |
AxLOCK | 必须是普通访问(normal access)。这意味着事务不会请求独占访问权,允许其他请求同时进行。 |
AxPROT | 没有约束,可以取任何值。这为不同的安全保护级别提供了灵活性。 |
AxQOS | 没有约束,可以取任何值。这允许不同的服务质量等级,以满足不同的事务需求。 |
与某些其他事务类型不同,WriteUnique事务不要求每个写数据脉冲(write data strobe)都被断言。这意味着WriteUnique事务允许稀疏的写数据脉冲(sparse write data strobes),这为特定的应用场景提供了更大的灵活性。
Note:
对于ReadOnce和WriteUnique事务,不支持固定突发类型(FIXED burst type)。这意味着任何从AXI到ACE-Lite的转换都必须提供对于固定突发类型的适当转换或替代方案。
WriteBack 和 WriteClean 事务:
在ACE协议中,WriteBack和WriteClean事务类型允许对缓存行进行写回和清理操作,而这些操作不受缓存行大小的限制。这意味着这些事务可以对缓存行的一部分进行更新,而不是整个缓存行。
表 D3-12 展示了 WriteBack 和 WriteClean 事务类型的约束条件。以下是这些约束的详细说明:
属性 | 条件约束 | 说明 |
---|---|---|
AWLEN | 正常限制适用。必须遵守地址结构的相关规定。 | 参见 A3-48 页的 Address structure 部分。 |
AWSIZE | 正常限制适用。必须遵守地址结构的相关规定。 | 参见 A3-48 页的 Address structure 部分。 |
AWBURST.WRAP | 地址必须对齐到 AxSIZE,即等于数据总线的宽度。 | 保证事务的地址对齐要求。 |
突发长度必须是 2, 4, 8 或 16。 | 限制突发长度以支持事务的类型和缓存行的更新。 | |
AWSIZE x AWLEN 不得超过缓存行大小(以字节为单位)。 | 确保事务的数据传输量不会超过缓存行的大小。 | |
AWBURST.INCR | 突发长度必须为 16 或更少。 | 适用于连续地址的突发传输。 |
事务不得跨越缓存行边界。最后字节的位置由 (AWSIZE × AWLEN) 加到 AWSIZE 对齐的起始地址决定。 | 保证事务在缓存行内的连续性。 | |
最后字节的位置必须落在与突发中第一个字节相同的缓存行内。 | 确保整个事务在单个缓存行内完成。 | |
AWBURST.FIXED | 不支持。 | 固定突发类型在此事务类型中不被支持。 |
AWDOMAIN | 必须不是系统域类型(System)。 | 事务应在正常的缓存域内进行。 |
AWBAR | 必须是普通访问。 | 事务应作为正常的内存访问处理。 |
AWCACHE | 必须是可修改的(Modifiable)。 | 允许事务修改缓存中的数据。 |
AWLOCK | 必须是普通访问。 | 事务不会请求独占访问权,允许其他请求同时进行。 |
AWPROT | 没有约束,可以取任何值。 | 保护属性没有特定要求。 |
AWQOS | 没有约束,可以取任何值。 | 服务质量属性没有特定要求。 |
在ACE协议中,WriteBack和WriteClean事务类型具有特定的特性和要求,以确保它们能够灵活地处理缓存行的更新。以下是这些事务类型的关键点和相关组件的要求:
稀疏写数据脉冲(Sparse Write Data Strobes)的使用:
- WriteBack和WriteClean事务允许使用稀疏写数据脉冲。这意味着在这些事务中,并不是所有的数据位都需要被写入,只有标记为“脏”(即已修改)的数据位需要更新。这种灵活性有助于提高效率,尤其是在只需要更新缓存行中部分数据的情况下。
支持窥探过滤器(Snoop Filter)的组件:
- 如果组件支持窥探过滤器,它必须正确地指示所有WriteBack、WriteClean和Evict事务的共享域(Shareability Domain)。这使得窥探过滤器能够跟踪内部可共享(Inner Shareable)和外部可共享(Outer Shareable)事务的分配情况。
- 窥探过滤器不需要跟踪不可共享(Non-shareable)事务的分配,因为这些事务的缓存行被替换或驱逐时不需要发送通知。
不支持窥探过滤器的组件:
- 对于不支持窥探过滤器的组件,它们可以在WriteBack或WriteClean事务中使用以下任何域:
- 不可共享(Non-shareable)
- 内部可共享(Inner Shareable)
- 外部可共享(Outer Shareable)
- 这种灵活性允许这些组件在不需要跟踪共享域的情况下执行写回和清理操作。
屏障事务(Barrier transactions):
在ACE协议中,屏障事务(Barrier transaction)是一种特殊的事务类型,用于确保在执行后续操作之前,一组操作已经完全完成。这通常用于同步多个处理器或执行单元的操作,以保证数据的一致性和顺序的正确性。屏障事务由AxBAR[0]信号等于1来指示。
对于屏障事务,读地址和写地址信号需要遵守特定的约束条件。
表 D3-13 展示了屏障事务(Barrier transaction)的约束条件。以下是这些约束的详细说明:
属性 | 约束条件 |
---|---|
AxADDR | 必须全部为零。这表明屏障事务不涉及具体的内存地址,它是一个全局的同步点。 |
AxBURST | 必须是递增(INCR)突发类型。这是屏障事务的推荐类型,因为它提供了连续的地址范围,有助于同步操作。 |
AxLEN | 必须全部为零。屏障事务不涉及数据传输,因此这个信号不需要指定突发长度。 |
AxSIZE | 必须等于数据总线的宽度。这确保了屏障事务能够适应系统的数据传输宽度。 |
AxCACHE | 必须是普通(Normal)且不可缓存(Non-cacheable)。这意味着屏障事务不应该被缓存,以确保其立即执行。 |
AxPROT | 没有约束,可以取任何值。这个属性对于屏障事务的功能不产生影响。 |
AxLOCK | 必须是普通访问(normal access)。这表明屏障事务是一个正常的内存访问请求,不要求独占或特殊的访问权限。 |
AxSNOOP | 必须全部为零。屏障事务不涉及窥探操作,因此这个信号被设置为零以表明这一点。 |
屏障事务的行为和效果取决于它所处的共享域,以及系统中其他主设备的配置和状态。例如,一个屏障事务可能会等待所有参与的处理器完成它们的当前操作,或者确保所有相关的缓存行都已经更新或变为一致状态。
为了更深入地了解屏障事务的具体行为和它们如何与共享域交互,可以参考ACE协议规范的第D8章“屏障事务”(Barrier Transactions)。这一章节将提供详细的说明和示例,帮助设计者和程序员正确地实现和使用屏障事务,以维护系统的稳定性和数据的一致性。