棋子 · 6 天前

UCIE 中的 Adapter 是什么?

UCIE 协议主要包括 protocol 层,Adapter 层和 PHY 层。Protocol 层复用 CXL,PCIE 或自定义的 stream 流格式。

Adapter 层主要负责:

  1. 数据的可靠传输。实现 retry,CRC 校验,奇偶校验等功能。
  2. 多路传输仲裁和复用。D2D adapter 支持多路数据共用物理层传输,Adapter 层实现对数据源的仲裁和选择。
  3. 物理层链路状态管理。
  4. 传输协议和参数协商。

protocol 和 Adapter 之间基于 flit 的 FDI 接口,即 flit aware D2D interface。Adapter 和 PHY 之间基于 RDI 接口,Raw D2D interface。功能示意如下:

image.png

协议栈复用

D2D 支持多个 protocol 复用同一个 Adapter 进行传输,由参数 Multi_Protocaol_Enable 和 Enhanced Multi_Protocol_Enable 决定。

D2D 支持同一个 protocol 的多路数据流传输,Adapter 需要支持对数据流的 Arb 和 Mux。

Image

同时 D2D 支持多个 protocol 的复用传输,Adapter 需要支持对 protocol 间的 Stack Mux。

Image

Multi_Protocol_Enable 和 Enhanced Multi_Protocol_Enable 的特性如下:

  1. Multi_Protocol_Enable
  • 支持两个协议栈在同一物理链路上复用,每个协议栈各占用一半带宽。
  • 两个协议栈必须是同一协议且具有相同的协议能力。
  • Adapter 必须保证不会连续发送来自同一协议栈的 flit。
  • Adapter 可以插入 NOP flit 以保证不发送连续 flit,这些 flit 不会转发到接收方的协议层。
  • 接收协议层必须能够以最大链路速度接收相同 flit 的连续块,但不会接收连续的 flit。
  • 两个协议栈必须使用相同的协议和 flit 格式。
  • 每个协议栈有栈标识符,用于在接收方对 flit 进行解复用。
  1. Enhanced Multi_Protocol_Enable:
  • 支持相同或不同协议的两个栈在同一物理链路上动态复用。
  • 协议栈和 Adapter 必须支持共同的 flit 格式以启用此功能。
  • Adapter 必须确定每个协议层的接收器可以接受的最大带宽百分比。
  • Adapter 需要支持 100%带宽(不限速)和限速至最大带宽的 50%。
  • 如果 Adapter 指定一个协议栈最大带宽的 50%,则对端 device 必须保证不会连续发送相同栈的 flit。
  • Adapter 插入 NOP flit 以避免超过协商的最大带宽。
  • 接收协议层必须能够在协商的最大带宽百分比下接收 flit,并且能够在最大协商链路速度下接收相同 flit 的连续块。
  • Adapter 允许每个协议层独立使用 100%的链路带宽。
  • 仲裁是按 flit 进行的,如果两个协议层都被允许使用 100%带宽,Adapter 需要支持轮询仲裁。
  • 允许使用特定的仲裁方案,前提是按 flit 进行,且不违反协商的最大带宽百分比。
  • flit 头包含栈标识符以识别目标栈。
  • 栈复用器为每个协议栈维护独立的链路状态机,链路状态转换相关的边带消息中包含特定的 opcode,以识别对于的协议栈。

总的来说,无论哪种复用,均需要多个数据源或协议栈具有相同的 flit 格式,Adapter 可利用 NOP flit 进行各协议栈的带宽调整。

Link 初始化

D2D 的初始化氛围四个步骤:

Stage0: 每个 Die 单独的初始化,如时钟,复位初始化等。该步骤两个 Die 独立进行,互不影响,结束时间也不同。

Stage1:Sideband 初始化。

Stage2:Mainband training 和 repair。training 参数的协商依赖 Stage1 中 Sideband 正常工作。

Stage3:协议栈参数,Flit 格式协商。

