C4.3 不同transaction导致的state变化
state可能会被以下影响:
1. 传输类型;
2. 在AR通道上的读响应;
3. 是否master支持外部的snoop filter;
4. 是否master指定的预测读;
如果传输读响应返回PassDirty,则cache line一定要变为dirty状态。PassDirty在以下状态使能:
1. ReadNotSharedDirty
2. ReadShared
3. ReadUnique
如果传输读响应返回IsShared,则cache line要么变为Shared,要么变为Invalid。IsShared在以下状态使能:
1. ReadOnce
2. ReadClean
3. ReadNotSharedDirty
4. ReadShared
5. CleanShared
一个Unique状态的cache line可以移动到Shared 状态,但是这个行为不鼓励。
如果没有外部的snoop filter,允许cache line从Clean状态变为Invalid状态。
C4.3.1 load不会导致cache line状态的跳转;
C4.3.2 Store对cache line状态的影响
在执行一个store命令之前,master应当检查它是否有store的权限。仅当master在uniqueclean或者是uniquedirty状态时,才能存放。
如果master没有这个store的权限,那么它应当:
1. 在AR通道发起transaction,获取store的权限,然后执行store指令,存储到cache上。在store之后,master一定要处于UniqueDirty状态。可以使用以下操作获取权限:
ReadUnique
CleanUnique
MakeUnique
2. 在AW通道发起操作,获取store的权限,然后执行store指令,存储到主存上。可以store并且更新主存传输类型如下:
WriteUnique
WriteLineUnique
C4.3.3 与主存更新相关的状态改变
如果cache line是dirty状态,那么可以将其更新到主存。
使用WriteBack/WriteClean,更新主存。更新之后,cacheline一定要变成clean/invalid 状态。
如果支持外部的snoop filter,应当有以下限制:
1. 写回类型的,cache line变而为无效;
2.写清类型的,cache line变为清;
C4.3.4 与cache一致性相关的状态改变
影响cache一致性的操作如下:
1. CleanShared;
2. CleanInvalid;
3. MakeInvalid;
在发起cache 一致性操作之前,master一定要保证:
对于CleanShared,cache line一定要在clean或者Invalid状态;
对于CleanInvalid和MakeInvalid,cache line一定要在Invalid状态。
注意:cache维护操作不会影响当前行的状态。
C4.4 state change
C4.5 Read Transactions (在AR通道上)
C4.5.1 Read No Snoop
Read No Snoop 用于读不在shareable区域内的数据。当传输完成时,cache对allocate的状态没有要求;
C4.5.2 Read Once
用于读取在shareable的区域的数据。这种操作用于获取数据的快照,这个数据也不会被cache。
C4.5.3 Read Clean
Read Clean操作用于确定不将更新主存的责任传递给发起动作的master。
如果一个master(比如一个写通型的)想要获取一份干净的cache line,可以使用这个操作。
C4.5.4 Read Not Share Dirty
Read Not Share Dirty在不是IsShared 和PassDirty同时是使能的其他情况下完成。
主要用于一个cache master发起一个load 操作,并且接受除了ShareDirty 状态的其他任何状态。
这个操作要求的响应如下:
如果IsShared 响应这个cache line已经被共享了,那么PassDirty一定要保证cache line是干净的。
C4.5.5 ReadShared
ReadShared 是一个读操作,可以接受任何IsShared和PassDirty的组合类型
如果一个cache line一开始是在一个shared clean的状态,如果操作返回的类型是PassDirty,那么cache line一定要变到 Dirty的状态。
C4.5.6 ReadUnique
这个操作获取数据的备份,并且可以保证数据保持在unique状态。这就允许master 执行一个store操作到这个cache line。
典型地,一个ReadUnique操作在如下场景被使用:发起操作的master执行一个部分cache line store,并且没有cache line的拷贝。
C4.6 Clean Transactions
C4.6.1 Clean Unique
CleanUnqiue 也是发生在shareable域的,主要用于保证:
cache line处于unqiue状态。这使得master 可以发起store到这个cache line的操作,但是这个transaction不要求获得master的拷贝。
如果其他处于dirty状态的cache被写入主存并且其他的cache line被移除。
transaction响应的要求如下:
在完成CleanUnqiue操作时,发起操作的master可以store这个cache line。如果这个cache line在store 操作前是无效的,那么一定要发起一个full cache line操作,将数据allocate到cache中。在full cache line 存储之后,这个cache line就在unqiue dirty状态了。
Store 操作一定要和Clean Unique是原子操作,因此,任何在CleanUnique之后的操作都将被延迟,直到store完成。
Clean Unique可以用于完成exclusive操作。
Snoop filter在完成CleanUnique操作之后,会将cache line认为是已经allocate了。
cache line如果在clean uniqu操作之前是allocate状态,那么在这个操作之后,仍然是allocate状态。
如果cache line在Clean Unique操作之前没有被分配,或者在CleanUnique期间被失效,那么当CleanUnique完成时,这个master应当:
完成一个full cache line store,那么这个cache line就被分配了。
完成一个整行或者部分行的写回操作,用于表明这个cache line已经不是allocated状态了。
重启另一个传输,如ReadUnique传输,在整行或者部分行成为allocated状态之前。
不发起一个store操作。在这情况下,master一定要发起evict操作用于通知snoop filter,这个cache line已经不是allocated状态了。