本文记录的相关源工程和文件为:
core-v RISCV核功能验证工程:https://github.com/openhwgroup/core-v-verif
core-v 验证策略:https://core-v-docs-verif-strat.readthedocs.io/en/latest/#
core-v系列核cva6工程:https://github.com/openhwgroup/cva6
core-v系列核cv32e40p工程:https://github.com/openhwgroup/cv32e40p
LowRISCV Ibex核工程:https://github.com/lowRISC/ibex
core-v RISCV核相关说明文档:https://github.com/openhwgroup/core-v-docs
RISCV ISA指令序列产生器:https://github.com/openhwgroup/force-riscv
sail语言介绍:https://www.cl.cam.ac.uk/~pes20/sail/
sail RISCV开源项目:https://github.com/rems-project/sail-riscv
openHW全称为open-source hardware,是一个支持开源软件和硬件的非盈利组织。该组织开源的内容包括开源CPU核、相关IP、工具和软件等。
1. 指令集验证
指令集测试激励分为自检(self-checking)和预存(pre-existing)两种。
- 自检测试激励运行时按照源文件中指令顺序依次,并同时将指令执行结果和参考值作检查,若出错则程序跳转到fail,打断正常执行顺序,立即执行完成。类似的测试集有riscv-tests、riscv-compilance-tests等
- 预存测试激励运行时不会打断执行顺序,执行的结果会和指令集模拟器(ISS)的结果作对比,最终统计对比的结果。类似的测试集有riscv-dv等
验证环境中指令集验证的需求:
- 能够使用操作数产生合法的基本整数运算指令
- 在指令执行完成后能够检查通用寄存器的状态
- 指令执行完成后能检查副效应,例如溢出等。
基本指令集验证内容:
2. 相关CPU核的验证工程
1. cv32e40p
CV32E40P(RI5CY)是一个32bit的4级流水线核,支持整数运算指令、乘法除法指令、单浮点运算指令、压缩指令以及DSP扩展指令(包括硬件循环、SIMD扩展、位操作和增量指令)
该核的验证环境为借鉴下述Ibex工程,testcase的产生是可以基于UVM环境的(这种方式类似于Ibex核验证环境)。
该工程的指令集测试激励包含指令兼容性测试(偏定向测试,如riscv-tests和riscv-compilance-tests)和随机约束,和其他的一些测试用例。
采用UVM搭环境的优势:
a)便于验证环境的结构建模
b) UVM环境类支持完全的UVM运行流程和log服务
c) 使用UVM sequence-item类可以产生随即约束激励
d)使用内建于验证环境中的参考模型预测执行的结果。(imperas有现成的开源ISS)
e) scoreboard可以比较参考模型和RTL的结果。
f) 功能覆盖率和代码覆盖率确保验证的完全性。
2. CVA6
CVA6(ariane)是一个6级流水线、单发射、顺序执行的RV32GC或RV64GC核,支持M/U/S三种模式,支持linux操作系统
该核现存的验证环境尚未成熟,但同样可以构建UVM的验证环境
该工程的指令集测试激励包括riscv官方测试套件(即riscv-tests)
3. Ibex
Ibex不是openHW的core-v系列,而是lowRISC持续维护的较为成熟的一款核,验证环境也较为成熟,其结构和运行非常类似于CV32E和CVA6的激励随机约束。
该验证环境激励的产生同样是基于GOOGLE的随机指令生成器
- 验证环境特征
- 运行有效性
testcase在验证环境中会持续运行完成,除非激励运行出错 - 方便调试
- 能够增加功能覆盖率
- 能够对比检查RTL运行的结果
3. 指令集描述语言——sail
sail是REMS构建的一种描述指令集的语言,可以认为是一种机器可读的形式化ISA模型。riscv基金会有意用其来描述RISCV指令集,且目前已有相关的开源工程。
初步来看,sail可以用来形式化testbench断言的参考模型,这些assertion可以根据sail spec来验证基于RISCV ISA的某微架构。目前该领域OneSpin GapFree已经在sail model和RTL代码间做了可比性的check,该公司仍在探索如何充分使用sail model
该语言将持续关注。