作者: AI Assistant
日期: 2025-05-21
标签: CPU Verification Self-Check RISC-V Formal Verification SBST SQED


一、什么是 Self-Check?

Self-Check(自检) 是指在 CPU 验证过程中,测试本身就能自动判断结果是否正确,而无需人工查看波形(VCD)或日志文件。

核心思想转变:

1
2
3
4
5
❌ 传统方法:
执行测试 → 转储波形/VCD → 人工盯着看 → 发现问题

✅ Self-Check 方法:
执行测试(内嵌断言/比较逻辑) → 自动报 PASS/FAIL

一个好的 self-check 框架能让验证效率提升 数个数量级,是工业级 CPU 验证的基石。


二、验证层级全景图

CPU 验证的 self-check 方法覆盖从指令级到系统级的多个层级:

1
2
3
4
5
6
7
8
9
10
11
12
13
┌─────────────────────────────────────────────┐
│ 系统级 Self-Check │
│ (锁步、Litmus Test、多核一致性) │
├─────────────────────────────────────────────┤
│ 微架构级 Self-Check │
│ (硬件检查器、SQED、μCFI、TIUP) │
├─────────────────────────────────────────────┤
│ 指令级 Self-Check │
│ (Store-Compare、Signature、参考模型比对) │
├─────────────────────────────────────────────┤
│ 电路级 Self-Check │
│ (BIST、MISR、ATPG) │
└─────────────────────────────────────────────┘

三、指令级 Self-Check

3.1 寄存器结果比对法(Store-Compare)

最基础也最广泛的方法:执行指令后读取目标寄存器,与预期值比较。

1
2
3
4
5
6
# FORCE 框架中的实现
self.initializeRegister("x5", 0x100)
self.genInstruction("ADDI##RISCV", {"rd": 5, "rs1": 5, "simm12": 1})
(val, valid) = self.readRegister("x5")
if val != 0x101:
self.error("Result mismatch: expected 0x101, got 0x%x" % val)
优点 缺点
简单直接 需要人工编写预期值
适合定向测试 覆盖有限
容易 debug 测试量大了维护成本高

3.2 Signature 法(签名压缩)

大量执行结果压缩成一个签名值(CRC / MISR / XOR 累加),最后只比较这个签名。

1
2
3
4
5
for i in range(1000):
result = execute_random_instruction()
signature = signature ^ result # XOR 累加

# 自检:signature == golden_signature ?

常见实现方式

方法 描述
MISR 硬件内建多输入签名寄存器,自动压缩测试响应
软件签名 测试程序末尾将寄存器/内存值通过哈希函数生成签名
CRC 循环冗余校验,抗混叠能力强

优点:大幅减少比较数据量,适合大量随机测试
缺点:存在混叠风险(aliasing)——错误结果也可能产生相同签名

3.3 QED / SQED(快速错误检测)

由 MIT 和学术界开发的革命性方法,核心思想异常巧妙

将寄存器文件分成两半,前半执行原始指令序列,后半执行完全相同的副本。执行完毕后两半应该完全一致。

1
2
3
4
原始: R1+=1, R2*=2, R3=R1+R2  → 结果存到前半寄存器
副本: R1+=1, R2*=2, R3=R1+R2 → 结果存到后半寄存器

前半 == 后半 ? PASS : FAIL

SQED(Symbolic QED):用符号执行 + BMC(Bounded Model Checking)自动探索所有可能的指令序列,无需手动编写测试程序。

指标 数据
顺序核 bug 检测时间 < 5 分钟
乱序核 bug 检测时间 < 2.5 小时
已知逻辑 bug 检出率 100%
“极难触发” bug 检出率 97.9%
新发现 bug 在开源 RISC-V 核中发现未知 bug

开源工具generic-sqed-demo

3.4 TIUP(重言式通用属性验证,2024)

针对问题:SQED 的单自洽属性(single self-consistency property)存在误报和可扩展性问题。

解决方案:不用单一属性,用一组重言式(tautologies) 作为通用规范:

1
2
3
4
交换律:A + B == B + A
结合律:(A + B) + C == A + (B + C)
德摩根律:~(A & B) == ~A | ~B
控制流蕴含关系:if (cond) branch_target == PC + offset

覆盖数据路径和控制路径,消除误报,降低状态空间爆炸风险。


