🔥点击查看精选 UCIe 系列文章🔥
🔥点击进入【芯片设计验证】社区,查看更多精彩内容🔥
📢 声明:
- 🥭 作者主页:【MangoPapa的CSDN主页】。
- ⚠️ 本文首发于CSDN,转载或引用请注明出处【https://mangopapa.blog.csdn.net/article/details/127863401】。
- ⚠️ 本文目的为 个人学习记录 及 知识分享。因个人能力受限,存在协议解读不正确的可能。若您参考本文进行产品设计或进行其他事项并造成了不良后果,本人不承担相关法律责任。
- ⚠️ 若本文所采用图片或相关引用侵犯了您的合法权益,请联系我进行删除。
- 😄 欢迎大家指出文章错误,欢迎同行与我交流 ~
- 📧 邮箱:mangopapa@yeah.net
UCIe 协议提供了多种机制来保证数据在链路上的可靠传输, 比如 CRC 校验及 Retry 机制,比如 FEC 纠错 等等。CRC 校验、Retry 机制 及 FEC 前向纠错均是常用的保证数据完整性的有效手段,CRC 来检查错误,Retry 重传来弥补错误,FEC 纠错直接改正错误。考虑到 UCIe 中 FEC 更多是服务于 Raw Mode 及 Retimer 的,我们有时间再聊,今天重点探讨跟数据完整性强相关的 CRC 及 Retry。
UCIe CRC 校验及 Retry 机制是在 Adapter 中实现的,Streaming Protocol 或 Raw Mode 的 相关机制由 Protocol Layer 实现,不在本篇讨论范畴之内。
这里的 CRC 和 Retry 都是 针对 非 Raw Mode 下的 Mainband 而言的 ,UCIe Link 上 Sideband 的传输速率较低,误码率也极低(1e-27),因此 UCIe 1.0 中没有针对 Sideband 的 CRC 及 Retry,但在 Sideband Packet 中留有 1bit Parity 位。对于 Mainband,为了满足 FIT<<1 的需求(FIT,Failure In Time,故障率,1e9 小时内出现 1 次故障为 1 FIT),在 BER<1e-15 时,必须采用 CRC/Parity 及 Retry 等机制来保证数据完整性。
UCIe 的 Raw BER 需求如表 1 所示,也就是说,8 GT/s 以上速率时必须开启 CRC/Parity 及 Retry 机制。这里要注意, 8 GT/s 及以下速率时,即便不支持或支持未开启 Retry 机制,也强烈建议实现 CRC 校验,便于 UCIe 模块能够检测错误并及时做出响应 ,比如跳转到 Link Error 状态并重新训练。

当然,UCIe Runtime Parity Test 也能够进行数据完整性相关的检查,但其设计初衷是用来进行链路质量测试的, 是一种测试时间窗口更长的奇偶校验 。UCIe CRC 本身已经具备了奇偶校验能力,且冗余度更高,UCIe Runtime Parity Test 在校验能力上不如 CRC,但其能够较为准确地报出哪条 Lane 出了问题,这是 CRC 做不到的。这部分我们放在 《UCIe Runtime Link Test》讲。
CRC,Cyclic Redundancy Check,循环冗余校验。CRC 相关概念较为基础,不做进一步解读,若不清楚可自行搜索。
UCIe 协议支持的 7 种 Flit Format 中,除了 用于 Raw Mode 的 Format1,另外 6 种 Format 的 Flit 中,均包含有 CRC 字段。对于 68B Flit Mode,每个 Flit 含 2B CRC;对于其他 256B Flit Mode,均有 4B CRC,根据具体 Format 的不同,CRC 在 Flit 中的位置稍有不同,具体可参考《UCIe 支持的协议及操作模式》 。
UCIe CRC 计算及校验是在 Adapter 中完成的,且收发端均需进行 CRC 计算。发送端打包 Flit 时计算相关字段的 CRC 并填充到 Flit 对应位置。接收端从接收到的 Flit 中提取相关字段后计算 CRC,然后与接收 Flit 中的期望 CRC 进行比较,若两者不同,即 CRC Error,表明数据传输过程中出现了误码。
UCIe 协议采用 CRC-16-IBM 算法计算 CRC,CRC 生成多项式如下:
能够实现 3bit 检错。其计算逻辑框图如图 1 所示。



