跳转至

功能覆盖率

1. 覆盖率模型

1.1 CPU 指令覆盖

covergroup instr_cg;
    instr_type: coverpoint instr {
        bins alu = {ADD, SUB, AND, OR, XOR, SLL, SRL, SRA, SLT, SLTU};
        bins imm = {ADDI, ANDI, ORI, XORI, SLLI, SRLI, SRAI, SLTI, SLTIU};
        bins load = {LB, LH, LW, LBU, LHU};
        bins store = {SB, SH, SW};
        bins branch = {BEQ, BNE, BLT, BGE, BLTU, BGEU};
        bins jump = {JAL, JALR};
        bins system = {ECALL, EBREAK, MRET, CSRRW, CSRRS, CSRRC};
    }
endgroup

1.2 地址覆盖

1
2
3
4
5
6
7
8
covergroup addr_cg;
    addr_range: coverpoint addr {
        bins rom = {[0x0000_0000:0x0007_FFFF]};
        bins sram = {[0x1000_0000:0x101F_FFFF]};
        bins peri = {[0x2000_0000:0x2FFF_FFFF]};
        bins ddr = {[0x4000_0000:0x7FFF_FFFF]};
    }
endgroup

1.3 数据覆盖

1
2
3
4
5
6
7
8
covergroup data_cg;
    data_val: coverpoint wdata {
        bins zero = {0};
        bins ones = {'1};
        bins pattern = {[1:100]};
        bins random = default;
    }
endgroup

2. 交叉覆盖

1
2
3
cross instr_type, addr_range;
cross instr_type, data_val;
cross addr_range, data_val;

3. 覆盖率状态

覆盖率类型 目标 当前 状态
指令覆盖 100% 85% 🔄 进行中
地址覆盖 100% 90% 🔄 进行中
数据覆盖 100% 75% 🔄 进行中
交叉覆盖 100% 60% 🔄 进行中

4. 未覆盖项分析

4.1 未覆盖指令

  • MULH: 需要测试有符号乘法
  • MULHSU: 需要测试混合符号乘法

4.2 未覆盖地址

  • DDR 区域: 需要添加 DDR 控制器测试

4.3 未覆盖数据

  • 边界值: 需要添加最大/最小值测试