本分析重点关注该repo向量扩展部分。

1. repo简介

该repo是指令集验证的仿真环境包括,大部分是指令集的测试用例,也包含了一些模拟器,如riscvOVPsimPlus。

主要介绍的是riscvOVPsimPlus指令集模拟器,riscvOVPsimPlus(下面统称ISS)是imperas公司在riscvOVPsim基础上扩充了向量扩展的指令集模拟器,该repo于今年9月份部分开源

  • riscvOVPsim和riscvOVPsimPlus的区别

riscvOVPsim:

  1. 主要用于运行测试用例,特别是兼容性测试,即确保core的RTL代码兼容RISCV官方spec
  2. 支持variant selection, semi-hosting,功能覆盖率分析,compliance suite signature dump
  3. 支持32/64bit ,支持IMAFDCNSUE指令扩展,imperas认为rvv0.9/0.8等均处于实验状态,并不开源在已公开发布的riscvOVPsim中
  4. 完全可配置的指令跟踪
  5. GDB/Eclipse调试支持
  6. 内存配置选项
  7. 完整的标准CLIC功能、Debug模块/模式、Hypervisor "H "仿真

官方spec的最新支持情况:

riscvOVPsimPlus:

  1. 包含riscvOVPsim所有的特性,
  2. ISA支持增加了V扩展(0.8/0.9/1.0版本)和B扩展
  3. 支持指令 trace
  4. 支持GDB/Eclipse debug,且支持模式切换debug,单module的debug
  5. 支持存储器可配置,CLIC, multi-hart, H-hypervisor simulation
  6. 支持更加定制化的开发

官方spec的最新支持情况:

  • 什么叫部分开源呢?
  1. 首先该repo必须在imperas官网注册下载,而且必须是企业用户;
  2. 其次ISS的运行所需的license必须联网才能使用(这是最骚的);
  3. 向量测试激励只提供了RVV0.8版本32位的V扩展激励,其他版本的需要向imperas定制。

综上,该riscvOVPsimPlus毕竟是商业化的工具,imperas开源的部分也只是“鱼饵”,完成的可配置工程还是要走商业流程

官网的license:Welcome Page | Open Virtual Platforms
Apache 2.0:大多数OVP model的支持license

  • 工程目录

  1. riscv-ovpsim-plus
    ISS的可执行文件(linux核windows),也包含了编译测试激励用到的gcc工具配置信息
  2. riscv-target
    激励测试对象激励的编译命令脚本,包括一些core和ISS
  3. riscv-test-env
    测试激励需要用到的一些头文件,以及verify脚本和覆盖率分析脚本
  4. riscv-test-suite
    测试用例集

2. repo配置信息

  • 向量测试激励的配置

VLEN=256, SLEN=256, ELEN=32

  • 工程案例
  1. LowRISCIbex
  2. OpenHW
    openhw开源的CV32e40P核,只提供了一个测试用例
    该核信息详情参见:CPU系统级验证——验证环境——OpenHW core-v验证环境及文件分析_KGback的博客-CSDN博客
  3. riscvOVPsimPlus
  4. saik-riscv-c
    指令集形式化验证的一种工具
    该工程只提供了rv32i、rv32ic、rv32m、rv64i、rv64ic、rv64m六组测试用例

3. 向量测试激励构建方案

1.激励概况

imperas编写激励的方式和riscv-test类似,但主要偏向于兼容性测试,并不会关注硬件corner,因此更类似于riscv-compilance(也是他们家开源的)。

激励组成根据32位/64位、基本指令/特权指令/向量扩展指令、整数计算指令/分为rv32i、rv32ic、rv32im、rv32vi等。

2.几个宏文件

相关的头文件总共有5个。

  1. riscv_test_macros.h
    定义了TEST_CASE等功能性的宏,扩充了基本指令浮点运算、压缩指令的相关宏,类似riscv-tests工程中的test_macro.h,因此基本指令测试会调用的宏该工程均可以调用
  2. compilance_test.h
    定义了一些初始化的宏,包括工作模式初始化、自陷处理、中断处理等,是riscv_test.h的补充,只支持裸机状态(P模式)
  3. compilance_io.h
    定义了与IO交互的一些宏,这些宏可以打印信息,对通用寄存器、浮点运算寄存器处理。
  4. encoding.h
    定义了一些寄存器的地址和一些特殊值
  5. riscv_test.h
    详细定义了裸机状态下的初始化的宏,包括工作模式初始化、自陷处理、中断处理等。

3. 激励文件结构

该repo内的测试激励均为自测试用例,即激励程序自己对参考值和真实结果做对比,并产生标志位,testbench通过读取该标志位的值判断测试是否成功。

该测试用例中数据段和代码段是分离的。

  • 定义裸机状态的初始化

采用宏:RV_COMPLIANCE_RV32、RV_COMPLIANCE_RV64等

  • IO口初始化

初始化ISS和DUT的IO口,并通过检测x0寄存器是否为0判断是否初始化成功;然后打印相关信息

采用宏:RVTEST_IO_INIT、RVTEST_IO_ASSERT_GPR_EQ、RVTEST_IO_WRITE_STR等

  • 数据输入,开始测试

在一个激励文件中,总共8个group,每个group里4次测试,共32次测试

设置x1保存结果的地址,x2保存测试源数据的地址