Stage1 和 Stage2 后续介绍,先介绍 Stage3 的参数协商内容。

Adapter 初始化

在 link 的 Stage0~2 结束后,RDI 正常 work,Adapter 需要一系列 sequence 来确定 local capabilities 以及和对端的参数协商。主要包含三部分:

  1. 确定 local Capabilities
  2. remote link 参数协商
  3. FDI bring up

local Capabilities

此部分需要确定如下几点:

  1. PHY traning 结果确定。
  2. 是否支持 retry 机制,Adapter 需要判断在给定的链路速度和配置下是支持 retry。
  3. retry 协商,如果 Adapter 支持 retry,必须在参数交换过程中通知 remote link partner。
  4. Retimer Receiver buffer 的 credit 大小,每个 credit 对应 256 字节的 mainband 数据。

Parameter Exchange

Adapter 和 remote partner 协商参数,均使用 sideband 的{AdvCap.Adapter}消息。在初始化需要协商的 AdvCap.Adapter 参数主要如下:

  1. Raw Format。UCIe link 控制寄存器中的位域,用于指示是否支持 Raw Format 格式传输。
  2. 68B Flit Mode。协议控制参数,用于指示是否支持 CXL 68B Flit Mode,或者 PCIe Non-Flit Mode.
  3. CXL 256B Flit Mode。协议控制参数,用于指示是否支持 CXL 256B Flit Mode。
  4. PCIe Flit Mode。协议控制参数,用于指示协议层是否支持 PCIe Flit Mode。
  5. Streaming。协议控制参数,指示是否支持 Streaming Raw Format,Streaming Flit Format。与 CXL 和 PCIe protocol 互斥。
  6. Retry。指示 Adapter 是否支持 retry 机制。
  7. Multi_Protocol_Enable。Adapter 连接多个 FDI 的协议层时,需要使能该 bit,同时 Stack0_Enable 和 Stack1_Enable 需要使能。
  8. CXL_LatOpt_Fmt5,CXL_LatOpt_Fmt5。是否支持 Format5/6 的传输格式。仅在 CXL 协议和 CXL 256B Flit 模式下可以使用。
  9. Retimer。在 Retimer 和同一个 package 内的 Adapter 进行参数协商时,需要使能该 bit。
  10. Retimer_Credits。仅在 Retimer 参数使能时开启,9bit 位宽,用于指示 retimer 的 receiver buffer 的大小,每个 credit 表示一个 256B 数据大小。
  11. DP/UP。上游或下游端口标记,用于通知 retimer 当前 link 的端口类型,目前适用于 PCIe 和 CXL 协议层。
  12. 68B Flit Format。使能 68B Flit Format。
  13. Enhanced Multi_Protocol_Enable
  14. Standard 256B End Header Flit Format
  15. Standard 256B Start Header Flit Format
  16. Latency-Optimized 256B without Optional Bytes Flit Format
  17. Latency-Optimized 256B with Optional Bytes Flit Format
  18. Stack 0 Maximum Bandwidth_Limit。使能 Enhanced Multi_Protocol_Enable 时,stack0 的最大利用带宽。
  19. Stack 1 Maximum Bandwidth_Limit。使能 Enhanced Multi_Protocol_Enable 时,stack1 的最大利用带宽。

PCIE/CXL 协议参数协商

