SV精通4-①随机约束和分布

1.为什么需要随机?
2.为什么需要约束?
3.需要随机什么?

例题
答案:AC。

4.声明随机变量的类
  • 随机的变量有且只能在“class”类里声明,用rand或randc关键词表面变量的随机属性。有且只有是类的成员变量才能随机,类中的方法中的局部变量不能被rand和randc修饰。
  • randc表示周期随机性,即所有可能的值都赋过值后随机值才能被重复。
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.什么是约束?
  • 因此随机定义最好使用bit等二值数据,位数可以为2或4位。
  • 例如rand bit [2:0] cc;、 rand bit [4:0] cc;//3位和5位

例题
答案:AB。C错误是因为month只有三位,只能最多到7。因此要考虑本身变量位数的大小。

  • 可以通过约束外部的变量和常量来改变约束的范围。
  • inside是另一种表示范围的方法,len也能用这种inside方法来表示范围。
  • 每个约束表达式里至少有一个变量必须是rand或randc类型的。没有rand(c)的话,只会检查变量的值是不是在约束范围内。
  • 在约束中,一个表达式最多只能使用一个关系操作符(<,<=,==,>=,>)
  • 给随机变量赋一个固定值,len == 42。

6.权重分布(影响随机数值的权重分布,可以让某些之的选取机会更大)
  • 使用关键词“dist”
  • dist带有一个值的列表以及相应的权重,中间使用“:=”或“:/”分开。此外值和权重可以是常数也可以是变量。
  • 权重不用百分比表示,权重之和也不必是100。
  • “:=”操作符表示:值范围内的每一个值的权重是相等的。
  • “:/”表示:权重要平均分到值范围内的每一个值。

7.集合成员和inside运算符

8.条件约束

9.注意
  • 约束是声明性代码,不是自上而下的,而是并行的,所有约束表达式同时生效,因此顺序没有关系;
  • 约束是双向的,表示会同时计算所有的随机变量的约束,增加或删除一个变量的约束都会影响所有相关的值的选取;
  • 约束也会被继承。但是子类的约束不能违背父类的约束。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值