【UCIE协议系列-2】


【博客首发于微信公众号《漫谈芯片与编程》,欢迎专注一下,多谢大家】

本篇博客主要介绍UCIE的层与层之间的接口RDI&FDI以及MainBand和SideBand数据传输;

1 D2D接口–Module

FDI: Protocol层与Adapter层之间的接口; RDI:Adapter层与Physical层之间的接口;(在这不用先纠结RDI和FDI上的具体接口信号);
而Module是Die-to-Die之间的物理接口;每个module包含Main Band用于数据传输,Side Band用于寄存器配置、初始化和Link Training–其频率固定跑在800MHz,Side Band相关逻辑电路需要处于“always on”电压域。
一个标准封装的UCIE module信号线:MainBand有16个TX Data Lane和16个RX Data Lane(先进封装对应64Lane);SideBand是一个x1 Data Lane;
一个先进封装的UCIE Module信号线:其中包括64个单端TX数据线和64个单端RX数据线,每32个数据管脚提供2个额外的管脚用于Lane repair,而Standard Package module没有额外管脚用于Lane repair。Side Band由两组不同方向的单端数据线和时钟线组成。

  

一个UCIE又可以允许有x1,x2和x4的的modlue配置;
 
x2和x4里面的module里面的速率要一致;

2 UCIE SideBand

UCIe 提供了两大数据通路:Mainband 及 Sideband。Mainband 用来传输业务数据流,Sideband 用来来处理一些 链路训练、链路管理、参数交换及寄存器访问 等非数据传输业务。Sideband 作为 Mainband 的 Back Channel,能够简化UCIE中的链路训练、链路管理和D2D参数交换,简化数据链路的建立过程、提升 Mainband 的带宽利用率、简化 Mainband 设计复杂度。
除了常规意义上的 Die 间 UCIe Link Sideband,UCIe 还有 FDI Sideband 及 RDI Sideband,在不同层次间传递边带信息。UCIe 支持类似于 PCIe 的 4 种数据包,包括配置读写、内存读写、Completion 及 Message。

2.1 SideBand功能

UCIe Sideband 主要是在 D2D 参数交换、链路训练、链路管理及寄存器配置方面,但具体UCIe Sideband 实现上述的就是这两种方式:① 寄存器访问;② Message 传递。

2.1.1 寄存器访问

UCIe 是个分层协议,根据作用的不同,其寄存器也分布在协议层、Adapter、物理层等各个层次。通过 UCIe Sideband,实现同 Die 内不同层次间的直接寄存器访问,或跨 Die 的间接寄存器访问。

  • Local Die 寄存器访问。同一 UCIe Die 内,上层通过 Sideband 访问下层寄存器,比如协议层访问 Adapter、物理层寄存器,比如 Adapter 访问物理层寄存器,都可以直接通过 FDI 或 RDI 上的 Sideband 接口实现寄存器访问。
  • Remote Die 寄存器访问。不同 UCIe Die 间,Master Die 可以基于 Mailbox 机制,由 Adapter 发起 Sideband 寄存器访问操作,间接访问对端任何层次的 UCIe 相关寄存器。

2.1.2 message传递

UCIe 通过在 UCIe Layer 间或 Die 间的 Sideband 来传递相关 Message,从而实现参数交换、链路训练及链路管理。

  • 链路训练。Sideband Message 传递贯穿整个 UCIe 链路训练过程(SBINIT->MBINIT->MBTRAIN->LINKINIT->ACTIVE)。
  • 链路管理。UCIe 通过 Sideband Message 实现 PM、Retrain 等链路状态的管理。
  • 参数交换。参数交换发生于链路初始化期间。Stage2 发生于 Sideband 初始化之后,Stage2 时在 UCIe 链路物理层之间通过 Sideband 交换训练参数,对 Mainband 进行训练。Stage3 时 Mainband 物理链路训练完毕,此时通过 Sideband 在 Adapter 之间交换协议参数 ,协商要采用的协议及 Flit 格式。

2.1.3 具体作用范围

用 Sideband 进行寄存器访问及 Message 传递时,Sideband 消息在层与层之间、Die 与 Die 之间传递时并不是畅通无阻的,而是有一定“地域”限制的。比如,协议层可以通过 FDI Sideband 直接访问 Local Die Adapter 及物理层的寄存器,却不能直接访问对端 Die 上的 UCIe 寄存器,只能通过 Mailbox 机制来访问。

以 Die0->Die1 方向的请求、Die1->Die0 方向的 Completion、Die0->Die1 方向的 Message 为例,笔者总结了 UCIe 1.0 Spec 中明确提到支持的 Sideband 在 UCIe 层间传输路径(或有不全),如下图所示:


2.2 SideBand数据包

SideBand数据包分类:
UCIe Sideband 支持 4 种不同的数据包:① 配置读写(CfgRd/Wr)、② 内存读写(MRd/Wr)、③ 完成(Cpl/Cpld)及 ④ 消息(Msg/MsgD);

  • 配置读写及内存读写都是用于寄存器访问,区别在于寄存器位于配置空间还是 MMIO 空间。若访问 UCIe 配置空间内的寄存器,比如 Host Die 访问 EP UCIe Link DVSEC 内的寄存器,则采用 CfgRd/Wr;若访问其他 MMIO 区域的寄存器,比如 D2D Adapter 内的寄存器,则采用 MRd/Wr。 根据寄存器数据位宽的不同,寄存器访问请求又可以分为 32bit 及 64bit。
  • Completion 一般对应寄存器访问请求的 Response。根据是否携带数据及返回数据的位宽不同,Completion 可以分为不带数据的 Cpl 及携带数据的 CplD,CplD 又分 32bit 数据及 64bit 数据。这里的 32/64bit 跟 PCIe 稍有不同,PCIe 中 32/64 bit 是指地址位宽,在 UCIe 中是指寄存器数据位宽。
  • Message 一般用于 D2D 间参数交换、链路训练、链路管理及其他 Vendor 自定义的场景。根据是否携带数据,消息分为 Msg 及 MsgD。

跟 PCIe TLP Header 的 FMT+Type 字段类似,UCIe 通过 Sideband Packet 中的操作码(Opcode)来区分是哪种类型的 Sideband 数据包、是否携带数据、地址数据的位宽。

SideBand数据包格式:每一笔 Sideband Message 都由 64bit Header + 32 或 64bit Data 组成。每个 Clock Cycle 对 Sideband 数据接口采样一次,为 1 个 Phase,有几个 Phase 就代表当前 FDI/RDI Sideband 帧需要几个 UI 才能发送出去。以位宽 32bit 的 FDI/RDI Sideband 数据接口为例,介绍下 Sideband 的数据格式。

2.2.1 MRd/Mwr/CfgRd/CfgWr

寄存器访问请求的 Sideband 帧格式如下图所示。重点介绍几个字段:
srcid 及 dstid 表明了 Sideband 寄存器请求的来源及目的地(协议层、Adapter、物理层,Local、Remote)。
tag 是 Requester 添加的标签,用以将 Outstanding 请求跟响应相对应。
addr 只有 24bit。当寄存器访问请求为 Cfg 类型时,24 位地址由 {RL[3:0], Rsvd[7:0], Byte_Offset[11:0]} 组成。这里的 RL 即 UCIe Link DVSEC 中的 Register Locator,为 0 表明当前地址为 UCIe Link DVSEC 中的地址,为 F 代表 Adapter 中的一些 shadow 寄存器地址。当寄存器访问请求为 MMIO 类型时,24 位地址由 {RL[3:0], Offset[19:0]} 组成。无论哪种地址组成方式,这里的地址都是一个在基地址基础上的偏移,基地址由 Host 或 Register Locator 寄存器提供。


2.2.2 Completion

Completion 的 Sideband 帧格式如图 3 所示,其跟寄存器访问请求大同小异,其中有几点不同:

  • Status,表明当前 Completion 的状态,包括 Success、UR、CA、Stall 四种状态。
  • Completion 在 FDI 上的去向不依赖于 dstid 而是依赖于 tag。
  • 没有 addr 地址字段。



2.2.3 Message

带 Data Payload 和不带 Data 的 Message Sideband 帧格式如图 4,5 所示。比较关键的几个字段位 MsgCode、MsgSubcode、MsgInfo;




2.3 SideBand接口及时序

2.3.1 SideBand接口分类

UCIe 有 3 类不同的 SideBand 接口:

  • FDI Sideband,在协议层与 Adapter 之间传递 Sideband 信息。FDI 接口上跟 Sideband 相关的信号为 pl_cfg* 及 lp_cfg*,协议层可以经 FDI Sideband 向 Adapter 发送寄存器访问请求,但 Adapter 不能向协议层发送寄存器访问请求;
  • RDI Sideband,在 Adapter 与物理层之间传递 Sideband 信息。RDI 接口上有一组跟 Sideband 相关的信号(pl_cfg* 与 lp_cfg*),逻辑物理层从 RDI 接口接收到 Sideband 相关信息后,封装成帧转换为串行数据流通过 PHY 传输到对端。同理,对端 PHY 发来的串行 Sideband 数据在逻辑物理层解包,通过 RDI 口上的 Sideband 信号发送到 Adapter。
  • UCIe Link Sideband,在 两个 UCIe Die 之间的物理层之间传递 Sideband 信息。跟 FDI RDI Sideband 不同,UCIe Link Sideband 数据线位宽只有 1,传输的为串行 Sideband 数据流,Clock 频率为 800MHz。

