UB 数据链路层机制

Unifiedbus Ub 协议栈数据链路层(§4),位于物理层与网络层之间。提供可靠的、保序的、点到点包传输。核心功能:封装/解析、CRC 校验、VL 虚通道、Credit 流控、点到点重传。

链路状态机

状态说明上报网络层
DLL_Disabled初始/复位态,物理层未就绪Status_Down
DLL_Param_Init物理层 LinkUp,交换 Init Block 协商参数Status_Down
DLL_Credit_Init参数协商完成,交换 Crd_Ack Block 初始化 creditStatus_Down
DLL_Normal正常通信,发送/接收 DLLDP + DLLCBStatus_Up

Entity 复位不触发 DLL_Disabled;仅物理层 LinkUp==0 触发。

包格式体系

基本单元

  • Flit = 20 字节(不可分割的物理传输单元)
  • DLLDP(数据包):1–512 flits,分 1–16 个 DLLDB(每个 DLLDB ≤ 32 flits)
  • DLLCB(控制块):1–32 flits,不可插入 DLLDB 中间

双封装模式

CRC 模式Non-CRC 模式
校验BCRC(CRC-30)per DLLDBEND 字段(仅尾部)
物理层 FEC可选必须启用
检错触发FEC 失败 CRC 失败 → 重传仅 FEC 失败 → 重传
延迟略高(CRC 计算)更低
切换由物理层发起 BER 检测 → Block_Mode_Chg Block 协调切换

LPH(链路包头)

4 字节,首个 DLLDB 的首个 flit:CRD(1) | ACK(1) | CRD_VL(4) | VL(4) | CFG(4) | RT(2) | PLENGTH(14)

关键字段:

  • CRD/ACK:credit 返回 + retry buffer 释放标志
  • CFG:0=DLLCB, 3/4/5/6/7/9=DLLDP(上层定义)
  • PLENGTH:14-bit 编码 DLLDB 数量 + 最后 DLLDB flit 数 + payload 边界

LBH(链路块头)

2 字节,中间/最后 DLLDB 的首个 flit。结构与 LPH 类似但更紧凑。

BCRC

每个 DLLDB 尾部:CRC-30 + ERROR_FLAG(1) + Reserved(1)。CRC 多项式:x^30+x^28+x^26+…+1。

DLLCB 类型

类型CTRL/SUB_CTRL功能平面
Null Block0000/0000链路空闲填充数据
No_Operation Block0000/0001小包节流(满足 PACKET_MIN_INTERVAL)数据
Retry_Idle Block0001/0000隔离 Retry_Req/Ack 与 DLLDP数据
Retry_Req Block0001/0001重传请求(携带 RcvPtr)数据
Retry_Ack Block0001/0010重传确认(携带 RdPtr/WrPtr/NumFreeBuf)数据
Crd_Ack Block0010/0100Credit 返回 + ACK 返回数据
Param_Exchg Block0011/0000邻居通告(网络层信息交换)控制
Lane_Manage Block0100/0001动态 lane 增减(X1/X2/X4/X8)控制
Block_Mode_Chg Block0101/0000CRC ↔ Non-CRC 模式切换控制
Init Block1100/1000初始化参数协商(5–32 flits)控制

初始化自协商

DLL_Param_Init 状态下交换 Init Block,协商以下参数(取两端支持的最小交集):

参数说明默认值
DATA_CREDIT_GRAIN_SIZEDLLDP 中 CRD 字段返回 credit 粒度(per VL)4 cells
CTRL_CREDIT_GRAIN_SIZECrd_Ack Block CRD_NUM 返回 credit 粒度(per VL)1 cell
FEATURE_ID协议版本1
RXBUF_VL_SHARE接收端 buffer 是否支持 VL 共享不共享
DATA_ACK_GRAIN_SIZEDLLDP ACK 返回粒度32 flits
CTRL_ACK_GRAIN_SIZECrd_Ack ACK_NUM 返回粒度1 flit
FLOW_CTRL_SIZE1 cell = ? flits8 flits
VL_ENABLE启用哪些 VL(VL0 必须启用)VL0 only
RETRY_BUF_DEPTH重传 buffer 深度直接采用对端值
PACKET_MIN_INTERVAL连续 DLLDP 最小间隔直接采用对端值

协商失败 → 使用默认值。

VL 机制

  • 每条点到点链路最多 16 个 VL(Virtual Lane)
  • 同一 DLLDP 的所有 DLLDB 走同一 VL
  • 同 VL 内 FCFS;跨 VL 调度由实现决定
  • DLLCB 不消耗 credit,不需要指定 VL
  • 网络层 SL→VL 映射配合实现端到端 QoS

Credit 流控

