跳到主要内容

G5 PAXICore 事务层设计规格

版本:1.2.0 状态:Draft 创建日期:2026-04-21 最后更新:2026-06-01 作者:xiang.li 前置互联通信G5仿真建模设计规格

变更历史

版本日期变更说明
1.2.02026-06-01按 spec 模板重构文档结构:9 节中文 H2 重排、新增名词定义与非功能性需求、完整字段表下沉附录 C
1.1.02026-05-12引入 frame 粒度作为 PAXICore 与下游接口契约,新增粒度分层契约章节,TxnTracker 改为按 frame 计数
1.0.02026-04-21初版:两级背压架构、drain 级联、OST 管理、MPS 分段

@tbl-spec-paxi-01 文档变更历史


概述

PAXICore 是 PAXI 协议栈的事务层模块,管理 AXI 事务级的 Outstanding 限制和 MPS 分段。本 spec 定义 G5 仿真中 PAXICore 的完整设计:两级 pending queue 背压架构(OST 层 + RC Link Slot 层)、drain 级联链条、零字节事务特殊处理、以及 PAXICore 与 RC Link TX 的衔接机制。

背景

总 spec 对 PAXICore 的描述覆盖 OST 管理和 MPS 分段公式,但缺以下四项设计细节,导致无法分析高负载场景的性能瓶颈:

  • 只描述一层 pending_queue(OST 满时排队),未描述第二层 segment_queue(RC Link Slot 满时的背压)。仿真中实际存在两级背压。
  • drain 级联链条未描述:ACK → slot 释放 → segment_queue drain → OST 释放 → pending_queue drain 的完整级联路径。
  • 零字节事务(tcredit)的特殊分段逻辑未描述:MPS 公式对 data_bytes=0 的边界处理。
  • PAXICore 与 RC Link TX 的协作方式未描述:PAXIBridge 如何协调两者的 feed 和 drain。

两级背压是背压传播分析的关键。当 RC Link Slot 耗尽时,背压从 RC Link 传递到 PAXICore 的 segment_queue,进而影响 OST 释放和后续事务提交。

名词定义

名词定义与易混淆概念的区分
事务(Transaction)一次 paxi.submit() 的完整 AXI 操作,对应 CDMA 一条 Transfer 指令,data_bytes 任意OST 占用单元;比 frame 粒度大
FrameMPS 分段单元,≤ MPS (4096B),对应 PAXI UserGuide 中"一个 AXI burst 一个 frame"PAXICore 对外最小事件粒度;与 packet 区分——frame 是 PAXICore↔RC Link 接口单元,packet 是 RC Link 内部单元
PacketRC Link 内部 retry 单元,≤ max_payload (1344B)PAXICore 不感知 packet 级 ACK;与 frame 区分见上
OST(Outstanding)同时在途的事务数限制,W_OST / R_OST 独立计数事务级资源;与 Slot 区分——OST 限事务数,Slot 限 frame 在途数
Slot(RC Link Slot)RC Link TX 的 frame 在途槽位,共 512 个与 OST 区分见上
pending_queue第一层背压队列,OST 耗尽时事务在此排队与 segment_queue 区分——pending 存事务,segment 存 frame 描述符
segment_queue第二层背压队列,Slot 耗尽时 frame 描述符在此排队(语义上是 frame_queue)与 pending_queue 区分见上
TxnTracker单个事务的追踪记录,按 frame 计数完成进度
SegmentInfo单个 frame 的描述符,PAXICore 提交给 RC Link TX 的最小单元即 frame 的承载结构
drain资源释放后从队列取出排队项继续推进的动作feed_rc_link drain segment_queue;drain_pending drain pending_queue
FACK零字节 frame 在 RC Link RX 端触发的响应,用于 tcredit 握手

目标与非目标

目标

  • 目标 1:定义两级 pending queue 背压架构及其语义
  • 目标 2:定义 drain 级联链条的完整路径
  • 目标 3:定义零字节事务的分段特殊处理
  • 目标 4:定义 PAXIBridge 中 PAXICore 与 RC Link TX 的协作机制

非目标

  • 非目标 1:TX Buffer 积攒策略(AR/B 通道最多 16 笔打包发出,属硬件行为,仿真不建模此级别延迟)
  • 非目标 2:硬件 VC 映射 Mode 0/Mode 1 选择(仿真固定使用 qp_id & 3 的 Bank 映射)
  • 非目标 3:RX 方向 OST 约束(rx_ost_constr_en 寄存器控制的 RX Master 行为)

用例说明

