AMBA-CHI协议详解(二十)
AMBA-CHI协议详解(一)- Introduction
AMBA-CHI协议详解(二)- Channel fields / Read transactions
AMBA-CHI协议详解(三)- Write transactions
AMBA-CHI协议详解(四)- Other transactions
AMBA-CHI协议详解(五)- Transaction identifier fields
AMBA-CHI协议详解(六)- Transaction identifier field flows
AMBA-CHI协议详解(七)- Ordering
AMBA-CHI协议详解(八)- Address, Control, and Data
AMBA-CHI协议详解(九)- Data transfer
AMBA-CHI协议详解(十)- Retry
AMBA-CHI协议详解(十一)- Network Layer
AMBA-CHI协议详解(十二)- Cache line states
AMBA-CHI协议详解(十三)- Read transactions and Cache line states
AMBA-CHI协议详解(十四)- Dataless transactions
AMBA-CHI协议详解(十五)- Write transactions
AMBA-CHI协议详解(十六)- Combined Write/Atomic transactions
AMBA-CHI协议详解(十七)- Snoop request types
AMBA-CHI协议详解(十八)- Response types
AMBA-CHI协议详解(十九)- Cache state transitions at a Requester
文章目录
- 4.8 Cache state transitions at a Snoopee
- 4.8.1 Non-Forwarding and Non-stash Snoop transactions
- 4.8.2 Stash snoop transactions
- 4.8.3 Forwarding Snoop transactions
- 4.9 Returning Data with Snoop response
- 4.10 Do not transition to SD
4.8 Cache state transitions at a Snoopee
本节指定以下snoop事务的缓存状态转换和完成响应:
- Non-Forwarding and Non-stash Snoop transactions
- Stash snoop transactions
- Forwarding Snoop transactions
Snoopee,一个 RN-F,接收到snoop后执行两个动作。 一个动作是缓存行的状态变化,第二个动作是向Home节点发送响应消息,或者同时向Home节点和请求者发送。缓存状态变化取决于snoop类型、缓存行的初始状态以及snoop中的 DoNotGoToSD 值。
Snoopee必须向Home节点发送响应,可以带数据或不带数据。此外,对于Forwarding snoops,Snoopee还可以向请求者转发数据响应。
发送的响应类型由snoop类型、初始缓存状态、缓存状态变化以及RetToSrc的值决定。
4.8.1 Non-Forwarding and Non-stash Snoop transactions
Non-forwarding和Non-stash Snoop事务包括:
- SnpOnce
- SnpClean, SnpShared, SnpNotSharedDirty, and SnpPreferUnique
- SnpUnique and SnpPreferUnique
- SnpCleanShared, SnpCleanInvalid, and SnpMakeInvalid
- SnpQuery
SnpOnce
下显示了对于SnpOnce,在被snoop请求者处的初始、预期最终和其他允许的最终缓存状态、RetToSrc字段值以及来自被窥探RN-F的有效完成响应。
SnpClean, SnpShared, SnpNotSharedDirty, and SnpPreferUnique
下表显示了对于SnpClean、SnpShared、SnpNotSharedDirty和SnpPreferUnique,在被snoop的请求者处的初始、预期最终和其他允许的最终缓存状态、RetToSrc字段值以及从被snoop的RN-F获得的有效完成响应。下表必须用于确定当被窥探者正在执行独占访问序列时,SnpPreferUnique缓存状态的转换。 一个不在执行独占访问中间的Snoopee被允许但不被期望使用下表来确定SnpPreferUnique缓存状态转换。
a. X表示协议要求适用于RetToSrc的两个状态。
b. 当Snoopee在执行独占序列中间时适用。 在任何时候都符合协议。
c. 如果设置了DoNotGoToSD,则不允许此状态转换。
SnpUnique and SnpPreferUnique
下表显示了对于SnpUnique和SnpPreferUnique在被snoop请求者处的初始、预期最终和其他允许的最终缓存状态、RetToSrc字段值以及来自被snoop RN-F的有效完成响应。下表期望将在Snoopee不在执行独占访问序列中间时用于确定SnpPreferUnique缓存状态转换。
a. X 表示协议要求适用于 RetToSrc 的两个状态。
b. 仅在被窥探者未处于执行独占序列的中间时适用。
SnpCleanShared, SnpCleanInvalid, and SnpMakeInvalid
下表显示了 SnpCleanShared、SnpCleanInvalid 和 SnpMakeInvalid 在被snoop请求者处的初始、预期最终和其他允许的最终缓存状态、RetToSrc 字段值以及来自被snoop RN-F 的有效完成响应。
SnpQuery
下表显示了 SnpQuery 在被snoop请求者处的初始、预期最终和其他允许的最终缓存状态、RetToSrc字段值以及来自被snoop RN-F 的有效完成响应。
4.8.2 Stash snoop transactions
以下子节显示了Stash类型snoop的允许响应:
- SnpUniqueStash and SnpMakeInvalidStash
- SnpStashUnique and SnpStashShared
SnpUniqueStash and SnpMakeInvalidStash
对SnpUniqueStash 和 SnpMakeInvalidStash 的允许响应与对 SnpUnique 和 SnpMakeInvalid 的响应相同。
在 SnpUniqueStash 和 SnpMakeInvalidStash 中,RetToSrc 位值不得设置为 1。对SnpUniqueStash 和 SnpMakeInvalidStash 的任何snoop响应可以包含DataPull请求。 对SnpUniqueStash 和 SnpMakeInvalidStash 的snoop响应中的DataPull请求必须视为 ReadUnique 请求。
下表显示了Snoopee缓存状态转换和所需的snoop响应。 snoop响应不包括DataPull选项。 DataPull在任何snoop响应下都是允许的。
SnpStashUnique and SnpStashShared
对于SnpStashUnique和SnpStashShared,Snoopee不得更改缓存状态。
Snoopee被允许在响应之前不执行缓存查找,在这种情况下,snoop响应必须是SnpResp_I。Snoopee者被允许在响应中包含精确的缓存状态。
只有当响应中的缓存状态是精确时,snoop响应才能包含DataPull。Snoopee可以在响应SnpStashUnique时包含DataPull,前提是缓存数据不存在,或以Shared状态存在。 Snoopee可以在响应 SnpStashShared 时包含DataPull,前提是缓存数据不存在。
在对 SnpStashUnique 的snoop响应中,DataPull请求必须被视为ReadUnique。 在对SnpStashShared 的snoop响应中,DataPull请求必须被视为ReadNotSharedDirty请求。
在snoop响应中包含DataPull必须确保初始状态不违反对应独立读取请求允许的初始状态条件。
下表显示了Snoopee缓存状态转换、所需的snoop响应以及 SnpStashUnique 的DataPull选项。
下表显示了Snoopee缓存状态转换、所需的窥探响应以及 SnpStashShared 的DataPull选项。
4.8.3 Forwarding Snoop transactions
Forwarding (Fwd) type的snoop由home节点用于支持DCT。Forwarding Snoop事务包括:
- SnpOnceFwd
- SnpCleanFwd, SnpNotSharedDirtyFwd
- SnpSharedFwd
- SnpUniqueFwd
- SnpPreferUnique and SnpPreferUniqueFwd
在Snoopee处,所有Forwarding snoops的共同规则是:
- 如果缓存行处于以下状态之一,期望但不要求将缓存行的副本转发给请求者:
— UD
— UC
— SD
— SC - Snoopee被允许但不要求将snoop转换为其相应的Non-forwarding类型。
- 在响应Non-invalidating类型的窥探时,必须不在Unique状态下转发数据。
- Snoopee接收到设置了 DoNotGoToSD 位的snoop请求时,除非该snoop为 SnpOnceFwd,否则必须不转移到 SD,即使一致性条件允许。
- 在某些情况下,根据snoop类型、Snoopee的缓存行状态以及snoop请求中的 RetToSrc 值,Snoopee将副本转发给Home节点,同时也转发给请求者。如果原始请求请求tags,则不得使用Forwarding snoops
如果tags可用,Clean tags可以与数据一起转发给请求者。
- 主节点不允许发送Forwarding类型的snoop,适用于:
— Atomic transactions
— Passing Exclusive read transactions
由于对所访问地址范围的非独占支持而导致失败的独占读取事务被视为相应的非独占读取,因此主节点在这些情况下可以使用转发类型的窥探。
下表格中的第一列显示初始缓存状态,并且是组合的数据和tag状态。 下表显示了使用的组合状态及其对应的数据和可能的tag状态组合。
下下张表格中的最后三列对应于对主节点的数据响应中的TagOp值。它们是根据tag的初始状态决定的:
Dirty(有两列)
- 第一列 :指示转换本身是否被允许。此列仅在tag初始状态为Dirty时相关。
下表显示了使用的约定,P和NP仅在数据初始状态为UD或SD且tag初始状态为Dirty时相关。
- 第二列 :当允许过渡时的响应 TagOp 值。 响应中的 TagOp值:
— 如果响应状态包括 Pass Dirty,则必须更新。
— 如果响应不包括 Pass Dirty,则必须转移。
Invalid, Clean(一列)
- 响应中的 TagOp 可以是:
— Invalid,如果初始tag状态为Invalid或Clean.。
— Transfer,当初始tag状态为Clean时。
在没有数据的 Home 的snoop响应中,TagOp 不适用。
SnpOnceFwd
接收 SnpOnceFwd 的Snoopee必须遵循的规则,除了通用规则外,还有:
-Snoopee必须在 I 状态下转发缓存行。
— 因此,Snoopee不得将 Pass Dirty 转发给请求者。
- Snoopee仅在Dirty 状态更改为Clean或Invalid时才向主节点返回数据。
- snoop中的 RetToSrc 位必须设置为零。
- Snoopee可以忽略snoop中的 DoNotGoToSD 值。
下表显示了Snoopee缓存状态转换及所需的snoop响应。
a. 此转换是允许的,即使snoop响应不包含数据且tag状态为Dirty,因为Dirty标签由Snoopee保留。
b. 此从Dirty标签状态的转换是允许的,因为脏副本的标签和数据被传递给Home节点。
c. 此事务从Dirty数据的初始状态,以及Invalid或Clean tag开始,当可用时包括带有Clean标签的snoop响应数据。
SnpCleanFwd, SnpNotSharedDirtyFwd
Snoopee在接收到 SnpCleanFwd 或 SnpNotSharedDirtyFwd 时需遵循的规则,除了通用规则外,还
有:
- Snoopee必须在 SC 状态下转发缓存行。
- Snoopee必须转换到 SD、SC 或 I 状态。
下表显示了Snoopee的缓存状态转换和所需的snoop响应。
a. 协议要求适用于RetToSrc的两个状态。
b. 如果DoNotGoToSD被断言,则不允许此状态转换。
SnpSharedFwd
除了通用规则外,Snoopee在接收SnpSharedFwd时需要遵循的规则有:
• Snoopee被允许在SD或SC状态下转发缓存行。
• Snoopee必须转换到 SD、SC 或 I 状态。
下表显示了Snoopee缓存状态转换和所需的snoop响应。
a. 协议要求适用于RetToSrc的两个状态。
b. 如果DoNotGoToSD被断言,则不允许此状态转换。
SnpUniqueFwd
仅在缓存行被单个 RN-F 缓存时,才允许使用 SnpUniqueFwd 窥探:
- 如果主节点确定只需向一个缓存发送Invalidating窥探,则允许主节点向处于Shared状态的 RN-F 发送 SnpUniqueFwd snoop。
Snoopee在接收到 SnpUniqueFwd 时需要遵循的规则,除了通用规则外,还有:
• Snoopee必须在Unique状态将缓存行转发。
• 处于Dirty状态的Snoopee必须将Dirty数据传递给请求者,而不是Home节点。
• Snoopee必须转换到 I 状态。
• Snoopee不得将数据返回给Home节点。
在snoop中,RetToSrc位必须设置为零。
下表显示了Snoopee的缓存状态转换和所需的snoop响应。
a. 此转换不被允许,因为Dirty标签丢失。 Dirty标签丢失是因为对主节点的snoop响应未包含用于传递Dirty标签的数据。
SnpPreferUnique and SnpPreferUniqueFwd
仅在缓存行仅在单个RN-F中缓存时,才允许使用SnpPreferUniqueFwd窥探。Snoopee在接收
到SnpPreferUniqueFwd并且不将其视为Non-forwarding时,必须遵循的规则,除了通用规则外,还有:
-
当Snoopee正在执行独占访问序列时,使用相同地址:
— Snoopee必须在 SC 状态下转发缓存行。
— Snoopee必须转换到SD或SC状态。
— Snoopee不得转换到I状态,除非处于UCE或UDP状态。
— 不在执行独占访问序列中的Snoopee被允许但不期望将snoop视为Non-invalidating窥探。 -
当Snoopee不在执行独占访问序列的过程中,使用相同地址,并将snoop视为Invalidating snoop时:
— Snoopee必须在Unique状态将缓存行转发。
— 处于Dirty状态的Snoopee必须将脏数据传递给请求者,而不是主节点。
— Snoopee必须转换到I状态。
— Snoopee不得向主节点返回数据。
— snoop中的RetToSrc位值被忽略并视为零。
下表显示了Snoopee缓存状态转换和所需的snoop响应。
下表显示了当Snoopee未执行独占序列时,SnpPreferUniqueFwd snoop请求的预期和允
许的Snoopee缓存状态转换及响应。
4.9 Returning Data with Snoop response
返回带有snoop响应的缓存行副本的规则如下所述。
对于Non-forwarding窥探,除了 SnpMakeInvalid,返回缓存行副本到主节点的规则是:
- 无论 RetToSrc 的值如何,如果缓存行是Dirty.的,必须返回一份副本。
- 无论 RetToSrc 的值如何,如果缓存行是Unique Clean的,可以选择性地返回一份副本。
- 如果 RetToSrc 的值为 1,必须返回一份副本,如果缓存行是Shared Clean的,并且Snoopee保留了缓存行的副本。
- 如果 RetToSrc 的值为 0,必须不返回一份副本,如果缓存行是Shared Clean的。
对于Forwarding窥探,其中数据被转发,返回缓存行副本到主节点的规则是:
- 无论 RetToSrc 的值如何,如果Dirty缓存行无法被转发或保留,必须返回一份副本。
- 如果 RetToSrc 的值为 1,必须返回一份副本,如果缓存行是Dirty的或Clean的。
- 如果 RetToSrc 的值为 0,必须不返回一份副本,如果缓存行是Clean的。
RetToSrc 不适用,必须设置为零在:
- SnpQuery 和 Stash snoop
- SnpCleanShared, SnpCleanInvalid 和 SnpMakeInvalid
- SnpOnceFwd 和 SnpUniqueFwd
RetToSrc 在所有其他 snoop 中适用,可以取任何值,除了 SnpDVMOp。
在 SnpDVMOp 中,RetToSrc 不适用,必须设置为零。
主节点只能在对单个请求节点的 snoop 请求中设置 RetToSrc。
4.10 Do not transition to SD
不要过渡到SD是对Non-invalidating的修饰符。
它指定了在何种情况下Snoopee不得因snoop请求而过渡到SD状态。
字段名称为DoNotGotoSD。
- 从UD到SD的非强制性变化或静默变化是允许的,无论DoNotGoToSD的值如何。
- 从Unique状态到Shared状态的任何强制性变化必须遵守DoNotGoToSD。