Adapter 的 local Capabilities 确定后,需要通过边带消息与 remote link partner 协商和确定协议参数。

  1. Capabilities inform:DP Adapter 发送{AdvCap.Adapter}边带消息,向 UP Adapter 通知其支持的 Capabilities。
  2. PCIe/CXL protocol Support:如果 UP Adapter 要支持 PCIe 或 CXL 协议,则需要先等待 DP Adapter 的第一个{AdvCap.Adapter}消息,确定 DP Adapter 的 Capabilities,然后向 DP Adapter 发送自己的{AdvCap.Adapter}边带消息。UP 可以根据 DP 的 Capabilities 更改其 Capabilities。
  3. configuration response:一旦 DP 收到 UP 的 Capabilities 消息,DP 使用{FinCap.Adapter}边带消息响应 UP 的配置,如图 3-4 所示。
  4. 协议参数确定:
  • 如果两个 Adapter 都使能了“68B Flit Mode”,则在{FinCap.Adapter}消息中设置为 1b。
  • 如果两个 Adapter 都使能了“CXL 256B Flit Mode”,则在{FinCap.Adapter}消息中设置为 1b。
  • 如果两个 Adapter 都使能了“PCIe Flit Mode”,则在{FinCap.Adapter}消息中将“PCIe Flit Mode”位设置为 1b。
  • 如果协商了 Stream 流传输协议,则不交换该栈的{FinCap.Adapter}消息,即 DP 不再向 UP 发送{FinCap.Adapter}边带消息。

Image

68B/256B Flit Mode 参数协商

如果{FinCap.Adapter}消息中设置了“68B Flit Mode”或“CXL 256B Flit Mode”,则需要使用{AdvCap.CXL}和{FinCap.CXL}消息进行新一轮参数协商,如图所示。

其他参数的最终确定(如果协商了 PCIe 或 CXL 协议):

  • 如果两个 Adapter 都使能了“Raw Format”,则在{FinCap.Adapter}消息中设置为 1b。
  • 如果两个 Adapter 都使能了“Retry”且未协商“Raw Format”,则启用 Adapter Retry,并将“Retry”设置为{FinCap.Adapter}消息中的 1b。
  • 如果两个 Adapter 都使能了“Enhanced Multi_Protocol_Enable”,则在适配器中启用 Stack0 和 Stack1,并将所有三个参数(“Enhanced Multi_Protocol_Enable”,“Stack0_Enable”和“Stack1_Enable”)设置为{FinCap.Adapter}消息中的 1b(如果需要发送{FinCap.Adapter}消息)。
  • 如果两个 Adapter 都使能了“Multi_Protocol_Enable”且未协商“Enhanced Multi_Protocol_Enable”,则在适配器中启用 Stack0 和 Stack1,并将所有三个参数(“Multi_Protocol_Enable”,“Stack0_Enable”和“Stack1_Enable”)设置为{FinCap.Adapter}消息中的 1b。
  • 如果未协商“Enhanced Multi_Protocol_Enable”或“Multi_Protocol_Enable”,则使用 e lowest common denominator 来确定启用 Stack0 还是 Stack1,相应位在{FinCap.Adapter}消息中设置为 1b。如果都通告了栈启用,则选择 Stack0 作为操作模式,并将 Stack0_Enable 设置为{FinCap.Adapter}消息中的 1b。
  • 如果两个 Adapter 都使能了 CXL_LatOpt_Fmt5,则在{FinCap.Adapter}消息中设置为 1b。
  • 如果两个 Adapter 都使能了 CXL_LatOpt_Fmt6,则在{FinCap.Adapter}消息中设置为 1b。

Image

多协议栈参数协商

如果协商了 Stream protocol 传输,则不区分 DP(下游端口)和 UP(上游端口),每一方独立地发送自己的 Capabilities 消息。同时允许交换厂商定义的边带消息,以实现相应厂商的特定扩展。

最终配置的 Capabilities 由 link 双方共同确定。对于 Stream protocol 传输,不发送{FinCap.*}消息。适配器必须以特定实现的方式确定厂商特定的要求。图 3-6 至图 3-11 展示了栈 0 和栈 1 具有不同协议的不同场景示例。

Image

Image

Image

Image

Image

Image

