3. CCIX协议层
3.9 错误处理
事务错误可以分为两类:
- 数据错误。用于当访问了正确的地址位置,但在数据中检测到无法纠正的(uncorrectable)错误。通常,这在ECC或奇偶校验检测到数据损坏时使用。
- 非数据错误。当检测到与数据损坏无关的错误时使用。
3.10 数据包头
3.10.1 数据包头
CCIX支持两种数据包头:
- PCIe兼容的数据包头,遵循PCIe协议规范
- 优化的数据包头,仅适用于CCIX协议规范
两种格式如下:
每个数据包可以包含多条消息。数据包中的每条消息都包含一个MsgLen字段,该字段指示该消息的长度。
NoMessagePack属性用于控制是否支持在一个数据包中打包多条消息。当NoMessagePack属性为True时,发送方只需为每个数据包发送一条消息。当NoMessagePack属性为False时,根据MaxPacketSize参数的限制,允许发送方在每个数据包中打包多条消息。
MaxPacketSize属性用于控制最大数据包大小。这决定了数据包有效负载中的最大字节数,因此也是数据包头中长度字段指示的最大值。MaxPacketSize的值可以是128B,256B,512B。
每个接收接口必须声明NoMessagePack和MaxPacketSize属性,以便软件在系统配置期间可以获取这些信息。
3.11 消息格式
3.11.1 读请求
读请求消息格式:
3.11.2 写请求
写请求消息格式:
3.11.3 无数据响应
无数据响应消息格式:
3.11.4 有数据响应
有数据响应消息格式:
3.11.5 监听
监听消息格式:
3.11.6 杂项消息
Credited杂项消息格式
信用交换消息格式:
NOP消息格式:
协议错误消息格式:
3.11.7 请求链(Request Chaining)
CCIX支持一种请求链机制。如果一个请求是发送到前一个请求的后续地址,允许为这个请求发送一条优化的消息。
3.11.8 监听链(Snoop Chaining)
同样的,CCIX也支持监听链机制。
3.11.9 扩展字段
CCIX允许消息包含使用一个或多个消息扩展的附加字段。
3.12 可选特性和参数
略
3.13 消息路由和代理ID分配
3.13.1 消息路由
对于一条消息,Address或TgtID值决定下一个要去的端口或链路。对于这种路由,地址路由消息使用系统地址映射(System Address Map,SAM),ID路由消息使用ID映射(ID Map,IDM)。监听响应使用的路由表标记为SR-IDM。SR-IDM可以与树拓扑或完全连接拓扑中的IDM相同,但在其他一些拓扑中,如具有维度序路由的网络,SR-IDM的编程方式必须与IDM不同。
对于地址路由消息,是这样的:
- 在原始RA中,RSAM表用于确定请求是发送到本地目标还是路由到端口
- 如果是发到端口,通过使用端口SAM(PSAM)确定所使用的链接
- 到达下一个芯片前,重复该过程,直到请求到达HA所在的芯片
系统中的每个芯片都包括一个64个条目的ID映射表,该表中的每个条目都提供了路由详细信息,以达到适当的代理ID。ID路由独立于代理类型,具有相同代理ID值的所有代理必须位于同一芯片上,并且对这些代理ID的请求响应和监听使用相同的路由。完全连接和树状拓扑中的监听响应也采用相同的路径。
IDM表仅确定正在使用的每个有效代理ID,也就是代理位于芯片本地或用于到达最终代理路由上的下一个芯片的端口/链路。对于远程代理,在到达下一个芯片时,该芯片的IDM表用于确定下一次跳跃(hop),直到最终到达最终目的地。
3.13.2 广播监听路由
对于Broadcast和Broadcast-1监听请求消息,广播转发控制向量(Broadcast Forward Control Vector)与IDM表结合使用,以确定消息应如何传播。
在Broadcast监听路径上的任何一点上,广播监听都可以分为多个监听。转发到另一个出口端口的拆分侦听必须是广播侦听。在Broadcast-1监听路径上的任何一点上,都可以分为多个监听。转发到出口端口的拆分侦听必须最多包括一个Broadcast-1侦听和任意数量的Broadcast Snoop。分割Broadcast或Broadcast-1侦听的点负责收集和合并与接收到的监听请求相对应的所有监听响应。
3.13.3 TxnID分配
将TxnID分配给内存和监听请求必须遵循以下规则:
- 对于内存请求,TxnID对于从单个源到单个点的所有超发请求必须是唯一的
- 对于Unicast,Broadcast,Broadcast-1,监听TxnID必须是唯一的
参与端口聚合的CCIX端口允许重新映射TxnID。下图显示了聚合端口示例,芯片1上的端口可以重新映射它们发送的请求的TxnID。芯片2上的代理必须保证其通过聚合端口接收到的芯片1的请求的TxnID是唯一。
3.13.4 代理ID
所有代理都使用6-bit的ID字段,分配给某一种代理的ID必须是唯一的,位于同一芯片上的不同类型的代理可以使用相同的ID值,同一ID不得分配给不同芯片上的不同代理类型。
3.13.5 目标ID确定
HA根据需要监听的RA的ID发出监听消息。可以根据监听过滤器(Snoop Filter)机制,或者目录(Directory)机制来确定需要监听的RA。
CCIX规范中的三种监听路由类型:
- Unicast:仅向TgtID字段中指定的代理发送监听。
- Broadcast:向所有请求代理发送监听。
- Broadcast-1:向除TgtID字段中指定的请求代理外的所有请求代理发送监听。
代理ID分配总结
下表总结了不同消息类型中SrcID和TgtID分配的规则。
3.14 内存扩展
CCIX规范支持内存扩展。例如一个场景,主代理在一个芯片上,其负责管理的物理内存在另外一个芯片上。这时,HA充当请求者,发出请求并接受响应;而SA充当HA的角色,接受请求并负责返回响应。
关于内存扩展的限制就不展开了。
3.15 端口聚合
CCIX允许在两个芯片之间使用多个并行CCIX链路进行通信。这种连接方式被称为端口聚合,用于单个端口的可用吞吐量不足以满足两个芯片之间通信需求的情况。CCIX支持的可聚合端口数量是2,4,8,16。
使用端口聚合时,以下规则适用于通过可用端口的事务路由:
- 请求消息和窥探消息根据地址解码进行路由
- 所有响应必须使用与相关请求相同的CCIX端口。
- 只有在确定使用同一CCIX链路的情况下,才允许在单个数据包中组合消息
端口聚合路由
总结:
CCIX的协议层首先定义了CCIX一致性协议,包括缓存行的状态,状态间的转移,及对应的各种请求和响应事务;并且,对数据包头和消息格式进行了定义,包括各字段及其含义;然后是对CCIX消息路由的规范,消息可以通过地址或者ID路由,两种路由方式分别有各自的限制;最后是内存扩展和端口聚合的说明。
通过这一层,CCIX规范对系统内存扩展,芯片间一致性和数据共享提供了基础框架。
【待续】
原文链接:老秦谈芯
作者:老秦谈芯
推荐阅读
更多IC设计技术干货请关注IC设计技术专栏。
迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。