走一遍一个 8192B Transfer 经过 PAXICore 的完整流程。假设 CDMA 提交 Transfer(dst=1, data_bytes=8192):

  1. OST 检查:W_OST 当前已用 200,上限 256,200 < 256 通过。W_OST 分配一个 slot(201)。
  2. MPS 分段:8192B / 4096B = 2 个 frame。每个 frame 内 ceil(4096 / 1344) = 4 个 packet(packet 数仅 RC Link 内部使用)。共 2 个 SegmentInfo。
  3. 创建 TxnTracker:记录 txn_id, total_frames=2, acked_frames=0。
  4. 提交到 RC Link TX:检查 RC Link 当前 free slot。假设 free slot 充足 → 2 个 SegmentInfo 提交到 RC Link TX(分配 Slot 组和 PSN 范围);若 Slot 不足,超出的 SegmentInfo 进入 segment_queue 等待。
  5. ACK 陆续到达:每个 frame 级 ACK 释放 RC Link Slot → PAXIBridge.feed_rc_link() 从 segment_queue 取出 SegmentInfo 提交到 RC Link。
  6. 事务完成:2 个 frame 全部 ACK → acked_frames == total_frames → 释放 W_OST slot → 检查 pending_queue,若有等待 OST 的事务则 drain。

详细设计

概念模型

PAXICore 内部有两个独立的排队层,对应两种资源耗尽场景:

层级队列排队原因容量限制
第一层pending_queue (VecDeque)OST 耗尽(W_OST 或 R_OST 达上限)W_OST_LIMIT / R_OST_LIMIT (各 256)
第二层segment_queue (VecDeque)RC Link Slot 耗尽(512 个 Slot 全部占用)TYPE1_OST (512)

@tbl-spec-paxi-02 两级背压架构:层级,队列

背压传播方向:

CDMA submit
→ OST 检查
→ 通过: MPS 分段 → 提交到 RC Link TX
→ Slot 有空: 分配 Slot + PSN
→ Slot 满: 入 segment_queue (第二层)
→ OST 满: 入 pending_queue (第一层)

事务追踪由 TxnTracker 承载,按 frame 计数完成进度。每收到一个 frame 的 ACK(on_frame_acked),acked_frames++;全部 frame 完成时释放 OST 并按 op_type 生成事件:

  • Transfer/Send → DataArrived(通知 CDMA 源端和目标端)
  • Receive → TcreditArrived(tcredit 到达目标芯片)

TxnTracker 完整字段表见附录 C。

设计原理

为什么按 frame 计数而非 packet 计数:PAXICore 与上下游的粒度契约对齐 PAXI SUE2.0 UserGuide §2.1.1 Flit Rules("Paxi packages the entire write or read burst into a single frame and transmits it to the rclink")。frame 是 PAXICore 对外最小事件粒度,packet 级 PSN / Go-Back-N retry 封装在 RC Link 内部,对事务层透明。三层粒度关系见 @tbl-spec-paxi-granularity(附录 C)。

[NEEDS CLARIFICATION: frame 切分语义存疑——PAXI UserGuide §2.1.1 原文为"整个 burst 打包成单个 frame"(burst:frame = 1:1),而本 spec 按 MPS 切 frame;且 MPS 硬件默认 256B,本 spec 取 4096B(可选最大档)。需确认建模意图是"每个 4096B burst 一 frame"还是"PAXICore 自行按 MPS 切 frame",待硬件/设计确认]

契约约束:

  • PAXICore 提交给 RC Link 的最小单元是 frame(SegmentInfo),不是 packet。
  • PAXICore 接收 RC Link 的完成通知是 frame 级(on_frame_acked),对应 AXI B/R channel 响应。
  • packet 级 ACK 在 RC Link 内部驱动 Go-Back-N retry 状态机,RC Link 仅在 frame 内所有 packet 成功 ACK 后才向 PAXICore 上报 on_frame_acked

为什么 W_OST / R_OST 独立计数:写和读是两种独立资源池,W_OST / R_OST 各取 256(项目仿真取值;SG2262 CDMA spec 实际为 rd 128 / wr 512(512B)·1024(256B),256 为建模简化值,待核实)。

为什么固定 Mode 1 VC 映射:仿真只涉及单向数据传输(CDMA write),不需要 REQ/RSP 分离(Mode 0)来防止死锁,故固定使用 QPID Bank 映射。

算法 / 公式

MPS 分段(frame 划分):将 AXI 事务按 MPS (4096B) 拆分为 frame:

$$\begin{equation} \text{frames} = \lceil \text{data\_bytes} / \text{MPS} \rceil \label{eq:paxi-frame-count} \end{equation}$$

