G5 PAXICore 事务层设计规格
版本:1.2.0 状态:Draft 创建日期:2026-04-21 最后更新:2026-06-01 作者:xiang.li 前置:互联通信G5仿真建模设计规格
变更历史
| 版本 | 日期 | 变更说明 |
|---|---|---|
| 1.2.0 | 2026-06-01 | 按 spec 模板重构文档结构:9 节中文 H2 重排、新增名词定义与非功能性需求、完整字段表下沉附录 C |
| 1.1.0 | 2026-05-12 | 引入 frame 粒度作为 PAXICore 与下游接口契约,新增粒度分层契约章节,TxnTracker 改为按 frame 计数 |
| 1.0.0 | 2026-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 粒度大 |
| Frame | MPS 分段单元,≤ MPS (4096B),对应 PAXI UserGuide 中"一个 AXI burst 一个 frame" | PAXICore 对外最小事件粒度;与 packet 区分——frame 是 PAXICore↔RC Link 接口单元,packet 是 RC Link 内部单元 |
| Packet | RC 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):
- OST 检查:W_OST 当前已用 200,上限 256,200 < 256 通过。W_OST 分配一个 slot(201)。
- MPS 分段:8192B / 4096B = 2 个 frame。每个 frame 内 ceil(4096 / 1344) = 4 个 packet(packet 数仅 RC Link 内部使用)。共 2 个 SegmentInfo。
- 创建 TxnTracker:记录 txn_id, total_frames=2, acked_frames=0。
- 提交到 RC Link TX:检查 RC Link 当前 free slot。假设 free slot 充足 → 2 个 SegmentInfo 提交到 RC Link TX(分配 Slot 组和 PSN 范围);若 Slot 不足,超出的 SegmentInfo 进入 segment_queue 等待。
- ACK 陆续到达:每个 frame 级 ACK 释放 RC Link Slot → PAXIBridge.feed_rc_link() 从 segment_queue 取出 SegmentInfo 提交到 RC Link。
- 事务完成: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 提交约束:
- 根据 op_type 判断使用 W_OST 还是 R_OST。
- 检查对应 OST 计数 < 上限。
- 通过:OST++,创建 TxnTracker,执行 MPS 分段,输出 SegmentInfo 列表。
- 未通过:整个事务入 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 路径:
- CDMA 调用 PAXIBridge.submit(dst, data_bytes, op_type, ...)。
- PAXIBridge 调用 PAXICore.submit() → 返回 SegmentInfo 列表(可能部分进入 segment_queue)。
- PAXIBridge 调用 feed_rc_link() → 将 segment_queue 内容提交到 RC Link TX。
ACK 路径:
- RC Link TX 调用 on_ack_released(slot_idx)。
- PAXIBridge 调用 PAXICore.on_frame_acked(txn_id) → 可能触发 drain_pending。
- 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 容量 | 可能一次性产生大量 SegmentInfo | feed_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_type | Transfer / Send / Receive |
| src_chip, dst_chip | 源/目标芯片 |
| cmd_id | CDMA 指令 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 |
| MPS | Maximum Payload Size | 4096B |
| MAX_PAYLOAD | RC Link 最大包负载 | 1344B |
@tbl-spec-paxi-04 参数配置