如何写出更系统的验证检查器

news2024/11/22 8:48:39

前言

芯片验证是为了发现芯片中的错误而执行的过程,它是一个破坏性的过程。有效激励灌入待测模块后,需要判断出不符合功能描述的行为。检查器(Checker)就是用于查看待测模块是否按照功能描述文档做出期望的行为,识别出所有的设计缺陷

不同被检查逻辑的层次,所需要的检查方法不一致,本文主要侧重于模块级验证的检查器设计。该层次需要检查的范围有:

  • 待测模块的所有输入输出信号;
  • 待测模块的内部设计细节;
  • 待测模块在芯片系统级的应用角色;

需要的功能描述文档至少有:

  • 项目产品文档:描述本模块的实际应用场景。
  • 项目需求文档:将产品文档转换为技术人员可读懂的技术文档。
  • 待测模块设计文档:将需求文档转换为实际RTL规范。

有些模块还需要其它手册,比如Arm和RISC-V的CPU还会有架构参考手册。

对待测模块行为的检查,可以采用不同的检查方法,主要有:

  • 监视器(monitor):可以用于信号级别的数值、时序和协议检查;
  • 参考模型+比较器(Checker):检查包层级的信息;
  • 断言:主要依靠它检查模块的逻辑细节和时序信息;
  • 定向测试:用于简单场景的检查,一般自带检查器;
  • 形式验证:用数学方式来证明功能是否正确;

根据情况不同,以上这些方法可以采用其中的一种或多种,一般很少只使用一种的。待测模块使用什么样的检查方法以及检查哪些内容,也是芯片验证的一大难点。和激励设计分析类似(如何写出更牛更系统的验证激励),本文也是从完备性可拓展性可控性三方面展开阐述如何系统地思考和构建验证检查器。

1. 完备性

检查器的完备性是最基本要求,可以从接口类型、内部结构、结束检查(End of check)和检查器审查这四方面去思考。

1.1 接口类型

接口类型检查主要是检查输入输出信号是否符合文档描述的行为,也就是与待测模块连接的上下游模块的互动信号行为。可以从单一接口类型和多个接口交互两方向去分析。

1.1.1 单一接口类型

单一接口类型分析由信号检查和协议检查组成。

  • 信号检查:主要检查每根信号的行为,包括信号值正确性和数据完整性。
  • 协议检查:主要检查多根信号之间的行为,包括时序检查、握手检查,hazard检查,order检查,outstanding能力检查和包传输流程检查等。

信号值检查、时序检查和握手检查通常可以用断言检查;outstanding能力检查和包传输流程检查通常可以用监控器检查。数据完整性、hazard检查和order检查等复杂建模需求的通常需要使用检查器检查。

1.1.2 多个接口交互

多个接口交互由数据完整性、保序和同步交互组成。

  • 数据完整性:检查信息传输没有丢失。
  • 保序:检查有先后关系的传输包是否正确传输。
  • 同步交互:检查传输包是否有同步或者约定先后出现等关系。

多个接口交互的检查通常需要检查器检查。

1.2 内部结构

内部结构检查需要沿着数据流(data flow)方向分析,看看有哪些必须检查的转换(transformation)和决策(decision)。主要有:

  • 内部功能点:order、hazard、forward、sleep、replay逻辑、register读写等。
  • 资源占用:FIFO、Buffer、Interface、流水线等。
  • 资源仲裁:优先级、死锁等。
  • 数据完整性:数据拆分、数据合并、数据保序等。
  • 功能配置:待测模块行为是否符合当前寄存器和参数配置等。
  • 异常检查:复位值、内部触发fault、外部返回错误响应、中断等。
    • 异常事件是否合理;
    • 异常处理是否正确;
    • 异常处理完,待测模块是否能恢复;

内部结构的检查经常需要用到RTL内部的辅助信号,最好是在非常有必要或可以大大节省检查器建模工作量的情况下,才使用这些辅助信号。而且检查器用辅助信号之前,必须检查辅助信号行为的合理性。

1.3 结束检查

结束检查主要用于在验证用例结束时,检查RTL和TB的状态,比如RTL是否处于非busy状态、FIFO是否为空、请求是否全部处理完毕等。只要有预期某个功能在用例结束时必须处于某种状态,都可以放到结束检查里。主要有:

  • TB/DUT状态检查:Counter、FIFO、Buffer、Queue、Busy等。
  • 仿真日志检查:可以通过脚本自动提取。
  • 波形检查:通过脚本解析波形内容来检查。

1.4检查器审查

审查(Review)环节对完善检查器起着至关重要的作用,可以提高检查器质量,并减少漏检查特性的概率,对个人成长也有很大帮助。

