《SystemVerilog验证-测试平台编写指南》学习 - 第1章 验证导论
《SystemVerilog验证-测试平台编写指南》学习 - 第1章 验证导论
测试平台(testbench)的功能
- 产生激励(Generate stimulus);
- 把激励输入到待测设计上(DUV,Design Under Verification);
- 产生预期(Generate Expectation);
- 捕捉响应(Capture response);
- 检验响应的正确性(Check the response for correctness);
- 根据验证目标评估验证进度(Measure the progress against the overall verification goals);
验证四要素:
- 灌激励:(产生输入信号)
- 做预期:(产生预期结果)
- 集响应:(收集输出信号)
- 作比较:(比较响应和预期结果)
方法学基础
本书采用如下原则:
- 受约束的随机激励;
- 功能覆盖率;
- 使用事务处理器的分层测试平台;
- 对所有测试通用的测试平台;
- 独立于测试平台之外的个性化测试代码;
这些原则是相关联的。随机激励对测试复杂设计十分关键。
定向测试:找出设计中预期的漏洞;
随机测试:找出预料不到的漏洞;
当使用随机激励时,需要用功能覆盖率来评估验证进度。一旦开始使用自动生成的激励,就需要一种能够自动预测结果的方式 -- 通常是计分板或参考模型。
1. 受约束的随机激励
为什么要约束?
答:
虽然你希望仿真器能产生随机激励,但同时有不希望这些激励数值完全随机。
你的随机化对象是什么?
需要广泛地考虑所有的设计输入,而不是仅仅是数据字段,如下所列:
- 设备和环境配置;
你应该对整个环境的配置进行随机化,包括仿真的时长、设备的数量,以及它们的配置方式。当然,你需要创建约束以确保配置的合法性。- 输入数据;
你需要事先估计好所有的分层协议和错误注入,以及计分板的内容和功能覆盖率。- 协议异常、错误和违例;
应该尽量尝试去仿真在实际的硬件中可能出现的错误,而且应该针对所有可能出现的错误。- 时延和同步;
尝试协调各个驱动器使他们能够在不同的速率下进行通信。
2. 功能覆盖率
你需要知道哪些部分已经被验证过,这样才能对验证计划中的项目进行核对。
功能覆盖率的测量和使用:
- 添加代码用于监控进入设备中的激励,以及设备对激励的反应,并据此确定哪些功能已经被验证过;
- 运行几次仿真,每次使用不同的种子,合并报告;
- 分析结果,采用新的激励测试未被测试到的条件和逻辑;
随机测试需要使用反馈。最初的测试会被运行很多次,使用不同的种子,创建很多互异的输入序列。但是到了最后,即时使用新的种子,所产生的激励也很可能无法在设计空间中探测到新区域。
随着功能覆盖率逐渐接近极限,你需要改变测试,以期望能找出新的方法去达到那些尚未被覆盖的区域。这被称为“ 覆盖率驱动的验证 ”
在受约束的随机激励中很少采用动态反馈。相反地,需要手工分析覆盖率报告,然后调整随机约束。
3. 分层的测试平台
不分层的的测试平台或者低层次的Verilog测试就是初学Verilog时写的简单testbench那种形式。
如下图所示是带着所有层次的完整测试平台:

- 信号层:把待测设计和测试平台相连;
- 命令层:驱动器驱动待测设计的输入和监视器检测待测设计的输出变化,并把这些变化按照命令分组。断言也穿过命令层和信号层,负责监视独立的信号以寻找穿越整个命令的信号变化;
- 功能层:代理(在VMM中称为事务处理器)接收到来自上层的事务,例如DMA读或者写,把它们分解成独立的命令。这些命令也被送往用于预测事务结果的计分板。检测器则负责比较来自监视器和计分板的命令;
- 场景层:功能层被位于场景层中的发生器所驱动。所谓的场景就是操作步骤,场景层就是负责组织协调这些步骤的;
- 测试层和功能覆盖率:测试平台的最顶层 -- 测试层,就像一个指挥官,不演奏任何乐器却引领者其他人的表演。测试包含了用于创建激励的约束。功能覆盖率可以衡量所有测试在满足验证计划要求方面的进展。随着各项测量标准的完成,功能覆盖率代码在整个项目过程中会经常变化。由于代码经常被修改,所以它不作为测试环境的组成部分。
建立一个分层的测试平台
1. 创建一个简单的驱动器
如之前所说,驱动器接收来自代理的命令。驱动器可能会注入错误或增加时延,然后再把命令分解成一些信号的变化,例如总线请求或者握手。这样的一个测试平台模块通常被称为“事务处理器(transactor)”,它的核心部分是一个循环:有关事务处理器的示范代码如下所示。
task run();
done = 0;
while (!done) begin
// 获取下一个事务
// 进行变换
// 发送事务
end
endtask
2. 仿真环境阶段
- 建立(build)
- 生成配置:把待测设计的配置和周围的环境随机化;
- 建立环境:基于配置来分配和连接测试平台构件;
- 对待测设计进行复位;
- 配置待测设计:基于第一步中生成的配置,载入待测设计的命令寄存器;
- 运行(run)
- 启动环境:运行测试平台构件,例如各种BFM和激励发生器;
- 运行测试:启动测试然后等待测试完成。定向测试很容易判断,但随机测试却比较困难。可以使用测试平台的层作为引导。从顶层启动,等待一个层接收完来自上一层的所有输入,接着等待当前层空闲下来,然后再等待下一层。应该同时使用超时检测保证待测设计或者测试平台不出现死锁;
- 收尾(wrap-up)
- 清空:在最下层完成以后,你需要等待待测设计清空最后的事务;
- 报告:一旦待测设计空闲下来,你就可以清空遗留在待测设计中的数据了。你可以根据这些信息创建最终报告,如果测试失败,务必把相应的功能覆盖率结果删除,因为他们可能是不正确的。
3. 最大限度代码重用
为了验证一个带有数百个特性的复杂设备,必须编写数百个定向测试。如果使用受约束的随机激励,你需要编写的测试就会少很多。
与定向测试相比,随机测试的主要工作是构建测试平台,使它包含所有较低的层:场景、功能、命令以及信号。这个测试平台代码要能够被所有的测试使用,所以它需要有很好的通用性。
4. 测试平台的性能
创建受约束的随机测试需要几个步骤:
- 建立分层的测试平台,包括自检的部分;
- 按照验证计划中列举的目标创建激励,你可以使用随机约束,也可以采用注入错误或者协议违例等迂回的方式;
- 功能覆盖率,这项任务的开始是创建一个强有力的验证计划,这个计划必须带有清晰而且便于测量的目标;
- 收集数据,结果分析;
《SystemVerilog验证-测试平台编写指南》学习 - 第1章 验证导论的更多相关文章
- 《SystemVerilog验证-测试平台编写指南》学习 - 第3章 过程语句和子程序
<SystemVerilog验证-测试平台编写指南>学习 - 第3章 过程语句和子程序 3.1 过程语句 3.2 任务.函数以及void函数 3.3 任务和函数概述 3.4 子程序参数 3 ...
- 《SystemVerilog验证-测试平台编写指南》学习 - 第2章 数据类型
<SystemVerilog验证-测试平台编写指南>学习 - 第2章 数据类型 2.1 内建数据类型 2.2 定宽数组 2.2.1 声明 2.2.2 常量数组 2.2.3 基本的数组操作 ...
- 《JS权威指南学习总结--第九章 类和模板》
内容要点: 一. 1.第六章详细介绍了JS对象,每个JS对象都是一个属性集合,相互之间没有任何联系.在JS中也可以定义对象的类,让每个对象都共享某些属性,这种"共享"的特性是非常有 ...
- 《JS权威指南学习总结--第二章词法结构》
第二章词法结构 内容要点: 一.注释 1. //表示单行注释 2. /*这里是一段注释*/ 3.一般编辑器里加注释是:选中要加注释的语句,按 ctrl+/ 二.直接量 所谓直接量,就是程序中直接使用的 ...
- 学习版pytest内核测试平台开发万字长文入门篇
前言 2021年,测试平台如雨后春笋般冒了出来,我就是其中一员,写了一款pytest内核测试平台,在公司落地.分享出来后,有同学觉得挺不错,希望能开源,本着"公司代码不要传到网上去,以免引起 ...
- Git_学习_09_Commit message 和 Change log 编写指南
一.前言 二.Commit message编写 1.规范 2.用空行分开主题和正文 提交时只执行 git commit,这时就会跳出文本编辑器,让你写多行. git commit 主题和正文分开 每次 ...
- Postman之API测试使用全指南
Postman Postman是一个可扩展的API开发和测试协同平台工具,可以快速集成到CI/CD管道中.旨在简化测试和开发中的API工作流. Postman 工具有 Chrome 扩展和独立客户端, ...
- 【PyHacker编写指南】打造URL批量采集器
这节课是巡安似海PyHacker编写指南的<打造URL批量采集器> 喜欢用Python写脚本的小伙伴可以跟着一起写一写呀. 编写环境:Python2.x 00x1: 需要用到的模块如下: ...
- 基于Asterisk的VoIP开发指南——Asterisk 模块编写指南(1)
原文:基于Asterisk的VoIP开发指南--Asterisk 模块编写指南(1) 1 开源项目概述 Asterisk是一个开源的软件包,通常运行在Linux操作系统平台上.Asterisk可以用三 ...
随机推荐
- 【10.5NOIP普及模拟】sort
[10.5NOIP普及模拟]sort 文章目录 [10.5NOIP普及模拟]sort 题目描述 输入 输出 输入输出样例 样例输入 样例输出 数据范围限制 解析 code 题目描述 小x和小y是好朋友 ...
- Python数据分析入门(十七):绘制条形图
条形图的绘制方式跟折线图非常的类似,只不过是换成了plt.bar方法.plt.bar方法有以下常用参数: x:一个数组或者列表,代表需要绘制的条形图的x轴的坐标点. height:一个数组或者列表,代 ...
- 软工热身——回顾&展望
项目 内容 这个作业属于哪个课程 2021春季软件工程 (罗杰 任健) 这个作业的要求在哪里 第一次阅读作业 我在这个课程的目标是 从实践中学习软件工程相关知识(结构化分析和设计方法.敏捷开发方法.软 ...
- windows利器使用与配置
1 概述 这篇文章主要讲述了一些windows下的"利器"级别工具的使用以及配置. 2 Listary Listary是一款强大的搜索工具,可以快速搜索过滤各种文件. 点击这里下载 ...
- Linux执行.sh文件,提示No such file or directory的问题
问题描述 在window平台下,写好shell脚本文件,迁移到linux平台,赋过可执行权限,执行该sh文件,却提示NO such file or directory 解决方案 难道是文件格式兼容性问 ...
- 13.Quick QML-RowLayout、ColumnLayout、GridLayout布局管理器介绍、并通过GridLayout设计的简易网站导航界面
上章我们学习了:12.Quick QML-QML 布局(Row.Column.Grid.Flow和嵌套布局) .Repeater对象,本章我们继续来学习布局管理器 1.RowLayout.Column ...
- Day13_64_线程的优先级
线程的调度 * 单核CPU在某一时刻只能执行一条指令,线程只有得到CPU的时间片,也就是使用权,才可以执行指令 * 在单核CPU的机器上线程不是并行运行的,而是频繁切换运行的,只有在多个CPU上线程才 ...
- Day07_38_集合中的remove()方法
集合中的remove()方法 remove() 移除集合中的一个指定对象 代码实例 package com.shige.Collection; import java.util.ArrayList; ...
- Day09_44_Set集合_SortedSet01
SortedSet集合 java.util.Set<interface> java.util.SortedSet<interface> 无序不可重复,但是存进去的数据可以按照元 ...
- 如何在linux上手动连接到互联网
作者 @飞洲人飞舟魂转载请注明出处. 一直以来对linux的网络管理不大明白,今天研究了一下网络的手动配置,现在记录一下.我使用Ubuntu20.04.1来进行演示. 介绍 首先我们先明确一些概念性的 ...