验证基础-随机约束与随机控制

news/2024/5/5 18:23:17/文章来源:https://blog.csdn.net/qq_57502075/article/details/127210971

目录​​​​​​​

随机约束和分布

约束

权重分布

约束块控制

内嵌约束

随机函数

数组约束

随机控制


随机约束和分布

        随着芯片体积增大、复杂度提高,定向测试已经无法满足验证的需求,随机测试的比例逐渐升高。定向测试能找到你认为可能存在的缺陷,而随机测试可以找到你想都没想到的缺陷。

        随机测试的环境要求比定向测试复杂,它除了需要激励,还需要参考模型在线比较,上百次的仿真不需要人为参与,它可以减少相当的代码,产生的激励也较定向测试更多样

        随机的约束不但可以指定数据的取值范围,还可以指定各个数值的随机权重分布

那么一般可以随机什么东西呢?

        1.器件配置:配置寄存器的值和系统信号。

        2.环境配置:随机化验证环境,例如合理的时钟和外部反馈信号。

        3.原始输入数据:例如数据包的长度、带宽,数据间的顺序。

        4.延时:握手信号之间的时序关系,例如 valid 和 ready ,req 和 ack 之间的时序关系。

        5.协议异常:如果反馈信号给出异常值,那么设计是否可以保持后续数据处理的稳定性呢?

        随机属性的声明,一般使用 rand 或者 randc 来表示它的随机属性,randc 和rand 的区别在于,randc 表示周期性的随机,即所有可能的值都赋过值后随机值才能重复。要注意 randrandc 使用的对象必须是类的成员变量,不能是静态变量。随机属性需要配合SV预定义的类随机函数 std::randomize() 使用。即只有通过声明rand变量,并且在后期通过对象调用randomize() 函数才可以随机化变量。约束 constraint 也同随机变量一起在类中声明。

        如上图,在定义类Packet的时候,给类中的成员变量下了rand和randc的属性声明,下随机声明的时候,通常还要伴随约束,也就是后面的constraint。Packet类里面没有new函数,这个是允许的,在类声明的时候没有内置new函数的时候系统会默认在new类时,给类里面的所有成员变量赋初值0。Packet p 这条语句不是创建一个对象 而是声明一个类的句柄,在initial语句块里面的p = new()才是创建了一个对象

        randomize()是一个随机函数,为类里所有的rand和randc类型的随机变量赋一个随机值,并且保证不违背所有有效的约束,随机成功了函数返回1,随机失败了返回0。

约束

        约束表达式的求解是由SV的约束求解器(constraintsolver)完成的。

        求解器能够选择满足约束的值,这个值是由SV的PRNG(伪随机数发生器 Pseudo random number generator)从一个初始值(seed)产生。只要改变种子的值,就可以改变CRT的行为。

        什么可以被约束?SV只能随机化2值数据类型, 但位可以是2值或者4值。这就是说,无法随机出X值和值,也无法随机化字符串。

        上面这个例子里,类Stim中,只有枚举类型 kind 和三个bit类型的len src和dst是随机的。其他都不是随机的。这里面 变量congestion_test不是随机的,所以我们可以通过外部控制congestion_test变量的取值来改变类内部随机变量的约束取值范围。

权重分布

        关键词 dist 可以在约束中用来产生随机数值的权重分布,这样某些值的选取机会要比其他值更大一些。dist 操作符带有一个值的列表以及相应的权重,中间用:=或者:/分开。值或权重可以是常数或者是变量。权重不用百分数表示,权重的和也不必是100。:=操作符表示值范围内的每一个值的权重是相同的。:/操作符表示权重要平均到值范围内的每一个值

        如下面例子解释: 

        inside 是常见的约束运算符,表示变量应该属于某一个值的集合,除非还存在其它约束,否则随机变量在集合里取值的概率是相等的。集合里也可以使用变量。

        还可以通过->或者if-else来让一个约束表达式在特定条件下有效。 

        我们要知道,约束块不像自上向下执行的程序性代码,它们是声明性的代码,是并行的,所有的约束表达式同时有效

        如果父类里面有约束,子类里面也有约束,并且子类继承了父类,那么在对子类里的变量进行随机化操作的时候,随机出来的变量既会满足子类里的约束也会满足父类里的约束条件

