【数字ic自整资料】SV约束constraint

news2024/9/24 12:16:25

参考链接:

SV--随机约束(一)_sv constraint-CSDN博客

SV--随机约束(二)_sv constraint f循环-CSDN博客

[SV]Constraint 遇到的问题_父类和子类 constraint-CSDN博客

目录

1、随机化的概念理解

2、约束(constraint)

2.1、inside

2.2、内嵌约束

2.3、约束块控制

2.4、对数组的约束

3、SV中的随机化函数


1、随机化的概念理解

我们要随机什么?

  1. 器件配置:通过寄存器和系统信号
  2. 环境配置:随机化验证环境,例如合理的时钟和外部反馈信号
  3. 原始输入数据:例如MCDF数据包的长度、带宽、数据间的顺序
  4. 延时:握手信号之间的时序关系,例如valid和ready,req和 ack之间的时序关系
  5. 协议异常:如果反馈信号给出异常, 那么设计是否可以保持后续数据处理的稳定性呢?

        随机化是为了产生更多可能的驱动,因此在软件世界"class"一侧的运用更多,所以我们倾向于将相关数据有机整理在一个类的同时,也用rand关键词来表明它们的随机属性。

        randc表示周期随机性,即所有可能的值都赋过值后随机值才可能重复。

        随机属性需要配合SV预定义的类随机函数std::randomize()使用。即只有通过声明rand变量,并且在后期通过对象调用randomize()函数才可以随机化变量

2、约束(constraint)

  1. 约束表达式的求解是由SV的约束求解器 (constraint solver)完成的。
  2. 求解器能够选择满足约束的值,这个值是有SV的PRNG (伪随机数发生器 Pseudo random number generator) 从—个初始值{seed}产生。只要改变种子的值,就可以改变CRT的行为。
  3. sv标准定义了表达式的含义以及产生的合法值, 但没有规定求解器计算约束的准确顺序。 这即是说,不同仿真器对千同一个约束类和种子值求解出的数值可能是不相同的。
  4. 什么可以被约束? sv只能随机化2值数据类型, 但位可以是2值或4值。 这即是说, 无法随机化出X值和Z值,也无法随机化字符串。
  5. 约束块不像自上向下的程序性代码。它们是声明性的代码,是并行的,所有的约束表达式同时有效。

2.1、inside

        inside是最常见的约束运算符,表示限定前面命名的变量的取值范围,除非还存在其他约束,否则随机变量在集合里取值的概率是相等的。

一个简单约束的写法:

class date;
rand bit[2:0] month;
rand bit[4:0] day;
rand int year;
constraint c_date {
                     month inside {[1:12]};
                     day inside {[1:31]};
                     year inside {[2010:2030]};
                     }
endclass

还可以用$来指定最小值和最大值。