在参数协商中,需要超时机制来保证参数交换的过程正常进行:

  1. 超时时间:Adapter 必须实现参数交换的 8 毫秒(-0%/+50%)的超时时间机制。
  2. 超时测量:参数交换完成的超时测量包括链路初始化第三阶段的第一部分和第二部分的所有步骤,即 local Capabilities 和 remote Capabilities 协商。
  3. 超时计时器:计时器只在 RDI 处于 active 状态时工作。
  4. 重置计时器:如果适配器收到来自 remote link partner 的{AdvCap._.Stall}、{FinCap._.Stall}、{MultiProtAdvCap._.Stall}或{MultiProtFinCap._.Stall}消息,计时器必须重置。
  5. 超时处理:参数交换或链路状态机转换的 8 毫秒超时被视为不可用错误(UUE),Adapter 必须将 RDI 置于 LinkError 状态。
  6. UCIe 重定时器:UCIe 重定时器必须确保在与其包内的 UCIe die 响应/启动参数交换之前,与 remote 重定时器 partner 解决能力通告问题(并与自己的能力合并)。
  7. 解决过程中的通信:在解决过程中,重定时器必须每隔 4 毫秒发送相应的暂停消息,以确保在其包内的 UCIe die 上不会产生超时。

FDI bring up

参数交换完成后,Adapter 将结果反映到 FDI 上的协议层,并按照后续定义的流程执行 FDI 启动。一旦 FDI 处于 Active 状态,它就完成了链路初始化的第三阶段,并且可以开始协议 flit 传输。

当同一 Adapter 上启用了多个栈时,每个栈可能在不同时间完成 FDI 启动流程。FDI 的数据宽度取决于 UCIe 栈的操作频率以及通过 UCIe 物理链路传输的总带宽。RDI 的数据宽度固定为至少每个物理通道每个模块一个字节,该模块由适配器控制。

State Machine Hierarchy

UCIe 采用分层方法管理链路状态,可以在不同层之间实现功能划分,并在 FDI 和 RDI 上使用相同的状态转换序列。

对于 CXL,ARB/MUX 的 vLSM(虚拟低层状态机)体现在 FDI 的 pl_state_sts。Adapter LSM 用于协调与 remote link partner 的链路状态,适用于所有配置。每个协议栈都有其对应的适配器状态机。对于 PCIe 或 Stream protocol 传输,Adapter LSM 体现在 FDI 的 pl_state_sts。

RDI 状态机表征物理层的状态。Adapter 的数据路径和 RDI 数据宽度可以扩展到多模块配置,但仅有一个 RDI 状态机。多模块的 PHY 在 RDI 状态和各个模块之间进行同步。

vLSM 状态转换使用 mainband 数据路径上的 ALMPs(链路管理协议)与 remote link partner 同步。状态转换规则遵循 CXL 规范中的 CXL 256B Flit Mode 规则。

Adapter LSM 状态转换使用{LinkMgmt.Adapter*}sideband 消息与 remote link partner 同步,这些消息由 D2D 适配器发起和接收。

RDI SM 状态转换使用{LinkMgmt.RDI*}sideband 消息与 remote link partner 同步,这些消息由物理层发起和接收。

Image

