CPU系统级验证——测试激励——riscv-tests代码结构分析

本文详细介绍了RISC-V指令集自测试集riscv-tests的内容,包括benchmark、isa和programs测试。深入探讨了不同指令类型的具体测试方法,如整数计算指令、存储器访问指令及控制转移指令等,并提供了具体的测试宏示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

riscv-tests是一种指令集自测试集,能够自我检测指令集运行成功还是失败的测试程序。这些程序基本由汇编语言编写。
内包含banchmark、isa、programs测试。
github链接:GitHub - riscv-software-src/riscv-tests

1. benchmark测试

benchmark内包含一些业内公认C代码测试集

该部分代码在编译链接时需要加入crt0.s,原因时crt.s文件是运行C代码的最基本的裸机配置,如果是运行汇编代码则无需将该文件链接在内。

2. ISA测试

在riscv-tests/isa中,内含测试集均为定向指令测试,包含机器/用户/监督者模式下I/A/C/D/F/M类型的指令的测试。此处以64位的指令集环境为例:

1. P/V运行环境

根据运行环境是否为裸机状态可以分为P/V环境,P为裸机状态下测试,即虚拟内存未启动;V状态测试环境中虚拟内存已启动(通常引导了操作系统)。下文以裸机状态下各功能指令为例介绍测试集相关的头文件、宏、内嵌函数等。

  • P环境

机器模式下:包括自陷检测处理、失能多核运行、物理地址保护配置、自陷配置、切换到USER模式等

  • V环境

虚拟地址情况下

2. M/S/U工作模式

根据RISCV用户指令集和特权指令集spec,某些指令只允许在特定的工作模式下才有权限执行。
三种工作模式:RISCV——指令集spec阅读笔记——特权级_KGback的博客-CSDN博客

  • M模式

运行特权指令集spec下的指令。

  • S模式
  • U模式

运行I/A/F/D/M/C相关指令,以及自定义的扩展指令。

3. 汇编宏——构成激励源文件的组件

在测试激励源文件中,

不仅有与测试激励相关的宏,还有一些公用宏——这些宏定义了一些初始化配置,程序段处理和数据段处理,以及一些组成汇编程序的工具类宏。
这些宏均由test_macros.h、riscv_test.h和encoding.h组成。

  • 寄存器编号
  1. x1 一般用作源寄存器,特殊情况下用作目的寄存器
  2. x2 一般用作源寄存器,特殊情况下用作目的寄存器
  3. x3 用作目的寄存器,存储测试激励pass/fail的标志
  4. x4 用作计数器(某些测试下指令要循环执行多次)
  5. x5 用作计数的目标值(一般执行两次,x5=2)
  6. x6 用作旁路测试中nop指令后目的寄存器,会用作与参考值比较的结果值
  7. x29 存储待测指令的结果参考值
  8. x30 一般用作待测指令的目的寄存器,会用作与参考值比较的结果值
  • 相关功能宏
  1. TEST_CASE
    该宏将测试案例代码code执行完后,将案例原本的正确值加载到x29寄存器,并与保存代码结果的寄存器testreg内的值作对比,若不相等则跳转到fail位置;若相等则继续执行。
    #define TEST_CASE( testnum, testreg, correctval, code...)   
                 test_ ## testnum:    
                          code;     \
                          li x29, MASK_XLEN(correctval);        \
                          li TESTNUM, testnum;          \
                          bne testreg, x29, fail;
  2. TEST_PASSFAIL
    该宏定义了pass和fail的入口,实际结果和理论结果相等则跳到pass,若不相等则执行fail。
  3. RVTEST_PASS
    测试通过,将x3的值设为1,并通过环境调用异常将PC值写入到mepc寄存器。
  4. RVTEST_FAIL
    测试不通过,判断x3是否等于0,若不等于0,则将x3寄存器值左移一位并将最低位置1,后同样通过环境调用异常将PC值写入到mepc寄存器。

4. 各类型指令验证corner

  • 整数计算指令

整数计算指令可以分为R-I指令(寄存器-立即数)和R-R指令(寄存器-寄存器)。
对于R-I指令测试有操作数激励测试、寄存器激励测试、旁路设计测试、测试0号寄存器、特殊立即数格式测试。
对于R-R指令测试有操作数激励测试、寄存器激励测试、旁路设计测试、测试0号寄存器

  1. 操作数激励测试
    改变操作数的值,验证实际结果和理论结果是否一致
    相关宏:TEST_IMM_OP(...)、TEST_RR_OP(...)等,均调用TEST_CASE
  2. 寄存器激励测试
    改变源寄存器和操作寄存器,验证实际结果和理论结果是否一致
    相关宏:TEST_IMM_SRC1_EQ_DEST(...)、TEST_RR_SRC1_EQ_DEST(...)等,均调用TEST_CASE
  3. 旁路设计测试
    对于DEST_BYPASS情形,通过在待测指令和数据相关的运算指令间插入0~2条NOP指令来实现,并循环执行两次(通过x4和x5判断)
    相关宏:TEST_IMM_DEST_BYPASS(...)、TEST_RR_DEST_BYPASS(...)等,均调用TEST_CASE
  4. 测试0号寄存器
    将x0寄存器作为原寄存器或目的寄存器,验证x0寄存器在整数计算中是否为只读寄存器且内容始终为0
    相关宏:TEST_IMM_ZEROSRC1(...)、TEST_RR_ZEROSRC1(...)等,均调用TEST_CASE
  5. 特殊立即数格式测试
    在R-I指令测试中,由LUI指令和AUIPC指令采用U型格式的立即数
  • 存储器访问指令

存储器访存指令分为load指令和store指令。

  1. load/store指令基本测试
    测试方案为分别采用正常地址类型(即基址和偏移值皆为正数);偏移量为负数;基址负数,将基址读到寄存器,然后减少32得到新的基址,测试基址偏移32的读出结果;非对齐地址,将基址读到寄存器,然后减少3得到新的基址,测试基址偏移7的读出结果
  2. 旁路设计测试
    类似于整数计算指令的旁路测试
  3. 数据相关性测试
    主要针对load指令WRW冒险测试
  • 控制转移指令

控制转移指令分为无条件跳转指令和条件跳转指令

  1. 条件分支跳转指令基本测试
    相关宏:TEST_BR2_OP_TAKEN、TEST_BR2_OP_NOTAKEN等
    测试分别在操作数相同和不相同情况下,指令执行跳转的状况,若没有正常跳转则跳转到fail标签处,且被测指令执行两次。
  2. 旁路设计测试
    相关宏:TEST_BR2_SRC12_BYPASS、TEST_BR2_SRC21_BYPASS
    类似于整数计算指令的旁路测试。
  • 控制和状态寄存器指令

该类指令包括CSR指令测试和环境调用相关指令测试

  1. CSR指令测试
    分为指令操作测试用例(即以mepc寄存器为操作对象分别测试CSRRRW、CSRRS、CSRRC三类指令),CSR寄存器读写测试
  2. 环境调用相关测试
    ECALL、EBREAK
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KGback

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值