如何写出更牛的验证激励
前言
芯片验证是为了发现芯片中的错误而执行的过程,它是一个破坏性的过程。完备的验证激励可以更有效地发现芯片错误,进而缩短验证周期。合格的验证激励必须能产生所有可能的验证场景(完备性),包括合法和非法的场景,并保持最大的可扩展性和可控性。
激励构造一直都是芯片验证的一大难点。本文将从完备性、可拓展性和可控性三方面展开阐述如何系统地思考和构建验证激励。
-
完备性
完备性可以从接口类型、内部结构和激励审查三方面分析。分析接口类型是为了从待测模块与其它模块的交互信号上提取出验证场景。分析内部结构是为了从待测模块内部实现细节上来调整激励,使激励多产生可能发现错误的场景。激励审查用于查缺补漏,从自己、他人以及项目等各个环节上对激励进行完善。
-
-
接口类型
-
对于待测设计的输入输出接口,可以通过接口类型进行划分,根据接口类型的特性构造对应的验证组件来产生激励。常见接口类型有:
- 系统控制接口:主要是时钟、复位、电源开关、时钟门控、时钟分频等,这类信号行为都会有详细的规定,遵循实际集成关系做控制即可。例如:时钟和复位的时序,多个时钟是不是同步关系,多个复位信号是否可以单独控制等。
- 标准总线接口:行业公开的标准总线协议,例如AMBA系列协议。这类协议通常有现成的验证IP,只需配置它们来产生预期的场景。
- 非标准总线接口:公司内部定义的接口,或者根据模块功能需求定义的接口。这类接口需要从相邻设计了解各信号的准确信息。
- 其它接口:DFT等。通常来说,这类接口与验证关系不是很大,只需要把它们接固定值即可。
在对接口类型进行分析要产生的激励时,可以先从单一接口类型进行分析,然后再看多个接口交互上有什么需要重点关注。关于如何进行测试点分解,可以看这个系列视频《芯片验证分享系列总结及PPT分享》。
-
-
-
单一接口类型
-
-
单一接口类型分析可以按基本颗粒、高级颗粒和非法行为顺序进行。
- 基本颗粒:基本颗粒面向信号层,提供基本颗粒生成方法。
- 每根信号:信号来源和功能、使能极性、脉冲有效或电平有效、时序、信号的取值范围和格式等。
- 信号之间:不同信号之间的关系,是否存在握手和时序关系,无关信号是否处理成随机值还是固定值等。
- 高级颗粒:高级颗粒面向场景层,它封装了多个基本颗粒,较少考虑底层信号。
- 序列:传输包的序列有哪些。
- 密度:传输包的密度分布有哪些。
- 非法行为:用于验证待测设计的鲁棒性,出现非法行为,待测设计是否可以正常处理。
- 数值:信号值可能出现哪些非预期的值。
- 行为:信号时序、协议等行为可能出现哪些异常行为。
-
-
-
多个接口交互
-
-
对于具有多个接口的待测设计,我们也需要考虑接口之间可能存在的交互或同步,以及接口之间是否使用共同资源。比如,为了测试两个接口相同地址hazard,可以让这两个接口共享一个地址产生器。
不同接口对应不同的验证组件,组件之间的协调有用多种方式:
- 中心统筹式:通过集中式控制、分配和协调,在上层将任务分解成每个接口组件的任务,并统一分派给各个接口组件去执行,进而产生不同的激励组合场景。比如UVM中的virtual sequence角色。
- 分布事件驱动式:每个接口组件有自己的控制权,各个组件直接进行交互。比如使用SystemVerilog中的event、mailbox、semaphore和全部变量等方式实现通信交互。
- 混合式:上述两种方式并存。这需要根据具体场景来使用。
-
-
内部结构
-
激励设计除了看接口信号外,还需要结合待测设计的内部结构和功能去分析,调整激励约束,从而有更大的概率产生有效场景。
可以沿着控制流(control flow)方向去分析待测设计的内部结构和功能,具体以下几个地方需要重点关注:
- 触发功能点:触发内部某个功能的激励序列有哪些,比如Prefetch、flow-control、address hazard等。触发内部某个功能的敏感值有哪些,比如ALU、内部错误(cache ecc error, slave error, etc)、barrier、exclusive monitor、address hazard等。
- 触发资源瓶颈和争抢:如何触发内部资源瓶颈和争抢。比如FIFO空满、Buffer空满、多请求源仲裁、数字运算上下溢等。
-
-
激励审查
-
审查(Review)环节对完善激励起着至关重要的作用,可以提高激励质量,并减少漏验特性、无效激励的概率,对个人成长也有很大帮助。
建议以下这些审查方式都要进行:
- 个人审查:由自己进行,对照历史错误清单进行,举一反三,避免犯类似错误。
- 同组审查:由组内更有经验的人进行,对激励完备性、设计结构、假设、代码实现进行检查。
- 跨组审查:由待测模块的设计人员进行,对激励完备性、设计顾虑、易错特性、局限性和各种激励假设进行检查。
-
可扩展性
可扩展性也包括可复用性。为了处理验证周期缩短、待测RTL规格频繁变动等各种情况,我们需要在设计激励时提前构思如何让激励更容易扩展。基于此,我们可以从模块化和层次化方面去思考。
-
-
模块化
-
模块化需要将设计输入输出信号划分为不同的接口类型,并创建出对应的接口验证组件,确保各个组件之间的独立性,各个组件才会最大程度地不受其它组件的制约。并定义好模块之间的交互方式,这样一个模块的改动对其它模块的影响就很小,而且模块也更容易的复用到其它地方。例如,如果有两组相同接口,则应该引入两个组件分别控制,而非建立一个组件却拥有两套接口,这样后期维护起来会很麻烦的。
另外把常见的功能封装成公共库,这样在多个地方都可以直接使用,如果功能需要改动,只需要改动一处代码即可。在写代码时,多留一些后门(callback),方便实现多样化的激励和后期增加新功能。
-
-
层次化
-
层次化需要将激励抽象出各个层次,越高的抽象层次越不关注底层的时序,而是更重视验证场景构造。这样底层信号时序或功能的改动也不容易影响到上层的激励,而且上层的激励说不定也可以复用到其它地方。
以UVM为例,uvm_driver应只关心接口驱动,负责把收到的uvm_sequence_item内容直接驱动到接口信号;uvm_sequence负责场景的构造,当然uvm_sequence也可以继续分层,更上层的uvm_sequence产生更宏观的验证场景,然后逐层分解成小的场景。
-
可控性
可控性用于表征是否容易控制激励产生预期的验证场景。比如验证ECC模块功能时,在最开始时,我们需要不注入任何ECC错误的激励,侧重于验证ECC模块功能是否正常。随后才会打开ECC注错激励,验证ECC模块是否可以检查出来。这需要提供一些方式可以控制是否打开ECC注错激励。基于此,我们可以从局部和全局方面去思考。
-
-
局部
-
可控性局部的意思是验证激励可以单独控制局部激励的行为,通常来说面向单个接口验证组件。这层控制的特点是偏向于接口,可以细致到控制接口每根信号的行为。
比如,待测对象有两个ECC模块,我们可以控制其中一个有ECC注错,另一个没有。
-
-
全局
-
可控性全局的意思是验证激励可以一同控制所有激励的行为,通常来说面向一个验证环境中的所有接口验证组件。这层控制的特点是偏向于特性,是把所有局部控制参数整合起来,提供和验证特性相关的控制参数。
比如,待测对象有两个ECC模块,我们可以同时控制两个都有ECC注错,或都没有等。又或者待测对象的某个特性还未开发完成,我们可以控制不让所有激励发出与未完成特性相关的场景。
总结
综上所述,激励设计可以按照“完备性->可拓展性->可控性”方向去分析。在完备性中,可以按照“接口类型->内部结构->激励审查”方向去分析。在可拓展性中,可以按照“模块化->层次化”方向去分析。在可控性中,可以按照“局部->全局”方向去分析。
另外很重要的一点是:要经常对验证结果进行复盘分析,并优化激励。
总得思维导图如下:
相关文章:

