AMBA-CHI协议详解(一)
AMBA-CHI协议详解(二)
AMBA-CHI协议详解(三)
AMBA-CHI协议详解(四)
AMBA-CHI协议详解(五)
AMBA-CHI协议详解(六)
AMBA-CHI协议详解(七)
文章目录
2.5 Transaction identifier field flows
本节展示不同事务类型的事务ID字段流
● 每个包中包含的字段如下:
—Request packet:
TgtID, SrcID, TxnID, StashNID, StashLPID, ReturnNID, ReturnTxnID, PGroupID, StashGroupID, and TagGroupID
—Response packet:
TgtID, SrcID, TxnID, DBID, PGroupID, StashGroupID, and TagGroupID.
—Data packet:
TgtID, SrcID, TxnID, HomeNID, and DBID
—Snoop packet:
SrcNID, TxnID, FwdNID, FwdTxnID, and StashLPID.
● 下图中所有具有相同颜色的字段都具有相同的值。
● 弯曲的回圈箭头显示了Requester和Completer如何使用早期数据包中的字段为后续数据包的字段。
● 包含星号[*]的方框表示字段首次生成的时间,也就是说,它表示确定该字段原始值的Agent。
● 括号内的字段表示该值实际上是固定值。通常情况下,发送数据包时的SrcID字段和到达目的地时的TgtID字段就是这种情况。
● 划掉的字段表示该字段无效。
● 允许将原始事务的TgtID通过互连重新映射到一个新值。(这是一个包含字母R的方框)
——Note—数字硬鉴———————————
在每个发送的数据包中,ID字段属于以下类别之一:
● 新值。星号表示生成新值。
● 由较早的数据包生成。一个回圈箭头表示源。
● 固定值。该值用括号括起来。
● 不是有效的。域段被划掉了。
————————————————————
在下面的示例中,为了清晰起见,有时会省略与示例无关的任何事务ID。
2.5.1 Read transactions
本节展示了带直接数据传输和不带直接数据传输的读事务中的ID字段流。
2.5.1.1 ID value transfer with DMT
下图显示了如何派生DMT事务消息中的目标和事务ID值。例如,来自互联的ReadNoSnp请求中的SrcID值是由互联分配的。而在数据响应中用作TgtID的ReturnNID被设置为接收到的读取请求的SrcID值(ReturnNID在响应中会被设置为TgtID)。
流程中需要完成的步骤如下:
1、Requester节点通过发送请求包启动事务
请求的ID字段生成如下:
● TgtID由请求的目的地决定(TgtID字段可以通过互连重新映射为不同的值。因为请求->互联的tgtid指向互联,互联->内存控制器的tgtid应该指向内存控制器)
● SrcID是Requester的固定值。(Requester本身的节点ID,响应需要根据该ID找回来)
● RN为一笔事务生成一个唯一的TxnID字段。
2、Home节点接收Requester节点的请求,并向Subordinate节点生成请求。
请求的ID字段生成如下:
● TgtID被设置为SN节点的ID值。(因为已经路由Home节点,指向Home节点的Tgtid要转换为指向SN节点)
● SrcID是Home的固定值。(Home本身的节点ID,响应需要根据该ID找回来)
● TxnID是由Home生成的唯一值
● 将ReturnNID设置为与原始请求的SrcID相同的值。(因为若有需求,SN会根据该ID将响应跨过HN直接返回至RN)
● ReturnTxnID被设置为与原始请求的TxnID相同的值。(因为若有需求,SN会根据ReturnNID响应跨过HN直接返回至RN,根据ReturnTxnID找到到原始的请求)
3、如果对SN的请求需要ReadReceipt,则下级需要提供read receipt(该响应的作用是保序,后续会提到)
ReadReceipt响应的ID字段如下所示:
● TgtID被设置为与请求的SrcID相同的值。(谁给我发的请求,我就要给谁回响应)
● SrcID是SN的固定值。这也与接收到的TgtID匹配。(SN的节点ID,接收请求是作为Tgtid,发送响应时作为Srcid)
● 将TxnID设置为与请求的TxnID相同的值。(响应返回到HN,HN要根据TxnID找到原始请求)
● DBID字段无效。
4、SN提供读取数据。
读取数据响应的ID字段生成如下:
● TgtID被设置为与请求的ReturnNID相同的值。(该事务是DMT,读取的数据要跨过HN直接给到RN,所以TgtID直接指向RN,ReturnNID就是在原始请求节点RN发送请求时放置的RN的节点ID)
● SrcID是SN的固定值。这也与接收到的TgtID匹配。(SN的节点ID,接收请求是作为Tgtid,发送响应时作为Srcid)
● TxnID被设置为与请求的ReturnTxnID相同的值。(RN需要根据该ID去找到原始的请求)
● HomeNID设置为与请求的SrcID相同的值。(HomeNID指向Home节点,因为RN的CompAck响应需要返回至HN,而不是SN)
● DBID被设置为与请求的TxnID相同的值。(因为该DBID会作为CompAck的txnid,Home要根据txnid在Home找到原始请求)
5、Requester接收读取的数据并发送一个完成确认CompAck响应。(该响应的作用先理解为要去为Home释放一些东西)
● 生成的CompAck ID字段如下:
● TgtID设置为与读数据的HomeNID相同的值。(HomeNID的作用就是作为针对读数据返回CompAck的TgtID)
● SrcID是RN的固定值。这也与接收到响应的TgtID匹配。(RN的节点ID)
● TxnID设置为与读数据的DBID相同的值。(因为该DBID会作为CompAck的txnid,Home要根据txnid在Home找到原始请求)
● DBID字段无效。
并非所有请求都需要从Requester到Home的CompAck响应
2.5.1.2 ID value transfer with DMT and separate Comp and Data
下图说明如何在使用单独的Comp和Data的DMT事务消息中派生ID字段值。
1、Requester节点通过发送请求包启动事务
生成请求的标识字段如下:
● TgtID由请求的目的地决定。(TgtID字段可以通过互连重新映射为不同的值。)
● SrcID是Requester的固定值。
● Requester为一笔事务生成一个唯一的TxnID字段。
2、Home节点接收Requester节点的请求,并向Subordinate节点生成请求。
生成请求的标识字段如下:
● TgtID被设置为SN的节点ID。
● SrcID是Home的固定值。
● TxnID是由Home生成的唯一值。
● 将ReturnNID设置为与原始请求的SrcID相同的值。
● ReturnTxnID被设置为与原始请求的TxnID相同的值。
3、Home节点提供单独的Read响应
读取响应的标识字段生成如下:
● TgtID被设置为与请求的SrcID相同的值
● SrcID是Home的固定值。
● TxnID被设置为与原始请求的TxnID相同的值。
● DBID值是由Home生成的唯一值,与向SN请求中的TxnID值相同
4、Requester接收Read响应并发送一个完成确认(CompAck)响应。
● TgtID被设置为与读响应的SrcID相同的值。
● SrcID是请求者的固定值。
● TxnID被设置为Home生成的唯一DBID值。
● DBID值无效。
5、对SN的请求需要一个ReadReceipt。下级提供ReadReceipt
● TgtID被设置为与请求的SrcID相同的值。
● SrcID是SN的固定值。这也与接收到的TgtID匹配。
● 将TxnID设置为与请求的TxnID相同的值。
6、SN提供单独的读取数据。
● TgtID被设置为与请求的ReturnNID相同的值。
● SrcID是从属的固定值。这也与接收到的TgtID匹配。
● TxnID被设置为与请求的ReturnTxnID相同的值。
● HomeNID设置为与请求的SrcID相同的值。
● DBID被设置为与请求的TxnID相同的值。
2.5.1.3 ID value transfer with DCT
在本例中,数据被转发到请求节点,并将带有或不带有数据的Snoop响应发送到HN-F。
1、Requester节点通过发送请求包启动事务
● TgtID由请求的目的地决定。
● SrcID是Requester的固定值。
● Requester为一笔事务生成一个唯一的TxnID字段。
2、互连中接收方Home节点向RN-F节点发出Forwarding snoop。
● SrcID是Home的固定值
● TxnID是由Home生成的唯一值。
● FwdNID设置为与原始请求的SrcID相同的值。(因为数据会根据此ID从一个RNF直接回到请求的RNF)
● 将FwdTxnID设置为与原始请求的TxnID相同的值。
3、RN-F提供读取数据。
● TgtID设置为与Snoop的FwdNID相同的值。
● SrcID是RN-F的固定值。
● TxnID设置为与Snoop的FwdTxnID相同的值。
● HomeNID设置为与Snoop的SrcID相同的值。
● DBID设置为与Snoop的TxnID相同的值。
4、RN-F还提供对Home的响应,无论是否读取数据(得把Snoop请求的响应回去呢)
● TgtID设置为与Snoop的SrcID相同的值。
● SrcID是RN-F的固定值。
● TxnID设置为与snoop的TxnID相同的值。
● DBID字段无效。
5、Requester接收读取的数据并发送一个完成确认CompAck响应。
● TgtID设置为与读数据的HomeNID相同的值。
● SrcID是Requester的固定值。这也与接收到的TgtID匹配。
● TxnID设置为与读数据的DBID相同的值。
● DBID字段无效。
2.5.1.3 ID value transfer without Direct Data Transfer
本节给出了一个没有DMT或DCT的Read ID字段流示例,并描述了在Read事务中使用TxnID和DBID字段。
本例中的Requester和Completer 分别是请求节点和HN-F
ID字段流包括来自Completer的可选ReadReceipt响应和来自Requester的可选CompAck响应。
对于包含CompAck响应的Read事务,Completer使用DBID将CompAck与原始事务关联起来。
不包含CompAck响应的Read事务不需要在数据响应中包含有效的DBID字段。
1、请求方通过发送请求包启动事务。
● TgtID由请求的目的地决定。
● SrcID是请求者的固定值。
● Requester为一笔事务生成一个唯一的TxnID字段。
2、如果事务包含ReadReceipt,则Completer接收请求包并提供ReadReceipt响应(如果有保序要求,会有该响应)
● TgtID被设置为与请求的SrcID相同的值。
● SrcID是Completer的固定值。这也与接收到的TgtID匹配。
● 将TxnID设置为与请求的TxnID相同的值。
● DBID字段无效。
3、Completer接收请求包并提供读取数据。
● TgtID被设置为与请求的SrcID相同的值
● SrcID是完成器的固定值。这也与接收到的TgtID匹配。
● 将TxnID设置为与请求的TxnID相同的值。
● HomeNID是Completer的固定值。(用于CompAck响应)
● 如果断言请求中的ExpCompAck,则Completer生成唯一的DBID值。
4、Requester接收读取的数据并发送完成确认CompAck和响应
● TgtID设置为与读数据的HomeNID相同的值。
● SrcID是请求者的固定值。这也与接收到的TgtID匹配。
● TxnID设置为与读数据的DBID相同的值。
● DBID字段无效。
2.5.2 Dataless transactions
对于Dataless事务,除了CleanSharedPersistSep和StashOnceSep之外,ID字段的使用类似于Without Direct Data传输的ID值传输。唯一的区别是,从Completer到Requester的响应在CRSP通道上作为单个数据包发送,而不是在RDAT通道上作为多个数据包发送。
对于StashOnceSep事务,StashGroupID值在请求节点发送到互连的请求中,该值在StashDone和CompStashDone响应中返回。StashDone响应中的TxnID值不适用,必须设置为零。
下面描述了一个CleanSharedPersistSep事务中的ID值传输。
2.5.2 .1 ID value transfer in a CleanSharedPersistSep transaction
下图展示了如何在使用单独的Comp和Persist响应的CleanSharedPersistSep事务消息中生成ID符字段值。PCMOSep represents CleanSharedPersistSep。
1、请求方通过发送请求包启动事务。Request的ID字段生成如下:
● TgtID由请求的目的地决定。
● SrcID是Requester的固定值。
● Requester为每笔事务生成一个唯一的TxnID值。(Requester可以在接收到Comp响应后重用TxnID值)
● Requester生成一个新的PGroupID值,或者重用当前正在使用的PGroupID值。
2、Home节点向SN节点生成请求。
● TgtID被设置为SN所需的值。
● SrcID是Home的固定值。
● TxnID是由Home生成的唯一值。(在收到Comp响应后,Home可以重用TxnID值。)
● 将ReturnNID设置为与原始请求的SrcID相同的值。
● ReturnTxnID不适用,必须设置为零。
● 将PGroupID设置为与原始请求的PGroupID相同的值。
3、Home节点向请求方发送一个Comp响应
● TgtID被设置为与原始请求的SrcID相同的值。
● SrcID是Home的固定值。
● TxnID被设置为与原始请求的TxnID相同的值。
4、Home节点可以选择性地向请求方发送Persist响应。
● TgtID被设置为与请求的SrcID相同的值。
● SrcID是Home节点的固定值。
● TxnID不适用,必须设置为0。
● 将PGroupID设置为与请求的PGroupID相同的值。
接收方Home节点可以选择向请求方发送一个组合的CompPersist响应,而不是单独的Comp和Persist响应。
CompPersist响应中的ID字段生成如下:
● TgtID被设置为与原始请求的SrcID相同的值
● SrcID是Home的固定值。
● TxnID被设置为与原始请求的TxnID相同的值。
● 将PGroupID设置为与原始请求的PGroupID相同的值。
5、SN节点生成Home节点的Comp响应
● TgtID被设置为与请求的SrcID相同的值。
● SrcID是SN的固定值。
● 将TxnID设置为与请求的TxnID相同的值。
6、SN节点生成对RN或HN的Persist响应。
● TgtID被设置为与请求的ReturnNID相同的值。
● SrcID是SN的固定值。
● TxnID不适用,必须设置为0。
● 将PGroupID设置为与请求的PGroupID相同的值。
7、如果请求的ReturnNID和SrcID是相同的值,SN节点可以选择向Home节点发送一个组合的CompPersist响应,而不是单独的Comp和Persist响应
● TgtID被设置为与请求的SrcID相同的值。
● SrcID是SN的固定值。
● 将TxnID设置为与请求的TxnID相同的值。
● 将PGroupID设置为与请求的PGroupID相同的值。
2.5.3 Write transactions
本节描述了写事务中TxnID和DBID字段的使用:
2.5.3.1 CopyBack transaction
本节描述CopyBack 事务中ID字段的使用。
1、Requester通过发送请求包启动事务。生成请求的ID字段如下:
● TgtID由请求的目的地决定。
● SrcID是RN的固定值。
● Requester为每笔事务生成一个唯一的TxnID值。
2、Completer接收请求包并生成一个CompDBIDResp响应。响应的ID字段生成如下:
● TgtID被设置为与请求的SrcID相同的值。
● SrcID是Completer的固定值。这也与接收到的TgtID匹配。
● 将TxnID设置为与请求的TxnID相同的值。
● Completer生成一个唯一的DBID值。
3、Requester接收CompDBIDResp响应并发送写数据。写数据的ID字段生成如下:
● TgtID被设置为与CompDBIDResp响应的SrcID相同的值。如果该值是由互连重新映射的,则该值可能与请求的原始TgtID不同。
● Requester是请求者的固定值。
● TxnID被设置为与CompDBIDResp响应中提供的DBID值相同的值。
● 写数据中的DBID字段没有被使用。
● 所有写数据包的TgtID、SrcID和TxnID字段必须相同。
4、Completer接收写数据并使用TxnID字段,该字段现在包含了Completer生成的DBID值。这有助于确定要关联哪个事务的写数据。
在接收到所有写数据包后,Completer可以在另一个事务中重用相同的DBID值。
2.5.3.2 WriteNoSnp transaction
本节描述WriteNoSnp事务中标ID字段的使用
显示单独Comp和DBIDResp的ID值传输。Completer可以将Comp和DBIDResp组合成单个CompDBIDResp响应。Requester可以一些情况下将NCBWrData与CompAck结合起来。
ID字段的使用与合并响应的事务相同,附加要求如下:
● 用于单独的DBIDResp和Comp响应的ID字段必须相同。
● 只有当接收到DBIDResp和Comp响应时,请求者才能重用TxnID值。
1、Requester通过发送请求包启动事务。生成请求的标识字段如下:
● TgtID由请求的目的地决定。
● SrcID是Requester的固定值。
● Requester生成一个唯一的TxnID字段。
2、Completer接收请求包并生成一个DBIDResp响应。响应的ID字段生成如下:
● TgtID被设置为与请求的SrcID相同的值。
● SrcID是Completer的固定值。这也与接收到的TgtID匹配。
● 将TxnID设置为与请求的TxnID相同的值。
● Completer生成一个唯一的DBID值。
3、Requester接收到DBIDResp响应并发送写数据。写数据的ID字段生成如下:
● TgtID被设置为与DBIDResp响应的SrcID相同的值。如果该值是由互连重新映射的,则该值可能与请求的原始TgtID不同。
● SrcID是Requester的固定值。
● TxnID被设置为与DBIDResp响应中提供的DBID值相同的值。
● 写数据中的DBID字段没有被使用。
● 所有写数据包的TgtID、SrcID和TxnID字段必须相同。
4、Completer接收写数据并使用TxnID字段(即Completer生成的DBID值)来确定写数据与哪个事务相关联。
5、Completer在完成事务后生成一个Comp响应。
Comp响应的ID字段必须与DBIDResp响应相同,生成方式如下:
● TgtID被设置为与请求的SrcID相同的值。
● SrcID是Completer的固定值。这也与接收到的TgtID匹配。
● 将TxnID设置为与请求的TxnID相同的值。
● Completer使用与在DBIDResp响应中使用的相同的DBID值。
6、如果事务需要,Requester在接收到DBIDResp或Comp后发送一个CompAck消息。
● TgtID被设置为与DBIDResp或Comp响应的SrcID相同的值。
● SrcID是请求者的固定值。这也与接收到的TgtID匹配。
● TxnID设置为与DBIDResp或Comp响应的DBID相同的值。
● DBID字段无效。
在接收到Comp和DBIDResp响应之后,Requester可以在另一个事务中重用相同的TxnID值。
在接收到所有写数据包后,Completer可以在另一个事务中重用相同的DBID值。
在单独的DBIDResp和Comp响应之间没有order要求。当两个消息来自同一来源时,需要使用相同的id值。
2.5.3.3 WriteUnique transaction
在某些情况下,WriteUnique事务还可以包括从Requester到Completer的CompAck响应。在这种情况下,使用ID字段的附加规则是:
● Requester给Completer的CompAck响应的TgtID、SrcID和TxnID标识字段必须与写数据使用的字段相同,即:
—TgtID被设置为与CompDBIDResp响应的SrcID相同的值。如果给出了单独的Comp和DBIDResp响应,则将TgtID设置为与Comp或DBIDResp响应的SrcID相同的值,因为两者中的SrcID值必须相同。但是,如果该值已被互连重新映射,则该值可能与请求的原始TgtID不同。
—SrcID是Requester的固定值。
—TxnID被设置为与CompDBIDResp响应中提供的DBID值相同的值。如果给出了单独的Comp和DBIDResp响应,则将TxnID设置为与Comp或DBIDResp响应的DBID相同的值,因为两者中的DBID值必须相同。
—没有使用WriteData和CompAck中的DBID字段
—如果发送WriteData和CompAck联合响应,则TgtID值与Comp、DBIDResp或CompDBIDResp中的SrcID值相同,TxnID值与Comp、DBIDResp或CompDBIDResp中的DBID值相同。
● 在为另一个事务重用相同的DBID值之前,Completer必须接收所有写数据项和CompAck响应。
2.5.3.4 StashOnce or StashOnceSep transaction
本节描述了在蕴含DataPull的StashOnce或StashOnceSep事务中ID字段的使用:
1、Requester通过发送一个Stash请求包来启动事务。
● TgtID由请求的目的地决定。
● SrcID是Requester的固定值。
● 请Requester为请求生成一个唯一的TxnID字段。
● Requester包含StashNID字段,以指示要向哪个RN-F发送Stash(划重点)。
● Requester包含StashLPID字段,以指示RN-F中的逻辑处理器。
2、Home节点接收Stash请求包并向请求节点发送Comp响应
● TgtID被设置为与请求的SrcID相同的值。
● 将TxnID设置为与请求的TxnID相同的值。
3、对于StashOnceSep请求,互连中的Home节点向请求节点发送StashDone响应。
● TgtID被设置为与请求的SrcID相同的值。
● TxnID无效
● 将StashGroupID设置为与请求的StashGroupID相同的值。
另外,对于StashOnceSep请求,互连中的Home节点可以发送组合的CompStashDone响应,而不是单独的Comp和StashDone响应到请求节点。
● TgtID被设置为与请求的SrcID相同的值。
● 将TxnID设置为与请求的TxnID相同的值。
● 将StashGroupID设置为与请求的StashGroupID相同的值。
4、Home节点使用Stash生成对适当的RN-F的Snoop。
● SrcID是Home的固定值。
● TxnID是由Home生成的唯一值
● 将StashLPID设置为与原始请求的StashLPID相同的值。
—Note—————
Snoop请求不包括tgtid域段
————————
5、被Snoop的RN-F产生一个Snoop响应。在本例中,它包括一个Data Pull指示。
● TgtID被设置为与请求的SrcID相同的值。
● SrcID是RN-F的固定值。
● 将TxnID设置为与请求的TxnID相同的值。
● DBID字段是由RN-F生成的唯一值。
6、Home提供读取数据。
● TgtID被设置为与Snoop响应的SrcID相同的值。
● SrcID是Home的固定值。(在本例中,读取数据由Home提供。)
● TxnID被设置为与Snoop响应的DBID相同的值。
● DBID字段是Home生成的唯一值。
● HomeNID是Home的固定值。
7、RN-F接收读取的数据并发送完成确认CompAck响应。
● TgtID设置为与读数据的HomeNID相同的值。
● SrcID是RN-F的固定值。这也与接收到的TgtID匹配。
● TxnID设置为与读数据的DBID相同的值。
● DBID字段无效。
2.5.4 DVMOp transaction
对DVMOp事务的TgtID、SrcID、TxnID和DBID标识符字段的使用与writensnp事务的相同。
2.5.5 Transaction requests with Retry
对于接收到RetryAck响应的事务,有关于如何使用ID字段的特定规则。
1、Requester通过发送请求包启动事务。生成请求的ID字段如下:
● TgtID由请求的目的地决定
● SrcID是请求者的固定值。
● Requester生成唯一的TxnID字段。
2、Completer接收请求包并确定它将发送一个RetryAck响应。RetryAck响应的ID字段生成如下:
● TgtID被设置为与请求的SrcID相同的值。
● SrcID是Completer的固定值。这也与接收到的TgtID匹配。
● 将TxnID设置为与请求的TxnID相同的值。
● DBID字段无效。
● Completer使用一个PCrdType值,该值指示Retry事务所需的信用类型。
3、当Completer能够接受给定PCrdType的Retry事务时,它使用PCrdGrant响应向Requester发送一个信用。生成PCrdGrant响应的标识符字段如下:
● TgtID被设置为与请求的SrcID相同的值。
● SrcID是Completer的固定值。这也与请求的TgtID相匹配。
● TxnID字段没有被使用,必须设置为零。
● DBID字段没有被使用,必须设置为零。
● PCrdType值被设置为再次发出原始事务所需的类型。
4、Requester接收信用授予,并通过发送请求包重新发送原始事务。生成请求的标识字段如下:
● TgtID被设置为与RetryAck响应的SrcID相同的值(也与PCrdGrant响应的SrcID相同),或者与原始请求中使用的值相同。
● SrcID是请求者的固定值
● Requester生成一个唯一的TxnID字段。这是允许的,但不是必需的,与接收到RetryAck响应的原始请求不同。
● 将PCrdType值设置为对原始请求的RetryAck响应中的PCrdType值,该值与PCrdGrant响应的PCrdType值相同。
2.5.6 Protocol Credit Return transaction
P-Credit返回事务使用PCrdReturn请求返回已授予但不再需要的信用。TgtID、SrcID和TxnID要求如下:
● Requester通过发送PCrdReturn请求包发送协议信用返回事务。生成请求的标识字段如下:
—TgtID必须与获得的credit的SrcID匹配。
—SrcID是请求者的固定值。
—TxnID字段没有被使用,必须设置为零。
PCrdType必须与再次发出原始事务所需的原始PCrdGrant中的PCrdType值匹配。
没有响应或使用与协议信用返回事务相关的DBID字段。