soc/sw/TEST_COVERAGE_ANALYSIS.md

SOC 软件测试覆盖分析报告

一、SOC 硬件模块清单

1.1 APB 子系统外设

根据 apb_subsystem.v 分析,APB 子系统包含以下外设:

外设模块 实例名 说明 状态
SPI0 u_apb_spi_master_0 QSPI 控制器 0 ✅ 已测试
SPI1 u_apb_spi_master_1 QSPI 控制器 1 ✅ 已测试
UART0 i_uart_apb UART 控制器 ✅ 已测试
PWM i_pwm_apb PWM 控制器 ✅ 已测试
I2C0 i_i2c_master0_top I2C 主控制器 0 ✅ 已测试
I2C1 i_i2c_master1_top I2C 主控制器 1 ⚠️ 部分测试
GPIO i_gpio GPIO 控制器 ❌ 已注释,未测试
Pinmux apb2pinmux 引脚复用控制器 ⚠️ 间接测试

1.2 其他 SOC 模块

模块 说明 测试状态
SRAM 静态存储器 ✅ 已测试
DMA 直接内存访问 ✅ 已测试(3个测试)
CNN 神经网络加速器 ✅ 已测试
ISP 图像信号处理器 ✅ 已测试
JTAG 调试接口 ✅ 已测试
Ibex Core RISC-V 处理器核心 ⚠️ 间接测试

二、现有测试用例分析

2.1 C 语言测试 (soc_test_c/)

测试用例 测试模块 基地址 状态 备注
sram_test SRAM 0x10000 基本读写测试
pwm_test PWM - PWM 功能测试
i2c_read_test I2C0 - I2C0 读测试
i2c_write_test I2C0 - I2C0 写测试
uart_test UART0 0x20010000 UART 通信测试
spi1_test SPI0 0x20000000 注意:名称是 spi1_test,但测试的是 SPI0
spi2_test SPI1 0x20040000 测试 SPI1
soc_dma_test DMA - DMA 基本测试
soc_dma_test1 DMA - DMA 测试变体 1
soc_dma_test2 DMA - DMA 测试变体 2
cnn_test CNN - CNN 加速器测试
isp_test ISP - ISP 功能测试
jtag_test JTAG - JTAG 调试测试
led GPIO? - ⚠️ 可能是简单的 GPIO 测试

2.2 UVM 测试 (soc_test_uvm/)

测试用例 测试模块 状态 备注
sram_uvm_test SRAM UVM 验证环境
pwm_uvm_test PWM UVM 验证环境
i2c_read_uvm_test I2C0 UVM 验证环境
i2c_write_uvm_test I2C0 UVM 验证环境
uart_uvm_test UART0 UVM 验证环境
spi_uvm_test SPI UVM 验证环境(可能测试 SPI0)
soc_dma_uvm_test DMA UVM 验证环境
soc_dma_uvm_test1 DMA UVM 验证环境
soc_dma_uvm_test2 DMA UVM 验证环境
cnn_uvm_test CNN UVM 验证环境
isp_uvm_test ISP UVM 验证环境
jtag_uvm_test JTAG UVM 验证环境
soc_base_test SOC 基础 SOC 基础测试

三、测试覆盖度分析

3.1 已覆盖模块 ✅

  • SRAM - 完整测试(C + UVM)
  • SPI0 - 完整测试(C: spi1_test + UVM)
  • SPI1 - 完整测试(C: spi2_test)
  • UART0 - 完整测试(C + UVM)
  • PWM - 完整测试(C + UVM)
  • I2C0 - 完整测试(C: read/write + UVM: read/write)
  • DMA - 完整测试(C: 3个测试 + UVM: 3个测试)
  • CNN - 完整测试(C + UVM)
  • ISP - 完整测试(C + UVM)
  • JTAG - 完整测试(C + UVM)

3.2 部分覆盖模块 ⚠️

  • ⚠️ I2C1 - 缺失测试
  • 只有 I2C0 的测试
  • 建议: 添加 i2c1_read_testi2c1_write_test
  • 建议: 添加 i2c1_read_uvm_testi2c1_write_uvm_test

  • ⚠️ Pinmux - 间接测试

  • spi2_test.c 中有 Pinmux 配置
  • 建议: 添加专门的 pinmux_test 测试所有引脚复用功能

