本章介绍了链路层,链路层为节点之间的基于数据包的通信和跨链路的互连提供了一种简化的机制。它包含以下几部分:
- Introduction
- Link
- Flit
- Channel
- Port
- Node interface definitions
- Increasing inter-port bandwidth
- Channel interface signals
- Flit packet definitions
- Protocol flit fields
- Link flit
1. Introduction
链路层定义了packet和flit格式,以及跨链路的流控。
下图示例了一种基于link的通信典型系统:
2. Link
Link通信是在transmitter和receiver之间的,在transmitter和receiver之间的连接称为link,一个节点和互连之间的双向通信需要一对链路,如下图所示:
outbound link :Transmitter发包的link,也就是我们所说的TX方向
inbound link :Receiver收包的link,也就是我们所说的RX方向
3. Flit
Flit是链接层中传输的基本单元,packets被转换成多个filts并通过link传输。有以下两种类型的flits:
Protocol flit:
Protocol flit的payload携带protocol packet。在CHI协议里,每个packet就是一个 flit。
Link flit:
Link flit携带的messages用于链路维护。例如在断链的过程中,transmitter使用link flit返回Link Layer Credit(L-Credit)给receiver。Link flits来源于transmitter,终结于链路另一边的receiver。
4. Channel
在本规范中,链路层提供了一组通道用于flit通信。每个通道有确定的flit格式,每个通道有很多field域,且有些field的位宽可以有多重可选值。在某些情况下,所定义的flit格式可以在入站通道和出站通道上同时使用。表13-1显示了通道,以及通道在RN和SN组件上的映射。
通道依赖关系
CHI协议的channel之间允许有以下依赖关系。
对于RN:
- RN的inbound SNP channel和outbound REQ channel不能存在依赖关系
- RN的outbound RSP channel允许(但不要求)等待inbound SNP channel;
- RN的inbound SNP channel允许(但不要求)等待outbound DAT channel;
- RN的inbound RSP通道不能和其它任何通道有依赖关系;
- RN的inbound DAT通道不能和其它任何通道有依赖关系;
注意:要求RN的inbound RSP和inbound DAT channel不能和其它通道有依赖关系,意味着对于所有还没有发送CompAck responses的outstanding transactions,RN必须有能力接收所有的Comp和CompData响应。
对于SN:
- SN的outbound RSP channel允许(但不要求)等待inbound REQ channel;
- SN的inbound REQ channel不能和outbound DAT channel有依赖关系;
- SN的inbound DAT channel不能和其它任何通道有依赖关系;
5.Port
Port是一个节点接口上所有的link的集合。下图是links、channels和port之间的关系:
(Port>link>channel > signal)
6.Node interface definitions
节点之间的通讯是通过使用node interface来交换link flits,本小节主要描述node interface,包含Request Nodes和Subordinate Nodes。每个节点中LINKACTIVE interface相关的信号和管脚将在14章《Link Handshake.》中描述。
6.1 Request Nodes(RN)
本节描述的RN接口包括:
- RN-F
- RN-D
- RN-I
RNF
RN-F接口使用全部的channel,用于完全一致性的requester,比如coer或cluster如下图所示:
RND
RN-D interface也使用了全部通道,用于处理DVM messages的IO 一致性节点,但是SNP通道只用于处理DVM 事务。如下图所示:
RNI
RN-I 接口使用除了SNP的其它通道,用于IO coherent RN,比如GPU或IO bridge。因为RN-I节点不需要包含硬件一致性cahce或TLB,所以无需SNP通道。如下图所示:
6.2 Subordinate Nodes(SN)
SN分为SN-F和SN-I。SN-I和SN-F的interface一样,包括:
- RX request channel *1
- TX response channel *1
- TX data channel *1
- RX data channel *1
SN从ICN上接收request messages,给ICN返回response messages。但是RN-I和RN-F接收不同的事务类型。下图展示了SNF/SNI的接口:
7. lncreasing inter-port bandwidth
一个节点接口上的可用带宽可以通过几种方式来增加。这里介绍以下两种允许的架构方法:
- Multiple interfaces(多接口)
- Replicated channels on a single interface(单接口,复制通道)
7.1 Multiple interfaces
为一个组件增加可用带宽的最简单的方法是有多个接口。可以复制(重复)一个完整的接口。
节点上接口重复的次数是实现者自定义的。
通过两个接口增加带宽的方法的主要特点是:
- 每个接口都有自己的:
——节点ID
——TxnID pool
——SACTIVE信号集
——LINKACTIVE信号集
——SYSCOREQ/SYSCOACK信号集
——可选广播控制引脚集
- 每个重复的接口必须视为独立接口:
——如果一个接口分配了cache line,则另一个复制接口无法释放该cache line。
——当响应请求时,完成者必须在与请求所使用的接口相同的接口上发送响应。
——必须将snoop发送到用于导致cache line分配的事务的相同接口。
——两个接口之间的事务不能有依赖关系。
- 即使只有一部分通道需要增加带宽,也必须复制所有通道。
Address striping
可选优化:RN通过指定address striping在多个接口之间进行选择。
一个Home节点通常可以基于一个snoop filter来过滤snoop。如果SF是精确的,那么它可以跟踪缓存cache line的请求者的节点ID,并向单个接口上的同一缓存行发送后续请求的snoop。如果SF不能精确跟踪,或者是追踪的系统组件的数量而不是请求节点接口的数量,将无法隔离需要发送snoop的单个接口,除非SF知道且使用RN相同的address striping算法。
当RN没有声明它正在使用的address striping算法时,SF要么需要做的更大,要么Home节点将不得不发送冗余的snoop。因此建议RN声明它正在使用的address striping算法。
通常使用hash函数。Hash是我们的老朋友了,就不举例了。
7.2 Replicated channels on a single interface
与通过更复杂的方法复制一个完整的接口不同,增加可用接口带宽的一种更有效的方法是有选择性地复制需要更大带宽的信道。
Features:
每个通道都可以被选择性地复制。对被复制的通道没有任何限制。通常,通道的复制是基于该通道上所需的预期带宽。例如,在图13-10中,TXREQ被复制为TXREQ0,TXREQ1,而RXSNP没有被复制,只有RXSNP0。复制的通道接口的特点是:
- 与单个DAT通道对应的所有复制的DAT子通道必须具有相同的位宽。
- 完整的接口必须使用:
——相同的NodeID
——单个TxnID池
- 事务中的message可以使用任何子通道:
——响应消息不需要使用与请求相同的子通道。例如,TXREQ0上的请求可以在RXRSP0或RXRSP1上给出响应。
——针对单个请求的多个响应消息可以在任何子通道上出现。例如,一个写入事务的DBIDResp可以在RXRSP0上接收,而相应的Comp可以在RXRSP1上接收。
- 与非复制通道一样,复制通道不提供任何通道内排序保证。
- 所有Link信用证都是在子通道的基础上完成的。
——不能使用TXREQ0的信用证来发送TXREQ1上的flit。
——接收方必须在所有子通道上提供信用证。
- 协议信用证是对合并后的TXREQ通道而言。
- 不支持单独关闭子通道的电源。
- DVM snoop的两个部分可以放在任何一个子通道上。即每个部分都可以在不同的子通道上。
- 两个已连接的接口上的子通道数必须匹配。
- 只能有一组 SACTIVE、LINKACTIVE和SYSCOREQ/SYSCOACK信号,以及可选的广播控制引脚。
- 当接口包含复制的DAT通道时,不允许将接口属性CCF_Wrap_Order设置为True。
8. Channel interface signals
主要包含以下内容:
- Request, REQ, channel
- Response, RSP, channel
- Snoop, SNP, channel
- Data, DAT, channel
8.1 Request, REQ, channel
图13-11 显示了REQ通道接口信号引脚,“R”:REQFLIT的位宽
下表是对上述信号的详细描述:(其他通道信号之相似,后文不再重复)
信号名 | 描述 |
REQFLITPEND | 比flit提前一拍置起,表示下个时钟周期可能会有flit传输 |
REQFLITV | Request flit valid |
REQFLIT | Request flit |
REQLCRDV | Request L-Credit valid ,接收者将此信号置起以返还一个请求通道的L-Credit给发送者。 |
8.2 Response, RSP, channel
下图显示了RSP通道接口管脚,T是RSPFLIT的位宽,发送和接收方向的RSP通道 接口信号是一样的。
下表是信号详细描述:
8.3 Snoop, SNP, channel
8.4 Data, DAT, channel
9. Flit packet definitions
9.1 Request flit
9.2 Response flit
9.3 Snoop flit
9.4 Data flit
10. Protocol flit fields
Protocol flit的opcode域值不为0,本节的所有域段都可应用于Protocol flit。下面将分别介绍Protocol field的各个域段。
简写 | 全称 | 描述 |
QoS | Quality of Service | 事务的服务质量,QoS值越大,优先级越高 |
TgtID | Target Identifier | 目标节点ID,message都有携带,是message要发送节点的组件NodeID,ICN可以根据这个将message正确发送到目的地 |
SrcID | Source Identifier, | 源节点ID,ICN可以根据这个确定哪个port发送的message |
HomeNID | Home Node Identifier | 原始请求的HomeId,Requester在收到CompData之后,用这个域值来决定CompAck的TgtID;用于CompData和DataSepResp,在其他data message中该域值必须为0; |
ReturnNID | Return Node Identifier | 用于决定SN发送的CompData, DataSepResp或者 Persist response的目标节点,该值可以是HN或原始Requester的NID;用于HN发往SN的ReadNoSnp, ReadNoSnpSep, CleanSharedPersistSep, WriteNoSnp, WriteNoSnpDef, Combined Write,Atomic requests. 其他不适用的请求该字段必须为0. |
FwdNID | Forward Node Identifier | 用于DCT传输中CompData响应要发给的Requester,该值必须等于原始请求的Requester的NID,只应用于Forward type snoops,在其它snoop requests中无用且必须为0; 注:在range-based TLBI DVM操作中,该字段为DVM payload |
LPID | Logical Processor Identifier | 在一个RN包含多个 processing agent时需要用其标识;在request中,和SrcID可以唯一标识一个logical processor; |
PGroupID | Persistence Group Identifier | 请求者使用此字段来处理不同的 CleanSharedPersistSep事务集,通过将它们分组并使用PGroupID标识每个事务集。 只用于 CleanSharedPersistSep、Write*CleanShPerSep requests和Persist、CompPersist Responses。 |
StashNID | Stash Node Identifier | 用于标识Stash request的目的地,在StashNIDValid有效时必须是有效值;只应用于Stash request中,在其它requests中无用且必须为0; |
StashNIDValid | Stash Node Identifier Valid | 在Stash命令中指示StashNID是否有效;在其它requests中无用 |
StashLPID | Stash Logical Processor Identifier | 用于Stash request和Stash type snoop request中,和StashNID一块确定唯一的Logical Processor;在其它requests中必须为0; |
StashLPIDValid | Stash Logical Processor Identifier Valid | 用于Stash request和Stash type snoop request中,指示StashLPID是否有效;在其它requests中无用 |
StashGroupID | Stash Group Identifier | 请求者使用此字段来处理不同的 StashOnceSep事务集,通过将它们分组并使用StashGroupID标识每个事务集。 |
TxnID | Transaction Identifier | Message的事务ID,如果同个源发起的outstanding transactions,需要使用不同的TxnID |
ReturnTxnID | Return Transaction Identifier | 用于下级节点返回CompData和DataSepResp响应的TxnID,它的值可以是HN产生TxnID,或者是原始requester产生的TxnID; |
FwdTxnID | Forwarding Transaction Identifier | 等于原始request的TxnID,用于snoop request中; |
DBID | Data Buffer Identifier | Completer返回的响应里携带,Requester用于CompAck或WriteData的TxnID |
Opcode | Channel opcodes | Opcode决定了每个message的操作,不同channel支持的Opcode不一样。 在表格后文详细展开。 |
Deep | Deep persistence | Requester用来表示在之前的写操作完成之前不能发送Persist response。 适用于CleanSharedPersist* request and Combined Write request with CleanSharedPersistSep |
Addr | Address | 支持44-52bits的地址 |
NS | Non-secure | 该字段与NSE结合,建立一个访问的PAS物理空间。 |
NSE | Non-secure extension | |
Size | Size of transaction data | 指定该笔transaction的data size大小 |
MemAttr | Memory Attribute | |
SnpAttr | Snoop Attribute | 0: non-snoopable 1:snoopable |
DoDWT | Do Direct Write Transfer | 直接写传输,数据从RN直接发到SN |
LikelyShared | Likely Shared, | 指示的requested data可能在其它RN中存在 |
Order | Ordering requirements | 指定保序要求
|
Excl | Exclusive | 独占访问 |
CAH | CopyAtHome | |
PBHA | Page-based Hardware Attribute | |
Endian | Endian | 0:小端模式 1:大端模式 |
AllowRetry | Allow Retry | 指示transaction是否可以被Retry; |
ExpCompAck | Expect Completion Acknowledge | 指示transaction是否包含CompAck响应; |
SnoopMe | SnoopMe | 指示HN是否需要给Requester发送snoop request,仅用于Atomic requests |
RetToSrc | Return to Source | 指示Snoopee是否需要返回一份cacheline data给HN;适用于除了DVMop外的所有snoop |
DataPull | Data Pull | 指示snoop response中是否包含Read request
|
DoNotGoToSD | Do not transition to SD state | 指示Snoopee的cache line能否允许是SD态; |
PCrdType | Protocol Credit Type | 指示grant或return的credit类型; |
TagOp | Tag Operation, | |
Tag | Tag | |
TU | Tag Update | |
TagGroupID | Tag Group Identifier, | |
TraceTag | Trace Tag | |
MPAM | Memory System Performance Resource Partitioning and Monitoring | |
RespErr | Response Error | 该域段用于指示Response的error status
|
Resp | Response status | |
FwdState | Forward State | |
CBusy | Completer Busy | |
CCID | Critical Chunk Identifier | 太晚了,一些字段后续再补充 |
Opcode:
REQ channel opcode:
Atomic opcode:
RSP channel opcode:
SNP channel opcode:
DAT channel opcode:
11. Link flit
LINK flit用于在断链过程中将L-Credits返回给接收方。LINK flit起源于链路发射器,终止于链路另一边的链路接收器。
Link flit通过opcode字段设为0来标识,TxnID字段也要求为0。其余的字段不被使用,并且可以取任何值。