建议以下这些审查方式都要按顺序进行:

  • 个人审查:由自己进行,对照历史错误清单进行,举一反三,避免犯类似错误。
  • 同组审查:由组内更有经验的人进行,对检查完备性、检查器设计结构、假设、采用的RTL辅助信号、代码实现进行检查。
  • 跨组审查:由待测模块的设计人员进行,对检查器完备性、设计顾虑、易错特性、局限性和各种检查器假设进行检查。

2. 可拓展性

可扩展性也包括可复用性。为了处理验证周期缩短、待测RTL规格频繁变动等各种情况,我们需要在设计检查器时提前构思如何让检查器更容易扩展。基于此,我们可以从模块化和解耦性方面去思考。

2.1 模块化

模块化需要对待测模块的每个功能点检查都分别集中于一处,而不是将一个功能点的检查分散到检查器各个地方,且多个功能点检查互相穿插耦合,这样后期如果某个功能点改动会影响检查器的很多代码,而且容易改漏。

把常见的功能封装成公共库,这样在多个地方都可以直接使用,如果功能需要改动,只需要改动一处代码即可。

不要把所有检查器内容都放到一个class类里解决,这样会造成这个类代码巨多,而且难以维护。可以把检查器根据待测模块特性切割成多个小的建模单位,由这些小的建模单位共同组成整体检查器,这样结构更清晰,而且待测模块特性的改动,只会影响其中一些建模单位,不需要整体检查器都修改。

2.2 解耦性

解耦性要求检查器代码尽量减少依赖于环境其它组件的代码,不管是变量类型、方法还是类,最好使用自身定义的,方便修改、移植和重用。

比如monitor送过来的类内容要转换为检查器自己内部定义的类内容,检查器就可以减少依赖于monitor中类的改动。

3. 可控性

检查器的可控性在这里主要是指是否方便控制检查器的功能检查范围和消息打印内容。

3.1 功能检查控制

最常见的就是控制检查器是否开启,比如在调试激励的时候,通常会先把检查器关闭掉,避免造成不必要的干扰。

如果需要的话,功能检查控制可以做到更细粒度的控制,按照待测模块的规格、接口或某个功能来控制,这样就方便根据实际情况,选择打开或关闭哪些检查。

3.2 消息等级控制

检查器中会打印一些消息,跟踪检查器的内部情况,方便出错时调试。有效的打印消息越多,仿真速度越慢,但对调试来说更友好些。因此,需要控制好不同消息的打印等级,不要每个周期都打印大量信息。默认情况下,只打印一些关键信息。只有需要更多调试消息时,才调低等级,打印更多的消息。

总结

综上所述,检查器设计可以按照“完备性->可拓展性->可控性”方向去分析。在完备性中,可以按照“接口类型->内部结构->结束检查->检查器审查”方向去分析。在可拓展性中,可以按照“模块化->解耦性”方向去分析。在可控性中,可以按照“功能检查控制->消息等级控制”方向去分析。

另外很重要的一点是:要经常对验证结果进行复盘分析,并增强检查器。

总得思维导图如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2194276.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PostgreSQL】PG数据库表“膨胀”粗浅学习

文章目录 1 为什么需要关注表膨胀?2 如何确定是否发生了表膨胀?2.1 通过查询表的死亡元组占比情况来判断膨胀率2.1.1 指定数据库和表名2.1.2 查询数据库里面所有表的膨胀情况 3 膨胀的原理3.1 什么是膨胀?膨胀率?3.2 哪些数据库元…

服贸会上的科技闪耀之星:璞华易研PLM系统引领产品研发潮流

2024年中国国际服务贸易交易会(以下简称为“服贸会”)于9月在北京盛大开幕,再次汇聚全球目光,共襄智慧服务的盛宴。本届服贸会秉承“全球服务、互惠共享”的核心理念,聚焦“共享智慧服务,共促开放发展”&am…

计算机毕业设计 基于Python的社交音乐分享平台的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

【路径规划】A*(A星)搜索路径规划教程

摘要 A算法是一种用于图形搜索的启发式搜索算法,广泛应用于路径规划、游戏AI和机器人导航等领域。本教程将深入介绍A算法的理论基础,展示其在路径规划中的应用,并通过Matlab代码实现A*算法的实际运行。同时,我们将结合实验结果进…

qsort函数及其使用的方法分解讲解