约束块控制

        一个类可以包含多个约束块。可以把不同约束块用于不同测试。使用constraint_mode()函数来控制。

        一般情况下,各个约束块之间的约束内容是互相协调不违背的,因此通过随机函数产生随机数可以找到合适的解。

        对于其它情况,例如根据不同需要,来选择使用哪些约束块,禁止哪些约束块的要求,可以使用内建的 constraint_mode( ) 函数打开或者关闭。可以用 handle.constraint.contraint_mode( ) 控制一个约束块,用handle.constraint_mode()控制对象的所有约束。

内嵌约束

        伴随着复杂的约束,它们之间会相互作用,最终产生难以预测的结果,用来使能和禁止这些约束的代码也会增加测试的复杂性。

        SV允许使用randomize() with 来增加额外的约束这和在类里增加约束是等效的。 

        在类里面约束块中,对地址的约束前面有一个关键词soft,代表该对地址的约束属于一个软约束,当外部的约束和该约束冲突的时候,取外面的约束有效。

随机函数

        有时需要在调用randomize()之前或之后立即执行一些操作,例如在随机前设置类例的一些非随机变量(上下限、条件值、权重),或者在随机化之后需要计算随机数据的误差、分析和记录随机数据等。

        SV提供了两个预定义的 void 类型函数 pre_randomize()  post_randomize() 函数。用户可以在类中定义这两个函数,分别在其中定义随机化前的行为和随机化后的行为。如果某个类中定义了 pre_randomize() 或者 post_randomize() 函数,那么对象在执行了randomize()之前或者之后会分别执行这两个函数。可以把这两个函数认为是 randomize() 函数的回调函数(callback function)

SV提供了一些常用的系统随机函数,这些随机函数可以直接调用来返回随机值。

        ※ $random( ) 平均分布,返回32位有符号随机数。

        ※ $urandom( ) 平均分布,返回32位无符号随机数。

        ※ $urandom_range( A,B) 在指定范围内的平均分布。

        在调用randomize( )时可以传递变量的一个子集,这样只随机化类里的几个变量。只有参数列表里的变量才会被随机化,其它变量会被当做状态变量而不会被随机化

        这里要注意的是:这种应用针对的是类里所有被指定或者没有被指定rand的变量都可以作为randomize()的参数而被随机化。 

数组约束

        约束动态数组的大小: 

多数情况下,数组的大小应该给定范围,防止生成过大体积的数组或者空数组。

        SV可以利用foreach对数组的每一个元素进行约束,和直接写出对固定大小数组的每一个元素的约束相比,foreach更加简洁。针对动态数组,foreach更适合于非固定大小数组中每个元素的约束。

         使用foreach产生递增的数组元素的值: 

        产生具有唯一元素值的数组:

        产生随机数组的元素:

        在上面的例子中,array[]是一个存放句柄的动态数组,function new函数的目的,就是让动态数组中的每个元素的句柄,都有指向对象,这样在随机化ra的时候,随机操作传递到对array随机,然后因为array数组里的句柄都有指向的对象,对象里面的变量也是有rand属性的,再对其进行随机。如果没有这么一个new操作,那么array数组中存放的句柄没有指向对象,也就是悬空状态,那么在randomize的时候,就会报错,因为句柄悬空,没有对象可以随机。

随机控制

        随机序列,产生事务序列的一个方法是使用SV的randsequence结构。

        stream是这个序列的入口,先进入stream,进入之后,会根据cfg_read(1/8权重)、io_read(2/8权重)、mem_read(5/8)的权重不同来进入不同的序列语句。安排随机序列。randsequence除了可以产生一个随机的过程以外,还能生成一个比较复杂的随机序列。