rand bit[6:0] b;     // 0 <= b <= 127
rand bit[5:0] e;     // 0<= e <= 63
constraint  c_range {
 b inside {[$:4], [20:$};      // 0 <= b <= 4 || 20 <= b <= 127
 e inside {[$:4], [20:$};      // 0 <= e <= 4 II 20 <= e <= 63
}

约束中也可以用条件表达式,即在指定条件下,后面的约束才成立。

constraint c_io {
              (io_space_mode) -> addr[31] == l'bl; }

                    
constraint c_en_rw {
                     if (op == READ)
                       len inside {[1: 10]}
                     else
                       len == 10;   //约束里用的是==,不是=
                     }

2.2、内嵌约束

        SV允许使用randomize()with来增加额外的约束,这和在类里增加约束是等效的,但同时要注意类内部约束和外部约束之间应该是协调的,如果出现互相违背的清况,那么随机数值求解会失败。

        必要的时候可以使用soft来声明约束,这代表当前写的约束属于软约束,如果在后续情况下遇到和soft约束冲突的情况下,soft约束失效。

class Transaction;
rand bit[31:0] addr, data;
constraint cl { soft addr inside {[0: 100], [1000: 2000]};}
endclass


Transaction t;

initial begin
t = new();
// addr is 50-100,
// 1000-1500, data < 10
assert (t.randomize() with {addr >= 50; addr <= 1500;
                                   data < 10;));

driveBus(t);

// force addr to a specific
// value, data > 10

assert(t.randomize() with
                     {addr = 2000; data > 10;});

driveBus(t);
end

2.3、约束块控制

        —个类可以包含多个约束块,可以把不同约束块用于不同测试。

        对于其它情况,例如根据不同需要,来选择使能哪些约束块,禁止哪些约束块的要求,可以使用内建的constraint_mode()函数打开或者关闭约束

        0为关闭约束,1为打开约束。

class Packet;
rand int length;
constraint c_short{length inside {[1:32]};}
constraint c_long {lengh inside {[1000:1023]};}
endclass

Packet p;

initial begin
p = new();

p.c_short.constraint_mode(0);
assert(p.randomize ()) ;
transmit(p);

p.constraint_mode(0);
p.c_short.constraint_mode(1);
assert(p.randomize ());
transmit(p);

end

遇到约束冲突时的解决方法

2.4、对数组的约束

//面试的时候数组约束被问了两次,答得稀碎,所以感觉这部分还挺重要的。我连数组的内建函数sum都不知道……废了

        sv可以利用foreach对数组的每一个元素进行约束,和直接写出对固定大小数组的每一个元素的约束相比,foreach要更简洁。

        针对动态数组,foreach更适合于对非固定大小数组中每个元素的约束。

        此外还可以在约束中结合数组的其它方法sum () , product () , and () , or ()和xor () 。

class good_sums;
rand uint len[];

constraintc len {
            foreach (len[i]) len[i] inside {[1:255]};
            len.sum() < 1024;
            len.size() inside {[1:8]};}
endclass

        数组求和约束防止溢出。

len.sum with(int'(item)) == 20

        如果想要产生一个随机数组,他的每一个元素值都是唯一的,如果使用randc数组,那么数组中的每一个元素只会独立的随机化,并不会按照我们的本意使得数组中的每一个数是唯一的。

class UniqueSlow;
rand bit[7:0] ua[64] ;

constraint C { foreach (ua[i]) //对数组中的每一个元素操作
                foreach (ua[j])
                if (i!= j) //除了元素自己
                ua [i] ! = ua [j] ; //和其它元素比较
                }
endclass

        如果要约束的是一个二维数组:

class A;

   rand bit [11:0] width [];
   rand bit [11:0] height [];
   rand bit [11:0] rows_cols [][];

   constraint width_cst {
      width.size() inside{[100:5]};
      height.size() inside {[200:700]};}

   constraint c {rows_cols.size() == width.size();
      foreach(rows_cols[ii])
              rows_cols[ii].size == height.size();
   }

   constraint each_element {foreach(rows_cols[ii,jj])
                         rows_cols[ii][jj] inside {[1:255]};}


endclass

        注意:对于二维数组在约束里的写法,不是rows_cols [ii][jj],而是rows_cols [ii,jj],用一个中括号+逗号写在一起。

3、SV中的随机化函数

        $urandom( ) 方法返回一个32bit的无符号整型数据

        $random( ) 方法返回的是一个32bit的带符号数据

        $urandom_range( )返回一定范围的无符号数据

        $urandom_range( int unsigned maxval, int unsigned minval = 0);

关于随机化种子(seed)

variable = $urandom(seed);

        seed是一个可选项,如果不设置种子,或者设置种子为None(默认情况下,如果未明确指定种子,random会使用当前系统时间作为种子),则每次运行程序时生成的随机数将不同。

        通过设置不同的种子值,可以生成不同的随机数序列。这对于需要多次实验并比较结果的情况非常有用,因为可以确保每次实验使用的随机数序列不同,从而得到更可靠的结果

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

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

相关文章

基于报位时间判断船舶设备是否在线,基于心跳时间判断基站网络是否在线

文章目录 引言I 在线船舶查询在线或者离线船舶显示在线状态统计在线船舶II 树状显示船舶设备数据结构统计船舶设备在线数和总数III 基站网络是否在线IV 知识扩展统计某个key的数据,例如统计船舶分类下的在线船舶MyBatis引言 本文采用的数据库是SQL Server,开发语言为Java。 …

无线协议wlan在华为模拟器中的实现

无线技术 wifi6:标准为802.11&#xff1b; wifi发展趋势&#xff1a; vlan基本概念&#xff1a; wlan组网架构&#xff1a; 1)fat胖AP;能够独立工作&#xff0c;可以单独配置&#xff1b;小型网络使用&#xff0c;功能少&#xff1b; 2)fit瘦APAC&#xff1a;适用大型网络…

《深度学习》—— PyTorch的介绍及PyTorch的CPU版本安装

文章目录 一、PyTorch的简单介绍二、pytorch的CPU版本安装三、 torch、torchvision、torchaudio 三个库的介绍 一、PyTorch的简单介绍 PyTorch是一个由Facebook AI实验室开发的深度学习框架&#xff0c;它基于Python&#xff0c;并提供了高效的GPU加速和灵活的模型定义能力。1…

基于vue框架的传统服饰剪裁交流平台5m953(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,服装分类,服装资讯 开题报告内容 基于Vue框架的传统服饰剪裁交流平台开题报告 一、研究背景与意义 随着全球化进程的加速&#xff0c;文化多样性的保护与传承日益受到重视。传统服饰作为各民族历史文化的瑰宝&#xff0c;不仅承载…

阅读记录:Gradient Episodic Memory for Continual Learning

1. Contribution 提出了一组指标来评估模型在连续数据上的学习情况。这些指标不仅通过测试准确性来表征模型&#xff0c;还通过其跨任务迁移知识的能力来表征模型。针对持续学习任务&#xff0c;提出了GEM模型&#xff08;Gradient Episodic Memory&#xff09;&#xff0c;它…

C++中stack类和queue类

感谢大佬的光临各位&#xff0c;希望和大家一起进步&#xff0c;望得到你的三连&#xff0c;互三支持&#xff0c;一起进步 数据结构习题_LaNzikinh篮子的博客-CSDN博客 初阶数据结构_LaNzikinh篮子的博客-CSDN博客 收入专栏&#xff1a;C_LaNzikinh篮子的博客-CSDN博客 其他专…

基于MT79815G CPE 板子上挂usb3.0的5G 模块,WIFI能跑多少速度呢

关于MT79815G CPE 板子上挂usb3.0的5G 模块&#xff0c;WIFI能跑多少速度的问题&#xff0c;我们以启明智显 ZX7981P智能无线接入型路由器&#xff08;CPE&#xff09;挂广合通5G模组为例说明&#xff1a; 一般来说&#xff0c;用 ZX7981P&#xff0c;通过软加速&#xff0c;U…

Java:列表操作

目录 1、判断列表是否为空或者为NULL2、列表包含3、列表排序4、列表截取5、列表合并6、列表求极值7、列表转字符串8、列表去重的四种方式9、列表转数组 1、判断列表是否为空或者为NULL Optional.ofNullable(list).orElse(Collections.emptyList()).isEmpty() // true为空或NU…

【JAVA-数据结构】时间空间复杂度计算案例

接着上一篇文章&#xff0c;对应举一些例子。 1.时间复杂度 【实例1】 // 计算func2的时间复杂度&#xff1f; void func2(int N) {int count 0;for (int k 0; k < 2 * N ; k) {count;} int M 10;while ((M--) > 0) {count;} System.out.println(count); } 基本操作…

在云渲染中3D工程文件安全性怎么样?

在云渲染中&#xff0c;3D工程文件的安全性是用户最关心的问题之一。随着企业对数据保护意识的增强&#xff0c;云渲染平台采取了严格的安全措施和加密技术&#xff0c;以确保用户数据的安全性和隐私性。 云渲染平台为了保障用户数据的安全&#xff0c;采取了多层次的安全措施。…

电子信息制造业数据安全如何防护?有什么加密方案?

电子信息制造业数据加密解决方案 问题 1.电子文档&#xff08;源代码、设计图纸、设计方案等&#xff09;均要做数据保护措施&#xff0c;防止内部人员有意或无意造成数据泄露&#xff1b; 2.与外部企业之间往来的外发文件&#xff0c;管控不当&#xff0c;容易造成泄密&…

工业能源物联网的建设与维护该如何实现

随着全球对可持续发展的重视&#xff0c;智能电网和微电网的应用逐渐成为能源转型的重要方向。在新型电力系统中&#xff0c;负荷侧资源不再是单纯消耗的“消费者”&#xff0c;而是既消耗电能又可生产电能的“产消者”。比如&#xff0c;电力用户利用屋顶建设光伏发电&#xf…

防火墙详解(二)通过网页登录配置华为eNSP中USG6000V1防火墙

配置步骤 步骤一 打开eNSP&#xff0c;建立如下拓扑。防火墙使用&#xff1a;USG6000V1。 Cloud的作用是通过它可以连接本地的网卡&#xff0c;然后与我们的电脑进行通信。 由于防火墙USG6000V&#xff0c;不能直接开启&#xff0c;需要的导入包&#xff0c;所以需要在华为官网…

可视挖耳勺神器怎么样?可视耳勺热销第一名品牌!

耳道作为我们身体的重要部分&#xff0c;它的清洁健康很重要。传统挖耳勺的材质偏硬、表面摩擦力大并且在不可视的情况下进行盲目掏耳&#xff0c;很容易出现刮伤耳道肌肤导致耳朵出血感染等意外。而网上出现了一种新型的掏耳神器--可视耳勺&#xff0c;它到底怎么样&#xff1…

Java语言程序设计基础篇_编程练习题**18.38 (递归树)

目录 题目&#xff1a;**18.38 (递归树) 代码示例 代码逻辑解释 类定义和变量初始化 main 方法 start 方法 drawRecursiveTree 方法 输出结果 题目&#xff1a;**18.38 (递归树) 编写一个程序来显示一个递归树&#xff0c;如图18-20所示 代码示例 编程练习题18_38Re…

Python模块和包:自定义模块和包③

文章目录 一、模块1.1 什么是模块1.2 创建模块1.3 导入模块1.4 模块的命名空间 二、包2.1 什么是包2.2 创建包2.3 导入包2.4 包的命名空间 三、综合详细例子3.1 项目结构3.2 模块代码student.pycourse.pymanager.py 3.3 主程序代码main.py 3.4 运行结果 四、总结 Python模块和包…

regPractice-正则表达式练习

正则表达式练习(java) 1 . 校验密码强度 密码的强度必须是包含大小写字母和数字的组合&#xff0c;不能使用特殊字符&#xff0c;长度在8-10之间。 ^(?.*\d)(?.*\[a-z])(?.*[A-Z])[a-zA-Z\d]{8,10}$**(?pattern)**属于正向前瞻断言 正向前瞻断言的语法是 (?pattern)&a…

Android开发不用存储权限进行拍照

Android开发不用存储权限进行拍照 有时平台审核严&#xff0c;拍照时不能获取存储。这怎么办呢&#xff0c;拍照功能又不能去掉。 一、思路&#xff1a; 得自定义Camera&#xff0c;然后把拍照图片存在app目录下&#xff0c;再刷新到手机相册 二、效果图&#xff1a; Andro…

31省市农业地图大数据

1.北京市 谷类作物种植结构&#xff08;万亩&#xff09; 农作物种植结构&#xff08;万亩&#xff09; 2.天津市 谷类作物种植结构&#xff08;万亩&#xff09; 农作物种植结构&#xff08;万亩&#xff09; 3.黑龙江省 谷类作物种植结构&#xff08;万亩&#xff09; 农作物…

JVM 几种经典的垃圾收集器

目录 前言 Serial Serial Old ParNew Parallel Scavenge Parallel Old CMS收集器 garbage first 收集器 前言 回顾一下之前的几种垃圾收集算法: JVM java主流的追踪式垃圾收集器-CSDN博客文章浏览阅读646次&#xff0c;点赞22次&#xff0c;收藏16次。简要介绍了几…