四、参考模型 Self-Check(最主流的工业方法)

4.1 ISA 参考模型比对

这是工业界最核心、最广泛使用的 self-check 方法,几乎每个 CPU 验证团队都在用。

1
2
3
4
5
6
7
8
9
10
11
12
13
┌─────────────┐     ┌──────────────┐
│ DUT (RTL) │ │ Reference │
│ │ │ Model (C/ISA)│
└──────┬───────┘ └──────┬────────┘
│ │
▼ ▼
DUT 状态 Reference 状态
(PC, regs, mem) (PC, regs, mem)
│ │
└────────┬───────────┘

Compare Engine
PASS/FAIL

逐指令比较的内容

1
2
3
4
5
6
每条指令执行后比较:
├── PC 值
├── 操作码
├── 目标寄存器值
├── 异常/陷阱信息
└── 内存更新

FORCE 框架的体现:FORCE 通过 ISS (Instruction Set Simulator) 仿真,StepInstructionWithSimulation() 在每一步对比 DUT 与参考模型的结果。

4.2 处理不可预测结果

现代 CPU 存在大量架构上不可预测的行为(如浮点溢出陷阱时序、Cycle 计数指令等)。参考模型比对法通过不可预测数据追踪来处理:

  • 标记不可预测的来源(如 mcycle 寄存器)
  • 任何源自不可预测源的数据也被标记为不可预测
  • 被标记的数据不参与比较

防止了误报,是工业级参考模型比对的必备机制。

4.3 锁步比较(Lockstep)

双核锁步:两个完全相同的核执行相同指令,每个周期比较输出。

1
2
3
4
5
6
7
8
┌────────────┐
│ Core 0 │────┐
│ (Master) │ │
└────────────┘ ├──→ Compare → PASS/FAIL
┌────────────┐ │
│ Core 1 │────┘
│ (Checker) │
└────────────┘

Synopsys 2025 专利中的进阶方案:

  • 镜像机制:维护 DUT 内部架构状态的精确副本
  • 挥发算法:处理实现定义(非架构)的寄存器
  • 推测执行同步:异步事件发生时探索所有可能的架构路径
  • 收敛/再收敛:即便出现分歧,也能调整状态继续验证

五、微架构级 Self-Check

5.1 硬件检查器(Hardware Checkers)

在 CPU 内部嵌入硬件断言,实时验证微架构行为是否正确。

1
2
3
4
5
6
7
8
9
10
11
// 译码级 vs 写回级交叉检查
property p_wb_matches_decode;
@(posedge clk)
decode_instr_opcode == wb_instr_opcode;
endproperty

// PC 连续性检查
property p_pc_sequential;
@(posedge clk)
(branch_taken == 0) |=> (pc == $past(pc) + 4);
endproperty

常见硬件检查器类型

检查器 验证内容
PC 连续性检查器 分支目标计算是否正确
寄存器重命名检查器 乱序提交后架构寄存器值正确
存储转发检查器 Load 是否从正确的 Store 转发数据
异常优先级检查器 多异常同时发生时的优先级处理
μCFI (2024) 控制流完整性,6个信号注入发现安全漏洞

5.2 BSSC(块签名自检)

给每个基本块分配签名,运行时验证基本块间的跳转是否合法。

1
2
3
4
基本块 A:              基本块 B:
instr1 instr1
instr2 → instr2
signature_A check(signature_A) ← 验证 A→B 跳转合法

适用于在线错误检测控制流完整性验证


六、软件自检(SBST — Software-Based Self-Test)

6.1 SBST 基本原理

直接在 CPU 上运行自检程序,不需要外部测试设备。测试程序本身就是验证工具。

1
2
3
4
5
6
7
8
9
10
void self_test_alu() {
volatile int result;
result = (1 + 2);
if (result != 3) // 自检点
fault_detected(ALU_FAULT);

result = (5 - 3);
if (result != 2) // 自检点
fault_detected(ALU_FAULT);
}

6.2 RL-SBST(强化学习优化,2024)

使用 PPO 算法自动生成高效的 SBST 程序:

指标 数据
Toggle 覆盖率 > 80%(仅200条指令)
Stuck-at 故障覆盖率 > 90%
相比随机方法提升 1.7 倍
目标 RISC-V 顺序核和乱序核