qsort函数 默认排序升序 void qsort(void* base,//指向待排序数组的第一个元素的地址 size_t num,//base指向数组中元素的个数 size_t size,//base指向的数组中一个元素的大小,单位是字节 int (*compar)(const void*,const void*…

YOLO11改进|卷积篇|引入线性可变形卷积LDConv

目录 一、【LDConv】卷积1.1【LDConv】卷积介绍1.2【LDConv】核心代码 二、添加【LDConv】卷积2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【LDConv】卷积 1.1【LDConv】卷积介绍 下图是【LDCNV】的结构图,让我们简单分析…

Mysql高级篇(下)——主从复制

主从复制 一、概述二、作用🎈 场景示例🎈 综合示例 三、原理🎈 主从复制基本原则🎈 主从复制存在的问题 四、一主一从架构搭建🌱准备工作🌞步骤1. 配置主库(Master)2. 配置从库&…

如何搭建基于大模型的智能知识库

自从2022年底ChatGPT横空出世引爆了大模型技术浪潮,时至今日已经一年有余,如何从技术侧向商业侧落地转化是一直以来业内普遍关注的问题。 从目前企业端观察到的情况来看,基于大模型的知识库是一个比较有潜力和价值的应用场景,能够…

落伍警告:不了解AI Agent,你可能会被编程界淘汰

AI Agent火爆到什么程度? OpenAI创始人奥特曼预测,未来各行各业,每一个人都可以拥有一个AI Agent;比尔盖茨在2023年层预言:AI Agent将彻底改变人机交互方式,并颠覆整个软件行业;吴恩达教授在AI…

UE5 武器IK瞄准系统

创建空项目 创建基础蓝图类My_GameMode,My_HUD,My_PlayChar,My_PlayController 项目设置地图模式 近裁平面 0.1 My_PlayChar蓝图中添加摄像机,角色骨骼网格体,武器骨骼网格体 编辑角色骨骼,预览控制器使用特定动画,动画选择ANM_ark-47-Idle hand_r 添加插槽WeaponMes…

Stable Diffusion绘画 | 如何做到不同动作表情,人物角色保持一致性(下篇)

在 人物角色保持一致性(上篇)中,我们已经得到了自己创造的角色的各个角度头像图片: 从中选择一个符合自己需求的角度,截图保存,例如下图: 更换人物表情 进入到「图生图」页面,把上一…

短视频时代,网站建设存在的意义还有多大?

在短视频时代,网站建设的存在意义依然具有多方面的价值和作用。尽管短视频作为一种新兴的传播方式迅速发展并受到广泛欢迎,但网站作为互联网的基础设施之一,仍然在许多领域发挥着不可替代的作用。以下是具体分析: 信息深度与完整性…

医院管理新思维:Spring Boot技术应用

5系统详细实现 5.1 医生模块的实现 5.1.1 病床信息管理 医院管理系统的医生可以管理病床信息,可以对病床信息添加修改删除操作。具体界面的展示如图5.1所示。 图5.1 病床信息管理界面 5.1.2 药房信息管理 医生可以对药房信息进行添加,修改,…

开源项目带来的思考

分享一位在Hacker News上的一个帖子,该开源作者在Github上年收入达到10万美元,你不得不承认,个人开源项目的影响力还是很大的。 这条帖子讲述了一位Laravel的开发者,是如何在Github上做到年收入10万美元。该帖子一发布&#xff0c…

rust使用tokio

Rust 是一种系统编程语言,它强调安全、并发和高性能。tokio 是一个基于 Rust 的异步运行时库,专门用于构建异步应用程序。使用 tokio 可以轻松地管理异步任务,并实现高效的并发。 添加依赖: cargo add tokio -F full 示例: 示例1: fn main() {let rt = tokio::runti…

RabbitMQ事务模块

目录 消息分发​​​​​​​ 负载均衡 幂等性保障 顺序性保障 顺序性保障方案 二号策略:分区消费 三号策略:消息确认机制 四号策略: 消息积压 RabbitMQ集群 选举过程 RabbitMQ是基于AMQP协议实现的,该协议实现了事务机制,要么全部成功,要么全…

软件设计师:03操作系统原理

文章目录 一、操作系统地位图二、前趋图(PV操作)三、移臂调度算法(1)最短移臂调度算法(2)先来先服务(3)最短寻道时间优先(4)扫描算法或电梯调度算法&#xff…

大模型~合集8

我自己的原文哦~ https://blog.51cto.com/whaosoft/11566472 # From r to Q∗ 这就是OpenAI神秘的Q*?斯坦福:语言模型就是Q函数 近日,斯坦福大学一个团队的一项新研究似乎为这一研究方向的潜力提供了佐证,其声称现在已经取得非…

【Linux-基础IO】磁盘的存储管理详解

磁盘的存储管理 由于一个磁盘中包含了大量的扇区,为了方便管理,我们对磁盘进行了分区,其中每个分区又进一步划分为多个块组(Block Group),每个块组中包含该块组的数据存储情况以及具体的数据 假设有一个8…

分层解耦-01.三层架构

一.对案例的思考 所有的代码都在这一个controller文件中,虽然该代码不复杂。但是如果针对大型项目,代码会很复杂。而且不利于项目的维护,复用性差。因此要修改该代码,使其满足维护方便,复用性好的特点。因此要用到一个…