文章目录
- Coherency 问题简介
- ACE 出现背景
- ACE 总线介绍
- Acknowledge signaling
- Snoop Channel Signals
Coherency 问题简介
一致性(Coherency)问题通常出现在多处理器系统中,尤其是当多个处理器可能同时访问同一内存位置时。简单来说,一致性问题是关于保证一个处理器上的操作结果对于其他处理器来说是可见和一致的问题。这里涉及两个主要方面:
- 数据一致性:如果两个或多个处理器都要读写同一个内存位置,我们需要确保它们不会读到过时或不正确的数据。例如,如果处理器A更新了某个内存位置的数据,那么处理器B在之后读取该位置时应该能读到处理器A最新写入的数据,而不是旧的数据。
- 操作顺序一致性:不仅数据要保持一致,操作的顺序也要一致。也就是说,如果处理器A先执行操作1然后执行操作2,其他处理器观察到的操作顺序也应该是这样。
ACE 出现背景
为了解决 Coherency 这一挑战,ARM引入了ACE协议。ACE是基于AXI(Advanced eXtensible Interface,高级可扩展接口)协议的一种扩展,AXI本身就是ARM处理器和外设之间的高性能、高带宽接口协议。通过ACE,ARM能够提供一种机制,使得多核处理器系统中的缓存可以实现一致性管理和数据共享。
ARM的ACE协议引入了以下关键特点来支持缓存一致性和系统级一致性:
- 缓存一致性协议支持:支持多核心之间的缓存行一致性,允许有效地同步缓存数据。
- 屏障事务(Barrier Transactions):支持同步操作,确保特定操作的顺序性。
ACE 总线介绍
ACE 总线主要是解决多个master共享数据时产生coherency的问题,对于memory 属性因此强调的是 shareable, 可以理解为某一个地址或者cache 行,它可能被多个master所共享,因为我们叫它shareable。
CE 协议相较于AXI 总线增加了3组总线:
- AC(Snoop Address)
- CR(Snoop Response)
- CD(Snoop Data).
AC 的方向是个 slave 方向(slave interface给master interface的线),也就是slave 方向向master方向的请求,因为master要连接到总线上,总线和master连接的那个点就叫做slave interface,只有slave interface 才可以和master 相连,所以针对coherency 总线发起一个 snoop transaction 给 master,比如 CPU 或者DMA,然后Master 会通过 CR(Snoop Response) 来响应这个transaction,有snoop 就有可能出现数据的传输,有些情况下,数据可以通过snoop data 把数据传过来。
需要注意的是并不是所有的 snoop transaction 都需要有 snoop data 传输
Acknowledge signaling
此外还有 Wack 和 Rack, 主要用于告诉一次完成的transaction 结束了。
Signal | Source | |
---|---|---|
RACK | Manager | |
WACK | Manager |
Rack
拉高的前提是当Rlast Rvalid Rready 都握手成功的时候Wack
拉高的前提是 Bvalid Bready 都握手成功
这两个信号解决的问题是:针对相同cache line 访问的情况,如果 RACK 或者WACK 没有给的时候,另外一个 Master 对这个cache line的snoop transaction,coherency总线是不应该发过来。
Snoop Channel Signals
Snoop channel signals | Signals | |
---|---|---|
Snoop Address | ACVALID, ACREADY, ACADDR[x:0], ACSNOOP[3:0], ACPROT[2:0] | |
Snoop Response | CRVALID, CRREADY, CRRESP[4:0] | |
Snoop Data | CDVALID, CDREADY,CDDATA[x:0], CDLAST |
- 既然对于cache行的操作,那么就要告诉它一个地址,因为如果不给地址,那不就不知道对那个cacheline操作;
ACPROT[2:0]
:因为访问有安全和非安全的区别,特权及非特权,所以需要有PROT信号;ACSNOOP[3:0]
:因为snoop transaction有很多种,比如 clean, invalidae,clean share等等,这些snoop transaction就是通过ACSNOOOP[3:0]
来区分的。CDDATA[x:0]
用来将snoop数据传回给 coherency总线,然后 coherency总线决定是将数据写入memory总还是传给其他master。