大家好,继续我们的 PCIe 验证每日学习。今天搭配清晰文本图表,系统讲解 PCIe 从报文级到系统级的错误检测、错误上报、错误隔离与恢复 ,是芯片验证中稳定性、健壮性测试的核心内容,承接前面电源管理、事务处理、Completion 等知识,形成完整闭环。
一、往期内容快速衔接
前面我们已经学习:
- PCIe 事务模型:Posted / Non-Posted、Completion 应答机制
- 路由规则:地址路由、ID 路由、BDF 寻址
- 链路训练 LTSSM、电源状态 L0/L0s/L1/L2/L3
- 原子操作、锁定事务、总线仲裁与并发控制
今天进入异常与可靠性体系 :PCIe 设计了一整套严密的错误处理机制,确保链路出现信号噪声、报文损坏、地址非法、设备异常时,系统不会直接崩溃,而是能检测、上报、恢复。这也是芯片量产前必须高强度覆盖的验证场景。
二、PCIe 错误总体架构
PCIe 错误严格按三层分级,每层只处理自己的错误,不越界、不遗漏:
┌─────────────────────────────────┐
│ 事务层错误 │ ← TLP 级:UR、CA、ECRC、地址非法
├─────────────────────────────────┤
│ 数据链路层错误 │ ← DLLP 级:DLLP 错、重传失败、信用异常
├─────────────────────────────────┤
│ 物理层错误 │ ← 信号级:CRC、失锁、失序、电气异常
└─────────────────────────────────┘
↑ ↑ ↑
检测 上报 恢复
- 物理层:负责信号完整性
- 数据链路层:负责传输可靠性
- 事务层:负责协议合法性与地址合法性
三、物理层错误
1. 典型错误类型
- 8b/10b 解码错误(PCIe 1.x/2.x)
- 128b/130b 解码错误(PCIe 3.0+)
- SKP 有序集丢失 / 错序
- 链路失锁、失同步
- 电气异常:电平错误、抖动超标
- Lane 错位、极性反转
2. 检测方式
- 物理层电路实时校验码 / 解码校验
- 收到非法有序集直接标记错误
3. 上报与处理
- 记录到 物理层错误寄存器
- 连续错误达到阈值 → 触发 Recovery
- 严重错误 → 链路热重启、重新训练
四、数据链路层错误(保证报文不丢不乱)
1. 典型错误类型
- TLP 报文 CRC 错误(LCRC)
- DLLP 校验错误
- 重传超时(Replay Timeout)
- 重传缓冲溢出
- 流控信用异常(信用为负 / 越界)
- ACK/NAK 机制异常
2. 核心机制:ACK/NAK 与重传
DLL 层是 PCIe 的 "可靠传输层":
发送方 → TLP + LCRC → 接收方
接收方校验 CRC
✅ 正确 → 回 ACK
❌ 错误 → 回 NAK → 发送方重传
3. 错误处理策略
- 单个错误:自动重传,软件无感知
- 连续重传失败:触发 Replay Timeout
- 最终无法恢复 → 上报 Uncorrectable Error → 进入 Recovery
五、事务层错误(协议合法性核心)
这是验证中最常抓、最易定位、也最容易漏测的一类错误。
1. 最经典四大错误(必须熟记)
(1)UR -- Unsupported Request
含义 :设备不支持 / 无法处理该请求典型场景:
- 访问不存在的地址(超出 BAR)
- 访问不存在的 BDF
- 发送设备不支持的事务类型
- 非法路由(如配置报文路由错误)
表现:返回 UR 类型 Completion
(2)CA -- Configuration Access Error
含义 :配置空间访问异常典型场景:
- 访问保留配置偏移
- 写只读寄存器
- 多功能设备访问非法 Function
(3)ECRC 错误
- ECRC:事务层端到端校验
- 用于 TLP 从 RC 到 EP 全程完整性校验
- 一旦错 → 直接标记为 Poisoned TLP
(4)Completion 异常
- Completion 丢失
- Completion 重复
- Tag 不匹配
- 读数据长度 / 偏移错误
2. 事务层错误统一图示
┌──────────────┬───────────────────────────┬──────────────────┐
│ 错误类型 │ 触发场景 │ 严重级别 │
├──────────────┼───────────────────────────┼──────────────────┤
│ UR │ 地址非法、BDF 不存在 │ Correctable │
│ CA │ 配置空间非法访问 │ Correctable │
│ ECRC 错 │ TLP 被篡改/传输损坏 │ Uncorrectable │
│ Completion 丢│ 读请求无应答 │ Uncorrectable │
│ 重复 CPL │ 响应端重复发送 │ 协议违规 │
└──────────────┴───────────────────────────┴──────────────────┘
六、PCIe 错误严重等级划分
PCIe 规范把错误分为两大类,处理逻辑完全不同:
1)Correctable Error(可纠正错误)
- 可以自动恢复,不需要软件干预
- 例:单 bit 错、重传成功、UR、CA
- 行为:计数 + 上报中断(可选)→ 继续运行
2)Uncorrectable Error(不可纠正错误)
- 无法自动恢复,可能导致数据丢失
- 例:ECRC 错、链路失效、重传超时、Completion 丢失
- 行为:
- 标记故障
- 隔离链路 / 设备
- 触发复位或 Recovery
- 上报系统(OS 异常、PCIe 错误中断)
七、错误上报机制(硬件如何告诉系统)
1. 错误寄存器体系
- Correctable Error 寄存器
- Uncorrectable Error 寄存器
- Error Status / Error Mask / Error Control
所有错误最终都会落到固定的 CAP 结构里,验证时必须读寄存器判断。
2. 错误上报通道
- PCIe 错误消息(Error Message)
- PCIe legacy INTx
- MSI/MSI-X 中断
- 系统管理中断 SMI、NMI(严重故障)
3. 错误广播机制
当 EP 检测到严重错误时,会主动发送 Error Message 给 RC:
- ERR_NON_FATAL(非致命)
- ERR_FATAL(致命)
- ERR_COR(可纠正)
八、错误恢复流程(从简单到严重)
给你一套标准协议恢复路径,验证用例可直接按这个写:
1. 错误检测 → 记录状态寄存器
2. Correctable?
├─ 是 → 自动重传/恢复 → 计数+日志 → 业务继续
└─ 否 → 进入异常处理
3. 发送错误消息 ERR_NON_FATAL / ERR_FATAL
4. 尝试链路 Recovery(重新训练)
5. Recovery 成功 → 恢复业务
6. Recovery 失败 → 设备隔离
7. 仍失败 → 触发 FLR / 热复位 / 系统级复位
九、验证中的高频易错点
-
只测功能,不测错误量产芯片最容易在噪声、异常场景挂死。
-
UR/CA 不返回正确 Completion很多设计直接丢包,不按协议回 CPL。
-
错误掩码寄存器(Mask)无效关了错误依然上报,属于逻辑 BUG。
-
重传机制不完整NAK 收到但不重传,导致链路卡死。
-
Recovery 后链路状态不一致LTSSM 跳变异常,Lane 同步失败。
-
ECRC 被转发但未校验导致错误 TLP 穿透到系统内核。
十、明日学习预告
PCIe 中断体系全解析(INTx / MSI / MSI‑X)内容包括:
- 传统引脚中断 INTx 虚拟机制
- MSI 消息中断原理与路由
- MSI‑X 高级中断:多向量、灵活映射
- 中断掩码、中断状态、中断协验证点
- 多设备并发中断不丢失、不混乱保障机制