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

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

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

相关文章

面试资料快速复习 Git常用命令(简单实用)

Git-command Git常用命令、面试复习、简单实用命令 ​ 一、概念理解 (一)工作区、暂存区、本地仓库、远程仓库 workspace:工作区staging area:暂存区/缓存区local repository:本地仓库remote repository&#xff…

Apache Airflow (九) :Airflow Operators及案例之BashOperator及调度Shell命令及脚本

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹…

C#单例模式懒汉式与饿汉式

单例模式一般分为懒汉模式和饿汉模式,懒汉式单例在第一次引用时创建实例,不是在类加载时;饿汉式单例模式是一种在类加载时就创建实例的方式,因此也称为静态初始化。 单例模式实现的技巧时构造私有,向外提供静态实例。…

12-2- DCGAN -简单网络-卷积网络

功能 随机噪声→生成器→MINIST图像。 训练方法 0 损失函数:gan的优化目标是一个对抗损失,是二分类问题,用BCELoss 1 判别器的训练,首先固定生成器参数不变,其次判别器应当将真实图像判别为1,生成图像判别为0 loss=loss(real_out, 1)+loss(fake_out, 0) 2 生成器的…

react-router-dom 版本6.18.0中NavLink的api和属性介绍

React Router 是一个基于 React 的路由库,它可以帮助我们在 React 应用中实现页面的切换和路由的管理。而 NavLink 则是 React Router 中的一个组件,它可以帮助我们实现导航栏的样式设置和路由跳转。 在 React Router 版本6.18.0 中,NavLink…

Matalab插值详解和源码

转载:Matalab插值详解和源码 - 知乎 (zhihu.com) 插值法 插值法又称“内插法”,是利用函数f (x)在某区间中已知的若干点的函数值,作出适当的特定函数,在区间的其他点上用这特定函数的值作为函数f (x)的近似值,这种方…

windows快捷方式图标变成空白

今天突然有客户说应用程序快捷方式图标变成了空白,就研究了一下,网上找了一下很多都说是什么图标缓存有问题,试过之后发现并不能解决问题。 然后发现用户的文件上都一把黄色的小锁的标志,查了一下说是文件属性里面设置加密之后就会…

高防CDN:构筑网络安全的钢铁长城

在当今数字化的世界里,网络安全问题日益突显,而高防CDN(高防御内容分发网络)正如一座坚不可摧的钢铁长城,成为互联网安全的不可或缺之物。本文将深入剖析高防CDN在网络安全环境中的关键作用,探讨其如何构筑…

Microsoft SQL Server Management Studio(2022版本)启动无法连接到服务器

Microsoft SQL Server Management Studio(2022版本)启动无法连接到服务器 解决方法: 打开SQL Server 2022 配置管理器。 启动即可。

java源码-工程讲解

1、 工程目录 源码工程目录讲解部分,讲解过程会让大家对后端源码工程有一个大致的了解,能让大家在此改造,就可以衍生出一些新的功能,需要对java技术深入了解,需要看后续java技术讲解部分 整个架构是一个spring-boot…

计算机网络的发展

目录 一、计算机网络发展的四个阶段 1、第一阶段:面向终端的计算机网络(20世纪50年代) 2、第二阶段:计算机—计算机网络(20世纪60年代) 3、第三阶段:开放式标准化网络(20世纪70年…

​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​

软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】 课本里章节里所有蓝色字体的思维导图

管理类联考——逻辑——知识+记忆篇——综合推理——考点+记忆

文章目录 整体目录大纲法汇总分类法记忆宫殿法绘图记忆法 考点记忆/考点汇总——按大纲 局部数字编码法归类记忆法重点记忆法歌决记忆法谐音记忆法理解记忆法比较记忆法 本篇思路:根据各方的资料,比如名师的资料,按大纲或者其他方式&#xff…

单元测试实战(四)MyBatis-Plus 的测试

为鼓励单元测试,特分门别类示例各种组件的测试代码并进行解说,供开发人员参考。 本文中的测试均基于JUnit5。 单元测试实战(一)Controller 的测试 单元测试实战(二)Service 的测试 单元测试实战&am…

鸿蒙开发|开启鸿蒙开发之旅-发工具下载安装、项目创建和预览

文章目录 一、鸿蒙开发使用语言二、下载开发工具三、安装开发工具四、新建项目五、项目启动 一、鸿蒙开发使用语言 鸿蒙OS开发支持多种编程语言,开发者可以根据自身技术背景和项目需求选择合适的语言进行开发。目前鸿蒙OS主要支持以下几种语言: Java&am…

掌握未来技术趋势,Python编程引领人工智能时代

掌握未来技术趋势,Python编程引领人工智能时代 摘要:Python作为一种高级编程语言,在人工智能领域中扮演着越来越重要的角色。本文将通过介绍Python编程的特点、应用场景及发展前景,展望Python未来的发展趋势,并结合代…

HarmonyOS真机调试报错:INSTALL_PARSE_FAILED_USESDK_ERROR处理

文章目录 1、 新建应用时选择与自己真机匹配的sdk版本2、 根据报错提示连接打开处理方案3、查询真机版本对应的**compileSdkVersion** 和 **compatibleSdkVersion** 提示3.1版本之后和3.1版本之前的不同命令(此处为3.0版本)4、根据查询修改参数5、连接成…

13.真刀实枪做项目---博客系统(页面设计)

文章目录 1.预期效果1.1博客列表页效果1.2博客详情页效果1.3博客登陆页效果1.4博客编辑页效果 2.实现博客列表页2.1实现导航栏2.2实现版心2.3实现个人信息2.4实现博客列表2.5博客列表页完整代码 3.实现博客正文页3.1引入导航栏3.2引入版心3.3引入个人信息3.4实现博客正文3.5博客…

Django模型层

模型层 与数据库相关的,用于定义数据模型和数据库表结构。 在Django应用程序中,模型层是数据库和应用程序之间的接口,它负责处理所有与数据库相关的操作,例如创建、读取、更新和删除记录。Django的模型层还提供了一些高级功能 首…

【机器学习Python实战】logistic回归

🚀个人主页:为梦而生~ 关注我一起学习吧! 💡专栏:机器学习python实战 欢迎订阅!后面的内容会越来越有意思~ ⭐内容说明:本专栏主要针对机器学习专栏的基础内容进行python的实现,部分…