1. UCIe D2D Adapter 基本介绍
UCIe D2D (Die-to-die) Adapter 位于 Procotol Layer 及 Physical Layer 之间,如图 1 所示。Adapter 往上通过 FDI (Flit-Aware D2D Interface) 接口连接 Protocol Layer,往下通过 RDI (Raw D2D Interface) 接口连接 Physical Layer。
▲图 1:UCIe D2D Adapter 在 UCIe 分层协议中的位置
在 UCIe 分层协议中,D2D Adapter 主要承担以下几项工作:
UCIe Die 间的参数协商。
链路状态管理。
确保数据可靠传输。相关机制有 CRC、Parity 及 Retry 等。
多协议栈的多路仲裁及选择。
以上几大工作中,D2D Adapter 必须实现链路状态管理及参数协商,根据使用场景及需求可以支持数据可靠传或多路仲裁选择。
2. UCIe D2D Adapter 主要作用
2.1 Die 间参数协商
UCIe Die 间参数协商主要发生在链路初始化及 Retrain 期间,接下来主要讲讲 Adapter 在链路初始化中的作用。
2.1.1 链路初始化中的 Adapter 初始化
在 UCIe Mainband 传输 Protocol 发来的 Flit 之前,必须对 UCIe 链路进行初始化。UCIe 链路初始化分为 4 个阶段,如图 2 所示,其中,链路初始化最后一个阶段(Stage3)便是 Adapter 初始化。
▲图 2:UCIe 链路初始化的 4 个阶段
RDI 状态机进入 Active 状态后,链路初始化进入 Stage3 的 Adapter 初始化。Adapter 初始化期间主要进行以下 3 项工作:
- 查询 Local UCIe 的能力(Capability)。比如支持哪些操作模式、是否支持多协议栈、是否开启 Retry、PCIe Port Type 及 Retimer 相关能力等等。注意:若 Local UCIe 的链路速度为 8GT/s 以上,应该使能 Retry 能力,并在接下来跟对端进行参数交换时请求对端也开启 Retry 能力。
- 跟对端 UCIe 进行参数交换。在查询完 Local UCIe 具备的能力后,通过 Sideband Message {AdvCap.*} 将自身能力告知对方,这一过程称为 Adapter 的参数交换。双方通过交换参数来获知对方信息并进行协商,协商一致后发送 {FinCap.*} 形成最终结论对链路最终工作状态进行配置。参数交换有个时间限制,从 RDI Active 开始,若 8ms 内没有完成参数交换也没有收到 {Adv/FinCap.*.Stall} 的 Message 来复位 Timer,则触发参数交换的 Timeout 机制。
- FDI Bring Up。FDI Bring Up 是指 UCIe Link 两侧的 UCIe 协议层之间经过一系列握手协商,使 FDI 状态机进入 Active 状态。FDI Bring Up 的过程如图 3 所示,这里不作展开,以后会详细讲(TODO)。对于有多组 FDI 接口的情况,每个 FDI 独立进行 Bring Up。
▲图 3:UCIe FDI Bring Up
2.2 链路状态管理
链路状态管理主要包括链路的 Power 状态等的管理 (Power Management, PM)。
UCIe 协议层采用 PCIe、CXL 协议时必须支持 L1、L2 低功耗状态。Adapter 通过与 Protocol Layer 及 Phisical Layer 进行握手,使 UCIe 链路进入低功耗状态。L1、L2 状态下,① 可以对 Global Clock 进行 Gating,② 也可以在系统层面发送 Idle Package。
FDI 支持 L1、L2 Power 状态,握手规则跟 CXl 256B Flit Mode 相同。RDI 也支持 L1、L2,但在 L1、L2 状态下,RDI 内部可以将这两个状态映射为常规非低功耗状态。不作展开,后边会单独开一节讲 UCIe PM (TODO)。
UCIe 采用 PCIe/CXL之外的其他 Streaming Protocol 时,对其 PM 能力未作要求。对于其他不支持 PM 的协议,在收到远端发来的 PM 请求后,可以回复 PMNAK 来拒绝 PM 请求。
2.3 数据可靠传输
2.3.1 插入信息
Protocol Layer 发给 Adapter 的 Flit 中,有些给 Adapter 预留的 Reserved 位,比如 Flit_Hdr、DLP、CRC。这些信息需要 Adapter 来进行填充。
Flit_Hdr:为了保证发出的 Flit 被正确传递到对端对应 Protocol Layer,在 Flit_Hdr 中携带有当前 Flit 的协议类型、协议栈 ID 等信息。对于支持 Retry 机制的 UCIe,Flit_Hdr 中还携带有 Sequence Number 及 Ack/Nak 等信息。
DLP:对于 Standard 256B Flit 而言,Flit_Hdr 占用了原来 DLP0/DLP1 的位置,若没有 Flit Marker,Adapter 还负责在 DLP Bytes (DLP2:5) 插入 DLLP 信息。
CRC:CRC 是循环冗余校验,在 D2D Adapter 中计算 CRC 并插入 Flit 适当位置,对端接收到 Flit 后能够通过解析 CRC 检测出最多 3 bit 随机错误。在接收端,若根据接收到的 Flit 计算出的 CRC跟 Flit 中标识的 CRC 不同,则 Invalid 当前 Flit 并请求重传。
当协议层发送 64 Byte Flit 数据,适配层一般会在有效数据 Flit 的前面加上 2 Byte Flit Header,后面加上 2 Byte CRC值,对于256B Flit一般需要额外增加 2 Byte CRC,每 128B Flit 对应 2 Byte CRC。
2.3.2 可靠传输
除了 CRC 机制,UCIe 还提供有 FEC、Parity、Retry、Flow Control 等机制来保证数据在链路上的可靠传输。
FEC:从 Spec 来看,D2D Adapter 在 Flit Mode 下没有涉及到 FEC,在 Raw Mode 下由 UCIe Protocol Layer 来插入 FEC。
Parity 机制:Parity 机制是一种在数据传输间隙检测物理链路健康状态的机制。若开启了 Parity 机制,在常规数据流之间周期性插入 Parity Bytes,对端解析 Parity Bytes 并判决链路是否出了问题。UCIe Parity 机制仅适用于 On-Package 的 UCIe 链路,对 UCIe Retimer 而言,Parity Bytes 并不占用其 Reciever Buffer Credit,Retimer Rx 也不能将 Rarity 数据写进其 Rx Buffer 中或传递给对端的 Retimer。
Retry 机制:UCIe Retry 机制是 PCIe 6.0 Flit Mode Retry 机制的简化版。速率为 8GT/s 及以上时,BER 性能相对较差,此时必须有 Retry 机制。Retry 一旦打开,即使中途掉速,仍然使需使用 Retry。想关闭 Retry,需要重新 Link Training。
Flow Control:流控时 Protocol Layer 通过 FDI 传输 Update_FC DLLP 来更新 Credit 信息,在 Adapter 中需要将其打包为 Optimized_Update_FC 的格式并加载到 Flit 中。在接收端,Adapter 从 Flit 中提取 DLLP 或 Optimized_Update_FC,然后驱动到 FDI 对应接口上。
2.4 多路复用及仲裁
UCIe 支持多个协议栈共享同一个 D2D Adapter,各协议栈通过独立的一组 FDI 接口连接到 Adapter 上。当多协议栈共享同一 Adapter 时,需要在 Adapter 中实现 Arb/Mux、Stack Mux,通过 Arb/Mux 或 Stack Mux 的选通与否,实现多协议栈对 Adapter 及 PHY 的分时复用。示意图如图 4 所示。
▲图 4:UCIe Protocol -> Adapter 配置
需要注意的是:
多个协议栈的带宽需求不能超过 UCIe PHY 的带宽能力。
若其中某个协议栈某段时间内没有 Protocol Flit 要发送,在选通该协议栈时需要插入 NOP Flit,防止出现 RDI 与 PHY 速率失配。
3. 参考
UCIe Spec r1.0, Chapter 3
深度解读Chiplet互连标准“UCIe”