UCIE协议主要包括protocol层,Adapter层和PHY层。Protocol层复用CXL,PCIE或自定义的stream流格式。
Adapter层主要负责:
数据的可靠传输。实现retry,CRC校验,奇偶校验等功能。 多路传输仲裁和复用。D2D adapter支持多路数据共用物理层传输,Adapter层实现对数据源的仲裁和选择。 物理层链路状态管理。 传输协议和参数协商。
protocol和Adapter之间基于flit的FDI接口,即flit aware D2D interface。Adapter和PHY之间基于RDI接口,Raw D2D interface。功能示意如下:
协议栈复用
D2D支持多个protocol复用同一个Adapter进行传输,由参数Multi_Protocaol_Enable和Enhanced Multi_Protocol_Enable决定。
D2D支持同一个protocol的多路数据流传输,Adapter需要支持对数据流的Arb和Mux。
同时D2D支持多个protocol的复用传输,Adapter需要支持对protocol间的Stack Mux。
Multi_Protocol_Enable和Enhanced Multi_Protocol_Enable的特性如下:
Multi_Protocol_Enable
支持两个协议栈在同一物理链路上复用,每个协议栈各占用一半带宽。 两个协议栈必须是同一协议且具有相同的协议能力。 Adapter必须保证不会连续发送来自同一协议栈的flit。 Adapter可以插入NOP flit以保证不发送连续flit,这些flit不会转发到接收方的协议层。 接收协议层必须能够以最大链路速度接收相同flit的连续块,但不会接收连续的flit。 两个协议栈必须使用相同的协议和flit格式。 每个协议栈有栈标识符,用于在接收方对flit进行解复用。
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以及和对端的参数协商。主要包含三部分:
确定local Capabilities remote link 参数协商 FDI bring up
local Capabilities
此部分需要确定如下几点:
PHY traning结果确定。
是否支持retry机制,Adapter需要判断在给定的链路速度和配置下是支持retry。
retry协商,如果Adapter支持retry,必须在参数交换过程中通知remote link partner。
Retimer Receiver buffer的credit大小,每个credit对应256字节的mainband数据。
Parameter Exchange
Adapter和remote partner协商参数,均使用sideband的{AdvCap.Adapter}消息。在初始化需要协商的AdvCap.Adapter参数主要如下:
Raw Format。UCIe link控制寄存器中的位域,用于指示是否支持Raw Format格式传输。
68B Flit Mode。协议控制参数,用于指示是否支持CXL 68B Flit Mode,或者PCIe Non-Flit Mode.
CXL 256B Flit Mode。协议控制参数,用于指示是否支持CXL 256B Flit Mode。
PCIe Flit Mode。协议控制参数,用于指示协议层是否支持PCIe Flit Mode。
Streaming。协议控制参数,指示是否支持Streaming Raw Format,Streaming Flit Format。与CXL和PCIe protocol互斥。
Retry。指示Adapter是否支持retry机制。
Multi_Protocol_Enable。Adapter连接多个FDI的协议层时,需要使能该bit,同时Stack0_Enable和Stack1_Enable需要使能。
CXL_LatOpt_Fmt5,CXL_LatOpt_Fmt5。是否支持Format5/6的传输格式。仅在CXL协议和CXL 256B Flit模式下可以使用。
Retimer。在Retimer和同一个package内的Adapter进行参数协商时,需要使能该bit。
Retimer_Credits。仅在Retimer参数使能时开启,9bit位宽,用于指示retimer的receiver buffer的大小,每个credit表示一个256B数据大小。
DP/UP。上游或下游端口标记,用于通知retimer当前link的端口类型,目前适用于PCIe和CXL协议层。
68B Flit Format。使能68B Flit Format。
Enhanced Multi_Protocol_Enable
Standard 256B End Header Flit Format
Standard 256B Start Header Flit Format
Latency-Optimized 256B without Optional Bytes Flit Format
Latency-Optimized 256B with Optional Bytes Flit Format
Stack 0 Maximum Bandwidth_Limit。使能Enhanced Multi_Protocol_Enable时,stack0的最大利用带宽。
Stack 1 Maximum Bandwidth_Limit。使能Enhanced Multi_Protocol_Enable时,stack1的最大利用带宽。
PCIE/CXL协议参数协商
Adapter的local Capabilities确定后,需要通过边带消息与remote link partner协商和确定协议参数。
Capabilities inform:DP Adapter发送{AdvCap.Adapter}边带消息,向UP Adapter通知其支持的Capabilities。
PCIe/CXL protocol Support:如果UP Adapter要支持PCIe或CXL协议,则需要先等待DP Adapter的第一个{AdvCap.Adapter}消息,确定DP Adapter的Capabilities,然后向DP Adapter发送自己的{AdvCap.Adapter}边带消息。UP可以根据DP的Capabilities更改其Capabilities。
configuration response:一旦DP收到UP的Capabilities消息,DP使用{FinCap.Adapter}边带消息响应UP的配置,如图3-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}边带消息。
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。
多协议栈参数协商
如果协商了Stream protocol传输,则不区分DP(下游端口)和UP(上游端口),每一方独立地发送自己的Capabilities消息。同时允许交换厂商定义的边带消息,以实现相应厂商的特定扩展。
最终配置的Capabilities由link双方共同确定。对于Stream protocol传输,不发送{FinCap.*}消息。适配器必须以特定实现的方式确定厂商特定的要求。图3-6至图3-11展示了栈0和栈1具有不同协议的不同场景示例。
在参数协商中,需要超时机制来保证参数交换的过程正常进行:
超时时间:Adapter必须实现参数交换的8毫秒(-0%/+50%)的超时时间机制。
超时测量:参数交换完成的超时测量包括链路初始化第三阶段的第一部分和第二部分的所有步骤,即local Capabilities和remote Capabilities协商。
超时计时器:计时器只在RDI处于active状态时工作。
重置计时器:如果适配器收到来自remote link partner的{AdvCap..Stall}、{FinCap..Stall}、{MultiProtAdvCap..Stall}或{MultiProtFinCap..Stall}消息,计时器必须重置。
超时处理:参数交换或链路状态机转换的8毫秒超时被视为不可用错误(UUE),Adapter必须将RDI置于LinkError状态。
UCIe重定时器:UCIe重定时器必须确保在与其包内的UCIe die响应/启动参数交换之前,与remote重定时器partner解决能力通告问题(并与自己的能力合并)。
解决过程中的通信:在解决过程中,重定时器必须每隔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同步,这些消息由物理层发起和接收。
分层的状态管理包含如下几个主要信息:
Active State转换:RDI状态机(RDI SM)必须先进入活Active状态,之后Adapter状态机(Adapter LSM)才能开始协商过渡到Active状态。Adapter LSM必须处于活跃状态,虚拟低层状态机(vLSMs)才能开始协商过渡到Active状态。即Active状态是自下而上逐层转换。
Retrain State转换:RDI SM必须先进入重新训练(Retrain)状态,然后才能将重新训练状态传播到Adapter LSMs。如果RDI SM处于Retrain状态,必须将Retrain状态传播到所有处于Active状态的Adapter LSMs。在所有相关的Adapter LSMs都已过渡到Retrain状态之前,Adapter不得请求RDI退出Retrain状态。Retrain状态是自下而上逐层转换。
电源管理状态转换:对于CXL协议,CXL.io和CXL.cachemem vLSMs必须在相应的Adapter LSM过渡到电源管理(PM)状态之前先过渡到PM状态。如果同一个Adapter上启用了多个栈,则所有Adapter LSMs在RDI SM过渡到PM状态之前必须处于PM状态。PM状态则是自上而下逐层转换。
链路错误状态转换: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状态是自下而上逐层转换。
链路重置或禁用状态转换: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。该过程种的状态则是自上而下逐层转换。
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。
退出电源管理:
协议层的活动请求通过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每256256N字节数据插入64*N字节,其中N由错误和链路测试控制寄存器决定。只有插入字节的第0位包含校验信息,其余7位保留。
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接收器不得将校验字节写入其接收器缓冲区,或将其转发给远程重定时器伙伴。
如果芯片检测到校验错误,该错误被视为可纠正错误。