SystemVerilog学习 (9)——随机化

目录

一、概述

二、随机化

2.1、如何简单地产生一个随机数

2.1.1 利用系统函数产生随机数

2.1.2 urandom()

2.2、什么需要随机化

2.3、随机约束

2.3.1 rand 和 randc 

2.3.2 随机约束的使用

2.3.3 约束块

三、总结


一、概述

        随着设计变得越来越大,要产生一个完整的激励集来测试设计的功能也变得越来越困难了。 定向激励的测试方法早已经无法满足检查功能完整性的要求。
        解决的办法是采用受约束的随机测试法(CRT)自动产生测试集。 随机约束测试(CRT,Constrained-Random Test)即能够产生你感兴趣的、你想不到的的测试向量,通过回归测试、替换随机种子的方式来提高单位测试用例的覆盖率收集效率。
        CRT由两部分组成:使用随机的数据流为DUT 产生输入的测试代码,以及伪随机数发生器(PRNG)的种子( seed)。只要改变种子的值﹐就可以改变CRT的行为。这样仅仅通过改变种子的值,就可以调整每次测试,使得每次测试可以达到很多次定向测试的效果。这种方法还可以产生更多的和定向测试等效的测试集。
        你可能会觉得这些随机测试有点像投掷飞镖,怎么才能知道是否覆盖了设计的所有方面?通常激励空间是非常大的,以至于无法用for循环来产生各种可能的输入,所以必须采用产生子集的方式来解决这个问题。在之后的内容中,我们将会学习如何用功能覆盖率来确定验证的进度。

二、随机化

2.1、如何简单地产生一个随机数

2.1.1 利用系统函数产生随机数

         通过系统函数std::randomize()对一些变量即可完成随机化,或者理解为产生随机数并赋予这些变量 。

2.1.2 urandom()

  • $urandom(),可以生成一个32位的无符号随机数。
  • $urandom_range(maxval, minval=0),可以生成一个 maxval与minval 之间的数。

2.2、什么需要随机化

        当谈到使用随机化的方式就行验证的时候,相信大家第一时间想到地都是随机化产生地数据,这种方式看起来非常简单,只需要调用$randm()函数就实现了,但是这种方式找bug的能力非常有限,只能找到一些数据路径方面的bug,这种设计方式的本质还是基于定向测试的方法。一般来说,大型的bug都存在与控制路径中,因此,对于DUT里所有的关键点都要采用随机化的方式。随机化使得控制路径里的每一个分支都可能被测试。

        我们需要考虑设计输入的各个方能,例如:

  1. 器件配置
  2. 环境配置
  3. 原始输入数据
  4. 封装后的输入数据
  5. 协议异常
  6. 延时
  7. 事务状态
  8. 错误(error)和违规(violation)

2.3、随机约束

         比起以上我们独立地生成一些随机数,在面向DUT的随机激励发生过程中,为了符合协议、满足测试需求,我们还需要添加一些 “约束” 。 这些“约束”会使得变量朝着希望他们变化的方向去随机。 不但如此,这些约束也会对变量与变量之间的关系生效, 因此,我们需要一个“载体”去容纳这些变量以及它们之间的约束。 这个“载体”即是类,而类的成员变量均可声明为“随机”属性,用 rand或者randc来表示。

2.3.1 rand 和 randc 

  • 对于rand修饰符,表示在可生成的范围内,每个值的可能性是相同的。 
  • 对于randc修饰符,它的值将会随机并且遍历其可取值范围。

        简单说就是randc的c可以解读成cycle,使用randc的时候会循环遍历一遍所有的取值。

2.3.2 随机约束的使用

  •  任何类中的整形(bit/byte/int)变量都可以声明为 rand/randc
  •  定长数组、动态数组、关联数组和队列都可以声明为 rand/randc,可以对动态数组和队列的长度加以约束
  •  指向对象的句柄成员,也可以声明为rand(不能被声明为 randc),随机时该句柄指向对象中的随机变量也会一并被随机
  •  非组合型结构体可以声明为rand,非组合型的成员可以声明为 rand/randc

        下图给出了一个带有随机变量的简单类

2.3.3 约束块

         有用的激励不仅仅是随机值,变量之间也有着相互关系。 没有约束的随机变量会包含许多无效的和非法的值,这会使得有效激励的产生变得低效。因此,我们 需要用包含一个或多个约束表达式的约束块定义这些相互关系。

         约束块支持整形通过set操作符来设置它们的可取值范围

