在前面介绍了一些基本概念,接下来具体看看。我们再来回顾一下CHI的分层,协议层(protocol)、网络层(network)和链路层(link)。在协议层,通信是基于transaction;在网络层,基于packet;链路层,基于flit。
先来看看协议层的transaction,可以分为以下几类(CHI.D):
Read
-
ReadNoSnp, ReadNoSnpSep
-
ReadOnce
-
ReadOnceCleanInvalid
-
ReadOnceMakeInvalid
-
ReadClean
-
ReadNotSharedDirty
-
ReadShared
-
ReadUnique
Dataless
-
CleanUnique
-
MakeUnique
-
Evict
-
StashOnceUnique
-
StashOnceShared
-
CleanShared
-
CleanSharedPersist
-
CleanSharedPersistSep
-
CleanInvalid
-
MakeInvalid
Write
-
WriteNoSnpPtl, WriteNoSnpFull
-
WriteUniquePtl, WriteUniqueFull
-
WriteUniquePtlStash, WriteUniqueFullStash
-
WriteBackPtl, WriteBackFull
-
WriteCleanFull
-
WriteEvictFull
Atomic
-
AtomicStore
-
AtomicLoad
-
AtomicSwap
-
AtomicCompare
Snoop
-
SnpOnceFwd
-
SnpOnce
-
SnpStashUnique
-
SnpStashShared
-
SnpCleanFwd
-
SnpClean
-
SnpNotSharedDirtyFwd
-
SnpNotSharedDirty
-
SnpSharedFwd
-
SnpShared
-
SnpUniqueFwd
-
SnpUnique
-
SnpUniqueStash
-
SnpCleanShared
-
SnpCleanInvalid
-
SnpMakeInvalid
-
SnpMakeInvalidStash
-
SnpDVMOp
Other
-
DVMOp
-
PrefetchTgt
-
PCrdReturn
看着挺多的,我们现在不需要全都记住,只记住分为几大类就好了。等到讲CHI一致性协议时还会提及。
现在我们知道了,一个RN会产生transaction(read,write,maintenance)给HN;HN接收,并对RN发来的请求进行排序,产生transaction给SN;SN接收这些请求,返回数据或者响应。
问题来了,transaction如何在系统中的节点间路由呢?首先,CHI协议规定,系统中的每个节点必须有一个节点号(Node ID)。系统中的每个RN和HN内部要有一个系统地址映射(System Address Map,以后简称SAM),负责把地址转换成目标节点的ID。也就是说,RN的SAM负责把物理地址转换成HN的ID;而HN的SAM需要把物理地址转换成SN的ID。看下图的一个简单例子:
-
RN0根据内部的SAM知道要把请求发给HN0(TgtID是HN0,SrcID是RN0);
-
HN0在通过内部的SAM知道要继续发给SN0(ReturnNID是RN0);
-
SN0接收请求,返回数据(HomeNID是HN0,TgtID从HN0的ReturnNID而来);
-
RN0接收到SN0的数据响应,返回CompAck给HN以结束此次transaction(TgtID是HN0,从HomeNID而来)。
如果考虑到remap和retry,会复杂一点,感兴趣的去看spec的3.4章节(我只分析简单的情况,哈哈)。
SAM必须可以对系统的全部地址空间进行解码。CHI协议建议,对于没有相应物理组件的地址访问,都发送给一个agent,该agent可以对这些无用地址的访问提供恰当的error响应。SAM的结构和格式是由具体实现决定的,在CHI协议中并没有规定SAM实现方式。每一个连接到ICN端口的组件都会被分配一个node ID,用于标识ICN上packets路由的源节点和目的节点。一个端口可以有多个node ID,但是一个node ID只能分配给一个端口,通俗点讲就是这个ID必须是唯一的,路由的时候不能有歧义。CHI协议支持的NodeID字段宽度在7~11bits之间,由具体实现决定,且一个系统中所有组件的NodeID字段宽度必须一样,至于每个组件的NodeID值也是由具体实现决定的。
解决了节点间路由的问题,那么节点间是怎么传输的呢?我们知道在AXI和ACE协议中,处理器和ICN,或者ICN与从设备之间的数据传输是通过通道(channel)完成的,同样在CHI中也有通道的概念。
CHI的通道,有收/发两个方向,在发送方向上,有三个通道分别是REQ,WDAT和SRSP;在接收方向上也是三个通道,分别是CRSP,RDAT和SNP。对于SN来说,因为不需要支持snoop操作,所以减少了SRSP和SNP。
-
REQ通道上:read/write command,cache maintenance,DVM request
-
SNP通道上:snoop command,DVM operation
-
DAT通道上:read/write data,snoop response,read response
-
RSP通道上:write/maintenance/completion response,dataless snoop response …
现在,transaction通信的基本问题已经解决,下周我们再来看其它的问题吧。