分层的状态管理包含如下几个主要信息:

  1. Active State 转换:RDI 状态机(RDI SM)必须先进入活 Active 状态,之后 Adapter 状态机(Adapter LSM)才能开始协商过渡到 Active 状态。Adapter LSM 必须处于活跃状态,虚拟低层状态机(vLSMs)才能开始协商过渡到 Active 状态。即 Active 状态是自下而上逐层转换。
  2. Retrain State 转换:RDI SM 必须先进入重新训练(Retrain)状态,然后才能将重新训练状态传播到 Adapter LSMs。如果 RDI SM 处于 Retrain 状态,必须将 Retrain 状态传播到所有处于 Active 状态的 Adapter LSMs。在所有相关的 Adapter LSMs 都已过渡到 Retrain 状态之前,Adapter 不得请求 RDI 退出 Retrain 状态。Retrain 状态是自下而上逐层转换。
  3. 电源管理状态转换:对于 CXL 协议,CXL.io 和 CXL.cachemem vLSMs 必须在相应的 Adapter LSM 过渡到电源管理(PM)状态之前先过渡到 PM 状态。如果同一个 Adapter 上启用了多个栈,则所有 Adapter LSMs 在 RDI SM 过渡到 PM 状态之前必须处于 PM 状态。PM 状态则是自上而下逐层转换。
  4. 链路错误状态转换:RDI SM 必须先进入链路错误(LinkError)状态,之后 Adapter LSM 才能过渡到 LinkError 状态。RDI SMs 使用边带消息与 remote link partner 协商 LinkError 状态转换,并将 LinkError 状态传播到所有已启用的 Adapter LSMs。如果使用 CXL 协议,Adapter LSM 在将 LinkError 状态传播到两个 vLSMs 之前必须处于 LinkError 状态。LinkError 状态转换优先于 LinkReset 或 Disabled 状态转换。在所有相关的 Adapter LSMs 和 CXL vLSMs 都已过渡到 LinkError 状态之前,Adapter 不得请求 RDI 退出 LinkError 状态。LinkError 状态是自下而上逐层转换。
  5. 链路重置或禁用状态转换:Adapter LSM 使用边带消息与其 remote link partner 协商 LinkReset 或 Disabled 状态转换。只有当所有相关的 Adapter LSMs 都已过渡到 LinkReset 或 Disabled 状态时,LinkReset 或 Disabled 才会传播到 RDI SM。Disabled 状态转换优先于 LinkReset 状态转换。如果 RDI SM 转换到 LinkReset 或 Disabled 状态,它必须将此状态传播到所有 Adapter LSMs。如果 Adapter LSM 转换到 LinkReset 或 Disabled 状态,它必须将其传播到 CXL 协议的两个 vLSMs。该过程种的状态则是自上而下逐层转换。
  6. UCIe Retimer:对于 UCIe Retimer,Retimer 芯片需要与 remote Retimer partner 协商状态转换,并确保不同的 UCIe 芯片保持同步,避免在等待响应时发生超时。例如,如果 UCIe 芯片 0 向 UCIe Retimer0 发送 Active 请求消息,UCIe Retimer0 必须与 UCIe Retimer1 确认 Active 请求消息已转发给 UCIe 芯片 1,并且 UCIe 芯片 1 已用 Active 状态消息响应,然后才能用 Active 状态消息响应 UCIe 芯片 0。在 UCIe 芯片 0 和 UCIe 芯片 1 的所有相关状态都达到低功耗状态之前,不能使封装外互连进入低功耗状态。UCIe Retimer 在完成与远程 Retimer 伙伴的协商时,必须每 4ms 响应一次“暂停”编码。

Power Management Link States

PCIe 和 CXL 协议必须支持电源管理状态。FDI 支持 L1 和 L2 电源状态,遵循 CXL 256B Flit Mode 的握手规则和状态转换。RDI 支持在接口上实现 L1 和 L2,以便物理层执行电源管理优化,但物理层可以将 L1 和 L2 映射到内部的共同状态。

电源管理状态允许全局时钟门控,并启用系统级流程,如封装级空闲(C-states)。其他协议可以通过发送 PMNAK 来禁用 PM 流程。

进入电源管理状态:

  • 协议层 PM 进入请求:FDI 定义了一个基于链路空闲时间的 PM 进入请求的通用流程。所有使用 UCIe 的协议在需要支持 PM 时必须遵循该流程。
  • Adapter 链路状态机 PM 进入:通过边带与 remote link partner 协调 PM 转换。Adapter 在两个协议栈之间复用时,每个栈的链路状态机必须独立转换到 PM。
  • RDI 上的 PM 进入:一旦 Adapter 的所有 LSM 处于 PM 状态,Adapter 可以在 RDI 上启动 PM。

Image

