跳到主要内容

ISSUE-027: P2 测试补全过程中发现的 spec 与实现偏差

发现日期:2026-05-15 状态全部已修复 (MERGE_DEPTH + pe_group_mask + rd_ost_limit, 2026-05-15) 类型建模误差 (Phase 2 计划已存在,部分行为偏差) 影响范围:控制面 ACK 聚合粒度 (已修),读 OST 背压 (已修),Scatter 目标选择 (已修). 仿真器对相应硬件契约的 enforcement 已全部对齐 spec.


问题现象

在执行 B.P2 测试缺口补全过程中,写测试时发现三处 spec 描述与 G5 仿真器代码当前实现存在契约差异。测试通过锁定当前实现行为,但 spec 列出的契约目前未被 enforced.

  1. rd_ost_limit 未 enforce: 已修复 (2026-05-15). 把"读类"映射到 rcvq 接收类 op (Receive/Gather): handle_receive_cmd/handle_gather_cmd 递增 rd_outstanding, arbitrate_rcvq_one 在 rd_outstanding ≥ rd_ost_limit 时 stall (ReceiveOstWait), on_receive_done 释放并跨 thread 唤醒 ReceiveOstWait 等待 thread;测试 test_rd_ost_limit_enforced 解除 ignore 改为正向断言。
  2. ACK MERGE_DEPTH 未 enforce: 已修复 (2026-05-15). ack_merge_poll 加 MERGE_DEPTH 截断 + 跨 poll 续传;AckMergeState.last_ack_psn 跟踪本 group ack 进度;测试 test_ack_merge_depth_enforces_split_on_overflow + test_ack_merge_under_depth_single_poll.
  3. Scatter pe_group_mask 未建模: 已修复 (2026-05-15). CDMACommand 新增 pe_group_mask: u32 + pe_group_size: u8 字段;handle_scatter_like_cmdpe_group_mask != 0 时用 popcount(mask) 替代 pe_num 计算 effective bytes;测试 test_scatter_pe_group_mask_field_propagated + test_scatter_pe_group_mask_zero_falls_back_to_pe_num.

调查过程

  • [查 spec] G5-CDMA建模设计规格.md L172: "Outstanding (rd) | 128 | 128 | 一致 (无偏差)" — spec 标注一致,但
  • [查代码] Grep rd_ost_limit / rd_outstanding 全 src:仅 unit.rs 声明 + tcredit.rs 注释,无任何位置调用以限制读类 cmd 入队. sendq_wr_ost_blocked 只覆盖 Transfer/Send/RemoteMsgSend (write side). 无 Read CDMA op 类型。
  • [查 spec] G5-RC-Link传输层设计规格.md L651: "MERGE_DEPTH (默认 64):单次 poll 最多合并的包数。超过此数时下次 poll 继续处理".
  • [查代码] tier6/rc_link_rx.rs::ack_merge_poll 无 cap, pending_count 无限累加,单次 poll 输出一条累积 ACK.
  • [查 spec] G5-CDMA建模设计规格.md L189 "Scatter / Scatter2 / Gather 指令" Phase 2 行:"完整指令含 descriptor + mask + 集成字段" — 现状 "缺失 (用 Transfer 模拟)".
  • [查代码] Grep pe_group_mask / pe_mask 全 src: 0 命中。CDMACommand 无该字段。

根因分析

三处共同根因:Phase 1 简化策略 — 优先建模数据路径吞吐 / 延迟,控制面与扩展指令 enforcement 延后到 Phase 2.

  1. rd_ost: Phase 1 未引入 read CDMA op (Transfer/Send 都是 write side). rd_outstanding 永远为 0, rd_ost_limit 检查无意义 → 字段成为"为 Phase 2 预留的占位".
  2. MERGE_DEPTH:仿真器层面忽略 ACK 包数对 RC Link RSP VC 的占用;累积 ACK 一次性发出,等价于 batched ACK with batch=∞. 影响 ACK 包率统计,数据吞吐不变。
  3. pe_group_mask: Scatter 在 Phase 1 通过 pe_num × bytes 近似总传输量,MoE dispatch 的 mask 选择不展开。影响 MoE 模型的 PE 维度并发度建模。

Spec / 文档依据

项目 Spec

docs/specs/G5仿真建模/G5-CDMA建模设计规格.md L172 "Outstanding (rd) | 128 | 128 | 一致 (无偏差)"

同上 L189 "Scatter / Scatter2 / Gather 指令 | 完整指令含 descriptor + mask + 集成字段 | 缺失 (用 Transfer 模拟) | 简化 (MoE dispatch 缺失批处理) | 实现 Scatter / Scatter2 / Gather"

docs/specs/G5仿真建模/G5-RC-Link传输层设计规格.md L651 "MERGE_DEPTH (默认 64):单次 poll 最多合并的包数。超过此数时下次 poll 继续处理"

与用户确认的行为

  • 测试任务约束:发现实现 bug 立即停下,但本次三处均为 spec 已描述的 Phase 2 计划项 (Scatter)spec 标注"一致"但代码未消费 (rd_ost) / spec 未在偏差表中列出但 enforcement 缺失 (MERGE_DEPTH). 不是 bug,是 Phase 1 简化未完结。通过 ignored / 锁定当前行为的测试追踪。

解决方案

采用方案

短期:加 3 个测试锁定当前行为契约,ignored 的两个置占位标记 Phase 2:

测试状态文件
test_rd_ost_limit_enforced#[ignore] Phase 2tier6/cdma/tests.rs
test_scatter_pe_group_mask_field_propagated#[ignore] Phase 2tier6/cdma/tests.rs
test_ack_merge_depth_unbounded_pending_current_behaviorpass (锁当前行为)tier6/rc_link_rx.rs

长期 Phase 2

  1. 引入 read-side CDMA op + 在 sendq_rd_ost_blocked 中检查 rd_ost_limit
  2. ack_merge_poll 加 MERGE_DEPTH 截断 + 跨 poll 续传 pending_count
  3. CDMACommandpe_group_mask: u16 字段 + Scatter dispatch 按 mask 分发

涉及文件 (Phase 2 修复时)

文件改动说明
tier6/cdma/unit.rsrd_outstanding 在 read cmd dispatch 时 ++
tier6/cdma/tcredit.rs新增 sendq_rd_ost_blocked 检查
tier6/rc_link_rx.rs::ack_merge_pollMERGE_DEPTH cap + 续 poll
types.rs::CDMACommandpe_group_mask 字段
tier6/cdma/handlers.rsScatter dispatch 按 mask 选目标

验证

  • 当前 308 passed, 4 ignored (2 num_chunks 占位 + 2 本 issue P2 占位).
  • Phase 2 修复后,启用 ignored 测试 + 加 enforcement 行为测试 (rd_outstanding 递增,MERGE_DEPTH=64 分批输出,pe_group_mask 字段透传).

遗留问题

  • CNP 聚合窗口默认值 2500ns vs DCQCN 设计文档 50000ns 不一致 (G5-RC-Link spec L1231 已列). 不在本 issue 范围,单列追踪。
  • spec L1259 "MERGE_DEPTH | ACK MERGE 单次最大合并数 | 64" 表项是 spec 列出的契约,当前实现未对齐。若 Phase 2 决定保持 unbounded,需更新 spec 标注偏差 (按 spec-first 规则).