UnityChipForXiangShan/ut_backend/ctrl_block/decode
yaozhicheng 335e7e0d4f decode: add 32bit check 2024-12-04 16:46:40 +08:00
..
env m 2024-11-22 18:36:26 +08:00
README.md decode: add rtl version check 2024-11-18 13:34:07 +08:00
__init__.py update 2024-10-09 20:01:48 +08:00
test_rv_decode.py decode: add 32bit check 2024-12-04 16:46:40 +08:00

README.md

Decode 单元验证

测试目标

解码单元的功能是对输入的指令进行解码最终转换为后端可识别的微指令。输出的指令有两种类型16位的压缩指令RVC 和 32位的普通指令RVI。本单元测试的主要目的是检查Dcode模块是否能识别所有非法指令

测试基本流程为:

  1. 随机生成指令
  2. 把指令输给DUT得到解码结果结果种包含是否为异常指令
  3. 把指令输给disasm判断能否正常解析disasm为RISC-V官方反汇编工具可以认为 Golden
  4. 对比DUT和disasm的结果判断是否一致

测试环境 Env

本测试基于disasm对 DUT 进行了封装。输入的DUT模块为 ut.predecode,ut.decodestageut.rvcexpander 三个模块。

  • ut.rvcexpander 对输入的指令进行展开输入支持16位压缩指令和普通32指令。

  • ut.predecode 预解码阶段,[TBD]

  • ut.decodestage [TBD]

依赖:

  • disasm 反汇编工具 (该工具位置为 tools.disasm

功能检查

本测试需要进行的功能点和检查点checkpoint/coverpoint如下

序号 所属模块 功能描述 检查点描述 检查标识 检查项
1 rvcexpander 压缩指令展开 检查是否能判断非法指令 RVC_EXPAND_RET ERRORstat接口ilegal==False
SUCCEstat接口ilegal==True
2 检查是否能展开所有正常指令,
发现所有非法指令
RVC_EXPAND_ALL_16B RANGE[start~end]: 16位压缩指令共有 2^16种可能
通过不同的start-end指定输入指令的
遍历范围,遍历该范围内的输入是否
是合法或非法指令startend由用例指定
3 常规指令展开 遍历所有32bit指令
检查是否合法
RVC_EXPAND_ALL_32B 检查项同上
4 随机生成N条32位指令
检查是否合法
RVC_EXPAND_RANDOM_32B POS_{i}:为了保证随机指令足够多,判断随机
生成的指令中第i位是否为1(0 <= i < 32)
5 TBD

Env提供的验证接口(API)

为了让测试用例更通用具有继承性本Env提供的接口对外屏蔽了电路引脚和时序,且接口保持稳定

1. rvcexpander


# 封装主类
class RVCExpander
    # 对指令指令 instr 进行展开
    # 参数:
    #    instr 输入指令
    # 返回:
    #    value 扩展结果
    #    ilegel 是否非法指令
    def expand(self, instr) -> (value, ilegal):
    # 获取 expander的状态
    # 返回:
    #    {
    #     instr当前的输入指令
    #     decode: 展开结果
    #     ilegal输入是否为非法指令
    #     }
    def stat(self) -> dict(instr => int, decode=>int, ilegal => bool):

# 用于自动创建RVCExpander的fixture
@pytest.fixture()
def rvc_expander(request) -> RVCExpander:

2. TBD

用例说明

本测试创建的用例如下以下内容建议以funciton doc的形式写入case的具体实现中然后以link的形式做链接:

1. test_rv_decode.test_rvc_expand_16bit_smoke 压缩指令展开冒烟测试

步骤 操作内容 预期结果 覆盖功能点
1 选择一条特定压缩指令 RVC_EXPAND_RET
2 通过RVCExpander.expand接口获取解码结果
通过disasm获取反汇编结果
3 检查两边的结果是否一致 所有指令是否非法指令判断结果一致 .SUCCE.ERROR

2. test_rv_decode.test_rvc_expand_32bit_smoke 普通指令展开冒烟测试

步骤 操作内容 预期结果 覆盖功能点
1 选择一条特定32位指令 RVC_EXPAND_RET
2 通过RVCExpander.expand接口获取解码结果
通过disasm获取反汇编结果
3 检查两边的结果是否一致 所有指令是否非法指令判断结果一致 .SUCCE.ERROR

3.test_rv_decode.test_rvc_expand_16bit_full 对所有压缩指令进行展开检查

步骤 操作内容 预期结果 覆盖功能点
1 将16位指令的取值范围拆分为N个分段 - 1->RVC_EXPAND_RET
2->RVC_EXPAND_16B_RANGE
2 遍历每个分段中的所有值,作为压缩指令 - 2.RANGE
3 通过RVCExpander.expand接口获取解码结果 - -
通过disasm获取反汇编结果
4 检查两边的结果是否一致 所有指令是否非法指令判断结果一致 1.SUCCE1.ERROR

4.test_rv_decode.test_rvc_expand_32bit_full 对所有压缩指令进行展开检查

同上,只是指令格式不一样

5.test_rv_decode.test_rvc_expand_32bit_randomN 随机对32位指令进行展开检查

步骤 操作内容 预期结果 覆盖功能点
1 随机运行K次每次随机生成N个32位指令 - 1->RVC_EXPAND_RET
2->RVC_EXPAND_RANDOM_32B
2 遍历N个指令 - 2.POS_i(0-32)
3 通过RVCExpander.expand接口获取解码结果 - -
通过disasm获取反汇编结果
4 检查两边的结果是否一致 所有指令是否非法指令判断结果一致 1.SUCCE1.ERROR,

目录结构

decode
├── README.md                 # 说明文件
├── __init__.py               # python模块文件
├── env                       # 环境模块
│   └── __init__.py
│   └── decode_wrapper.py
└── test_rv_decode.py         # 测试用例

检查列表

  • 本文档符合指定模板要求
  • Env提供的API不包含任何DUT引脚和时序信息
  • Env的API保持稳定共有[ X ]个)
  • Env中对所支持的RTL版本支持版本[ X ])进行了检查
  • 功能点(共有[ X ]个)与设计文档一致
  • 检查点(共有[ X ]个)覆盖所有功能点
  • 检查点的输入不依赖任何DUT引脚仅依赖Env的标准API
  • 所有测试用例(共有[ X ]个)都对功能检查点进行了反标
  • 所有测试用例都是通过 assert 进行的结果判断
  • 所有DUT或对应wrapper都是通过fixture创建
  • 在上述fixture中对RTL版本进行了检查
  • 创建DUT或对应wrapper的fixture进行了功能和代码行覆盖率统计
  • 设置代码行覆盖率时对过滤需求进行了检查