06. 错误处理与重传机制
三层错误保护体系
SUE2.0技术栈提供三层错误保护:
| 层级 | 机制 | 位置 | 说明 |
|---|---|---|---|
| L1 | FEC (RSFEC) | CESOC CEFEC | 前向纠错, 自动纠正小错误, 错误率 < 10^-12 |
| L2 | E2E Retry | RC Link | 端到端Go-Back-N重传, 替代旧版MAC L2 Retry |
| L3 | PAXI Error Handling | PAXI Core | 端到端错误处理, DA级隔离与恢复 |
[推导] 与旧版的变化:
- L2层从MAC Retry升级为RC Link E2E Retry, 提供端到端可靠性
- Go-Back-N重传由RC Link的TYPE1数据类型实现, 支持最多1024个QP
L1: FEC (RSFEC)
[DOC] CESOC Features:
"Ethernet error rate lower than 10e-12"
- 使用Reed-Solomon FEC (RSFEC)算法
- 自动纠正链路中的少量误码
- 纠错后错误率低于10^-12
- 无法纠正的错误传递给L2层处理
L2: RC Link E2E Retry
[DOC] PAXI SUE2.0 Features:
"Support error free transmission with RC LINK E2E retry enabled"
Go-Back-N重传
[DOC] 来自RCLINK Spec 4.1:
RC Link的TYPE1数据类型支持端到端保护和Go-Back-N重传:
- 最多1024个队列 (QP)
- 512 outstanding
- 最大报文4KB
- 检测到PSN(数据包序列号)错误时触发重传
重传计数器
[DOC] 每个 QP 的 RETRY_CNT_MEM 包含两个独立的 4-bit 计数器:
| 计数器 | 位域 | 触发条件 | 说明 |
|---|---|---|---|
| retry_counter | [3:0] | PSN 错误触发的 Go-Back-N 重传 | 常规链路错误重传 |
| rnr_retry_counter | [7:4] | RNR (Receiver Not Ready) 条件触发 | 接收方 Buffer 不足时的重传 |
[推导] 两种重传的区分: retry 由链路错误 (CRC/FCS 失败导致 PSN 缺口) 触发; RNR retry 由接收方资源不足 (Buffer 满, 通过 ACK 中的 Aeth_syndrom 字段 RNR Time 指示) 触发。建模时需要区分这两种场景, 因为 RNR 重传通常意味着流控机制未及时生效, 对延迟影响更大。
TYPE1 ACK机制
[DOC] 来自RCLINK Spec RH结构:
| RH字段 | Bits | 说明 |
|---|---|---|
| Dest_QP | [12:0] | QP序列号 |
| PSN | [24:13] | 数据包序列号 |
| Pkt_len | [31:25] | RH+payload长度 |
| P_key | [39:32] | Partition Key, 隔离机制 |
| Timestamp | [55:40] | 时间戳, RTT测量 |
| Opcode | [63:62] | 00:SEND Req, 01:ACK/NAK, 10:CNP |
ACK MERGE
[DOC] 来自RCLINK Spec 5.8:
ACK MERGE模块合并多个ACK, 减少ACK报文数量, 提高效率。使用深度为2^QP_AW的寄存器Buffer, 以4组为单位轮询检查并发出合并的ACK。
ACK 完整发送路径
[DOC] 来自 RCLINK_AFH_SPEC_v2.4 §4.2 逻辑框图、§5.8 ACK MERGE、§5.10 TYPE1 报文发送仲裁。
ACK 从接收到发出经历完整的芯片 TX 路径,不是独立旁路:
关键事实(来自 spec §4.2 框图):
- ACK 经过
ackcnp_buff → ack_proc → rc_pkt_ctrl,与数据包共用同一个rc_pkt_ctrl的 Arbiter - ACK 对应 slot buffer 中的粉色高亮槽位(
get_ack/nak输入),与数据包槽位(get_pkt)有区分 - 两者通过同一个 Arbiter 输出
tx_req,最终经rc_pkt_gen → ip_pkt_gen → MAC TX发出
rc_pkt_ctrl 仲裁器内部结构
[DOC] 来自 RCLINK_AFH_SPEC_v2.4 §4.2 rc_pkt_ctrl 框图。
[推导] ACK 槽位(粉色)在 slot buffer 顶部,推测 Arbiter 对 ACK 赋予更高优先级。§5.10 明确说数据包按"进入队列先后顺序仲裁",ACK 的优先级规则 spec 未明文说明,但从工程常识判断(ACK 延迟直接影响 Go-Back-N 重传速率),ACK 有严格优先级于数据包。
三类 TX 流量的路径对比
[推导] 基于 §4.2 框图和 §5.5 CBFC:
| 流量类型 | 是否经过 rc_pkt_ctrl | 是否占用数据 VC | 与数据竞争 |
|---|---|---|---|
| 数据包(TYPE1_REQ) | 是 | 是(REQ VC) | 自身竞争 WRR |
| ACK/NAK(TYPE1_ACK) | 是 | 是(RSP VC) | 共用 Arbiter,推测有优先级 |
| Credit Return(PFC) | 否 | 否(MAC 信号) | 完全不竞争 |
G5 建模近似
[推导] 基于上述 spec 分析:
-
Credit Return:已正确建模为
propagation_delay,完全跳过busy_until_ns。依据:MAC 层 PFC 信号,不经过 rc_pkt_ctrl。 -
ACK:硬件中经过 rc_pkt_ctrl Arbiter,有优先级,实际等待时间不超过当前正在传输的 1 个数据帧(~18 ns)。G5 使用独立的
busy_until_ns_rsp建模,ACK 只与其他 ACK 竞争,不等待数据包队列。这是可接受的近似——误差约 18 ns,远小于链路传播延迟(~150 ns)。
L3: PAXI Error Handling
[DOC] 来自SUE2.0 2.6 Error Handle:
"When a DA's retry fails, rc-link reports an error indication. Upon receiving it, paxi initiates its internal error-handling procedure."
单播错误处理
[DOC] 恢复步骤:
-
检测: DA重传失败时, PAXI上报retry fail中断
-
诊断: 用户读取 Int Indicator Register (0x008) 和 Retry Error Register (0x300~0x37C) 确定错误DA和详情
-
隔离: [DOC]: "After the user-side TX logic receives the error indication, it must complete the burst transmission for any AWDATA/WDATA pair and RDATA burst that has already been sent to PAXI TX, and subsequently stop sending data to the faulty DA."
[DOC]: "On the RX direction, PAXI will complete any AWDATA/WDATA and RDATA currently in-transit, after which no new requests or responses related to error DA will be sent."
-
错误处理: [DOC]: "Defaultly, PAXI initiates its internal error-handling and discards the packets of the error DA automatically. However, user can set Ctrl Register to manually control paxi's entry into error handling flow."
-
确认完成: 用户读取PAXI STATUS Register (0x01C) 的TX_ERR_STAT (bit13) 和 RX_ERR_STAT (bit14) 确认错误位已清除
-
恢复: 清除Int Indicator Register和Retry Error Register, 恢复AXI数据传输
自动 vs 手动错误处理
[DOC] Ctrl Register (0x00C):
| Bit | 字段 | 说明 |
|---|---|---|
| 14 | Error Handle Trigger | 写1触发错误处理流程 (RW1C) |
| 13 | Self-retry err clr en | 1: PAXI自动进入错误处理; 0: 软件介入控制 |
[推导] 两种模式:
- 自动模式 (bit13=1): PAXI检测到retry fail后自动进入错误处理, 丢弃错误DA的数据包
- 手动模式 (bit13=0): 软件决定是否触发错误处理, 通过写bit14=1手动触发
多播错误处理
[DOC] 来自SUE2.0 2.6:
"When PAXI receives a multicast error indication reported by the MAC or when no response is received within the timeout period after PAXI has sent a multicast request, multicast error handling is triggered."
两种多播错误
| 错误类型 | PAXI STATUS位 | Int Indicator位 |
|---|---|---|
| MULTI-CAST RETRY ERR | bit17 | bit11 |
| MULTI-CAST TIMEOUT | bit18 | bit12 |
恢复步骤
[DOC]:
- 多播重传失败时, PAXI上报retry fail中断
- 用户读取Int Indicator Register和PAXI STATUS Register的MULTI-CAST RETRY ERR/TIMEOUT位
- TX侧必须完成当前burst的AW+W数据传输
- 默认TX和RX内部自动清除多播数据, 也可通过Ctrl Register手动控制
- PAXI错误处理完成后上报中断
- 用户确认PAXI STATUS的multi-cast错误状态位清除
- 清除相关寄存器, 恢复传输
多播超时配置
[DOC] RX Multicast Timeout Register (0x080):
默认值: 0x03d0_9000
中断系统
中断状态寄存器
[DOC] Int Indicator Register (0x008):
| Bit | 字段 | 说明 | 类型 |
|---|---|---|---|
| 12 | MULTI_CAST TIMEOUT | 多播B响应超时 | RW1C |
| 11 | MULTI_CAST RETRY ERR CLR | 多播重传错误清除完成 | RW1C |
| 10 | RETRY ERR CLR | 单播重传错误清除完成 | RW1C |
| 9 | PAT DATA ERR | Pattern Generator读/写数据不匹配 | RW1C |
| 8 | PAT RD DONE | Pattern Generator读完成 | RW1C |
| 7 | PAT WR DONE | Pattern Generator写完成 | RW1C |
| 6 | RSVD | 保留 | RO |
| 5 | APB_Linkup_MSG | 收到远端PCS link-up消息 | RW1C |
| 4 | LM timeout | 延迟测量超时 | RW1C |
| 3 | LM done | 延迟测量完成 | RW1C |
| 2 | APB_ERR_MSG | APB消息错误 | RW1C |
| 1 | E2E_RETRY_ERR | RC Link E2E Retry错误 | RW1C |
| 0 | OFLOW_IND | FIFO溢出 | RW1C |
中断屏蔽寄存器
[DOC] Interrupt Mask Register (0x004):
| Bit | 字段 | 说明 |
|---|---|---|
| 12 | MULTI_CAST Timeout MASK | 多播超时屏蔽 |
| 11 | MULTI_CAST RETRY ERR CLR MASK | 多播重传错误清除屏蔽 |
| 10 | RETRY ERR CLR MASK | 重传错误清除屏蔽 |
| 9 | PAT DATA ERR MASK | Pattern错误屏蔽 |
| 8 | PAT RD DONE MASK | Pattern读完成屏蔽 |
| 7 | PAT WR DONE MASK | Pattern写完成屏蔽 |
| 5 | APB_Linkup_MSG MASK | PCS Linkup屏蔽 |
| 4 | LM timeout MASK | 延迟测量超时屏蔽 |
| 3 | LM done MASK | 延迟测量完成屏蔽 |
| 2 | APB_ERR_MSG MASK | APB消息错误屏蔽 |
| 1 | E2E_RETRY_ERR MASK | E2E Retry错误屏蔽 |
| 0 | OFLOW_IND MASK | FIFO溢出屏蔽 |
PAXI Status Register错误位
[DOC] PAXI Status Register (0x01C):
| Bit | 字段 | 说明 | 类型 |
|---|---|---|---|
| 18 | MULTI-CAST TIMEOUT | 多播超时 | RW1C |
| 17 | MULTI-CAST RETRY ERR | 多播重传失败 | RW1C |
| 16 | RX_MULTI_CAST_ERR_STAT | RX多播错误处理状态 (1:未完成, 0:完成) | RO |
| 15 | TX_MULTI_CAST_ERR_STAT | TX多播错误处理状态 (1:未完成, 0:完成) | RO |
| 14 | RX_ERR_STAT | RX错误处理状态 (1:未完成, 0:完成) | RO |
| 13 | TX_ERR_STAT | TX错误处理状态 (1:未完成, 0:完成) | RO |
远端链路状态检测
[DOC] 来自SUE2.0 3.2.35:
Remote PCS Linkup Register 0~31
- 地址: 0x280~0x2FC
- 当远端芯片PCS重新Link-up时置位
Remote Error Status Register 0~31
- 地址: 0x200~0x27C
- 记录远端错误状态
Retry Error Register 0~31
- 地址: 0x300~0x37C
- 记录各DA的重传错误状态
RC Link异常处理
[DOC] 来自RCLINK Spec 第10章:
TX方向异常
| 异常类型 | 说明 | 处理方式 |
|---|---|---|
| TX overcredit | 上游下发的 pkt ost 数量超过 TYPE1_OST_N (仅调试场景, 正常工作时上游通过 TX_S_CRD_O 令牌机制保证不会超限) | 丢弃超限包, 上报中断 (RC_INTR_O[1]) |
| TX oversize | 报文长度超过TYPE1_PKT_LEN | 丢弃超长包, 上报中断 |
| TX retry times over | QP重传次数超过阈值 | 上报中断 |
下游数据通路异常
[DOC]:
| 场景 | 处理 |
|---|---|
| 短暂断路 | RC Link内部缓冲吸收, 恢复后继续传输 |
| 复位 | 清除所有状态, 需要重新初始化 |
| 长时间断链 | 重传超时, 上报中断, 等待软件处理 |
TYPE3异常
[DOC] TYPE3有独立的异常中断, 通过0x1170寄存器查询:
- rx fifo overflow
- tx fifo underflow
- md axi wr/rd resp abnormal
- data axi resp abnormal
- tx get two sop / tx last eop
- tx/rx buffer oversize
- tx/rx get md size zero