如何写出更牛的验证激励
前言 芯片验证是为了发现芯片中的错误而执行的过程,它是一个破坏性的过程。完备的验证激励可以更有效地发现芯片错误,进而缩短验证周期。合格的验证激励必须能产生所有可能的验证场景(完备性),包括合法和非法的场景,并保持最大的…...

EasyCVR视频汇聚平台:解锁视频监控核心功能,打造高效安全监管体系
随着科技的飞速发展,视频监控技术已成为现代社会安全、企业管理、智慧城市构建等领域不可或缺的一部分。EasyCVR视频汇聚平台作为一款高性能的视频综合管理平台,凭借其强大的视频处理、汇聚与融合能力,在构建智慧安防/视频监控系统中展现出了…...

面对大文件(300G以上)如何加速上传速度
解题思路 采用分片上传,同时每个分片多线程上传可以加速上传速度,上传速度提升10倍左右 在阿里云OSS Go SDK中,bucket.UploadStream 函数并没有直接提供,而是通过 bucket.UploadFile 或者 bucket.PutObject 等函数来实现文件上传…...

基于 Redis 实现消息队列的深入解析
目录 Redis 消息队列简介Redis 消息队列的实现方式 2.1 使用 List 实现简单队列2.2 使用 Pub/Sub 模式实现消息发布与订阅2.3 使用 Stream 实现高级队列 Redis 消息队列的特点与优势Redis 消息队列的应用场景Redis 消息队列的局限性及应对方案总结 Redis 消息队列简介 Redis…...

