AMBA-CHI协议详解(五)
AMBA-CHI协议详解(一)
AMBA-CHI协议详解(二)
AMBA-CHI协议详解(三)
AMBA-CHI协议详解(四)
AMBA-CHI协议详解(五)
文章目录
- 2.4.Transaction identifier fields
- 2.4.1 Target Identifier, TgtID, and Source Identifier, SrcID
- 2.4.2 Transaction Identifier, TxnID
- 2.4.3 Data Buffer Identifier, DBID
- 2.4.4 Return Transaction Identifier, ReturnTxnID
- 2.4.5 Forward Transaction Identifier, FwdTxnID
- 2.4.6 Data Identifier, DataID, and Critical Chunk Identifier, CCID
- 2.4.7 Logical Processor Identifier, LPID
- 2.4.8 Stash Logical Processor Identifier, StashLPID
- 2.4.9 Stash Node Identifier, StashNID
- 2.4.10 Return Node Identifier, ReturnNID
- 2.4.11 Home Node Identifier, HomeNID
- 2.4.12 Forward Node Identifier, FwdNID
- 2.4.13 Persistence Group Identifier, PGroupID
- 2.4.14 Stash Group Identifier, StashGroupID
- 2.4.15 Tag Group Identifier, TagGroupID
2.4.Transaction identifier fields
每个事务由许多不同的packets组成,这些数据包通过互连(interconnect)传输。packets内的一组ID域段用于提供有关包的附加信息。
2.4.1 Target Identifier, TgtID, and Source Identifier, SrcID
请求事务包括标识目标节点的TgtID和标识源节点的SrcID。
这些id用于在互连(interconnect)中路由。
2.4.2 Transaction Identifier, TxnID
事务请求包括一个TxnID,用于标识来自给Requester的事务。除了PrefetchTgt之外,对于Requester,TxnID必须是唯一的。SrcID指向Requester ,这确保任何返回的读取数据或响应信息都可以与正确的事务相关联。
TxnID定义了一个12位字段,outstanding限制为1024。Requester可以在接收到TxnID值后可以重用该值。
● 响应使用相同的值与先前的事务进行关联。(响应通过该值关联到相关的请求)。
● RetryAck响应使用相同的值与先前事务相关联。
TxnID域段不适用于PrefetchTgt请求,它可以取任何值。
一旦接收到释放请求所需的所有响应或接收到RetryAck响应,从Home到SN的请求的TxnID域段中使用的值可以被Home重用。
Retry的事务不需要使用相同的TxnID。
2.4.3 Data Buffer Identifier, DBID
DBID字段允许事务的Completer提供自己的标识(例如Completer的Buff ID)。Completer发送一个包含DBID的响应。以下情况下,DBID值用作TxnID字段值:
● Immediate Write,CopyBack Write,Combined Write, Atomic,以及DVMOp transactions的WriteData响应。
● 蕴含Data Pull的Stash transactions的CompData response。
● 包含CompAck响应的Read, Dataless, WriteNoSnp, WriteUnique and Immediate Combined Write transactions的CompAck 响应。
在以下情况下,Completer在给定事务响应中使用的DBID值对于Requester必须是唯一的:
● 除了WriteNoSnpZero和WriteUniqueZero的所有Write transactions的DBIDResp or DBIDRespOrd或CompDBIDResp
● 所有组合写事务的DBIDResp或DBIDRespOrd或CompDBIDResp。
● 用于原子事务的DBIDResp或DBIDRespOrd或CompDBIDResp。
● DBIDResp或DBIDRespOrd或CompDBIDResp用于DVMOp事务。
● 包含CompAck的Read事务的CompData或RespSepData,除非ReadOnce*和ReadNoSnp不使用CompAck在Home中释放请求。
DBID值适用于包含CompAck的读取请求的DataSepResp响应,它必须与关联的RespSepData响应中的DBID值相同。
对于Write或Combined Write事务,如果Comp和DBIDResp或DBIDRespOrd消息来自同一源,则Comp和DBIDResp或DBIDRespOrd消息中必须包含相同的DBID字段值。
允许但不要求与原子事务的DBIDResp或DBIDRespOrd消息分开发送的Comp响应消息在Comp和DBIDResp或DBIDRespOrd消息中包含相同的DBID字段值。
Completer允许(但不是必须)对具有不同Requesters的两个事务使用相同的DBID值。在接收到释放使用相同值的前一个事务所需的所有数据包后,Completer被允许重用DBID值。
Snoop Completer在响应包含 Data Pull的Stash Snoop时使用的DBID值必须在以下方面是唯一的:
● 对使用Data Pull的Stash snoops的其他Snoop响应中的DBID值。
● 来自该Snoop Completer的任何未完成请求的TxnID。
Completer不需要使用DBID字段,并允许将其设置为以下格式中的任何值:
● WriteNoSnpZero和WriteUniqueZero事务。
● 不带CompAck的Read事务。
● 不带CompAck的Dataless事务。
● Snoop对不包含Data Pull的Stash Snoop响应。
● Non-stash snoop的Snoop响应。
——Note-数字硬鉴——————
使用由Completer分配的DBID而不是由Requester分配的TxnID的优点是:Completer可以使用DBID索引其请求结构,而不是使用TxnID和SrcID执行查找,以确定哪个事务Write Data或CompAck与哪个请求相关联。
如果Completer对不同的Requesters使用相同的DBID值(如果它的操作需要同时激活1024个以上的DBID响应,它必须这样做),它必须使用SrcID和DBID来确定哪个请求应该与写数据或响应消息相关联。
———————————————
DBIDResp响应还用于提供与事务相关的某些保序(order)保证。
2.4.4 Return Transaction Identifier, ReturnTxnID
● 从Home到SN的事务请求还包括一个ReturnTxnID字段,用于传递数据响应和SN的DBIDResp响应中的TxnID值。当适用时,其值必须为:
● 当ReturnNID为Home节点ID时,是由Home生成的TxnID。(例如响应返回至HN)
● 当ReturnNID是原始请求者的节点ID时,是由原始Requester生成的TxnID。(例如响应直接返回至RN)。
ReturnTxnID仅适用于从Home到SN的ReadNoSnp、ReadNoSnp、WriteNoSnp、Combined Write和Atomic请求。该字段不适用时,必须在从Home到从属的所有其他请求中设置为零。
ReturnTxnID不适用,必须在从Requester到Home和Requester到SN所有请求中设置为零。(因为会影响响应路由等判断)
以下是从主节点到从属节点的请求中ReturnTxnID的期望值和允许值。(常用场景DMT、DWT等)
In ReadNoSnp and ReadNoSnpSep:
● 期望值是原始的RN 的TxnID,但允许是Home TxnID。
● 在CompData和DataSepResp响应中用作TxnID。
In Atomic with TagOp Invalid or Match:
● 对于AtomicStore, ReturnTxnID可以取任何值,并且该值不会在任何响应中使用。
● 对于 Non-store原子,ReturnTxnID必须是Home TxnID。该值在CompData响应中用作TxnID。
In WriteNoSnp with any TagOp value:
● 当DoDWT = 0时,ReturnTxnID可以取任意值,该值不用于任何响应。
● 当DoDWT = 1时,ReturnTxnID值应该是原始的RN的TxnID(DBIDResp响应直接回到RN),但允许是Home TxnID。在DBIDResp响应中用作TxnID。
In WriteNoSnpDef:
● 当DoDWT = 0时,ReturnTxnID可以取任意值,该值不用于任何响应。
● 当DoDWT = 1时,ReturnTxnID值应该是原始的RN的TxnID,但允许是Home TxnID。在DBIDResp响应中用作TxnID。
In Combined Write:
● 当DoDWT = 0时,ReturnTxnID可以取任意值,该值不用于任何响应。
● 当DoDWT = 1时,ReturnTxnID值应该是原始的RN的TxnID,但允许是Home TxnID。在DBIDResp响应中用作TxnID。
2.4.5 Forward Transaction Identifier, FwdTxnID
从Home到RN-F的Snoop请求还包括一个FwdTxnID字段,用于传递来自Snoopee的Data响应中的TxnID值。它的值必须是原始请求的TxnID。
FwdTxnID字段仅适用于:
● SnpSharedFwd
● SnpCleanFwd
● SnpOnceFwd
● SnpNotSharedDirtyFwd
● SnpUniqueFwd
● SnpPreferUniqueFwd
在所有其他的Snoop,它是不适用的,必须设置为零。
2.4.6 Data Identifier, DataID, and Critical Chunk Identifier, CCID
该字段标识事务中的各个数据包。
2.4.7 Logical Processor Identifier, LPID
当单个请求Requester 包含多个逻辑上独立的处理Agent时,使用此字段。SrcID与LPID一起用于唯一标识生成请求的逻辑处理器。
对于以下事务,LPID必须设置为正确的值:
● 对于任何Non-snoopable Non-cacheable 或Device访问:
● — ReadNoSnp
● — WriteNoSnp
● — WriteNoSnpDef
● 对于Exclusive访问,可以是以下事务类型之一:
● — ReadClean
● — ReadShared
● — ReadNotSharedDirty
● — ReadPreferUnique
● — MakeReadUnique
● — CleanUnique
● — ReadNoSnp
● — WriteNoSnp
对于其他事务,LPID值是允许的,但不是必需的,用于指示事务发出的原始逻辑处理器。
在请求中,当适用时,数据包中的相同位用于TagGroupID、PGroupID和StashGroupID(即复用)。
2.4.8 Stash Logical Processor Identifier, StashLPID
当断言相应的StashLPIDValid位时,StashLPID字段可用于指定由StashNID指定的请求节点内的特定LP(Logical Processor)。
2.4.9 Stash Node Identifier, StashNID
当断言相应的StashNIDValid位时,StashNID字段提供作为Stash事务的目标节点。
2.4.10 Return Node Identifier, ReturnNID
从Home节点到SN节点的事务请求包含一个ReturnNID,用于确定来自SN节点的以下响应的TgtID:(就是响应要回到SN还是HN)
● Data response
● DBIDResp response
● Persist response
● TagMatch response
它的值必须是Home的节点ID或原始RN的节点ID。
ReturnNID仅适用于从Home到SN的ReadNoSnp、ReadNoSnp、CleanSharedPersistSep、WriteNoSnp、Combined Write和Atomic请求。该字段不适用时,必须在从Home到从属的所有其他请求中设置为零。
ReturnNID不适用时,必须在从Requester到Home和Requester到从属的所有请求中设置为零。
以下是从Home节点到SN节点的请求中ReturnNID的期望值和允许值
In ReadNoSnp, ReadNoSnpSep, and CleanSharedPersistSep:
● 期望值是原始RN节点ID,但允许是Home节点ID
● 在CompData, DataSepResp和Persist响应中用作TgtID
In Atomic with TagOp Invalid:
● 对于AtomicStore, ReturnNID可以为任何值,并且该值不会在任何响应中使用。
● 对于Non-store原子,ReturnNID必须是主节点ID。该值作为CompData中的TgtID。
In Atomic with TagOp Match:
● ReturnNID必须是Home节点ID。
● 该值在CompData和TagMatch响应中用作TgtID。
In WriteNoSnp with TagOp not Match:
● 当DoDWT = 0时,ReturnNID可以取任意值,该值不会用于任何响应。
● 当DoDWT = 1时,ReturnNID值应该是原始的RN节点ID,但允许是主节点ID。在DBIDResp响应中用作TgtID。
In WriteNoSnp with TagOp Match:
● 不管DoDWTt的值是什么,ReturnNID值应该是原始的请求者节点ID,但允许是Home节点ID。
● 当DoDWT= 0时,ReturnNID值仅用作TagMatch响应中的TgtID。
● 当DoDWT= 1时,ReturnNID值用作DBIDResp和TagMatch响应中的TgtID。
In WriteNoSnpDef:
● 当DoDWT = 0时,ReturnNID可以取任意值,该值不用于任何响应。
● 当DoDWT = 1时,ReturnNID值应该是原始的Requester节点ID,但允许是Home节点ID。在DBIDResp响应中用作TgtID。
In Non-PCMO Combined Write:
● 当DoDWT = 0时,ReturnNID可以取任意值,该值不用于任何响应。
● 当DoDWT = 1时,ReturnNID值应该是原始的Requester节点ID,但允许是Home节点ID。在DBIDResp响应中用作TgtID。
In WriteNoSnpFullClnShPer and WriteNoSnpPtlClnShPer:
● 不管DoDWT 的值是什么,ReturnNID值应该是原始的Requester节点ID,但允许是Home节点ID。
● 当DoDWT = 0时,ReturnNID值仅用作Persist响应中的TgtID。
● 当DoDWT = 1时,ReturnNID值被用作DBIDResp和Persist响应中的TgtID。
2.4.11 Home Node Identifier, HomeNID
CompData包含HomeNID字段,Requester使用它来标识针对CompData的CompAck相应的目标ID。HomeNID适用于CompData和DataSepResp,不适用于所有其他数据消息,必须设置为零。
——Note—数字硬鉴—————
在DataSepResp响应中没有对HomeNID和DBID字段的功能需求,因为在RespSepData响应中提供的值是相同的,并且总是可以使用。但是,需要包含这些值来帮助调试和协议检查。
——————————————
2.4.12 Forward Node Identifier, FwdNID
从Home到RN-F的Snoop请求包含一个FwdNID,用于确定来自Snoopee的Data响应的TgtID。它的值必须是原始Requester的节点ID。
fwdid字段只适用于以下情况:
● SnpSharedFwd
● SnpCleanFwd
● SnpOnceFwd
● SnpNotSharedDirtyFwd
● SnpUniqueFwd
● SnpPreferUniqueFwd
● 除了基于范围的TLBI DVM操作外,它在所有其他Snoop中都不适用,必须设置为零。对于基于范围的TLBI操作,字段中的位用于DVM payload。
2.4.13 Persistence Group Identifier, PGroupID
CleanSharedPersistSep和 Combined Write with Persistent CMO (PCMO)请求包含一个PGroupID,用于标识该请求所属的 Persistence组。如果Requester有来自不同功能Agent的Persistent CMO请求,它希望识别这些请求以进行高性能的 Persist CMO处理,那么它可以为每组 Persist请求分配不同的PGroupID值。这个8位字段的使用适用于CleanSharedPersistSep和组合写与PCMO事务。它也适用于Persist和CompPersist响应。
● PGroupID必须在CleanSharedPersistSep请求和包含PCMO的组合写请求中发送。
● Requster可以使用Persist响应中返回的PGroupID值分别跟踪来自每个组的Persist响应的完成情况。
● 不支持多个persistence 的RN可以将PGroupID值设置为零。
● 使用PGroupID传递barrier的RN通常不会重用PGroupID值,直到该组先前发送的所有CleanSharedPersistSep请求都收到了Persist响应。
● Completer需要在Persist和CompPersist响应中携带PGroupID,以及包含PCMO的组合写请求的响应。
● 来自Home和SN的Comp和CompCMO响应中的PGroupID字段不适用,必须设置为零。
2.4.14 Stash Group Identifier, StashGroupID
为了识别请求所属的Stash组,StashOnceSep请求包含一个StashGroupID。来自请求的相同StashGroupID值随后由事务流中的StashDone响应使用。如果RN有来自不同功能Agent的StashOnceSep请求,它想要识别这些请求以进行高性能的stash处理,那么它可以为每组存储请求分配不同的StashGroupID值。
这个8位字段的使用适用于StashOnceSep请求和StashDone响应。如果它不适用,必须在所有其他请求和响应中设置为零。
● StashGroupID必须在StashOnceSep请求中发送。
● RN可以使用StashDone响应中返回的StashGroupID值分别跟踪来自每个组的Stash事务的完成情况。
● 不支持多个Stash组的RN将StashGroupID值设置为零。
● Completer需要在StashDone响应中携带StashGroupID。
2.4.15 Tag Group Identifier, TagGroupID
为了识别请求所属的Tag组,将TagOp设置为Match的写请求包含TagGroupID。随后,事务流中的TagMatch响应将使用来自请求的相同TagGroupID值,以便在TagMatch操作通过或失败时通知RN。
使用这个8位字段适用于写请求,其中TagOp设置为Match,以及TagMatch响应。如果它不适用,必须在所有其他请求和响应中设置为零。
● TagGroupID必须在TagOp设置为Match的写请求中发送。
● TagGroupID的确切内容是实现决定的。通常,TagGroupID应该包含异常级别、TTBR值和PE标识符(Exception Level, TTBR value, and PE identifier)。