2.3.2 发送时序

每一笔 Sideband Message 都由 64bit Header + 32 或 64bit Data 组成,若 Data 为 32bit,需要高位补 0 到 64bit。发送串行数据时,每 64bit 为 1 个 Packet,相邻 Packet 之间插入 32bit 0 以分隔不同的 Packet。每个 Clock Cycle 发送 1bit Sideband 数据,下降沿采样。如图 6 所示。



相比于支持多速率 DDR 传输的 Mainband,UCIe Sideband 采用 800Mbps 的固定速率 SDR 传输。UCIe Sideband 工作在 Always On 状态下,不受低功耗状态的影响,无论 LSM 处于哪种低功耗状态,Sideband 对应的时钟都是能够正常运行。

2.4 SideBand流控–基于Credit

前文 UCIe Sideband 介绍 中提到 UCIe FDI、RDI 接口及 UCIe Link 上均可以传输 Sideband 包,相对应地,Sideband 数据包在 FDI、RDI 及 UCIe Link 接口上进行传输时独立进行基于 Credit 的流控。
PCIe 流控中,根据 VC 、事务类型(P/NP/CPL)及 Header/Data 分了多种 Credit,但在 UCIe Sideband 流控中,所有类型的 Sideband Packet 共享同一种 Credit。虽然有些 Sideband Packet 是不带 Data 的,携带 Data 的 Packet 中 Data 也有 32bit 及 64bit 之分,但在 Sideband 流控中,不论是否携带 Data、不论 Data 位宽多少(目前只有 32、64bit 两种啊),同一个 Sideband Header 消耗的就是一笔 Credit,即 每一笔 Credit 对应 64bit Header w/wo Data。

2.4.1 FDI/RDI Sideband Flow Control

PCIe Flow Control 是一种点到点(P2P)的流控,通过在 PCIe Link 两端数据链路层间发送 DLLP 实现流控;
UCIe Local Die Sideband的 Flow Control 更为精细,是一种层到层(L2L)的流控,每一个 FDI、RDI 的收发环路独立进行流控;
对于发送端,Tx 向 Rx 发送 寄存器访问请求或 Message 类型的 Sideband 包之前,必须先检查 Rx 是否还有 Credit 余量。对于接收端,其在处理完相关 Sideband Packet 之后,及时回一个taken出去。Completion 是不占用 Credit 的,发送 Completion 之前无需确认 Rx Credit 情况,Rx 收到 Completion 后应无条件立即执行。
** 这个是很好理解的;TX–>RX; RX里面会有一个缓存FIFO,而TX里面会有一个Credit更新的模块,其Credit的大小一般即为RX里面FIFO的depth,当TX发出去一个即crdt_cnt就加1,RX回来一个taken则crdt_cnt就减1;**
在 PCIe 流控中,数据链路层 Link Up 之前会发送 FC_Init 类型的 DLLP 进行流控初始化,来告诉有多少credits;UCIE好像是固定最大32个credit;

死锁避免::UCIe Link Sideband 流控一大关键是 避免死锁。为了避免死锁,对于 Adapter Mailbox 发出的寄存器访问请求,支持的 Outstanding 数量最大为 4,在物理层及 Adapter 中一次至少应能容纳 4 个这种请求。如果 UCIe 实际能支持 N 个请求,其可以通过 {NOP.Crd} 向对端额外释放 (N-4) 个 Credit。对于 Message 类型的 Sideband Packet,除了 Vendor 自定义的 Message,一方面所有 Msg/MsgD 都应一路下发且不能阻塞后来的 Sideband Packet,另一方面链路管理类的 Message 不能 Outstanding 发送,必须收到 Rsp 之后才能发送下一步,从而避免死锁。对于一些 Vendor 自定义的 Message,定义 Message 的同时也必须定义其 Outstanding 能力,在 Rx 留有足够的空间来接收这些 Message,以免阻塞住后续 Message。

【ref】
1.https://blog.csdn.net/weixin_40357487/article/details/126960034
2.https://blog.csdn.net/li_kin/article/details/135757688
3.https://mangopapa.blog.csdn.net/article/details/127015510

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值