UCIE协议
3.0 Adapter
这是链路的初始化,stage2是RDI -> Active结束。
stage3主要在参数Exchange阶段协商在给定phy速率下是否需要retry;其余参数交换参考3.2.1.2;FDI bring up
3.3 68B flit的对齐问题
Adapter在RDI / 链路侧传输连续flit时按 256B 倍数组织数据
如果 Retry 或者 Retrain,都要插入PDS 然后对齐到 256B 的边界
PDS和普通的 Flit Head可能会产生混淆。
- 错把PDS认为是Regular FH的可能性很小,即使发生也会触发CRC
- 错把Regular FH认为是FDS的可能存在,当不满足四个条件(见3.3.2.1)的时候,检查后面第一个收到的有效flit是否满足预期的sequence number,并且CRC需要通过,不通过触发retry
3.5 状态机的变化
Active / Retrain / LinkError :RDI SM -> Adapter LSM Active -> vLSM Active(PCIE/CXL)
PM的顺序和上面的反过来,RDI最后进PM
LinkReset / Disabled : Adapter LSM 先和远端协商,所有相关 Adapter LSM都同意进入,最后让 RDI SM 进入 LinkReset / Disabled
3.6 PM
FDI定义了统一flow进入PM—-based on Link idle time. 判定链路空闲时间的具体算法与迟滞效应(hysteresis)由实现方案自行定义。
3.9 Runtime Link Testing using Parity
如果打开这个 feature,Adapter 会在业务数据流中:每隔一大段数据,插入一小段 parity bytes
该机制通过软件向位于UCIe链路两端适配器中的使能位寄存器写入1b来启用(寄存器详情参见第7.5.3.9节)。软件必须在两个适配器上完成使能位写入后触发UCIe链路重训练。
4.0 Logical Phy
链路初始化,链路训练 ,PM
把上层数据字节分配到不同 lane 上发送: 一条lane的传输单位是按Byte,单个Byte内部是LSB first。Valid Framing是做Byte边界的
如果链路中间有 Retimer,那么 valid 这根线不只是做分帧,还顺带承载了 credit release 信息。每个 credit 对应 256B 数据,编码形式请查看4.1.2.1
Valid=0 后,还要继续输出一段固定的 postamble clock才允许关闭时钟,见4.1.3
- sideband传输
sideband message 格式是:64-bit header后跟 • 32-bit 或 64-bit data • 如果只有 32-bit data,仍按 64-bit serial packet 发,高位补 0。
两个 sideband serial packet 之间,至少插入32 bit low的间隔
4.1 Sideband Performant Mode (PMO)
协商好 PMO bit=1之后,PMO模式下可以按64UI连续发送,而不需要等待32UI
4.2 Lane Reversal
reversal就是本地 lane 0 可能接到远端 lane N-1,本地 lane 1 接远端 lane N-2 …
只在发送端实现,发送端负责把 logical lane 顺序反过来映射到 physical lane
只有数据 lane 和冗余数据 lane 能反转:Track,Valid,Clock,sideband这些都不能反转。 Track是 时钟跟踪/采样对齐辅助信号,
Lane ID 的作用就是:在训练阶段识别“我现在接到的物理 lane,到底对应哪一条逻辑 lane”
- 4.3在讲repair的mapping,包含data lane repair、Data Lane repair with Lane reversal、Clock and Track Lane repair以及Valid Repair
如果链路做了 lane reversal,再发生单条 lane 坏掉时,修复方向要反过来
4.4 Data to Clock Training and Test Modes
PHY 训练/测试模式下,怎么用伪随机测试图样去检查链路质量:
发送端和接收端的 pattern generator 同步启动,发送端和接收端都实现同一个 LFSR. 接收端必须支持两种比较方式: 1️⃣逐 lane 比较(每条通道的比较结果可通过sideband读取) 2️⃣ Aggregate comparison(聚合比较)
UCIe 用 LFSR 做两件事,每条 Lane 可以各自有一个独立 LFSR,不同 lane 的 LFSR seed 不一样
- Scrambling
- Training/Test pattern generation(训练/测试图样生成)
不同 lane 的 LFSR seed 不一样,按 lane number modulo 8 复用的。lane 0 用一套 seed;lane 1 用一套 seed;lane 8 再回到 lane 0 那套 你不一定真的要“每条 lane 一个完整 LFSR”
4.5 Link的initial和training
- 训练里的 PI 指的是“采样时钟相位选择/生成方法”
- 除 RESET 和 TRAINERROR 外,每个训练状态/子状态超时都是 8ms
- 如果收到 sideband 的 Stall,超时计数要清零
- 训练失败若达到实现定义次数,PHY 回到 RESET
- 如果是软件触发或 RDI 触发训练而失败 或者 由于物理层超时,link up -> link down。PHY 要在 RDI 上报 fatal error
链路训练可以由以下三种触发:(UCIE v1.1)
- 软件把 Start UCIe Link Training 位置 1
- Adapter 在 RDI 上发起 Reset → Active 请求
- 任意 sideband 接收口检测到 SBINIT pattern(two consecutive iterations of 64 UI clock pattern and 32 UI low)
- sideband training
- 软件写Retrain Link
- Management Port Gateway自动发起(比如Management reset之后自动触发train)
- 被动检测触发(
SB_MGMT_UP= 0,接收端在某个sideband的 clock / data pin上看到了SBINIT pattern)
- mainband training
- (同1.1的1和2)
- 如果该 UCIe link 支持 Management Transport,软件也可以通过 Sideband 或 Mainband 的 Management Port Structure 去写 Retrain Link = 1
- 如果不支持 Management Transport,或者SB_MGMT_UP=0,就靠检测 SBINIT pattern。如果支持就靠接受
SBINIT done req
4.5.1 Link Training基本的operation
UCIe 在做链路训练时反复调用的基础测试原语,这些操作会被后续的 mainband initialization、training、margining 复用
- 单点测试:固定一个PI相位,发测试图样,接收端逐UI比较。用于测试某一个采样点是否可用
- 眼宽扫描:扫多个PI相位,持续记录各相位下的通过 / 失败结果。用于找出passing phase range
1
2
3
4
5
6
7
8
9
10
11
12
1. 发起方先通过 sideband 通知对端:我要开始测了,请把本地训练参数配好。
2. 双方清 LFSR / 清错误统计。
3. 发送端在 mainband 上发一个已知测试 pattern。
4. 接收端把收到的数据和本地期望 pattern 比较,并记录结果。
5. 通过 sideband 把比较结果取回来,判断 pass / fail。
6. 如果是 sweep,就重复多次,换不同 PI phase 扫描。
7. 双方交换结束消息,完成这一轮的训练。
用 sideband 做控制协调,用 mainband 发训练码型,用比较结果来校准采样时钟位置。
Point test: 在当前这个 PI 相位下,接收是否正确?
Eye width sweep:哪些 PI 相位是能工作的?通过区间有多宽?
当链路中间插了 UCIe Retimer 之后,需要彼此协商一下用什么速度和配置
训练时可配置的参数:
- Tx Pattern Generator Setup:发送图样
- Tx Pattern Mode Setup:这些pattern怎么发送
4.5.3 Link Training State Machine
PHY 在链路从“没起来”到“真正可用”之间,必须按什么状态顺序推进,以及运行中掉速、重训、低功耗、报错时怎么回到这些状态。它给的是一套 PHY 级 bring-up 状态机:
1
2
3
4
5
6
1. SBINIT 把 sideband 建好,随后 MBINIT/MBTRAIN 做 mainband 初始化与训练.
之后在 LINKINIT 交换 Adapter/Link management 消息,最后进入 ACTIVE 收发正常事务
2. SBINIT 是 sideband 初始化与修复,MBINIT 是最低速率下的 mainband 初始化和 on-die calibration / interconnect repair,MBTRAIN 是把 mainband 提到协商出的最高速率并做 data-to-clock 居中训练,LINKINIT 用于交换Adapter 和 link management 消息,ACTIVE 才是正式传事务的状态
3. 如果训练或运行中出现 fatal / non-fatal 事件,就进 TRAINERROR,再回 RESET
Reset
Reset停留至少4ms。推出Reset之前要满足:
- sideband clock 800MHz
- mainband clock设到最低速率
- Phy不在保持RESET
- 出现mainband的training trigger
在RESET中,Tx的Data / Valid / Clock / Track是三态;Rx允许关闭;Sideband的Transmitter保持low
LTSM处于RESET状态时,对于新发或者待发未传输的sideband register access可以直接返回UR,然后返还credit。
对于completion,Phy Layer可以直接丢掉,completion不消耗credit
SBINIT
初始化工作在800MT/s,sideband时钟为800MHz。
LTSM处于SBINIT状态时,Phy Layer可以等待一个实现决定的时间,以观察SBINIT是否推进或者完成,之后基本情况和应对方式和RESET一样。
Advanced Package还有冗余的Sideband的Lane,修复详情见4.5.3.2
standard package下,整个流程如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
发送固定 Sideband Pattern(101010...共64UI,期间TXCKSB输出strobe)
↓
检测到对端 Pattern?(128UI的clock pattern)
├─ 否:1ms发/1ms停重试,最多8ms,失败→TRAINERROR
└─ 是:再发4轮后切到消息模式
↓
发送/接收 {SBINIT Out of Reset} (收到对方发来的Out of reset进入下一步)
↓
发送 {SBINIT done req}
↓
收到 {SBINIT done resp}?
└─ 是:进入 MBINIT
对于Management Transport protocol支持性,有三条异常/特殊规则。见4.5.3.2,page134
MBINIT
对于standard package,no Lane Repair is needed。Sub-states在两种不同的package中有不同的用法。
4.6 Runtime Recalibration
链路已经在 ACTIVE 正常跑的时候,接收端还能利用 Track 信号做在线重新校准,而且 mainband 数据不用停。
1
2
3
4
5
6
7
校准时:mainband 数据仍然继续采样和处理,只是额外用 Track pattern 去微调接收端时序
过程靠 sideband 协商:
1. 本端发 {RECAL.track pattern init req}
2. 对端回 resp,开始发 Track pattern + clock
3. 本端完成校准后发 done req
4. 对端停止 pattern,回 done resp
6.0 Sideband
- Protocol Layer 不能直接通过 sideband 去访问远端 Protocol Layer,必须走 mailbox 间接访问
Append
- TX/RX data to clock training:调节采样时刻 / 相位,-找 左边界 / 右边界 / eye center
- RX reference voltage training
- Build-in eye monitor