6.3 自动化 SBST + 形式验证(2024)

结合形式验证 + 故障模拟

  • 用形式分析减少所需断言的数量
  • 引入 PFC (Program Flow Checking),符合 ISO 26262 功能安全标准
  • 达到 >91% 故障覆盖率,100% 故障检测率

七、内存子系统 Self-Check

7.1 缓存一致性验证

多核 CPU 中缓存一致性协议(MESI/MOESI/CCIX)的自检:

方法 描述
Litmus Test 多核分别对同一地址做 store/load,验证全局有序
Scoreboard 检查器 分析事务序列是否符合一致性规则
EveCheck (2023) 事件驱动算法,一半测试量达到完全错误检测

7.2 Eidetic Memory / Event Log 法

记录所有 store/coherence 指令 → 过滤 → 生成 read/compare 检查器。支持前后硅复用——同一个测试可在仿真和实际芯片上运行。


八、电路级 Self-Check

8.1 BIST(Built-In Self-Test)

芯片内部集成测试电路,上电或诊断模式时自动测试:

  • MISR:多输入签名寄存器,压缩测试响应
  • BISC(内置签名检查):设置签名初始值,使正确机器签名始终为常量(如全零),只需一个 OR 门判断通过/失败

8.2 等价性检查(Equivalence Checking)

类型 验证内容
组合等价性 两个组合电路功能相同
时序等价性 重定时(retiming)后功能相同
RTL-to-Gate 综合后的网表与原始 RTL 等价

九、方法对比总表

方法 层级 复杂度 覆盖 适用阶段 误报率 代表工具
Store-Compare 指令级 功能正确性 前/后硅 FORCE, 手写测试
Signature (MISR) 全芯片 制造+功能 后硅 中(混叠) DFT 工具链
QED/SQED 微架构 逻辑 bug 前硅 Yosys+Pono
TIUP(重言式) 微架构 数据+控制 前硅 极低 TPV (GitHub)
参考模型比对 全芯片 架构合规 前硅 Spike, QEMU, FORCE(ISS)
硬件检查器 微架构 微架构违规 前硅 UVM Assertion, SV
SBST 全芯片 制造故障 后硅 RL-SBST, 自检库
BSSC (签名块) 控制流 在线错误 运行时 软件自检库
锁步 (Lockstep) 全芯片 瞬时故障 运行时 双核/异构锁步
Litmus Test 内存一致性 内存排序 前/后硅 EveCheck, Scoreboard

十、2024-2025 新趋势

10.1 RL/ML 驱动自检程序生成

RL-SBST 用强化学习(PPO)自动生成高效的 SBST 程序,以 toggle coverage 为奖励信号。机器代替人写自检代码。

10.2 LLM 辅助验证

ISAAC(2025)使用多 Agent LLM 架构

  • 注入微架构知识和历史 bug 模式
  • 自动生成高覆盖率定向测试
  • FPGA 加速仿真

10.3 重言式通用属性(TIUP/TPV)

终结”每个设计都要手动写断言”的时代:

  • 从架构规范自动推导通用属性
  • 同时覆盖 data path 和 control path
  • 开源工具 TPV 已可用

10.4 μCFI:微架构控制流完整性(2024)

检测从指令操作数到 PC 的信息流。仅需标记 6 个信号,已在 4 个 RISC-V CPU 中发现 5 个新的安全漏洞(4 个 CVE)


十一、总结与建议

核心理念

Self-Check 是验证自动化的灵魂。从最简单的 Store-Compare 到复杂的参考模型比对,每一层级的方法都有其适用场景。工业界的主流选择是参考模型比对,但前沿方向正在向自动化、智能化演进——RL-SBST、LLM 辅助验证、TIVP/重言式属性等技术正在重新定义 CPU 验证的生产力边界。

选择建议

场景 推荐方法
快速定向测试 Store-Compare
大规模随机测试 Signature / MISR
深度逻辑验证 SQED / TIUP
工业级回归验证 参考模型比对
硅后诊断 SBST / BIST
多核一致性 Litmus Test + EveCheck

一句话总结:没有银弹,只有层层嵌套的自检机制才能兜住 CPU 验证的质量底线。


本文内容由 AI 整理自 CPU 验证领域最新技术进展,供学习研究参考。