C++(string类的实现)
1. 迭代器、返回capacity、返回size、判空、c_str、重载[]和clear的实现 string类的迭代器的功能就类似于一个指针,所以我们可以直接使用一个指针来实现迭代器,但如下图可见迭代器有两个,一个是指向的内容可以被修改,另一个则是指…...

nrf 24l01使用方法
1、frequency 频率基础频率2.400G HZ RF_CH RF_CH10 CH2.4G0.01G2.41G 2、逻辑通道6个 pipe 时间片不同,占用同一个频率 发送时,只有一个pipe 接受时可以有6个pipe 3、通讯速率 air data rate rf_dr 寄存器设置 有两种速率 2M 1M RF_DR0 1M ,…...

C语言普及难度三题
先热个身,一个长度为10的整型数组,输出元素的差的max和min。 #include<stdio.h> int main() {int m[10],i0,max,min;for(i0;i<10;i){scanf("%d",&m[i]);}minm[0];maxm[0];for (i 0; i <10; i){if(min>m[i]) min m[i];i…...

10.4每日作业
C1 C2 C1 C2...

日常工作记录:服务器被攻击导致chattr: command not found
在深夜的寂静中,公司的服务器突然遭遇了一场突如其来的攻击。特别是nginx配置文件无法修改,仿佛预示着不祥的预兆,面对这突如其来的灾难,技术人员迅速响应。 这时候需要chattr,但是执行的chattr -i xxx的时候…...

多线程-初阶(1)
本节⽬标 • 认识多线程 • 掌握多线程程序的编写 • 掌握多线程的状态 • 掌握什么是线程不安全及解决思路 • 掌握 synchronized、volatile 关键字 1. 认识线程(Thread) 1.1 概念 1) 线程是什么 ⼀个线程就是⼀个 "执⾏流". 每个线…...

Spring Boot集成encache快速入门Demo
1.什么是encache EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认的 CacheProvider。 Ehcache 特性 优点 快速、简单支持多种缓存策略:LRU、LFU、FIFO 淘汰算法缓存数据有两级:内存和磁盘&a…...

【C语言】数组练习
【C语言】数组练习 练习1:多个字符从两端移动,向中间汇聚练习2、二分查找 练习1:多个字符从两端移动,向中间汇聚 编写代码,演示多个字符从两端移动,向中间汇聚 练习2、二分查找 在⼀个升序的数组中查找指…...

微服务实战——ElasticSearch(保存)
商品上架——ElasticSearch(保存) 0.商城架构图 1.商品Mapping 分析:商品上架在 es 中是存 sku 还是 spu ? 检索的时候输入名字,是需要按照 sku 的 title 进行全文检索的检索使用商品规格,规格是 spu 的…...

leetcode练习 路径总和II
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22 输出&a…...

使用Three.js库创建的简单WebGL应用程序,主要用于展示具有不同透明度和缩放比例的圆环列
上述HTML文档是一个使用Three.js库创建的简单WebGL应用程序,主要用于展示具有不同透明度和缩放比例的圆环列。以下是代码的详细解释: HTML结构: 文档类型声明为HTML5。<html>标签设置了语言属性为英语(lang"en")…...

Redis: 集群架构,优缺点和数据分区方式和算法
集群 集群指的就是一组计算机作为一个整体向用户提供一组网络资源 我就举一个简单的例子,比如百度,在北京和你在上海访问的百度是同一个服务器吗?答案肯定是不是的,每一个应用可以部署在不同的地方,但是我们提供的服务…...

负载均衡可以在网络模型的哪一层?
一、网络模型概述 网络模型是用于描述网络通信过程和网络服务的抽象框架。最常见的网络模型有两种:OSI(开放式系统互联)模型和TCP/IP模型。 OSI模型 OSI(Open Systems Interconnection)模型是由国际标准化组织&…...

YOLOv11改进 | 上采样篇 | YOLOv11引入CARAFE上采样
1. DySample介绍 1.1 摘要:特征上采样是许多现代卷积网络体系结构(如特征金字塔)中的关键操作。它的设计对于密集预测任务(如对象检测和语义/实例分割)至关重要。在本文中,我们提出了一个通用、轻量级、高效的特征重组算子CARAFE来实现这一目标.CARAFE有几个吸引人的特性…...

