SystemVerilog的随机化

目录

SystemVerilog中的随机化

约束

解的概率

 控制多个约束块

有效性约束

内嵌约束


采用受约束的随机测试法(CRT)自动产生测试集。定向测试集能找到你认为可能存在的Bug,CRT方法通过随机激励,可以找到你都无法确定的Bug。可以通过约束来选择测试方案,只产生有效的激励,以及测试感兴趣的功能项。CRT环境不仅需要产生激励,还需要通过参考模型,传输函数或其他方法预测输出结果。CRT由两部分组成:使用随机的数据流为 DUT 产生输人的测试代码,以及伪随机数发生器(PRNG)的种子(seed)。只要改变种子的值,就可以改变CRT的行为。这样仅仅通过改变种子的值﹐就可以调整每次测试,使得每次测试可以达到很多次定向测试的效果。这种方法还可以产生更多的和定向测试等效的测试集。

SystemVerilog中的随机化

首先建立一个具有一组相关的随机变量的类,然后用随机函数为这些变量赋随机值。可以用约束来限制这些随机值的范围,使他们是有效的值,也可以测试某些专用的功能。

带有随机变量的简单类

rand修饰符表示每次随机化这个类时,这些变量都会赋一个值。

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

约束是一组用来确定变量的值的范围的关系表达式,表达式的值永远为真。在这个例子里,src变量的值必须大于10,并且小于15。注意例子中的约束表达式是放在括号“{}"中,而没有放在begin和 end之间,这是由于这段代码是声明性质,而不是程序性质。

randomize()函数为类里所有的rand和randc类型的随机变量赋一个随机值,并保证不违背所有有效的约束。randonize()函数在遇到约束方面的问题时返回0。

不能在类的构造函数里随机化对象,因为在随机化前可能需要打开或关闭约束,改变权重,甚至添加新的约束。构造函数用来初始化对象的变量,不能在这里调用randomize()函数。

约束

在一个表达式中最多只能使用一个关系操作符(<、<=、==、 >=、>)。

因为在约束块里只能包含表达式,所以在约束块里不能进行赋值。相反,应该用关系运算符为随机变量赋一个固定的值.例如len==42。

权重分布

dist操作符允许产生权重分布,这样某些值的选取机会要比其他值更大一些。dist操作符带有一个值的列表以及相应的权重,中间用:=或:/分开。值或权重可以是常数或变量。值可以是一个值或值的范围﹐例如[lo:hi]。权重不用百分比表示,权重的和也不必是100。:=操作符表示值范围内的每一个值的权重是相同的,:/操作符表示权重要均分到值范围内的每一个值。

 值和权重可以是常数或变量。可以使用权重变量来随时改变值的概率分布,甚至可以把权重设为0,从而删除一个值。

集合(set)成员和inside运算符

可以用inside运算符产生一个值的集合。除非对变量还存在其他约束,否则SystemVerilog 在值的集合里取随机值时,各个值的选取机会是相等的。在集合里也可以使用变量。可以使用$来代表取值范围里的最小值和最大值。如果想选择一个集合之外的值,只需要用取反操作符!对约束取反。把集合里的值保存到数组中后就可以在约束中使用这些数组。集合里的每一个值取出的概率都是相同的,即使值在数组中出现多次。

 条件约束

System Verilog支持两种关系操作:->和if-else。

->操作符可以产生和case操作符效果类似的语句块,它可以用于枚举类型的表达式。

双向约束

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

即使->和if-else这些看起来像if-else程序性语句的条件约束,也是双向的。例如,约束{(a==1)- > (b==0)}和{!(a==1)||b==0;}是等价的。约束求解器并不是先检查a==1,然后再令b==0。事实上,如果增加一个约束{b==1;),约束求解器将把a置为0。

解的概率

没有约束的类

没有约束的类,由于没有任何约束,每种解的可能性是相同的。

关系操作

 关系操作和双向约束

关系操作规定×==0时,y的值为0,但y==0时,对x的值没有约束。由于关系操作是双向的,如果y为非零值,那么×的值将为1。

使用solve...before约束引导概率

 

solve...before约束不会改变解的个数,只会改变各个值的概率分布。求解器计算x的值为0或1的概率是相同的。在 1000次 randomize ()的调用里,x为0的次数大约是500次,为1的次数大约也是500次。x为0时,y必须也是0;x为1时,y为0、1,2,3的概率相等。

 控制多个约束块

在运行期间,可以使用内建的constraint_mode ()函数打开或关闭约束。可以用handle.constrain. constraint_mode()控制一个约束块,用handle.constraint_mode (控制对象的所有约束,如例6.28所示。

有效性约束

设置多个约束以保证随机激励的正确性是一种很好的随机化技术,它也称为“有效性约束”。

内嵌约束

很多测试只会在代码的一个地方随机化对象。SystemVerilog允许使用randomize ()with来增加额外的约束,这和在类里增加约束是等效的。

有时需要在调用randomize()之前或之后立即执行一些操作,例如在随机化之前可能要设置类里的一些非随机变量(例如上下限.权重),或者随机化之后需要计算随机数据的误差校正位。

有时需要在调用randomize()之前或之后立即执行一些操作,例如在随机化之前可能要设置类里的一些非随机变量(例如上下限.权重),或者随机化之后需要计算随机数据的误差校正位。
SystemVerilog可以使用两个特殊的void类型的pre_randomize和post_randomize函数来完成这些功能。void类型函数没有返回值,由于函数不是任务,所以并不消耗时间。如果想在pre_randomize和 post_randomize 函数里调用调试程序,那么调试程序必须是函数类型。
随机数函数

 随机化个别变量

可以在调用randomize()函数时只传递变量的一个子集,这样就只会随机化类里的几个变量。只有参数列表里的变量才会被随机化,其他变量会被当作状态变量而不会被随机化。所有的约束仍然保持有效。第一次调用randomize()函数只改变了两个rand变量med和 hi。第二次调用只改变了med变量,而hi变量仍然保持原来的值。需要注意的是,你可以在随机化时传递一个非随机变量﹐例如第三次调用,low变量被赋了一个随机值,并且满足约束条件。

 产生具有唯一元素的数组

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值