使用 randcase 来建立随机决策树。

        randsequencerandcase是针对轻量级的随机控制的应用。而我们可以通过定义随机类来取代上述随机控制的功能,并且由于类的继承性使得后期代码的维护更加方便。

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

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

相关文章

leetcode 738单调递增的数字

单调递增的数字 找到一个比目标值小的最大递增数列 递归法 从左到右遍历,找符合递增的部分, 当发现不符合的部分,不符合部分都置9 找到符合部分-1的最大递增数(后面都置9要借位) 例:输入668841 发现6688…

GMSL虚拟通道ID简介

Maxim千兆多媒体串行链路(GMSL) SERDES技术 通过一根电缆在两个端点之间提供高带宽和丰富的点对点互连,其长度可达15米。 SERDES(序列化器/反序列化器)技术广泛应用于传感器和网络通信。 SERDES在同一链路上支持多种协议。 由于其灵活性和性能,汽车工业应用程序严重依赖于…

关于TCP和UDP的联系与区别以及网络字节序和主机字节序的转换函数实践

1. TCP和UDP的相同点: TCP和UDP都是在网络层,都是传输层协议,都能都是保护网络层的传输,双方的通信都需要开放端口。 2.TCP和UDP的不同点: TCP传输协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC793定义。 UDP是Internet协议集支持一个无连接的…

SD-WAN:现代网络的基石

罗马工程构成了现代文明的基石,建造了横跨已知世界的渡槽,连接了各行各业的人民。拱门支撑着这些壮观的结构,但这些宏伟建筑成就的核心是基石。 SD-WAN 是现代网络的基石,为实现一致的服务质量 (QoS)、基于云的集中式网络管理和控…

scrapy爬取网站图片(静态加载)

1.创建一个scrapy项目 scrapy startgproject tupian cd tupian 创建爬虫文件 scrapy genspider Image www.com(域名)后续需要更改 开通pip管道是需要注意,我们将之前的类注释了,所以我们需要将原来的pip管道的名称加以修改 在终端运行就可以获取数据, 运行后会出现错误是…

面试官:Hash 碰撞是什么?如何解决?被问懵了……

