IC 验证篇(09-02)UVM 验证方案和测试分解

芯片原厂必学课程 - 第九篇章 - IC 验证篇

09-02 UVM 验证方案和测试分解

新芯设计:专注,积累,探索,挑战

引言

  NOTES:本文来自《芯片原厂必学课程 - 第九篇章 - IC 验证篇》技术专栏


🌏 一、UVM 验证方案

1. 验证方案的内容

  ✉ 文档流程,严格遵守:输出验证方案之前,首先要求熟悉 SPEC 内容,这里的时间占比要充分

  ✉ 输入文档,验证依据:列出所有的参考文件和版本号码,同时要求保持时刻刷新的准备

  ✉ 验证的需求:从设计的角度出发,要求全部覆盖的、容易出错的、重要功能的

  ✉ 测试点分解:从验证的角度出发,要求覆盖整个 SPEC 的、不小于验证需求的、特殊场景之下的

  ✉ 验证的环境:激励 Transaction,激励组件 Driver,监控组件 Monitor,参考模型 Reference,记分板 Scoreboard,逻辑探针 Inner Signal 等等的架构描述

2. 验证环境的划分

  ✉ UT 模块测试:取出单个模块,创造周围环境,包括输入激励和记录输出,具有快速运行,完备验证的优点(模块分割验证)

  ✉ IT 集成测试:在整个系统中验证子模块,输入激励是从 CPU 到模块的顶层,记录输出是在芯片的管脚上

  ✉ ST 系统测试:同上,IT 是虚假的 CPU/DMA(直接通过总线输入激励),ST 是真实的 CPU/DMA(写 C 测试程序)

09-02-01 经典的 ST 系统测试验证方案

3. 验证环境的流程

  ✉ 步骤一:由验证需求和模块接口确定环境使用的部件以及模型

  ✉ 步骤二:由外挂部件来构造环境内部结构,确定数据对比方式,主要是通过数据的 B2B,即 from Bit to Bit is all matching

# PYTHON 语言实现的文件对比操作
import operator
import numpy as np

N = 10000

riscv_core_verilog = []
riscv_core_cmodels = []

#import v & c data.
with open("./riscv_core_v.txt", "r") as aaa_: #import verilog data.
    aaa__ = [line.strip() for line in aaa_]   #delete unnecessary space.

with open("./riscv_core_c.txt", "r") as bbb_: #import c model data.
    bbb__ = [line.strip() for line in bbb_]   #delete unnecessary space.

#looking for the num of data comparision, and store in list.
for i in range(0, N):
    riscv_core_verilog.append(aaa__[i])
    riscv_core_cmodels.append(bbb__[i])

#mem compare results.
print('\n\n', "1. The Total Number of Comparision is: ")
print("***********************************************")
print("**********", len(riscv_core_verilog), "*********")
print("***********************************************")

print('\n', "2. The " "FFT" " Comparision Result is: ")
if(operator.eq(riscv_core_verilog, riscv_core_cmodels)\
and (len(riscv_core_verilog) == len(riscv_core_cmodels))):
    print("*******************************************")
    print("************* MEM COMPARE PASS ************")
    print("*******************************************")
else:
    print("*******************************************")
    print("************* MEM COMPARE FAIL ************")
    print("*******************************************")

  ✉ 步骤三:循序渐进把部件挂上接口,确定无误之后再挂下一个

  ✉ 步骤四:按照测试点编写用例测试


🌏 二、UVM 测试分解

1. 前仿验证流程

  ✉ 熟悉 SPEC 文档 -> UT/IT/ST 的验证策略制定 -> 测试点分解 -> 验证方案 -> 验证环境 -> 冒烟测试 -> 验证执行 -> 验证报告

2. 测试点定义

  ✉ 指的是从 IC 验证工程师的角度,能够映射 DUT 支持的全部应用场景,最终可以指导验证人员来进行下一步的验证工作

3. 测试点分类

  ✉ 场景类,功能类,性能类,接口类,异常类,白盒测试点(设计提供)

4. 测试点分解

  ✉ 依据 1:从软件算法,相关的协议文档的角度,主要是从应用层面

  ✉ 依据 2:从芯片规格,架构文档,SPEC,详细的设计文档的角度,主要是从硬件层面

  ✉ 目标 1:保证验证的完备性

  ✉ 目标 2:保证验证的准确性

  ✉ 目标 3:保证验证的操作性

  ✉ 关注 1:输入的正确性和完备性

  ✉ 关注 2:模块的时钟和复位

  ✉ 关注 3:系统资源

  ✉ 关注 4:边界点

  ✉ 关注 5:异常场景

  ✉ 关注 6:FIFO/FSM/CTRL 等繁忙的部分

  ✉ 类型 1:离散型:主要是侧重相关的应用场景的分解和梳理,如支持多种模式则启动多种模式的配置

  ✉ 类型 2:聚合型:主要是侧重单个的应用场景的归类,偏向于定向测试,如配置具体的寄存器令其工作在某一种工作模式

  ✉ 步骤 1:对设计规格进行细分和合理拓展,从而得到测试特性

  ✉ 步骤 2:以测试特性为单位,进一步分解出较为合理的测试点

  ✉ 步骤 3:提取验证对象,以功能覆盖率模型检查测试点完备性

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-09 12:26:01       91 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-09 12:26:01       97 阅读
  3. 在Django里面运行非项目文件

    2024-02-09 12:26:01       78 阅读
  4. Python语言-面向对象

    2024-02-09 12:26:01       88 阅读

热门阅读

  1. C++ [NOIP2007 提高组] 矩阵取数游戏

    2024-02-09 12:26:01       46 阅读
  2. lnmp指令

    2024-02-09 12:26:01       58 阅读
  3. C++中的递归算法

    2024-02-09 12:26:01       54 阅读
  4. 力扣刷题-392.判断子序列

    2024-02-09 12:26:01       53 阅读
  5. C语言中的作用域与生命周期

    2024-02-09 12:26:01       55 阅读
  6. 前端开发:(六)Vue快速入门

    2024-02-09 12:26:01       42 阅读
  7. GraphicsMagick 的 OpenCL 开发记录(三十四)

    2024-02-09 12:26:01       43 阅读
  8. c++学习:数组

    2024-02-09 12:26:01       44 阅读
  9. 开源大型语言模型概览:多语种支持与中文专注

    2024-02-09 12:26:01       51 阅读
  10. openssl3.2 - exp - RAND_bytes_ex

    2024-02-09 12:26:01       47 阅读