UnityChipForXiangShan/ut_backend/ctrl_block/decode/README.md

150 lines
6.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Decode 单元验证
## 测试目标
解码单元的功能是对输入的指令进行解码最终转换为后端可识别的微指令。输出的指令有两种类型16位的压缩指令RVC 和 32位的普通指令RVI。本单元测试的主要目的是**检查Dcode模块是否能识别所有非法指令**。
测试基本流程为:
1. 随机生成指令
1. 把指令输给DUT得到解码结果结果种包含是否为异常指令
1. 把指令输给disasm判断能否正常解析disasm为RISC-V官方反汇编工具可以认为 Golden
1. 对比DUT和disasm的结果判断是否一致
## 测试环境 Env
本测试基于disasm对 DUT 进行了封装。输入的DUT模块为 `ut.predecode`,`ut.decodestage` 和 `ut.rvcexpander` 三个模块。
- **ut.rvcexpander**
对输入的指令进行展开输入支持16位压缩指令和普通32指令。
- **ut.predecode**
预解码阶段,[TBD]
- **ut.decodestage**
[TBD]
依赖:
- disasm 反汇编工具 (该工具位置为 tools.disasm
## 功能检查
本测试需要进行的功能点和检查点checkpoint/coverpoint如下
|序号|所属模块|功能描述|检查点描述|检查标识|检查项|
|-|-|-|-|-|-|
|1|rvcexpander|压缩指令展开|检查是否能判断非法指令|RVC_EXPAND_RET|ERRORstat接口`ilegal==False`<br>SUCCEstat接口`ilegal==True`|
|2|||检查是否能展开所有正常指令,<br>发现所有非法指令|RVC_EXPAND_ALL_16B|RANGE[`start~end`]: 16位压缩指令共有 2^16种可能<br>通过不同的start-end指定输入指令的<br>遍历范围,遍历该范围内的输入是否<br>是合法或非法指令startend由用例指定|
|3||常规指令展开|遍历所有32bit指令<br>检查是否合法|RVC_EXPAND_ALL_32B|检查项同上|
|4|||随机生成N条32位指令<br>检查是否合法|RVC_EXPAND_RANDOM_32B|POS_{i}:为了保证随机指令足够多,判断随机<br>生成的指令中第i位是否为1(0 <= i < 32)|
|5|TBD|||||
## Env提供的验证接口(API)
为了让测试用例更通用具有继承性本Env提供的接口**对外屏蔽了电路引脚和时序且接口保持稳定**
#### 1. rvcexpander
```python
# 封装主类
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]()<br> [2->RVC_EXPAND_16B_RANGE]()|
|2|遍历每个分段中的所有值,作为压缩指令|-|[2.RANGE]()|
|3|通过RVCExpander.expand接口获取解码结果|-|-|
||通过disasm获取反汇编结果|||
|4|检查两边的结果是否一致|所有指令是否非法指令判断结果一致|[1.SUCCE]()[1.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]()<br>[2->RVC_EXPAND_RANDOM_32B]()|
|2|遍历N个指令|-|[2.POS_i(0-32)]()|
|3|通过RVCExpander.expand接口获取解码结果|-|-|
||通过disasm获取反汇编结果|||
|4|检查两边的结果是否一致|所有指令是否非法指令判断结果一致|[1.SUCCE]()[1.ERROR](), |
## 目录结构
```bash
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进行了功能和代码行覆盖率统计
- [ ] 设置代码行覆盖率时对过滤需求进行了检查