您的位置:首页 > 其它

systemverilog语法(六)

2017-02-11 17:20 148 查看
十六、随机化

通过随机化可以通过利用CPU的时间来换取人工检查的时间,提高效率,提供足够的激励。

采用受约束的随机测试法(CRT)产生测试集:使用随机的数据流为DUT产生输入的测试代码。改变伪随机数发生器(PRNG)的种子(seed)。

一般会在测试设计时考虑设计规范的边界处,甚至测试设计规范之外的行为。

1、 简单的随机变量的简单类

例:


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

Randomize()函数在遇到约束方面的问题时返回0.

2、 权重分布的约束

Dist操作符允许产生权重分布。

:=操作符表示值范围内的每一个值的权重是相同的。

:/操作符表示权重要均分到值范围内的每一个值。

例:


3、 集合成员和inside运算符

用inside运算符产生一个值的集合,还可以求反!,用$代表最大值和最小值

例:


4、 条件约束

支持->和if-else,其中->操作等价于case产生的效果

例:


5、 高效的约束办法

例:


6、 带关系操作的约束办法

例:


7、 带关系操作和约束的类

例:


当x==0时,y==0,但y==0时,对x没有约束。

8、 使用slove••••before约束引导概率分布

slove••••before约束不会改变解的个数,只会改变各个值的概率分布。

例:


9、 控制多个约束块

可以使用内建constraint_mode()函数打开或者关闭约束。

可以用handle.constrain.constraint_mode()控制一个约束块。

用handle.constraint_mode()控制对象的所有约束。

例:


10、内嵌约束(randomize() with)

通过randomize() with来增加额外的约束

例:


11、pre_randomize和post_randomize函数

构建浴缸分布的例子:



12、常用的随机函数



13、约束技巧和技术

1)使用变量设定上限的约束



2)带权重变量的dist约束



14、随机化中常见的错误

1)小心使用有符号变量(除非必要,不要在随机约束里使用有符号类型):错误的例子如下

例:


2)使用无符号32位变量随机化也将产生错误。

如:randm bit[31:0] pkt1_len.•••••••••••••••错误

15、约束数组或者队列的大小

Size()函数可以约束动态数组或队列的元素个数。Inside约束数组大小的上限和下限

例:


15、约束数组和队列的每一个元素

1)可以用foreach对数组的每一个元素进行约束。

例:


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

例:


16、使用randcase和$urandom_range()随机控制

例:


$urandom_range函数返回一个指定范围的随机数,若只用一个参数,则当做(0,最大值)对待。

使用randcase建立决策树

例:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  systemveri 验证