跳转至

lightSSS 简介

在仿真调试过程中,并不需要完整过程的波形,只需要在仿真出错的时候把前面一段时间内的波形保存即可。Verilator等仿真器提供了持久化保存电路状态的snapshot功能,仿真出错时可以调用这个功能生成相应的状态文件,复现错误的时候可以用这个文件从特定电路状态开始跑仿真。但这个功能的局限性有以下几点:

  • 只能保存RTL电路的状态,其他仿真的部分比如参考模型、DRAMSim3等的状态不能被保存
  • 而且当电路规模比较大的时候,保存电路状态的存储开销比较大

为此我们开发了轻量级的仿真快照工具lightSSS,它可以在仿真进程出错时自动保存出错点附近的波形和debug信息而不需要经过电路状态文件这个中间层。

原理

lightSSS的原理是采用进程抽象的方式,用fork函数对仿真进程进行快照,具体过程如下:

  • 主仿真进程每隔一定时间(这个时间间隔可以进行配置)fork一个子进程,子进程自我阻塞等待父进程的信号,这样每个子进程保存了父进程在特定时间的仿真状态。
  • 父进程仿真发生错误时,通知最新的子进程(但也必须在这个时间间隔之前)开始运行并打印波形或者debug信息。父进程等待子进程结束后退出。

lightSSS的使用

参数配置

difftest/config/config.h中查看Checkpoint config选项:

参数名称 参数描述
FORK_INTERVAL 每多长时间(秒)fork一个子进程
SLOT_SIZE 同时最多支持多少个子进程存在,多余的会被kill掉
WAIT_INTERVAL 子进程每隔多长时间(秒)检查父进程的信号

运行

  • 如果需要dump 波形,在make emu时需要加入EMU_TRACE=1的选项
  • 运行仿真时启用--enable-fork选项(不需要--dump-wave选项,子进程默认保存波形,如果编译没有开EMU_TRACE=1会报错),例如:
    ./build/emu -i ./ready-to-run/linux.bin --enable-fork
    
  • 完成的波形文件会默认保存在$NOOP_HOME/build目录下,文件名中蕴含了生成文件的日期和仿真开始的周期数。