1.为什么需要随机?
![](https://i-blog.csdnimg.cn/blog_migrate/9e71ae55742633b487c31b804a65c8e2.png)
2.为什么需要约束?
![](https://i-blog.csdnimg.cn/blog_migrate/fb6de5084ae001e1eeabfe1bd2434ecf.png)
3.需要随机什么?
![](https://i-blog.csdnimg.cn/blog_migrate/ead1c6526910cd084e2cb2c3c92b2fb0.png)
例题
![](https://i-blog.csdnimg.cn/blog_migrate/54eeb6f221a1acb3877398f447140c91.png)
4.声明随机变量的类
-
随机的变量有且只能在“class”类里声明,用rand或randc关键词表面变量的随机属性。有且只有是类的成员变量才能随机,类中的方法中的局部变量不能被rand和randc修饰。
-
randc表示周期随机性,即所有可能的值都赋过值后随机值才能被重复。
![](https://i-blog.csdnimg.cn/blog_migrate/464487a1e3f6fd95a5059ccabda27b63.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1d57efd8333b451c24ba1c124d3d9a36.png)
p.randomize()函数进行随机,利用句柄和函数,该函数会返回值0或1,返回1则随机化成功,0则是随机化失败。
-
randomize()函数会为类里所有的rand和randc类型的变量赋一个随机值,并且不违背约束。
-
随机化会失败可能是因为约束的矛盾,例如src>10,src<15,约束矛盾导致 发现 src随机求不出解。
-
一次完整的randomize要求成员变量随机的值满足全部的constraint约束条件。因此只要有不满足约束求解失败,那么没有添加约束的dst、data也不会有随机的数值。
-
rand和randc的区别:假设一副扑克牌使用rand随机抽出一张牌,每一张被抽到的概率都是五十四分之一;第二次抽牌,每一张牌被抽到的概率还是五十四分之一,相当于第一次抽完把牌放回去了,即每张牌被抽到的概率永远是五十四分之一。而使用randc,第一次抽牌,任意一张为五十四分之一;第二次则相当于第一次的牌没有了,在剩余的53张牌中抽牌,概率变成五十三分之一,抽上54次的话每一张牌都会被抽出来(即遍历),c表示cycle循环。
5.什么是约束?
![](https://i-blog.csdnimg.cn/blog_migrate/e643a2616f1b4b52a664258fbc319515.png)
-
因此随机定义最好使用bit等二值数据,位数可以为2或4位。
-
例如rand bit [2:0] cc;、 rand bit [4:0] cc;//3位和5位
例题
![](https://i-blog.csdnimg.cn/blog_migrate/45a7bd41c493a433e9f6a9e5516d4811.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9bea50277527682421cc5a3033c4b405.png)
![](https://i-blog.csdnimg.cn/blog_migrate/89a817017b9f9667ad799f9f6cd982df.png)
-
可以通过约束外部的变量和常量来改变约束的范围。
-
inside是另一种表示范围的方法,len也能用这种inside方法来表示范围。
-
每个约束表达式里至少有一个变量必须是rand或randc类型的。没有rand(c)的话,只会检查变量的值是不是在约束范围内。
-
在约束中,一个表达式最多只能使用一个关系操作符(<,<=,==,>=,>)
-
给随机变量赋一个固定值,len == 42。
6.权重分布(影响随机数值的权重分布,可以让某些之的选取机会更大)
-
使用关键词“dist”
-
dist带有一个值的列表以及相应的权重,中间使用“:=”或“:/”分开。此外值和权重可以是常数也可以是变量。
-
权重不用百分比表示,权重之和也不必是100。
-
“:=”操作符表示:值范围内的每一个值的权重是相等的。
-
“:/”表示:权重要平均分到值范围内的每一个值。
![](https://i-blog.csdnimg.cn/blog_migrate/d99063c16005c321b0298c499ada50ec.png)
7.集合成员和inside运算符
![](https://i-blog.csdnimg.cn/blog_migrate/533c1ce057f5cc203071fefe32b25b1e.png)
8.条件约束
![](https://i-blog.csdnimg.cn/blog_migrate/29646b062a064000167965df70118923.png)
9.注意
-
约束是声明性代码,不是自上而下的,而是并行的,所有约束表达式同时生效,因此顺序没有关系;
-
约束是双向的,表示会同时计算所有的随机变量的约束,增加或删除一个变量的约束都会影响所有相关的值的选取;
-
约束也会被继承。但是子类的约束不能违背父类的约束。