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.5 Response types
- 4.5.1 Completion response
- 4.5.2 WriteData response
- 4.5.3 Snoop response
- 4.5.4 Miscellaneous response
4.5 Response types
每个请求可以生成一个或多个响应。 某些响应也可以包含数据。 响应被分类为如下:
- Completion response
- WriteData response
- Snoop response
- Miscellaneous response
4.5.1 Completion response
对于除 PCrdReturn 和 PrefetchTgt 之外的所有事务,完成响应是必需的。它通常是从完成者发送的最后一条消息,以结束请求事务。 然而,请求者可能仍会发送 CompAck 响应以结束事务。 完成保证请求已到达 PoS 或 PoC,在那里将与来自系统中任何请求者的同一地址的请求进行排序。
Read and Atomic transaction completion
读取完成可以是通过 RDAT 通道使用 CompData 操作码的单个响应,或是两个单独的响应,一个在 RSP通道使用 RespSepData 操作码,另一个在 RDAT 通道使用 DataSepResp 操作码。
AtomicLoad、AtomicSwap 和 AtomicCompare 完成在 RDAT 通道上发送,并使用 CompData操作码。
CompData 和 DataSepResp 完成响应包括 Resp 字段,指示以下内容:
Cache state - 请求者处缓存行的最终允许状态,适用于除 ReadNoSnp 和 ReadOnce* 之外的所有读取。
Pass Dirty - 指示是否将更新内存的责任传递给请求者。传递脏数据位的断言在响应名称中显示为 _PD。
当使用单独的 Comp 和 Data 响应时,RespSepData 还包括带有缓存状态和传递脏数据指示的 Resp 字段。RespSepData 中的 Resp 字段值必须是不可适用并设置为零,或者与相应的 DataSepResp 中的值相同。
下表显示了允许的读取事务完成、Resp字段的编码以及响应的含义。 Subordinate节点只能在响应ReadNoSnpSep时发送数据分离响应,并且只能在响应ReadNoSnp时发送完整数据。
在带有error指示的响应中,缓存状态可以是任何值,包括保留值。
Dataless transaction completion
对于Dataless和没有数据的 MakeReadUnique 事务,完成信息通过 CRSP 通道发送,并使用 Comp、CompPersist、CompCMO 或 CompStashDone 操作码。
CompCMO 是在组合写入事务中 CMO 和 PCMO 的完成消息。 它只能在组合写入事务中使用。 CompCMO 可以与Persist响应结合使用,作为 CompPersist 操作码。
Comp 响应包括 Resp 字段,指示以下内容:
Cache state - 请求者允许缓存行处于的最终状态,CMO 事务除外。对于 CMO 事务,完成中的缓存状态字段值,特别是在 Comp、CompCMO 和 CompPersist 事务中,将被忽略,缓存状态保持不变。
下表显示了允许的Dataless事务Comp、Resp 字段的编码以及响应的含义。
在带有Error指示的响应中,缓存状态可以是任何值,包括保留值。
Write and Atomic transaction completion
写入和AtomicStore完成通过 CRSP 通道发送,并使用 Comp 或 CompDBIDResp 操作码。
写入事务完成时,不会传递任何缓存状态信息或Dirty缓存行。 对于任何写入事务完成,Comp 或 CompDBIDResp 响应的 Resp 字段必须设置为零,除了WriteNoSnpDef。所有缓存状态信息和Dirty缓存行的责任都通过 WriteData 进行传递。
允许的写入事务完成响应为:
Comp - 用于完成响应与 DBIDResp 或 DBIDRespOrd 响应分开的情况。
CompDBIDResp - 用于完成响应与 DBIDResp 或 DBIDRespOrd 响应结合的情况。
所有 CopyBack 请求必须使用 CompDBIDResp 完成响应。Immediate writes和 AtomicStore 可以单独发送 Comp 和 DBIDResp 或 DBIDRespOrd 响应,或者可以将两个响应结合并发送 CompDBIDResp,前提是两者都准备好发送给请求者。
WriteNoSnpDef
WriteNoSnpDef 事务中 Comp 或 CompDBIDResp 响应的 Resp 字段和 RespErr 字段值组合的允许情
况见下表
HN-F 被允许但不期望成为 WriteNoSnpDef 请求的目标主节点。 接收到预期的 WriteNoSnpDef 请求的 HN-F,必须不能将 WriteNoSnpDef 请求转发给 SN-F。HN-F 必须返回 OK/不支持的响应。
4.5.2 WriteData response
写入数据响应是写入请求和 DVMOp 事务的一部分。 请求者在收到可接受数据的缓冲区可用保证后,将写入数据发送给完成者。 缓冲区可用性通过完成者发送的 DBIDResp 或 DBIDRespOrd 响应进行信号传递。(下游有存储数据的Buff空间后返回 DBIDResp 或 DBIDRespOrd)
写入数据响应在 WDAT 通道上发送,并使用以下opcode。
CopyBackWriteData, CBWrData
用于 WriteBack、WriteClean、WriteEvictFull 和 WriteEvictOrEvict,以及 CopyBac
k组合写入事务。 从请求者的缓存向互连传输一致性数据。 在发送写数据响应之前,包含缓存行状态的指示。
NonCopyBackWriteData, NCBWrData
用于WriteUnique 、WriteNoSnp、WriteNoSnpDef、Combined Immediate Write
transactions。 也用于DVMOp事务。 响应中的缓存状态必须为I。
NonCopyBackWriteDataCompAck, NCBWrDataCompAck
用于即时Immediate Write、Combined Write transactions。 组合NonCopyBackWrData and CompAck。响应中的缓存状态必须为I。
WriteDataCancel
用于通知完成者在写数据发送之前写请求被取消。
- 请求节点可以在WriteNoSnpPtl、WriteUniquePtl、WriteUniquePtlStash和相应的组合写入事务中发送写数据取消,而不是NonCopyBackWrData。
- Home节点可以在 WriteNoSnpFull、WriteNoSnpPtl 和相应的组合写入事务中,向从属节点发送 WriteDataCancel,而不是 NonCopyBackWrData。
- 请求节点或主节点可以在 WriteNoSnpDef 事务中,向从属节点发送 WriteDataCancel,而不是 NCBWrdata,前提是 Comp 或 CompDBIDResp 响应包含NDERR、OK/Defer 或 OK/Unsupported。
- 在写入Device内存的请求中不得使用,除非在 WriteNoSnpDef 事务中。
- 所有原本打算传输的数据包必须发送。
WriteDataCancel 消息中的 BE 字段值必须设置为全零。 - 响应中的缓存状态必须为 I。
响应包括 Resp 字段,指示以下内容:
Cache state — 指示发送 WriteData 响应之前缓存行的状态。 如果在发送原始事务请求后,但在发送相应的 WriteData 响应之前,请求者收到了对同一地址的snoop请求,则该状态可能与发送原始事务请求时缓存行的状态不同。
Pass Dirty — 指示请求者是否将更新内存的责任传递。传递脏位的断言在响应名称中用 _PD 表示。
下表显示了允许的 WriteData 响应、操作码和响应字段编码,以及响应的含义。
在写入事务完成后,请求者的缓存行状态无法从 WriteData 响应中的缓存状态信息中确定。 可以通过事务的opcode确定缓存行在事务后是否保持有效:
• WriteBack 或 WriteEvictFull 事务必须处于 I 状态。
• WriteClean 事务可以保持allocated并处于Clean状态。
4.5.3 Snoop response
Snoop事务包括Snoop 响应。 Snoop响应可以有数据或没有数据。 Snoop 响应的形式有:
Snoop response without data
- 当不需要数据传输时使用此Snoop 响应。
- 它通过SRSP通道发送,并使用SnpResp opcode。
- 它可以包含对stash snoops的DataPull请求。
- 没有数据的snoops响应始终用于对SnpDVMOp事务的响应。
Snoop response without data to Home and DCT
- 当Snoopee向Requester发送数据且不需要向Home节点进行数据传输时,使用此Snoop 响应。
- 它通过SRSP通道发送,并使用SnpRespFwded操作码。
Snoop response with data
- 当一整行缓存数据被传输到Home节点时,使用此Snoop 响应。
- 它在WDAT通道上发送,并使用SnpRespData操作码。
- 它可以包含对stash snoops的DataPull请求。
Snoop response with partial data
- 当部分缓存行数据被传输到主节点时,将使用此Snoop 响应。
- 它通过WDAT通道发送,并使用SnpRespDataPtl操作码。
- 它可以包含对stash snoops的DataPull请求。
- 当Snoop 请求和缓存行状态的组合为:
— 任何窥探请求,除了SnpMakeInvalid,并且缓存行状态为UDP时,发送。
Snoop response with data to Home and DCT
- 当Snoopee向请求者发送数据,并且还需要向主节点进行数据传输时,将使用此Snoop 响应。
- 它通过DAT通道发送,并使用SnpRespDataFwded操作码。
窥探响应包括Resp字段,指示以下内容:
Cache state — 在发送Snoop 响应后,Snoop 节点上缓存行的最终状态。
Pass Dirty — 指示更新内存的责任已转移给请求者或ICN。
仅在带数据的Snoop 响应中被断言。 Pass Dirty 位的断言在响应名称中由 _PD 显示。
Snoop 响应还包括适用于 DCT 的 FwdState 字段,指示缓存状态和在发送给请求者的 CompData 响应中的 Pass Dirty 值。
Snoop 响应缓存状态信息提供了在发送Snoop 响应后缓存行的状态。
这与以下情况不同:
• 写入数据响应,其中缓存状态信息提供了在发送写入数据时缓存行的状态。
• 读取数据响应,其中缓存状态信息指示事务完成后缓存行的允许状态。
下表显示了允许的无数据Non-forward snoop响应、RSP操作码和响应字段编码,以及响应的含义。
下表显示了允许的无数据Forward type窥探响应、RSP操作码、Resp和FwdState字段编码,以及响应的含义
下表显示了允许的Non-forward snopp响应及其数据、DAT 操作码和响应字段编码,以及响应的含义
下表显示了允许的Forward type snoop响应及数据、DAT 操作码、响应和转发状态字段编码,以及响应的含义。
在对stash snoops的响应中,Snoopee可以通过设置Data Pull发送结合了读取请求的snoop响应
(SnpResp_X_Read)。允许的带Data Pull的snoop响应有:
-
For SnpUniqueStash:
— SnpResp_I_Read
— SnpRespData_I_Read
— SnpRespData_I_PD_Read
— SnpRespDataPtl_I_PD_Read -
For SnpMakeInvalidStash:
— SnpResp_I_Read -
For SnpStashUnique:
— SnpResp_I_Read
— SnpResp_UC_Read
— SnpResp_SC_Read
— SnpResp_SD_Read -
For SnpStashShared:
— SnpResp_I_Read
— SnpResp_UC_Read
4.5.4 Miscellaneous response
在本节中的所有响应中,Resp 和 RespErr 字段没有意义,必须设置为零。
miscellaneous responses包括
CompAck
- 在收到完成响应时由请求者发送。
- 由Read, Dataless, WriteNoSnp, WriteUnique, 和CopyBack Write使用。
- 对于Immediate Write事务,CompAck 响应中的 Resp 值不适用,必须设置为零。
- 对于CopyBack Write事务,CompAck 响应中的 Resp 值是适用的。 CompAck 中 Resp 的允许值如下表所示。
a. 当CopyBack写事务为WriteClean时,Unique副本仍然可以存在于请求者处。
RetryAck
如果请求由于缺乏适当资源而未被完成者接受,则由完成者发送给请求者。
对于除PCrdReturn或PrefetchTgt之外的任何请求事务,响应是允许的。
PCrdGrant
授予协议信用。使用协议信用发送的后续请求,保证被目标接受。
ReadReceipt
- 对于具有保序要求的请求,发送此请求以满足与来自同一请求者的其他有序请求的关系。
- 由从属节点发送,以指示其已接受读取请求,并且不会发送RetryAck响应。
- 适用于ReadNoSnp, ReadNoSnpSep, and ReadOnce*请求事务。
DBIDResp
- 发送响应以通知请求者资源可用,以接受写入数据响应。
- DBIDResp 响应还表明,完成者提供某些事务排序保证。
- 适用于Write, Combined Write, DVMOp, and Atomic事务。
- 响应允许从主节点到请求节点,以及从从属节点到主节点和请求节点。(HN到RN,或SN到HN,SN到RN)
DBIDRespOrd
- 发送响应以通知请求者资源可用,以接受写入数据响应。
- DBIDRespOrd 响应还表明,完成者提供某些事务排序保证。
- 适用于Write, Combined Write, and Atomic事务。
- 在 DVM 事务中不允许使用 DBIDRespOrd。
- 响应仅允许从主节点到请求节点。
Persist
由完成者发送的 CleanSharedPersistSep 事务,表示之前写入同一内存位置的数据已被持久化。
StashDone
由完成者发送的 StashOnceSep,以指示请求在完成者处的排序。
TagMatch
由完成者发送,用于带有TagOp为Match的写入事务,以表示标记Tag Match操作完成。