diff --git a/ut_backend/ctrl_block/decode/README.md b/ut_backend/ctrl_block/decode/README.md
index a74a25b..a9a35f9 100644
--- a/ut_backend/ctrl_block/decode/README.md
+++ b/ut_backend/ctrl_block/decode/README.md
@@ -17,10 +17,10 @@
本测试基于disasm对 DUT 进行了封装。输入的DUT模块为 `ut.predecode`,`ut.decodestage` 和 `ut.rvcexpander` 三个模块。
- **ut.rvcexpander**
-在 env 环境中,通过RVCExpander对DUT进行了封装,提供指令展开接口。
+对输入的指令进行展开,输入支持16位压缩指令和普通32指令。
- **ut.predecode**
-[TBD]
+预解码阶段,[TBD]
- **ut.decodestage**
[TBD]
@@ -29,26 +29,18 @@
依赖:
- disasm 反汇编工具 (该工具位置为 tools.disasm)
-## 功能检查点
+## 功能检查
-本测试需要进行的功能点和检查点(checkpoint/coverpoint)如下(该部分建议以注释的形式写入funcov):
+本测试需要进行的功能点和检查点(checkpoint/coverpoint)如下:
-|序号|涉及模块|功能描述|检查方法|检查点名称|
-|-|-|-|-|-|
-|1|rvcexpander|压缩指令展开|检查是否有非法判断|RVC_EXPAND_RET|
-|1|rvcexpander|压缩指令展开|检查所有正常指令是否都覆盖到|RVC_EXPAND_16B_RANGE|
-|2|| |检查所有非法指令是否都覆盖到|同上|
-|3|rvcexpander|常规指令展开|检查随机输入得指令,
每一位是否都被覆盖过
eg: ins[7] == 1|RVC_EXPAND_32B_BITS|
-|5|TBD| |-|-|
+|序号|所属模块|功能描述|检查点描述|检查标识|检查项|
+|-|-|-|-|-|-|
+|1|rvcexpander|压缩指令展开|检查是否能判断非法指令|RVC_EXPAND_RET|ERROR:stat接口`ilegal==False`
SUCCE:stat接口`ilegal==True`|
+|2|||检查是否能展开所有正常指令,
发现所有非法指令|RVC_EXPAND_ALL_16B|RANGE[`start~end`]: 16位压缩指令共有 2^16种可能,
通过不同的start-end指定输入指令的
遍历范围,遍历该范围内的输入是否
是合法或非法指令(start,end由用例指定)|
+|3||常规指令展开|遍历所有32bit指令,
检查是否合法|RVC_EXPAND_ALL_32B|检查项同上|
+|4|||随机生成N条32位指令,
检查是否合法|RVC_EXPAND_RANDOM_32B|POS_{i}:为了保证随机指令足够多,判断随机
生成的指令中第i位是否为1(0 <= i < 32)|
+|5|TBD|||||
-检查点细分(Bins,一个检查点由多个bin组成,只有所有bin都触发,该检查点才算被覆盖):
-- RVC_EXPAND_RET
- - ERROR expander 得非法检查返回 0
- - SUCCE expander 得非法检查返回 1
-- RVC_EXPAND_16B_RANGE
- - RANGE[start-end] 16为指令公有 2^16种可能,需要start-end覆盖整个16bit的取值范围
-- RVC_EXPAND_32B_BITS
- - POS_(0-31)
## Env提供的验证接口(API)
@@ -109,17 +101,19 @@ def rvc_expander(request) -> RVCExpander:
#### 3.test_rv_decode.test_rvc_expand_16bit_full 对所有压缩指令进行展开检查
|步骤|操作内容|预期结果|覆盖功能点|
|-|-|-|-|
-|1|将16位指令的取值范围拆分为N个分段|-|[1->RVC_EXPAND_RET](), [2->RVC_EXPAND_16B_RANGE]()|
+|1|将16位指令的取值范围拆分为N个分段|-|[1->RVC_EXPAND_RET]()
[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 对所有压缩指令进行展开检查
+同上,只是指令格式不一样
-#### 3.test_rv_decode.test_rvc_expand_32bit_randomN 随机对32位指令进行展开检查
+#### 5.test_rv_decode.test_rvc_expand_32bit_randomN 随机对32位指令进行展开检查
|步骤|操作内容|预期结果|覆盖功能点|
|-|-|-|-|
-|1|随机运行K次,每次随机生成N个32位指令|-|[1->RVC_EXPAND_RET](), [2->RVC_EXPAND_32B_BITS]()|
+|1|随机运行K次,每次随机生成N个32位指令|-|[1->RVC_EXPAND_RET]()
[2->RVC_EXPAND_RANDOM_32B]()|
|2|遍历N个指令|-|[2.POS_i(0-32)]()|
|3|通过RVCExpander.expand接口获取解码结果|-|-|
||通过disasm获取反汇编结果|||
@@ -140,12 +134,15 @@ decode
## 检查列表
-- [ ] 模块 README 包含[模板]()中提到的所有内容
-- [ ] Env提供的API不包含任何DUT引脚和时序信息(已对必要情况进行了说明)
-- [ ] 功能点(共有[ ]个)与[设计文档]()一致
-- [ ] 检查点(共有[ ]个)覆盖所有功能点
+- [ ] 本文档符合指定[模板]()要求
+- [ ] Env提供的API不包含任何DUT引脚和时序信息
+- [ ] Env的API保持稳定(共有[ X ]个)
+- [ ] Env中对所支持的RTL版本(支持版本[ X ])进行了检查
+- [ ] 功能点(共有[ X ]个)与[设计文档]()一致
+- [ ] 检查点(共有[ X ]个)覆盖所有功能点
- [ ] 检查点的输入不依赖任何DUT引脚,仅依赖Env的标准API
-- [ ] Env的API保持稳定(共有[ ]个)
-- [ ] 所有测试用例(共有[ ]个)都对功能检查点进行了反标
-- [ ] 对行覆盖率过滤需求进行了检查
-- [ ] Env中对所支持的RTL版本(支持版本[ ])进行了检查
+- [ ] 所有测试用例(共有[ X ]个)都对功能检查点进行了反标
+- [ ] 所有测试用例都是通过 assert 进行的结果判断
+- [ ] 所有DUT或对应wrapper都是通过fixture创建
+- [ ] 创建DUT或对应wrapper的fixture进行了功能和代码行覆盖率统计
+- [ ] 设置代码行覆盖率时对过滤需求进行了检查
diff --git a/ut_backend/ctrl_block/decode/env/decode_wrapper.py b/ut_backend/ctrl_block/decode/env/decode_wrapper.py
index dfb7216..cde883b 100644
--- a/ut_backend/ctrl_block/decode/env/decode_wrapper.py
+++ b/ut_backend/ctrl_block/decode/env/decode_wrapper.py
@@ -49,11 +49,22 @@ def init_rvc_expander_funcov(expander, g: fc.CovGroup):
# 2. Add point RVC_EXPAND_16B_RANGE to check expander input range
# - bin RANGE[start-end]. The instruction is in the range of the compressed instruction set
# This check point is added in case 'test_rv_decode.test_rvc_expand_16bit_full' dynamically, see the test case for details
-
+
+ # 3. Add point RVC_EXPAND_32B_RANGE to check expander input range
+ # - bin RANGE[start-end]. The instruction is in the range of the 32bit instruction set
+ # This check point is added in case 'test_rv_decode.test_rvc_expand_32bit_full' dynamically, see the test case for details
+
# 3. Add point RVC_EXPAND_32B_BITS to check expander function coverage
# - bin BITS[0-31]. The instruction is expanded to the corresponding 32-bit instruction
- # This check point is added in case 'test_rv_decode.test_rvc_expand_32bit_randomN' dynamically, see the test case for details
-
+ def _check_pos(i):
+ def check(expander):
+ return expander.stat()["instr"] & (1<