UCIe 处理 CRC Error 的方式无非就 3 种:
UCIe 接收端 CRC 校验发现数据传输错误后,可采用 Retry 机制请求重传出现误码的 Flit,从而保证数据的可靠传输。
如前文所述,传输速率为 8 GT/s 及以下时,误码率较低,Retry 机制可选。传输速率为 8 GT/s 以上时,BER 相对较高,UCIe 模块必须支持 Retry。UCIe 链路两端的 Module 在协商一致后才能决定是否启动 Retry 机制,只有在自身及对端均支持 Retry 的前提下才会协商成功。
具体而言,UCIe Retry 能力的协商发生于 Adapter 初始化阶段,即 UCIe 链路初始化 Stage 3,RDI Bring Up 之后,FDI Bring Up 之前。Retry 能力协商采用的 Sideband Message 为 {AdvCap.Adapter} 及 {FinCap.Adapter}。
协商一致过后 Retry 一旦打开,即使中途掉速到 8 GT/s 或以下,仍需继续开启 Retry 机制。想要关闭 Retry,只能走重新 Link 训练的过程并协商一致关闭 Retry。
PCIe 1.0~5.0 的 Ack/Nak 机制中,发送端每发送一笔 TLP 分配一个 12bit 的 Sequence Number 附在 TLP Header 之前,每 4096 个 TLP 一循环。接收端根据 CRC 检查结果等响应以携带有 Sequence Number 的 Ack/Nak DLLP,发送端收到 Ack/Nak 后进行重传或清理 Retry Buffer。
在 PCIe 6.0 Flit Mode 时,不再以 TLP 为单位,而是以 Flit 为单位, 每个 Flit 分配一个 10bit 的 Flit Sequence Number 放在 Flit DLLP 的 DLP0 及 DLP1 ,其中 Flit Sequence Number=0 仅用于 Idle Flit,NOP Flit 不消耗 Flit Sequence Number 。接收端根据 CRC 检查结果等响应以 DLLP 中携带有 Ack/Nak Flit Sequence Number 的 Flit,发送端收到 Ack/Nak 后进行重传或清理 Retry Buffer。这里的 Nak 又细分为 Standard Nak 与 Selective Nak,Selective Nak 实现的前提是 Rx Retry Buffer 的存在,仅重传出错的 Flit。具体请查看 PCIe 6.0 Spec。
UCIe Ack/Nak 机制跟 PCIe 6.0 Flit Mode 的 Retry 机制类似。UCIe 采用了 Flit 粒度 的 Ack/Nak 机制来实现错误 Flit 重传,只是在某些方面针对 UCIe 做了精简。UCIe 采用 8bit 的 Flit Sequence Number,位于 Flit Header 中。这里注意了, UCIe Retry 重传的是 Flit,而非 PCIe Gen1~Gen5 协议所规定的重传整个 TLP。 具体的 Retry 机制请参照 PCIe 6.0 Spec。
开启 Retry 跟不开启 Rety 机制时,UCIe Flit Header 相关位域的定义是不同的。以 Standard 256B Flit Format 为例,带有及不带 Retry 的 Flit Header 格式分别如表 2,3 所示。从表中可见,开启了 Retry 机制的 Flit Header 中携带了 Ack/Nak 信息及 Sequence Number 位域。


UCIe Retry 机制跟 PCIe 6.0 Retry 基础上做了删减改动,主要区别如下:
UCIe 并未给出 Retry 失败的具体方案,具体可以参考 PCIe 的实现方案,这里只给出简单说明:
|
|
🔥 精选往期 UCIe 协议系列文章,请查看【 Chiplet 专栏】🔥
⬆️ 返回顶部 ⬆️