Hash如何存数据 hash表的本质其实就是数组,hash表中通常存放的是键值对Entry。 如下图:这里的学号是个key,哈希表就是根据key值来通过哈希函数计算得到一个值,这个值就是下标值,用来确定这个Entry要存放在哈希表中哪个位置。 Hash碰撞 hash碰撞指的是,两个不同的值(比如张…

你真的了解SQL中的EXISTS谓词吗?

EXISTS 谓词的用法 支撑 SQL 和关系数据库的基础理论主要有两个:一个是数学领域的集合论,另一个是作为现代逻辑学标准体系的谓词逻辑(predicate logic),准确地说是“一阶谓词逻辑”。EXISTS 是为了实现谓词逻辑中“量…

管理系统权限总结

概念 功能权限和数据权限。 功能权限:用户是否能打开某一个网页,是否能点击编辑按钮等。数据权限:用户可以使用的数据范围。 用户 应用系统的具体操作者,用户可以自己拥有权限信息,可以归属于0~n个角色&…

使用VSCode连接远程服务器

1 效果展示 最近在使用云服务器开项目,发现VSCode的remote插件能远程连接服务器进行开发,这样就非常方便了。效果如下: 可以看到,这样操作,使得云端开发和本地开发几乎没什么不同,如果是云服务器就更方便了…

Vue脚手架报错:‘v-model‘ directives require no argument 解决方案

1、报错: v-model directives require no argument 截图 2、原因: ESLint对vetur进行了eslint检查 3、解决方法 ① 修改模板中使用v-show 将 v-model:show"show" 改为 v-model"show" ② vetur插件的作者给出了解决办法 我们可…

20201306吴龙灿第三章学习笔记

目录Ⅰ知识点归纳1.进程的概念什么是进程?进程的特征动态性并发性独立性异步性结构性程序和进程主要区别2.多任务处理系统(1)背景(2)多任务处理系统代码介绍3.进程同步(1)同步(2)进程唤醒与睡眠无效唤醒A 进程:B 进程:避免无效唤醒A 进程:Linux 内核的例子Ⅱ实践内容与…

docker jenkins升级以及失败处理

一、概述 jenkins是由docker安装的,目前的jenkins版本为2.356。然后jenkins右上角提示版本升级 点击了升级,升级完成后,需要重启一下。 然后就芭比Q了,访问jenkins出现504错误。查看docker日志,提示需要jdk升级到1.8。默认的jenkins的jdk版本为1.7,然后docker就开始一直…

督办管理系统——让企业工作落实到位

开展督查督办工作是企业在经营管理过程中的重要环节和管理手段,是企业办公室系统政务服务的一项重要工作。其具有间接性、权威性、实效性等特点。要加强企业督查督办工作,必须思想认识到位,充分把握督查督办工作原则;制度建设到位&#xff0c…

linux NTP同步时间后比实际时间慢8小时

1. issue ntp同步时间后比实际时间慢8小时 2. analysis 查询系统当前的时区设置 date -R,看到系统是 0000 时区,而中国统一采用北京所在的东8时区,由此造成了8小时的时间偏差。 3. solution 将PC ubuntu /usr/share/zoneinfo/Asia/Shanghai…

Django定义路由_子路由_函数视图

Django定义路由什么是路由,怎么去定义路由?添加路由Path 函数路由定义的痛点处理路由中的动态参数什么是路由,怎么去定义路由? 通常在我们创建项目包中,有个url.py的文件,我们需要去定义路由信息&#xff…

二叉树专项训练LeetCode

144. 二叉树的前序遍历 二叉树入门 递归 与 迭代 class Solution {List<Integer> ans new ArrayList<>();void dfs(TreeNode root){if(root null) {return;}ans.add(root.val);dfs(root.left);dfs(root.right);}public List<Integer> preorderTraversal(T…

【Golang开发面经】蔚来(两轮技术面)

文章目录一面1. channel 缓冲与非缓冲2. mysql引擎3. 索引如何建立&#xff1f;4. linux 如何看进程5. redis 字符串的底层6. 线程池理解7. 线程池的拒绝策略8.悲观锁&#xff0c;乐观锁9. HTTP 各个版本的区别10. HTTP2.0之前怎么实现服务器推送机制&#xff1f;11. websocket…

[操作系统] 启动

启动 一、通电 由于内存是随机存储器&#xff08;Random access memory&#xff0c;RAM&#xff09;&#xff0c;属于易失性存储器&#xff0c;未通电时&#xff0c;RAM中不会有任何内容&#xff0c;因此刚一通电&#xff0c;RAM不可能有任何实际信息。计算机硬件厂商在只读存…

信创浪潮下,看看大公司是如何建立数据安全保护体系的?

信创&#xff0c;即信息技术应用创新产业&#xff0c;它是数据安全、网络安全的基础&#xff0c;也是新基建的重要组成部分。信创涉及到的行业包括IT基础设施&#xff1a;CPU芯片、服务器、存储、交换机、路由器、各种云和相关服务内容&#xff0c;基础软件&#xff1a;数据库、…

1.ROS机器视觉:单目摄像头的调用与标定

(1条消息) ROS改错&#xff1a;vm虚拟机中调用摄像头失败_机械专业的计算机小白的博客-CSDN博客https://blog.csdn.net/wzfafabga/article/details/127204106?spm1001.2014.3001.5502 首先保证摄像头是可调用的。 1.安装usb_cam驱动 sudo apt-get install ros-melodic-usb-…