基本模型

  • 接收端按 VL 分配 credit 给发送端
  • 发送端维护 per-VL credit 计数器:发送扣减,收到 credit 返回增加
  • Cell 为最小单位:1 cell = n flits(n ∈ {1,2,4,8,16,32,64,128},协商确定)
  • 最大 credit 数:65535 cells
  • DLLDP 消耗 credit = ⌈flits / flits_per_cell⌉

Exclusive 模式

  • 每个 VL 独占固定 credit,互不共享
  • 简单可预测

Sharing 模式

  • 所有 VL 共享 SHARE_CRD 池 + 每个 VL 有最低 exclusive credit 保底
  • 发送时优先使用共享 credit,不足时用 exclusive credit
  • credit 返回时全部归入 SHARE_CRD,然后检测各 VL exclusive credit 是否低于阈值并补充
  • 更高 buffer 利用率,适合流量不均匀场景

Credit 返回途径

  1. DLLDP 内嵌:LPH/LBH 的 CRD 字段(粒度 DATA_CREDIT_GRAIN_SIZE)
  2. Crd_Ack Block:CRD_NUM 字段(粒度 CTRL_CREDIT_GRAIN_SIZE)
  3. 阈值触发:待返回 credit 达阈值 → 反压 + 强制发 Crd_Ack Block

重传机制

Go-Back-N

  • 接收端检测 CRC/FEC 错误 → 发 Retry_Req_Set(1 Retry_Idle + 32 Retry_Req)
  • 发送端从 RcvPtr 开始重传所有后续 flit
  • Retry Buffer:发送端缓存已发未确认的 flit

Retry Buffer 管理

  • NumFreeBuf:空闲空间
  • WrPtr:最新写入位置
  • TailPtr:最早未确认位置
  • RdPtr:重传读取位置
  • RcvPtr:接收端期望位置(对端 buffer 中的偏移)

双状态机

RETRY_REQ_SM(接收端)NORMAL → REQ → WAIT → RETRAIN → ERROR

  • NORMAL 检测错误 → REQ 发 Retry_Req_Set → WAIT 等 Retry_Ack_Set
  • 超时 → 回到 REQ 重试(NUM_RETRY++)
  • NUM_RETRY 达阈值 → RETRAIN(触发物理层 retrain)
  • NUM_PHY_REINIT 达阈值 → ERROR(需 UBFM 复位)
  • 推荐:NUM_RETRY_THRESHOLD=15, NUM_PHY_REINIT_THRESHOLD=4

RETRY_ACK_SM(发送端)NORMAL ↔ ACK

  • 收到 Retry_Req_Set → ACK 态,发 Retry_Ack_Set + 重传 flit → 回 NORMAL

Retry Buffer 死锁预防

高误码率下两端 retry buffer 可能互锁(都满,无法发 ACK)。解决方案:NumFreeBuf < 阈值时停止发 DLLDP/其他 DLLCB,优先发 Crd_Ack Block 释放对端 buffer。

异常处理

异常处理
接收 buffer 溢出上报错误,等 UBFM 复位
Credit 溢出上报错误,等 UBFM 复位
Credit 返回超时上报错误,等 UBFM 复位
Retry ACK 超时自动重试 → retrain → ERROR
ERROR_FLAG 包正常上传,在完整 DLLDP 处丢弃

封装模式切换流程

CRC ↔ Non-CRC 通过 Block_Mode_Chg Block 协调:

  1. 物理层发起(BER 触发或软件请求)
  2. 本端反压网络层 → 发 Block_Mode_Chg_REQ → 对端反压 → 发 Block_Mode_Chg_REQ
  3. 双端 flush 待发 ACK → 发 Block_Mode_Chg_ACK
  4. 物理层 retrain → 新模式生效 → 解除反压

协议栈关联

  • Ub Physical Layer — 物理层提供 FEC 和 SerDes 服务,数据链路层在此基础上构建可靠性
  • Ub Network Layer — 数据链路层为网络层提供 VL 通道和点到点可靠传输
  • Unifiedbus Ub — UB 协议整体架构

与其他协议对比

特性UBInfiniBandPCIe
基本传输单元Flit (20B)Flit (可变)TLP
VL 数量16168 TC
流控Credit-based per VLCredit-based per VLCredit-based per VC
重传Go-Back-N + retry bufferGo-Back-N重试机制不同
封装模式CRC / Non-CRC 动态切换固定 CRC固定 LCRC/ECRC
Lane 管理动态 X1/X2/X4/X8静态宽度Link width 可配
链路初始化4 阶段状态机类似多阶段LTSSM

来源

  • UB Base Specification Rev 2.0, §4 Data Link Layer(完整章节)

Citations

[1] UB-DL-ch4.md