开始单次测试:

  1. 通过vsetvli配置将源向量寄存器长度设为最长(存疑),通过x2寄存器不断偏移 (VLEN*LMUL/8)位依次将数据段数据读到vs1和vs2中,同时vd也赋一个初始值
  2. 后再次通过vsetvli将向量寄存器长度及元素长度,配置成目标指令的特征值
  3. 目标指令执行
  4. 再次通过vsetvli配置将源向量寄存器长度设为最长,将vd值保存到x1值(地址)开始的结果数据段
  5. 从x1段依次取出XLEN长度的值,依次与参考值做对比
    若相同,则进行下一次对比;若不同,则打印错误信息,并跳转到RVTEST_FAIL(该宏会将x3的最低位置1,testbench读取他的最低位从而识别到测试是否失败)
  6. 进行VLEN/XLEN次的对比后,若全都正确则开始下一次测试

采用宏:RVTEST_IO_ASSERT_GPR_EQ等

4. 激励测试corner

每个激励文件中的32次测试,vs和vd的值均遍历。vs1: v31-v0    vs2: v15-v0-v31-v16  vd: v0-v31

测试激励并无特别。

CPU系统级验证——测试激励——imperas公司riscvOVPsimPlus文件分析相关推荐

  1. CPU系统级验证——概览索引

    1. RISC-V CPU核指令集验证分析 1 wujian100 (1)SoC核分析 无剑100实际上是一款低功耗SoC,采用的CPU核是E902. core通过AHB总线与Icache相连 (2) ...

  2. CPU系统级验证——验证环境——OpenHW core-v验证环境及文件分析

    本文记录的相关源工程和文件为: core-v RISCV核功能验证工程:https://github.com/openhwgroup/core-v-verif core-v 验证策略:https:// ...

  3. Android系统中APP安装到手机后的文件分析

    一. Android系统APP安装格式 1.1 CAB格式 直接将文件copy到手机里,都可以在手机上执行该CAB文件即可安装. 1.2 EXE格式 EXE格式的程序可分为手机上直接运行(即绿色软件的 ...

  4. 【原创】MIPS中断系统的板级验证及实例测试

    "五一"假期前后这约五天时间,终于将MIPS中断系统进行了板级验证及实例测试.因为老师给的交叉编译工具不会用,所以测试代码完全用MIPS汇编编写.使用MARS而没有用QtSpim, ...

  5. 百度广告产品系统级测试技术演进

    背景 根据典型的测试金字塔结构,一个产品的测试可分为三个层级.第一层是单元测试,主要对程序函数进行测试.第二层是集成测试,在百度内部是大家常理解的模块测试.第三层是系统级测试,对产品整体进行的测试.这 ...

  6. android cpu 压力测试,两个古董级压力测试工具 leakyapp.exe 和 cpustre.exe

    两个古董级压力测试工具 leakyapp.exe 和 cpustre.exe,应该是在NT的 Windows Resource Kit Tools里面--连2000的里面都没有. Leakyapp.e ...

  7. 【操作细则】如何实现TSN系统级测试?

    汽车行业正不断向着数字化.自动化.网联化发展,汽车与周围环境及车身电子元件中的交互也日益复杂,大量来自雷达.传感器的数据需要传输处理,这必然会在网络延迟.可靠性方面造成影响.因此,实时网络变得不可或缺 ...

  8. 特权级概述(哥子就想知道CPU是如何验证特权级的)GATE+TSS

    [0]README text description from orange's implemention of a os . [1]特权级概述 当当前代码段试图访问一个段或者门时,目标段的DPL将会 ...

  9. linux系统下常用或有用的系统级命令

    本文章记录我在linux系统下常用或有用的系统级命令,包括软硬件查看.修改命令,有CPU.内存.硬盘.网络.系统管理等命令.但本文不打算介绍生僻命令,也不介绍各个linux发行版下的特有命令,且以后会 ...

最新文章

  1. ccf 交通规划(迪杰斯特拉优先队列模板)
  2. sed修炼系列(四):sed中的疑难杂症
  3. idea的setting界面怎么进_WMA转MP3怎么转?学会这招,WMA视频随便看!
  4. 常见数学符号:等号、不等号、算术运算符号、几何符号、三角函数、指数、对数、微分、积分符号、集合符号、逻辑符号
  5. 首届Apache Hadoop技术社区中国Meetup在京举办(附PPT)
  6. halcon使用直线标定板,标定相机内参代码
  7. 如何在 ASP.Net Core 使用 内存缓存
  8. 请移步到我的新浪博客
  9. 自定义shell脚本
  10. Spring Boot整合Swagger3
  11. bootstrap-table动态合并相同行和列的方法
  12. OpenStack还是OpenStack,云已不是那朵云!
  13. MySQL查询不同年份母亲节_日期习俗大不同 走近七个国家的母亲节
  14. 中国父母常犯的十大错误(转载)
  15. Java零基础学习全套视频笔记
  16. mysql建表实例 删除记录_python基础_mysql建表、编辑、删除、查询、更新
  17. 微信 服务器 台,2W台服务器的微信过载控制系统.docx
  18. Cannot initialize a variable of type 'Stu *' with an rvalue of type 'void *'
  19. Linux 的nameserver-域名服务器
  20. 【Android -- 学习笔记】ListView 详解

热门文章

  1. vue3 项目创建(UI图形化界面方式,可视化操作Vue项目,vue ui)
  2. 当你不看月亮时,月亮存在吗?
  3. 面向对象(一) 类和对象
  4. SRC部落,国家、企业和安全人才的三方求和
  5. Outlook 2003邮件如何导入FoxMail!!!
  6. 无线系统(EEEN3006J-Wireless Systems)复习笔记 (2)
  7. 【元宇宙欧米说】蓝魂,web3专用linktree
  8. 基于php中医药资讯网站管理系统源码获取
  9. 使用 Win32DiskImager 读写 SD 卡时,报错 error 1117
  10. 简单聊聊网络工程师的一些事