【CXL协议-链路层(4)】

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信用返回编码:
在这里插入图片描述

最后,时隙格式类型字段对头部时隙和微片中其他通用时隙的时隙格式进行编码(如果微片类型位指定微片是协议微片)。 随后的部分详细介绍了每种时隙格式的协议消息内容,但下表提供了时隙格式字段编码的快速参考。
注意:H6 格式被定义为与完整性和数据加密一起使用。 请参阅第 11.1 节中的详细使用要求。
在这里插入图片描述

下表描述了两个方向的时隙格式以及每种格式所包含的消息类型。
在这里插入图片描述

4.2.3 插槽格式定义
4.2.3.1 H2D和M2S格式
本节中的槽图包含位字段名称的缩写,以允许它们适合图表。 在图表中,大多数缩写都是显而易见的,但是下面的缩写列表确保清晰。
• SL3 = 插槽3[2]
• LI3 = LD-ID[3]
• U11 = UQID[11]
• O4 = 操作码[4]
• Val = 有效
• RV = 保留
• RSVD = 保留
• Poi = 毒药
• 标签15 = 标签[15]
• MV0 = 元值[0]
• MV1 = 元值[1]
• R11 = RspData[11]
在这里插入图片描述

4.2.3.2 D2H和S2M格式
CXL 2.0 之前的时隙定义确保消息的所有标头位都位于连续位中。 在 CXL 2.0 中,S2M NDR 消息扩展了两位以适合 2 位 DevLoad 字段。 现在,一些携带 NDR 消息的时隙格式在时隙内包含非连续位。 受影响的格式包括 H4、G4 和 G5 以及非连续位
表示为“DevLoad*”(“*”是具有单独颜色/图案的特殊指示符,用于具有非连续位的 NDR 消息)。 通过以这种方式扩展时隙,可以保持与 CXL1.1 时隙定义的向后兼容,确保仅使用 RSVD 时隙位来扩展标头。 携带单个 NDR 的其他插槽格式
消息可以扩展并保留连续的报头位,因为 NDR 消息是时隙格式中的最后一个消息(参见格式 H0 和 H3)。
在这里插入图片描述

4.2.4 链路层寄存器
在第八章中定义。
4.2.5 Flit打包规则
包装规则定义如下。 假设给定队列有积分
对于 RX 和任何协议依赖性(例如 SNP-GO 排序)都有
已经考虑过:
• 翻转定义为数据传输需要多次传输的任何时间。 请注意,一个
包含128b(格式G0)的数据块,只能调度在Slots 1、2、
和 3 个协议 flit,因为插槽 0 只有 96b 可用,因为 32b 被占用
片头。 以下规则适用于翻转数据块。
— 如果有超过 3 个 16B 数据块的翻转,则下一个 flit 必须
必然是所有数据传输。
— 如果有 3 个 16B 数据块的翻转,则时隙 1、时隙 2 和时隙 3 必须
必须包含 3 个翻转数据块。 插槽 0 将被打包
独立(允许Slot 0具有用于下一次数据传输的数据头)。
— 如果有 2 个 16B 数据块翻转,则插槽 1 和插槽 2 必须包含 2 个翻转数据块。 Slot 0 和 Slot 3 将独立打包。
— 如果有 1 16B 数据块的翻转,则插槽 1 必须包含翻转数据块。 Slot 0、Slot 2 和 Slot 3 将独立打包。
— 如果没有翻转,4 个插槽中的每个插槽将独立打包。
• 必须注意确保CXL.mem 和CXL.cache 事务打包之间的公平性。 同样,必须注意确保给定协议内通道之间的公平性。 确保公平的确切机制是特定于实现的。

• 给定槽内的有效消息需要紧密包装。 这意味着,如果一个时隙包含给定消息的多个可能位置,则 Tx 必须将消息打包在第一个可用位置,然后再前进到下一个可用位置。
• 给定flit 内的有效消息需要紧密打包。 这意味着,如果 flit 包含给定消息的多个可能时隙,则 Tx 必须在前进到下一个可用时隙之前将消息打包在第一个可用时隙中。
• 空槽被定义为没有任何有效位设置的槽,只要遵循其他打包规则,它们可以以任何顺序与其他槽混合。 例如,请参阅图 48,其中时隙 H3 可能没有指示空时隙的有效位集,但第一个和第二个通用时隙(示例中的 G1 和 G2)可能具有混合的有效位集。
• 如果有效的数据头被打包在给定的槽中,则下一个可用于数据传输的槽(槽1、槽2、槽3 或全数据片)将保证具有与头相关联的数据。 Rx 将使用此属性来维护 Tx 翻转计数的卷影副本。 这使得 Rx 能够预期不存在 flit 标头的所有数据 flits。
• 对于数据传输,Tx 必须按缓存行顺序发送16B 数据块。 即,32B 传输的块顺序 01 和 64B 传输的块顺序 0123。
• 具有多个数据头的时隙(例如,S2M 方向的 H5,或 H2D 方向的 G3)称为多数据头时隙或 MDH 时隙。 仅当两个 32B 块均可立即打包时,才能发送 MDH 插槽以进行完整的高速缓存行传输。 即,BE = 0,Sz = 1。仅当两个代理都支持 MDH(第 8.2.5.11.7 节中定义的 defeature)时,才能使用 MDH 时隙。 如果在禁用时收到 MDH,则认为是致命错误。
• 仅当有超过 1 个有效数据时,Tx 才必须选择 MDH 时隙格式
要打包在该插槽中的标头。
• 控制流片不能与全数据流片交错。 这也意味着,当预计在协议传输之后会出现全数据传输(由于翻转)时,Tx 无法在全数据传输之前发送控制传输。
• 对于包含flit 的非MDH,该flit 中最多可以有1 个有效数据头。
此外,包含 flit 的 MDH 不能与同一 flit 中的另一个有效数据头一起打包。
• 给定 flit 中可以发送的最大消息数受到限制,以降低将这些消息写入信用队列的接收方的复杂性。 通过限制整个 flit 上的消息数量,可以限制写入接收方队列的端口数量。 最大消息数
flit(所有槽位的总和)为:
D2H 请求 --> 4
D2H 响应 --> 2
D2H 数据头 --> 4
D2H 数据 --> 416B
S2M NDR --> 2
S2M DRS 标头 --> 3
S2M DRS数据 --> 4
16B
H2D 请求 --> 2
H2D 响应 --> 4
H2D 数据头 --> 4
H2D数据 --> 416B
M2S 要求 --> 2
M2S RwD 标头 --> 1
M2S RwD 数据 --> 4
16B

对于给定的时隙,较低位位置被定义为从较低阶字节#开始出现的位位置。 也就是说,位的顺序是从(字节 0,位 0)开始到(字节 15,位 7)。
• 对于多位消息字段(如地址[MSB:LSB]),较低有效位将出现在较低位位置。
• flit 内的消息排序基于 flit 位编号,即最早的消息放置在最低 flit 位位置,随后的消息放置在逐渐较高的位位置。 示例:打包在时隙 0 中的 M2S Req 0 在打包在时隙 1 中的 M2S Req 1 之前。类似地,打包在时隙 1 中的 Snoop 跟随在打包在时隙 0 中的 GO,并且必须保持此顺序。
最后,对于标头时隙格式 H1,从字节 7 开始打包的 H2D 响应先于从字节 11 开始打包的 H2D 响应。
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中为此分配任何位。其次,它允许立即指示病毒,并降低病毒分布路径和数据路径之间的竞争条件的风险。

  • 22
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天Aileft

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值