3.3 未覆盖模块 ❌

  • GPIO - 完全缺失
  • GPIO 模块在代码中被注释掉(apb_subsystem.v 第 541-552 行)
  • 只有 led 测试,可能不是完整的 GPIO 测试
  • 建议: 如果 GPIO 功能需要,应取消注释并添加完整测试

  • SPI0 UVM 测试 - 可能缺失

  • spi_uvm_test 可能只测试了 SPI0,需要确认是否也测试 SPI1
  • 建议: 添加 spi0_uvm_testspi1_uvm_test 明确区分

四、测试命名问题

4.1 命名混淆

问题: spi1_test 实际上测试的是 SPI0spi2_test 测试的是 SPI1

原因分析:
- SPI0 基地址: 0x20000000 (在 spi1_test.c 中使用)
- SPI1 基地址: 0x20040000 (在 spi2_test.c 中使用)

建议:
- 重命名 spi1_testspi0_testqspi0_test
- 重命名 spi2_testspi1_testqspi1_test
- 或者添加注释说明命名规则

五、测试完整性评估

5.1 总体覆盖度: 约 85%

已覆盖: 10/12 主要模块 (83%)
- SRAM, SPI0, SPI1, UART0, PWM, I2C0, DMA, CNN, ISP, JTAG

部分覆盖: 1/12 模块 (8%)
- I2C1 (缺失)

未覆盖: 1/12 模块 (8%)
- GPIO (已注释,可能不需要)

5.2 测试类型覆盖

测试类型 C 测试 UVM 测试 状态
功能测试 完整
边界测试 ⚠️ ⚠️ 部分
错误处理 ⚠️ ⚠️ 部分
性能测试 缺失
压力测试 缺失

六、建议补充的测试

6.1 高优先级(必须补充)

  1. I2C1 测试
  2. i2c1_read_test.c / i2c1_write_test.c
  3. i2c1_read_uvm_test.sv / i2c1_write_uvm_test.sv
  4. 原因: I2C1 是硬件中存在的模块,应该有独立测试

  5. Pinmux 专门测试

  6. pinmux_test.c
  7. pinmux_uvm_test.sv
  8. 原因: Pinmux 是重要的配置模块,需要完整测试

6.2 中优先级(建议补充)

  1. SPI 测试明确化
  2. 重命名或添加 spi0_testspi1_test
  3. 添加 spi0_uvm_testspi1_uvm_test
  4. 原因: 避免命名混淆,确保两个 SPI 都有完整测试

  5. GPIO 测试(如果启用)

  6. 如果 GPIO 功能需要启用,应取消注释并添加测试
  7. gpio_test.c / gpio_uvm_test.sv

6.3 低优先级(可选补充)

  1. 边界和错误处理测试
  2. 各模块的边界条件测试
  3. 错误注入测试

  4. 性能和压力测试

  5. 各模块的性能基准测试
  6. 长时间运行压力测试

七、总结

7.1 测试覆盖情况

  • 核心功能: ✅ 已基本覆盖
  • 主要外设: ✅ 已基本覆盖(除 I2C1)
  • 特殊功能: ✅ CNN、ISP 已覆盖
  • 调试接口: ✅ JTAG 已覆盖

7.2 主要问题

  1. I2C1 测试缺失 - 硬件存在但无测试
  2. 命名混淆 - spi1_test 实际测试 SPI0
  3. GPIO 未测试 - 模块被注释,如需要应启用并测试
  4. Pinmux 测试不完整 - 只有间接测试

7.3 建议

立即补充:
- I2C1 的 C 和 UVM 测试
- Pinmux 专门测试

改进建议:
- 统一测试命名规范
- 添加测试文档说明各测试对应的硬件模块
- 考虑添加测试覆盖率统计

总体评价: 测试覆盖度较好(约 85%),主要缺失 I2C1 测试。建议补充后可达 95%+ 覆盖度。