DiffTest

DiffTest 是一种强大的软件测试方法,它通过 对比 待测设计 (Design Under Test, DUT) 与 参考实现 (Reference, REF) 在 相同输入 下的 行为差异,来检测 DUT 的错误。

DiffTest 在 NEMU 指令调试中的应用:

  1. DiffTest 的核心思想:对比状态

    • 指令的正确行为: 指令的正确行为体现在其对计算机状态的改变上。
    • 计算机状态: 计算机状态可以抽象为二元组 S = ,其中 R 代表 寄存器 的值,M 代表 内存 的值。
    • DiffTest 方法:
      • DUT (待测设计): NEMU (我们实现的模拟器)。
      • REF (参考实现): 真机 (实际的 x86 计算机) 或 其他全系统模拟器 (功能更完善的模拟器)。
      • 相同输入: 让 DUT 和 REF 执行 相同的客户程序 (AM 程序编译后的指令序列)。
      • 状态对比: 逐条指令执行 后,对比 NEMU 和 REF 的状态 (寄存器和内存)
      • 错误检测: 如果 NEMU 和 REF 的状态 不一致,则表明 NEMU 当前执行的 指令实现有误,DiffTest 捕捉到错误。
  2. DiffTest 的优势:

    • 及时捕捉错误: DiffTest 能在 错误发生的第一时间 检测到,防止错误进一步传播,大大缩短了错误定位和修复的时间。
    • 自动化检查: DiffTest 可以实现 自动化测试,对大量指令进行快速、有效的验证。
    • 适用于复杂指令集: DiffTest 特别适合调试像 x86 这样指令集复杂、指令行为细致的架构,能够有效应对指令实现中的各种潜在错误。
  3. DiffTest 的具体流程:

    • NEMU (DUT) 和 REF (全系统模拟器) 并行执行同一个客户程序。
    • 每执行完一条指令,DUT 和 REF 都暂停执行。
    • DiffTest 工具对比 DUT 和 REF 的寄存器和内存状态。
    • 状态一致则继续执行下一条指令,状态不一致则报告错误并停止执行。