每个 frame 进入 segment_queue(语义上是 frame_queue)。RC Link 内部将 frame 切分为 packet 用于 retry 追踪:

$$\begin{equation} \text{每 frame 内 packet 数} = \lceil \text{frame\_bytes} / \text{max\_payload} \rceil \label{eq:paxi-frame-packets} \end{equation}$$

此 packet 数仅 RC Link 内部使用,PAXICore 不维护。

VC 分类:PAXICore 将每个 SegmentInfo 分配到 VC:

$$\begin{equation} \text{vc\_id} = \text{qp\_id} \mathbin{\&} 3 \label{eq:paxi-vc-mapping} \end{equation}$$

映射到 Bank0-3(VC 0-3)。MUL VC (VC 4) 当前未使用。

约束与规则

OST 提交约束

  1. 根据 op_type 判断使用 W_OST 还是 R_OST。
  2. 检查对应 OST 计数 < 上限。
  3. 通过:OST++,创建 TxnTracker,执行 MPS 分段,输出 SegmentInfo 列表。
  4. 未通过:整个事务入 pending_queue,等待 OST 释放后 drain。

OST 释放约束:事务的所有 frame 全部 ACK → on_frame_acked 中 acked_frames == total_frames → 释放 OST → drain_pending。

零字节事务特殊处理:当 data_bytes == 0(tcredit 包)时,公式 ceil(0/4096) = 0 会产生零 frame。此时强制 frames = 1,生成一个 frame_bytes = 0 的 frame 描述符。零字节 frame 在 RC Link RX 端触发 FACK(见 RC Link spec),用于 tcredit 握手。

无反压循环约束:submit() 中 PAXICore 返回的 SegmentInfo 数量受 rc_link_capacity(当前 free slot 数)限制,超出的留在 segment_queue。一次 submit 不会触发 feed_rc_link 循环调用。

集成点

drain 级联链条(由 ACK 触发):

Frame 全部 packets ACK 到达 RC Link TX
→ RC Link TX 聚合后回 frame-level ACK
→ 释放该 frame 占用的 Slot 组 (WaitAck → Empty)
→ 调用 PAXICore.on_frame_acked(txn_id)
→ acked_frames++
→ 如果事务完成: 释放 OST → drain_pending()
→ pending_queue 头部事务尝试获取 OST
→ 获取成功: MPS 分段(frame 划分)→ frame 描述符入 segment_queue
→ PAXIBridge.feed_rc_link()
→ 从 segment_queue 取 frame 描述符
→ 提交到 RC Link TX(分配 Slot 组 + PSN 范围)
→ 直到 segment_queue 为空或 Slot 再次耗尽
  • feed_rc_link 调用时机:每次 ACK 释放 Slot 后调用。从 segment_queue 取尽可能多的 SegmentInfo 提交到 RC Link TX,直到 segment_queue 为空或 free_slot_count 为 0。
  • drain_pending 调用时机:每次 OST 释放后调用。从 pending_queue 头部取事务尝试 OST 分配,成功则分段并将 SegmentInfo 追加到 segment_queue。

PAXIBridge 协作:PAXIBridge 组合 PAXICore (TX) 和 RC Link TX/RX,对外提供统一 submit/receive 接口。

submit 路径:

  1. CDMA 调用 PAXIBridge.submit(dst, data_bytes, op_type, ...)。
  2. PAXIBridge 调用 PAXICore.submit() → 返回 SegmentInfo 列表(可能部分进入 segment_queue)。
  3. PAXIBridge 调用 feed_rc_link() → 将 segment_queue 内容提交到 RC Link TX。

ACK 路径:

  1. RC Link TX 调用 on_ack_released(slot_idx)。
  2. PAXIBridge 调用 PAXICore.on_frame_acked(txn_id) → 可能触发 drain_pending。
  3. PAXIBridge 调用 feed_rc_link() → drain segment_queue。

备选方案

维度两层 (选定)单层 (只有 OST queue)
背压保真度高:区分 OST 满和 Slot 满两种瓶颈低:混淆两种不同的阻塞原因
瓶颈定位可区分事务级瓶颈 vs 包级瓶颈只能看到整体阻塞
实现复杂度两个队列 + 级联 drain一个队列

@tbl-spec-paxi-05 单层 vs 两层 pending queue:维度,两层 (选定)

选择理由:OST 和 Slot 是两种独立资源,耗尽时机和恢复路径不同,单层队列会掩盖真实瓶颈位置。例如 OST 充足但 Slot 耗尽的场景(大量小事务,每事务只需 1 个 OST 但占用多个 Slot),单层队列无法建模。


非功能性需求

