04. SG2262 C2C 通信协议与数据通路
本文档覆盖 PAXI 协议桥、Send/Receive 通信流程、报文格式、流控与背压机制。行为级描述:硬件做什么、怎么做、什么时候做。
信息来源标注:[DOC] = 原始方案文档, [PPT] = feature PPT, [推导] = 从文档推导。
PAXI 协议桥
定位与基本参数
[DOC] PAXI 是 AXI 协议的跨芯片透明桥接 (AXI Bridge)。从上层软件视角,远端芯片内存与本地 AXI 地址空间无差异。
[DOC] 物理参数:
| 参数 | 值 | 说明 |
|---|---|---|
| link_count | 8 | 8 组 x4 SerDes link |
| lanes_per_link | 4 | 每组 4 lane |
| serdes_rate_gbps | 112.0 | 单 lane 速率 |
| total_bw_gbps | 448.0 | 8 * 4 * 112 / 8 (GB/s) |
| max_payload_bytes | 1344 | 单报文最大有效载荷 |
| header_overhead_bytes | 50 | 报头开销 |
| max_ost | 512 | TYPE1 outstanding 请求上限 |
TX Buffer 积攒与发出策略
[DOC] PAXI TX Buffer 根据 AXI 事务类型采用不同的积攒策略,核心权衡是小包延迟 vs. 大包吞吐:
| AXI 事务类型 | 积攒规则 | 行为描述 |
|---|---|---|
| AW+W (写请求) | 必须收齐整个 burst 才发送 | AW 等待 W 通道最后一拍 (wlast),收齐后打包为一笔 PAXI 报文发出 |
| AR (读请求) | 按水位/超时/DA 切换触发打包 | 最多积攒 16 笔 AR 事务后打包发出;水位线到达或超时同样触发发送 |
| B (写响应) | 与 AR 相同的打包策略 | 最多积攒 16 笔 B 响应后打包发出 |
[推导] 延迟影响:小包场景下 TX Buffer 需要等待积攒,引入额外延迟;大包场景下 burst 本身较长,积攒开销占比低,有效提高吞吐。
8 VC 通道仲裁
[DOC] PAXI 内部使用 8 条 Virtual Channel (VC),通过加权轮询仲裁决定哪条 VC 获得发送权。
[DOC] VC 映射规则 (Mode 0 默认配置):
| AXI 通道类型 | 映射 VC | 说明 |
|---|---|---|
| REQ (请求) | VC0 / VC2 | 写请求 / 读请求 |
| RSP (响应) | VC1 / VC3 | 写响应 / 读响应 |
| MUL (组播) | VC4 | 组播报文专用 |
[DOC] 设计要点:
- REQ 和 RSP 使用不同 VC,防止请求-响应死锁(响应永远有通道可走)
- 加权轮询权重:REQ/RSP = 0x0008, MUL = 0x0100(组播优先级显著高于单播)
CBFC/PFC 流控
[DOC] PAXI 支持两种流控机制,二者互斥,不能同时启用。
CBFC (Credit-Based Flow Control) 模式:
| 项目 | 描述 |
|---|---|
| 工作原理 | 发送方按 per-VC 追踪 credit;每发一笔消耗 credit,收到 ack 回收 credit |
| credit 粒度 | 32 ~ 2048B 可配 |
| 阻塞条件 | 某 VC credit 不足时,该 VC 阻塞,上游 CDMA 被背压 |
| 适用交换机 | 先进交换机(支持 CBFC 协议) |
PFC (Priority Flow Control) 模式:
| 项目 | 描述 |
|---|---|
| 工作原理 | 接收方按 RX buffer 水位线控制发送方 |
| 触发暂停 | RX buffer 超过 high_watermark -> 发送 PFC PAUSE (per-priority) |
| 恢复发送 | RX buffer 降到 low_watermark -> 发送 PFC RESUME |
| 适用交换机 | 典型以太网交换机(标准 PFC 支持) |
OST 限制
[DOC] TYPE1 请求最多 512 outstanding。当 outstanding 请求数达到 512 时,PAXI 停止接受新的 TYPE1 请求,直至收到响应释放 slot。
报文封装效率
[推导] 有效带宽按最大 payload 计算:
有效带宽 = raw_bw * payload / (payload + header)
= 448 * 1344 / (1344 + 50)
= 432.0 GB/s (约 96.4% 封装效率)
[推导] 封装效率随 payload 减小而下降。当 payload 远小于 max_payload_bytes 时(如 256B 小报文),header 占比上升,有效带宽显著降低。
Send/Receive 完整流程
核心机制
[DOC] Send/Receive 的核心优势:地址可动态分配(无需预分配片间交互地址),通过配对完成发送方和接收方的同步。
替代方案:如不支持 Send/Receive,可通过 write + msg 方式替代,但地址需在运行模型前预分配好,且所有芯片的片间交互地址需相同。
配对规则
[DOC] Send/Receive 配对约束(严格 thread 级一一对应):
| 规则 | 描述 |
|---|---|
| Send 配对 | 每个 CDMA Thread 的 Send 只能与一个对端 Chip 的一个 CDMA Thread 配对 |
| Receive 配对 | 每个 CDMA Thread 的 Receive 只能与一个对端 Chip 的一个 CDMA Thread 配对 |
| 跨芯片灵活性 | 同一 CDMA Thread 的 Send 和 Receive 可与不同芯片配对 |
| 一对多限制 | 不支持一对多发送(一个 Send Thread 不能同时发给多个 Receive Thread) |
| 多对一接收 | 支持:一个 Send Thread 可收集来自多个 Receive Chip 的 tcredit |
[DOC] 多 tcredit 收集能力:
- Send Chip 的 CDMA Thread N 可同时持有来自不同 Receive Chip 的 tcredit
- 每个 tcredit 通过
chipid + cdmaid唯一标识,存入 tcredit tracker - write_done 需分别发送到各 Receive Chip 对应的 write_done 地址
- 这不意味着一对多通信 -- 每个 tcredit 仍代表一次独立的 thread 级一对一配对
tcredit 机制
[DOC] tcredit 存储与 tracker 实现:
| 项目 | 实现方式 |
|---|---|
| tcredit 数据存储 | 放入 SRAM(多个线程共享同一 SRAM) |
| tracker 匹配标识 | chipid + cdmaid 使用专用寄存器实现 |
| 队列深度 | 32 per CDMA |
| 一次通信最大指令数 | 30 条(通信之间可全系统同步) |
| 设计演变 | 从 FIFO 改为 tracker 结构,以支持多 Receive Chip 场景下按 chipid 区分 |
[PPT] Descriptor 配对要求:
- Send descriptor 需指定 receive chip 和 receive cdma thread
- Receive descriptor 需指定 send chip 和 send cdma thread
CFS 模式流程
[DOC] CFS (C2C Fence Sequence) 模式使用 non-post write 请求。Send 指令自带 fence 语义:必须收齐所有 write_send 的 bresp 后才能发送 write_done。
完整 9 步流程:
| 步骤 | 执行方 | 动作 |
|---|---|---|
| 1 | Receive Chip | CDMA Thread 收到 Receive 指令 |
| 2 | Receive Chip | 将 receive 指令内容打包进 wdata,连同 cdmaid 一起,发送 tcredit 报文给对应 Send Chip CDMA Thread |
| 3 | Send Chip | CDMA Thread 收到所属 tcredit (chipid+cdmaid 匹配),结合已有的 Send 指令,进入 Ready 状态 |
| 4 | Send Chip | 获得 Datapath 仲裁,执行搬运:连续发出多笔 write_send 报文 (awuser 携带 reduce_opcode) |
| 5 | Send Chip | 搬运完成,Datapath 退出,将剩余 Bresp 个数信息交付 CDMA Thread(Datapath 只负责发送,不等 Bresp) |
| 6 | Send Chip | Thread 独立收集 Bresp,逐一收集所有 write_send 对应的 bresp |
| 7 | Send Chip | 所有 Bresp 收齐,发送 write_done 报文给 Receive Chip(写入 descriptor 指定的 write_done 地址),Retire Send 指令 |
| 8 | Receive Chip | 收到 write_done,发送 bresp 给 Send Chip(确认 write_done 接收),Retire Receive 指令 |
| 9 | Send Chip | 收到 write_done 的 bresp,完成整个 Send/Receive 周期 |
[DOC] CFS 关键约束:
| 约束项 | 说明 |
|---|---|
| 写请求类型 | non-post write(必须等待远端 bresp) |
| fence 语义 | Send 指令默认自带 fence:收齐所有 write_send 的 bresp 后才 retire |
| Datapath 退出时机 | 发完所有 write_send 后立即退出,bresp 收集交还 thread |
| Send/Receive 切换 | 不需要做同步(但可以做) |
| 一次通信最大指令数 | 30 条 |
CHS 模式流程
[DOC] CHS (C2C post-write Hardware Sequence) 模式使用 post write 请求。与 CFS 流程几乎相同,关键差异在于 write_done 与前置 write_send 的保序机制不同。
[DOC] CHS 与 CFS 的差异步骤:
- 步骤 1~3:与 CFS 完全相同
- 步骤 4 (Bresp 收集):由于使用 post write,MAC 回复 early resp 后即视为完成,无需等待数据真正写入远端内存
- 步骤 5 (write_done 发送):write_done 地址必须配置在保序窗口内;write_done 报文发出后,不由 Send Thread 直接控制释放,而是由 c2c_sys 在保序窗口中等待,确认所有前置 write_send 已在远端执行完成后,才释放 write_done 报文给下游
- 步骤 6~9:与 CFS 相同
[DOC] CFS vs CHS 核心差异对比:
| 差异点 | CFS 模式 | CHS 模式 |
|---|---|---|
| 写请求类型 | non-post write | post write |
| write_done 保序方式 | fence 指令保序:Send 指令自带 fence,收齐所有 bresp 后才发 write_done | 保序窗口保序:write_done 地址在保序窗口内,硬件保证前置写完成后才释放 |
| write_done 地址约束 | 无特殊约束 | 必须落在保序窗口配置范围内 |
| write_done 释放主体 | Send Thread 收齐 bresp 后主动发送 | c2c_sys 在确认前置 write_send 完成后自动释放 |
| 量化反量化传输 | 支持重封包/重解包 | 不支持重封包/重解包(只能根据量化前 ITLV 粒度封包) |
报文格式
AXI User 信号
[DOC] C2C 使用 AXI user 信号传递芯片间路由信息:
| 信号 | 用途 |
|---|---|
| dst_chipid | 目标芯片 ID(MAC 层映射为 dst macid 进行寻址) |
| src_chipid | 源芯片 ID(在源芯片 MAC 层挂载) |
| src_chipen | 标识请求是否由本芯片发起(1 = 本芯片发起,0 = 转发) |
转发场景
[DOC] 多跳转发场景下的报文流程(以 Chip A -> Chip B -> Chip C 为例):
| 步骤 | 位置 | 动作 |
|---|---|---|
| 1 | Chip A (源) | 发出请求:awuser 携带 dst_chipid=C,MAC 挂载 src_chipid=A,src_chipen=1 |
| 2 | Chip B (中继) | 识别 dst_chipid != 本芯片,执行转发,保持 src_chipid=A,设置 src_chipen=0 |
| 3 | Chip C (目标) | 识别 dst_chipid = 本芯片,使用 src_chipid=A 作为响应目标 |
| 4 | Chip C -> B -> A | Bresp/Rresp 经 Chip B 转发回 Chip A |
Send/Receive 报文类型
[DOC] Send/Receive 涉及的四种报文类型:
| 报文类型 | 方向 | 关键字段 | 功能 |
|---|---|---|---|
| tcredit | Receive -> Send | receive 指令内容打包进 wdata + cdmaid | 通知 Send 端接收方已就绪,携带目标地址信息 |
| write_send | Send -> Receive | awuser 携带 reduce_opcode | 实际数据搬运报文 |
| write_done | Send -> Receive | 写入 descriptor 指定的 receive chip cdma write_done 地址 | 通知接收方所有数据已发送完成 |
| bresp_send | Receive -> Send | - | 确认 write_done 接收 |
All Reduce 操作码映射
[DOC] All Reduce 操作码通过 awuser 传递,在 k2k 和 C2C 之间存在位域映射关系。
awuser 格式 (k2k 侧):
| 位域 | 字段 | 含义 |
|---|---|---|
| [11:8] | psum_op | Reduce 操作类型 (sum/max/min 等) |
| [7:4] | opcode | 具体操作码 |
| [3:0] | dtype | 数据类型 (fp16/bf16/fp32 等) |
C2C 侧映射 (PCIe Link):
| Reduce_op 位域 | 映射目标 | 说明 |
|---|---|---|
| Reduce_op[4] | des_lst | 是否最后一个包 |
| Reduce_op[3:2] | psum_op | 与 k2k 侧 psum_op 对应 |
| Reduce_op[1:0] | opcode/dtype | 操作码和数据类型的压缩编码 |
Bresp 合并机制
[DOC] Bresp merge 通过 CAM (Content-Addressable Memory) 结构实现确定性合并。合并规则:相同 dst macid 的 bresp 合并成一笔报文,不同 dst macid 占据不同 CAM entry。
存入条件(满足任一即可):
| 条件 | 描述 |
|---|---|
| CAM 未满 | 有空闲 entry,新 bresp 分配到空闲 entry;或命中已有 entry 时追加 |
| CAM 满但命中未满 entry | dst macid 匹配到一个未满的现有 entry,将 bresp 合并到该 entry |
若 CAM 满且无命中 entry(所有 entry 的 dst macid 均不匹配,或匹配的 entry 已满),需先释放再存入。
释放条件(必须同时满足):
| 条件 | 描述 |
|---|---|
| 条件 1 | CAM 有某个 entry 已满,或 CAM 满且上游有新 bresp 待发送 |
| 条件 2 | PAXI ready(下游链路可接受新报文) |
释放行为:将满足条件的 entry 打包为一笔合并后的 bresp 报文发出。
Datagram 模式
[DOC] Datagram 支持软件通过配置 buffer 触发发送和接收原始以太网帧。C2C 不提供可靠性支持,全部由软件负责。
发送 Buffer
[DOC] 发送 buffer 结构:32 个元素,每元素 128B(共 4KB 地址空间),配套 size 寄存器 FIFO(深度 32)。
[DOC] 发送流程:
| 步骤 | 动作 |
|---|---|
| 1 | 复位后所有 32 个 buffer 元素为空,长度字段为 0 |
| 2 | 软件写入数据到 buffer(接收地址固定,硬件自动分配到第一个空元素) |
| 3 | 有效载荷 1~128B;帧超过 128B 时自动跨元素紧凑存储 |
| 4 | 软件配置 size 寄存器指定帧长度 -> 硬件开始发送(允许 MAC 背压) |
| 5 | 发送完成后清除长度字段,元素标记为空 |
[DOC] 溢出保护:写入导致 buffer 溢出时,对应完整帧被丢弃并报告中断。软件必须结合 reg_space_send_datagram 寄存器保证不触发帧丢弃。
接收 Buffer
[DOC] 接收 buffer 结构:32 个元素,每元素 128B(共 4KB,只读),按 MACID + Priority 匹配过滤。
[DOC] 接收流程:
| 步骤 | 动作 |
|---|---|
| 1 | PCS 收到帧后,DMAC 与 MACID 比对 + Priority 比对 |
| 2 | 匹配后依次写入 buffer 元素,完成后更新长度字段 |
| 3 | C2C 上报中断通知 CPU 介入 |
| 4 | CPU 读取长度 -> 读取帧数据(每次完整元素 128B) -> 自动指向下一帧 |
| 5 | 无空闲元素时,新帧完整丢弃并发出中断 |
寄存器
[DOC]
| 寄存器 | 描述 |
|---|---|
send_datagram[31:0] | 发送帧位置,4KB,128B 写入,只能写首元素地址,可读全地址 |
reg_rptr_send_datagram | 当前待发送首帧的首位元素指针 |
reg_space_send_datagram | 当前剩余元素空间 |
reg_size_send_datagram[15:0] | 帧长度配置,只能写首寄存器,可全部读出 |
rcv_datagram[31:0] | 接收帧位置,只读,只能读首元素地址,128B 为单位读出 |
reg_size_rcv_datagram[15:0] | 接收帧长度,只读,32bit 为单位读出 |
中断
[DOC]
| 中断类型 | 触发条件 |
|---|---|
| 发送帧中断 | 帧发送完成 |
| 接收帧中断 | 帧接收完成 |
| 发送帧溢出中断 | 写入导致 buffer 溢出(帧被丢弃) |
| 接收帧溢出中断 | 无空闲元素(帧被丢弃) |
| 读接收帧溢出中断 | 读取空元素 |
流控与背压传播路径
[DOC] 背压从 PAXI 向上游 CDMA 传播,有两条独立路径,取决于流控模式:
路径 1 -- CBFC 背压:
CDMA 发起写请求
-> PAXI TX Buffer 接收
-> 检查目标 VC credit 是否充足
-> credit 不足: 该 VC 阻塞
-> PAXI 无法接收新报文
-> CDMA 被背压,暂停发送
路径 2 -- PFC 背压:
CDMA 发起写请求
-> PAXI TX Buffer 接收
-> 检查下游 Switch 是否发出 PFC PAUSE
-> 收到 PFC PAUSE: PAXI 暂停对应 priority 的发送
-> TX Buffer 积压
-> CDMA 被背压,暂停发送
[DOC] 两条路径的共同特征:背压最终都传导到 CDMA 层,使 CDMA 暂停发起新的 AXI 事务。区别在于触发源不同 -- CBFC 由 per-VC credit 耗尽触发,PFC 由下游交换机/接收方的 buffer 水位线触发。