芯片原厂必学课程 - 第九篇章 - 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 测试程序)
✅ 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:提取验证对象,以功能覆盖率模型检查测试点完备性