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
目录下,文件名中蕴含了生成文件的日期和仿真开始的周期数。