退出电源管理:

  • 协议层的活动请求通过 FDI 和 RDI 传输到本地物理层。
  • 物理层使用边带协调唤醒和物理链路的重新训练。
  • 物理链路重新训练后,RDI 在双方处于 Active 状态,并从双方触发 Adapter LSM PM 退出。
  • 对于 PCIe 或 Stream 传输协议场景,这也将协议层转换为 FDI 上的活跃状态。
  • 对于 CXL 协议,此步骤后是 ALMP 交换,将所需协议带入活跃状态,然后可以开始协议 Flit 传输。

Retry Rules

原始比特错误率(BER)高于 1e-27,除非操作格式为 Raw Format,否则 Adapter 必须支持 Retry。如果 Adapter 不支持 Retry,物理层在链路训练期间 BER 不得高于 1e-27。

在链路初始化的阶段协商了 Retry,即使在运行时链路速度降低,也不能禁用 Retry。Retry 只能在下一次链路初始化时重新协商(即,RDI 移动到 Reset 状态)。

对于多个协议栈的 Adapter,Tx Retry 缓冲区在栈之间共享。

UCIe 中的 Retry 方案是 PCIe 基础规范中定义的 Flit 模式 Retry 机制的简化版本。其中一些规则不适用,并进行了相应的参数变更:

  • 选择性 Nak 及其相关规则不适用,且不得实现。
  • 在链路操作期间,除非与 PCIe Retry 规则冲突,显式序列号 flit 和 Ack/Nak flit 交替发送,这允许更快的 Ack 转换,从而可以使用更小的重试缓冲区。
  • 所有 10 位 Retry 相关计数器被替换为 8 位计数器,最大允许序列号为 255。
  • REPLAY_TIMEOUT_FLIT_COUNT 是一个 9 位计数器,在 1FF 处饱和。
  • 除了在 PCIe 基础规范中描述的增加 REPLAY_TIMEOUT_FLIT_COUNT 外,当处于 Active 状态且自上次发送 flit 后,已经过去一个 flit 时间,且既没有传输有效载荷 flit 也没有传输 NOP flit 时,也必须增加计数。
  • NAK_WITHDRAWAL_ALLOWED 始终设置为 0b。
  • IDLE Flit 握手阶段不适用,因为通过边带握手管理到链路活跃的转换,并且没有交换 IDLE flit 的要求。

Runtime Link Testing using Parity

UCIe 支持在运行时通过定期在数据流中注入校验字节来检测链路健康状况的机制。当启用此机制时,Adapter 会在数据流中间定期注入校验字节,接收方会检查并记录插入校验字节的校验错误。

Adapter 每 256_256_N 字节数据插入 64*N 字节,其中 N 由错误和链路测试控制寄存器决定。只有插入字节的第 0 位包含校验信息,其余 7 位保留。

Image

Adapter 的发送器和接收器必须跟踪经过的数据字节数,以计算或检查校验信息。

如果 RDI 不再处于 Active 状态,数据计数和校验将被重置,双方必须在下次从重新训练进入 Active 状态之前协商启用校验注入。

软件通过向 UCIe 链路上的两个 Adapter 中的寄存器写入 1b 来启用此机制,并在写入后触发 UCIe 链路重新训练。

Adapter 在重新训练期间交换边带消息,以确保 remote link partner 的接收器准备好接收数据流中的额外校验字节。

Adapter 发送{ParityFeature.Req}边带消息给 remote link partner,remote Adapter 接收器已启用并准备好接受校验字节,则响应{ParityFeature.Ack}边带消息。

如果 Adapter 未准备好接受校验字节,或该特性尚未使能,则响应{ParityFeature.Nak}。

Adapter 允许在启用校验特性时转换到更高延迟的数据路径。

Retimer 接收器不得将校验字节写入其接收器缓冲区,或将其转发给远程重定时器伙伴。

如果芯片检测到校验错误,该错误被视为可纠正错误。

END

文章来源:处芯积律

推荐阅读

更多 IC 设计干货请关注IC设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。

推荐阅读
关注数
20643
内容数
1316
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息