维度本 spec 的考虑
性能 (Performance)两级背压队列均用 VecDeque,FIFO O(1) 入队出队;feed_rc_link 按需消费 segment_queue,不一次性溢出
可靠性 (Reliability)packet 级 retry / PSN 封装在 RC Link 内部;frame 级完成判定要求全部 packet ACK,部分失败由 RC Link Go-Back-N 重传,PAXICore 不感知
兼容性 (Compatibility)frame 粒度契约对齐 PAXI SUE2.0 UserGuide §2.1.1,底层 RC Link 仍按 packet 处理 retry,对 PAXICore 暴露 frame-level 完成事件
安全性 (Security)本 spec 模块在芯片内部数据通路运行,不涉及鉴权 / 加密
可观测性 (Observability)通过 pending_queue 长度和 segment_queue 长度区分两类瓶颈来源

局限与后续工作

局限(本设计的代价)

风险 / 局限影响缓解措施
segment_queue 无大小限制理论上可无限增长实际受 OST 上限约束:最多 256 事务 × 每事务若干 segment
drain_pending 不检查 segment_queue 容量可能一次性产生大量 SegmentInfofeed_rc_link 按需消费,不会实际溢出
零字节事务的 1-segment 硬编码非通用解决方案只有 tcredit 用零字节,语义明确

@tbl-spec-paxi-06 风险与缓解措施

后续工作(后续扩展方向)

方向优先级前置条件
TX Buffer 积攒延迟建模需要 AXI 事务级时序模型
REQ/RSP VC 分离 (Mode 0)需要读操作支持
多播事务支持需要 TYPE2 VC4 + 双重流控

@tbl-spec-paxi-08 未来方向


验收标准

场景指标目标值测试方法
OST 耗尽事务排队新事务入 pending_queue,OST 释放后 drain提交 > 256 事务,检查 pending_queue 长度变化
Slot 耗尽segment 排队SegmentInfo 入 segment_queue,ACK 后 drain提交大事务(> 512 包),检查 segment_queue
级联 drain全链路恢复ACK → slot 释放 → segment drain → OST 释放 → pending drain同时触发两层背压,检查恢复顺序
零字节事务正确分段生成 1 个 payload=0 的 SegmentInfo提交 data_bytes=0 事务,检查输出
事务完成事件正确Transfer → DataArrived, Receive → TcreditArrived检查事件类型与 op_type 对应

@tbl-spec-paxi-07 验收标准


附录

附录 A:业界调研

(本节内容已并入正文 §设计选型;原引用的 PAXI / 2262-C2C 硬件资料整理已归档。)

附录 B:实现说明

实现完成后补充,记录 spec 与实际实现的偏差。

  • [2026-04-21] PAXICore 的 W_OST_LIMIT 默认 256(项目仿真取值;SG2262 CDMA spec 实际为 rd 128 / wr 512(512B)·1024(256B),256 为建模简化值,待核实),RC Link TYPE1_OST 默认 512。两者是独立的资源池。
  • [2026-04-21] segment_queue 和 pending_queue 均使用 VecDeque 实现 FIFO 语义。

附录 C:完整接口签名 / 数据结构

粒度分层契约

粒度PAXICore 视角
事务(Transaction)任意(一次 paxi.submit() 的 data_bytes)OST 占用单元;对应 CDMA 一条 Transfer 指令
Frame(= MPS segment)≤ MPS (4096B)PAXICore 对外的最小事件粒度;对应 PAXI UserGuide 中一个 AXI burst 一个 frame;frame 完成事件通知上层
Packet≤ max_payload (1344B)RC Link 内部 retry 单元;PAXICore 不感知 packet 级 ACK

@tbl-spec-paxi-granularity 粒度分层契约

TxnTracker 字段

字段含义
txn_id全局唯一事务 ID
total_frames该事务的总 frame 数
acked_frames已收到 frame 级 ACK 的数量
op_typeTransfer / Send / Receive
src_chip, dst_chip源/目标芯片
cmd_idCDMA 指令 ID
thread_id, remote_thread_id线程标识,用于 tcredit/write_done 路由

@tbl-spec-paxi-03 事务追踪 (TxnTracker):字段,含义

frame 描述符(SegmentInfo)字段:每个 frame 携带 (txn_id, frame_bytes, vc_id, dst, qp_id, op_type, lg_id, earliest_ready_ns)。

参数配置

参数含义默认值
W_OST_LIMIT写 OST 上限256
R_OST_LIMIT读 OST 上限256
MPSMaximum Payload Size4096B
MAX_PAYLOADRC Link 最大包负载1344B

@tbl-spec-paxi-04 参数配置