riscv co-sim:riscv cpu开发集成simulator仿真

riscv co-sim:riscv cpu开发集成simulator仿真

1. 原理

a. 确定对比粒度

仿真对比的粒度需要simulator(eg.dromajo、spike)与RTL内核共同状态确定

simulator与RTL存在的相同状态(simulator维护的变量与RTL的寄存器状态)越多,对比项可以越多,也越精细,同样代价越大

一般而言,我们维护程序在提交指令后可见的架构寄存器相同(仅在指令提交时进行对比),即可保证simulator与RTL内核行为一致

如果simulator更加精细,流水线与RTL一致,每级流水线内都有相对应的状态,我们可以做到每个周期都进行对比,比较对应流水线的状态

RTL trace interface

将RTL内部需要跟踪对比的信号拽到testbench中

关键信号 含义
valid 指令提交,架构寄存器已经更新
core input signals 输入到core内进行计算处理的数据,即影响架构寄存器变化的信号
core state signals 架构寄存器或者其他需要与simulator对比的信号

simulator step interface

提取simulator中单步执行的核心函数,包括输入的形式参数,返回的结果

DPI interface & TestBench

将simulator的单步执行接口使用DPI接口封装,使TestBench可见

在TestBench中调度。监控valid信号,有效启动捕获RTL接口上的信号,并将信息通过DPI接口注入到simulator 单步执行接口中

simulator执行后将返回结果与RTL的结果进行对比,结果一致即可确认RTL与simulator行为一致,如此循环往复对比

另外,一般而言,simulator与RTL是螺旋更迭的,可以不断增加simulator与RTL对比的状态,以使两者有更多checkpoint,这样在simulator上跑的所有case能快速在RTL环境移植与debug

b. 系统构建

simulator编译生成共享库文件

编译simulator,获得静态链接库(linux上一般以.a为后缀)

emulator编译

使用RTL仿真工具(如vcs、verilator、xrun等)将riscv内核、simulator编译得到的静态链接库以及带有对比的TestBench进行编译,得到可执行的emulator

c. run tests

使用生成的emulator加载二进制文件进行RTL仿真与关键状态对比

2. 案例:ibex

  1. RTL trace interface
    image

  2. simulator step interface
    image

  3. DPI interface & TestBench
    image

  4. simulator编译生成共享库文件
    image

  5. emulator编译
    image

3. 案例:cva6

image

  1. dpi interface
    image

  2. data compare
    image

  3. emulator编译
    image

4. 案例:chipyard

  1. dpi interface
    image

  2. emulator编译
    image

5. 延伸

借助dpi接口能力与co-sim思路,其他协议或模块也可以组合c/c++的模型(golden model)与RTL设计形成co-sim环境

posted @ 2023-03-06 19:03  乔_木  阅读(466)  评论(0编辑  收藏  举报