rand integer x, y, z; 
constraint c1 {x inside {3, 5, [9:15], [24:32], [y:2*y], z};} 

rand integer a, b, c; 
constraint c2 {a inside {b, c};} 

integer fives[4] = '{ 5, 10, 15, 20 }; 
rand integer v; 
constraint c3 { v inside {fives}; }

        此外, 除了成员集合设置,约束块也支持设置可取值的同时也为其设置随机时的权重。 

  • 对于:=操作符,它们表示每一个值的权重是相同的; 
  • 对于:/操作符,它们表示权重会平均分配到每一个值。 

         unique可以用来约束一组变量,使得其在随机后变量之间不会有相同的数值。还有的地方可以使用if-else或者->操作符来表示条件约束; foreach可以用来迭代约束数组中的元素,这些数组可以是定长数组、动态数组、关联数组或者队列。

         在没有soft描述时的约束,我们称之为硬约束,而带有soft描述的则是软约束。软约束用来指定变量的默认值和权重。如果用户在使用时,指定了外部约束对同一个变量做二次约束,或者用 户定义了子类,也对同一个变量做二次约束时,那么硬约束可以“覆盖” 软约束,并且不会导致随机数产生的失败。

三、总结

        CRT是产生验证复杂设计所需激励的唯一可行的方法。SystemVerilog 提供了很多种产生随机激励的方法,本章展示了其中的一些实现方法。
        测试必须是灵活的,允许你既可以使用产生的缺省值,也可以约束或修改缺省值以实现最终目标。在建立测试平台前务必事先规划,留出足够的“钩子",这样才能在不修改现有代码的情况下控制测试平台。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vivado产生报告阅读分析6-时序报告2

1、复查时序路径详情 单击“ OK ”运行报告命令后 , 将打开一个新窗口。这样您即可复查其中内容。在其中可查看执行选定的每种类型 (min/max/min_max ) 的分析之后所报告的 N 条最差路径。 下图显示的“Report Timing ” ( 时序报告 ) 窗口…

知识梳理到了领域榜一,意外,开心。

我的护城河 就是掌握的不断更新的技术。 一直被认可的能力。 完美的项目交付。 写的文章得到了读者们的认可。 希望我做的努力被更多的人看到。 分享的代码片可以解决他人的问题。 很惊喜,今早我的文章被数据结构和算法领域内容榜排到了第一名。 被认可的感觉很棒。…

基于IGT-DSER实现工业触摸屏与PLC设备之间WIFI无线通讯

本文是基于IGT-DSER系列智能网关设备实现工业触摸屏与PLC设备之间WIFI无线通讯的案例。PLC之间无线通讯的案例 网络结构如下图,触摸屏通过网线连接IGT-DSERWIFI智能网关,实现WIFI的AP功能;一台串口型PLC和一台网口型PLC分别通过IGT-WSER智能网…

接口自动化测试面试题

前言 前面总结了一篇关于接口测试的常规面试题,现在接口自动化测试用的比较多,也是被很多公司看好。那么想做接口自动化测试需要具备哪些能力呢? 也就是面试的过程中,面试官会考哪些问题,知道你是不是真的做过接口自动…

【第2章 Node.js基础】2.7 Node.js 的流(一)可写流

🌈可写流 🚀什么是可写流 可写流是对数据被写入的目的地的一种抽象。 所有可写流都实现了 stream.Writable类定义的接口。 可写流的例子包括,也都是实现了可写流接口的双工流 客户端的 HTTP 请求、服务器的HTTP 响应、fs 的写入流、zlib…

JUNIT使用和注意、以及断言的介绍使用、SpringBoot Test测试类的使用、maven配置使用junit详细介绍

参考文章: https://www.cnblogs.com/zhukaile/p/14514238.html,https://blog.csdn.net/qq_36448800/article/details/126438339 一、什么是单元测试 在平时的开发当中,一个项目往往包含了大量的方法,可能有成千上万个。如何去保…

最小生成树

目录 带权图 带权图java代码实现 最小生成树 Kruskal算法 ​切分定理 Kruskal算法的java代码实现 Prim算法 Prim算法的java代码实现 总结 带权图 边上的权是附加的额外信息,可以代表不同公路的收费等你需要的信息。 带权图java代码实现 port java.io.File…

mysql---squid代理服务器

squid代理服务器 nginx也可以代理:反向代理--------负载均衡 squid:正向代理服务器。例:vpn squid :正向代理,缓存加速,acl过滤控制 代理的工作机制 1、代替客户端向网站请求数据,不需要访问代理的IP地址…