【Linux运维】grep命令粗浅学习
文章目录 1 背景介绍1.1 为什么要学习grep?1.2 grep是什么?1.3 grep可以做什么? 2 grep基本语法2.1 命令格式2.2 “PATTERN”部分中的正则表达式语法学习2.3 grep命令参数学习 3 典型案例3.1 匹配非空行,过滤纯空行3.2 匹配IPv4地…...

【Godot4.3】匀速和匀变速直线运动粒子
概述 本篇论述,如何用加速度在Godot中控制粒子运动。 匀速和匀变速直线运动的统一 以下是匀变速运动的速度和位移公式: v t v 0 a t x t v 0 t 1 2 a t 2 v_tv_0 at \\ x_tv_0t \frac{1}{2}at^2 vtv0atxtv0t21at2 当a 0 时…...

基于Hive和Hadoop的用电量分析系统
本项目是一个基于大数据技术的用电量分析系统,旨在为用户提供全面的电力消耗信息和深入的用电量分析。系统采用 Hadoop 平台进行大规模数据存储和处理,利用 MapReduce 进行数据分析和处理,通过 Sqoop 实现数据的导入导出,以 Spark…...

一个简单的摄像头应用程序4
我们进一步完善了这个app01.py,我们优化了界面使其更人性化,下面介绍中包含了原有的功能及新增的功能: 创建和管理文件夹: create_folder 函数用于创建保存照片和视频的文件夹。 get_next_file_number 函数用于获取文件夹中下一个可用的文件编号。 图像处理: pil_to_cv 函…...

SpringBoot使用EasyPoi根据模板导出word or pdf
1、导出效果 1.1 wrod 1.2 pdf 2、依赖 <!--word--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.3.0</version></dependency><dependency><groupId>cn.…...

NVIDIA Hopper 架构深入
在 2022 年 NVIDIA GTC 主题演讲中,NVIDIA 首席执行官黄仁勋介绍了基于全新 NVIDIA Hopper GPU 架构的全新 NVIDIA H100 Tensor Core GPU。 文章目录 前言一、NVIDIA H100 Tensor Core GPU 简介二、NVIDIA H100 GPU 主要功能概述1. 新的流式多处理器 (SM) 具有许多性能和效率…...

AWS IoT Core for Amazon Sidewalk
目录 1 前言2 AWS IoT2.1 准备条件2.2 创建Credentials2.2.1 创建user2.2.2 配置User 2.3 本地CLI配置Credentials 3 小结 1 前言 在测试Sidewalk时,device发送数据,网关接收到,网关通过网络发送给NS,而此处用到的NS是AWS IoT&am…...

今日指数项目项目集成RabbitMQ与CaffienCatch
今日指数项目项目集成RabbitMQ与CaffienCatch 一. 为什么要集成RabbitMQ 首先CaffeineCatch 是作为一个本地缓存工具 使用CaffeineCatch 能够大大较少I/O开销 股票项目 主要分为两大工程 --> job工程(负责数据采集) , backend(负责业务处理) 由于股票的实时性也就是说 ,…...

C0005.Clion中移动ui文件到新目录后,报错问题的解决
报错问题如下 AutoUic error ------------- "SRC:/confirmwizardpage.cpp" includes the uic file "ui_confirmwizardpage.h", but the user interface file "confirmwizardpage.ui" could not be found in the following directories"SRC…...

基于STM32的智能家居灯光控制系统设计
引言 本项目将使用STM32微控制器实现一个智能家居灯光控制系统,能够通过按键、遥控器或无线模块远程控制家庭照明。该项目展示了如何结合STM32的外设功能,实现对灯光的智能化控制,提升家居生活的便利性和节能效果。 环境准备 1. 硬件设备 …...

06.useEffect
在 React 开发中,正确使用 useEffect 钩子对于优化组件性能至关重要。一个常见但容易被忽视的性能问题是在依赖数组中使用对象作为依赖项。这可能导致不必要的效果重新执行,从而影响应用性能。通过优先使用原始值(如字符串、数字)作为依赖项,我们可以显著提高组件的效率。…...

【设计模式-中介者模式】
定义 中介者模式(Mediator Pattern)是一种行为设计模式,通过引入一个中介者对象,来降低多个对象之间的直接交互,从而减少它们之间的耦合度。中介者充当不同对象之间的协调者,使得对象之间的通信变得简单且…...