4.1 CXL.io链路层
CXL.io链路层充当CXL.io事务层和Flex Bus物理层之间的中间层。其主要职责是提供可靠的机制,用于在链路上的两个组件之间交换事务层数据包(TLP)。PCIe数据链路层充当CXL.io的链路层。此外,CXL.io链路层实现了CXL.io数据包的帧/碎片整理。CXL.io仅针对8.0 GT/s和更高的数据速率使用编码。
4.2 CXL.mem和CXL.cache共用的链路层
4.2.1 介绍
CXL.mem和CXL.cache共用同一个链路层,下图中的黄色区域。
4.2.2 高层次CXL.cache/CXL.mem Flit概述
CXL.cache/CXL.mem的flit大小是固定的528-bit,其中包括16-bit的CRC和4个16-byte的数据槽(slot)。
插播一句,flit是flow control unit的缩写,flit是最小的流控单元,也是链路层的传输单元。具体我也不知道flit这个词是出于哪里,没有考证过。另外,有的文档中还会出现一个词是phit,physical layer transfer unit的缩写。
“Header“槽携带链路层特定信息的“头”信息,包括包含在头的其余部分以及flit中的其它数据槽中的协议级消息定义。
“Generic“数据槽中是一个或多个请求/响应消息或单个16B数据块。
下图是设备发给主机的协议flit格式。
Flit头定义:
Flit类型编码,0表示“protocol“,1表示”control“。
CXL.cache/CXL.mem信用返回编码:
挑几个字段来简单看看。
4.2.3 插槽格式定义
4.2.3.1 H2D和M2S格式
就是格式的定义,也没啥好解释的。
4.2.3.2 D2H和S2M格式
同上。
4.2.4 链路层寄存器
4.2.5 Flit打包规则
4.2.6 链路层控制Flit
链路层控制flit不遵循协议flit的流控规则。它可以从实体发出,而不需要信用。接收机必须在信道上传输flit的周期内处理这些flit。
控制flit的类型:
4.2.7 链路层初始化
在初始化期间和发送INIT flit之后,直到链路初始化完成,CXL.cache/CXL.mem链路层只能发送Control-Retry flit,不能发送其它类型的flit。
4.2.8 CXL.cache/CXL.mem链路层retry
当发生传输错误时,CXL.cache/CXL.mem链路层支持重新传输或链路层重试(Link Layer Retry,LLR)。与PCIe不同,CXL.cache/CXL.mem序列号不会在每个flit的设备之间进行通信,以优化链路效率。在LLR序列期间,序列号的交换仅通过链路层控制flit发生。在链路层初始化期间,序列号被设置为零,并且它们使用环绕计数器实现。达到重试缓冲区的深度后,计数器返回到零。
暂时略过。
4.2.9 毒药(Poison)和病毒(Viral)
4.2.9.1 病毒
病毒(viral)是章节12.4“CXL病毒处理”中的一个功能。当一个CPU socket处于“中毒”时,它需要通知其它的socket。CXL.cache/CXL.mem链接层负责传递病毒状态信息。一旦本地检测到病毒状态,链路层就会在下一个传出flit上强制加上一个CRC错误。如果没有要发送的通信消息,发射机将发送带有CRC错误的LLCRD flit。然后,它将病毒状态信息嵌入到它生成的Retry.Ack消息中。这种方法有两个主要好处。首先,通过使用RETRY.Ack来传达病毒状态,我们不必在协议flit中为此分配任何位。其次,它允许立即指示病毒,并降低病毒分布路径和数据路径之间的竞争条件的风险。
协议在这里讲的不多,不是很清楚。等到第12章的RAS,再来看看CXL如何处理“中毒”情况。
插播一句,RAS是Reliability(可靠性),Availability(可用性)和Serviceability(可服务性)三个词的缩写。可靠性描述系统是否能够正确工作,需要系统能够持续运转,从来不停机;可使用性描述系统对重要资源都有备份,能够检测到潜在要发生的问题,并且能够转移其上正在运行的任务到其它资源,以减少停机时间;可服务性描述系统的容错性,即出现错误之后恢复的难易程度,要求系统支持实时在线诊断,精确定位出根本问题所在,做到准确无误的快速修复。不同的系统应用对于RAS的要求不同,如计算机服务器和汽车电子等对RAS的要求就非常高,需要在做设计时提供更多的保护机制。
本章总结:这一章的主要内容就是各种链路层格式的定义。内容实在太繁琐,如果不是从事CXL设计的话,我觉得没必要记住这些细节,大概了解一下就好了。
原作者:老秦谈芯
|