AI时代,如何防范诈骗的建议

以下是一些防范AI诈骗的方法: 认知教育:了解AI技术的应用和局限性,学习如何识别虚假信息和诈骗手段。保护个人信息:不要轻易泄露个人信息,尤其是身份证号码、银行卡号等敏感信息。谨慎对待陌生人的联系和信息&#xf…

前后端分离项目在Linux的部署方法、一台Nginx如何部署多个Web应用

需求场景:目前有三个前后端分离项目(vue+springboot),Linux服务器一台,nginx一个,比如服务器地址为www.xxxxxxx.com 我想通过80端口访问服务①(即访问www.xxxxxxx.com);通过81端口访问服务②(即www.xxxxxxx.com:81);通过82端口访问服务③(即www.xxxxxxx.com:82) ①部…

Java抽象类和接口

抽象类 看看这个代码 class Shape{public void draw(){System.out.println("画图形");} } class Cycle extends Shape{Overridepublic void draw() {System.out.println("⚪");} } class Rect extends Shape{Overridepublic void draw() {System.out.pri…

一个集成了AI和BI报表功能的新一代数据库管理系统神器--Chat2DB

世人皆知Navicate,无人识我Chat2DB 📖 简介 Chat2DB 是一款开源免费的多数据库客户端工具,支持多平台和主流数据库。 集成了AI的能力,能进行自然语言转SQL、SQL解释、SQL优化、SQL转换 ✨ 好处 1、AIGC和数据库客户端的联动&am…

[Vue 代码模板] Vue3 中使用 Tailwind CSS + NutUI 实现侧边工具栏切换主题

文章归档:https://www.yuque.com/u27599042/coding_star/vzkgy6gvcnpl3u2y 效果示例 配置 src 目录别名 https://www.yuque.com/u27599042/coding_star/ogu2bhefy1fvahfv 配置 Tailwind CSS https://www.yuque.com/u27599042/coding_star/yqzi9olphko9ity1 配置…

各地区农村及城镇恩格尔系数数据集(1978-2022年)

恩格尔系数是以德国统计学家恩格尔(Ernst Engel)的名字命名的一个经济指标,用来衡量食品支出占家庭总支出的比例。一般来说,恩格尔系数越低,表明家庭在食品上的支出占比越小,相对而言家庭的生活水平和经济条…

StringBuffer和StringBuilder的区别与联系

文章目录 区别一览StringBuffer如何实现多线程同步关键字(Synchronized)性能考虑使用场景 当不使用多线程的情况下,是否StringBuffer和StringBuilder的性能一样?性能差异原因实践中的选择结论 区别一览 StringBuffer 和 StringBu…

Unity Quaternion接口API的常用方法解析_unity基础开发教程

Quaternion接口的常用方法 Quaternion.Euler()Quaternion.Lerp()Quaternion.Inverse()Quaternion.RotateTowards() Quaternion在Unity中是一种非常重要的数据类型,用于表示3D空间中的旋转。Quaternion可以表示任何旋转,无论是在哪个轴上旋转多少度&#…

fablic 矩形多边形展示删除按钮

标注的矩形框或者多边形框展示删除按钮; 官网有一个例子 我原本想着按照他这个思路,很简单的; 可是当我在使用的过程中,遇到了一些问题,多变想不展示删除按钮;并且如果之前有矩形,无法渲然删除按…

拿走吧你,Fiddler模拟请求发送和修改响应数据

fiddler模拟伪造请求 方法一:打断点模拟HTTP请求 1、浏览器页面填好内容后(不要操作提交),打开fiddler,设置请求前断点,点击菜单fiddler,”Rules”\”Automatic Breakpoints”\”Before Requests” 2、在…

问题总结(持续更新)

Linux 1.虚拟机问题 打开虚拟机所在目录对 后缀 .vmx文件进行修改 vmcio.present"FALSE" 改为FALSE即可 2.因某些问题导致本来正常的虚拟机没有网络了 重新配置网络 vim /etc/sysconfig/network-scripts/ifcfg-enstab补全 service network restart 重启网络 Sentina…

海外推广必备|如何制定领英LinkedIn营销战略?

在网络上脱颖而出不是一件简单的事。不仅有比以往更多的平台、算法和内容类型,而且还有更多的企业在争夺注意力。据统计,每天有超过 270 万家公司在 LinkedIn 上发布信息。 策略很重要,尤其是在 LinkedIn 营销领域。下面将为你总结LinkedIn 营…