赞
踩
1、为什么需要随机化
芯片体积日渐增大,复杂度越来越高,定向测试已经无法满足测试的需求,而随机测试产生的激励多样,更能满足测试的需求。而且随机测试相对于定向测试的代码量会减少很多,但是激励会更丰富。我们需要的约束是合法的约束,需要限定激励的合法范围。所进行的约束不但可以指定数据的取值范围,还可以指定各个随机数值的权重分布。所要随机的内容为:器件配置、环境配置、原始输入数据、延时、异常协议等等。
2、什么可以被随机化
可以随机化整形变量,即由位组构成的变量,尽管可以随机化2值数据类型,但位也可以是2值或者4值类型。
3、声明随机变量的类
rand关键词可以表明随机属性;randc可以表示周期随机性,所有的值赋值以后才可以重复。类的随机函数:std::randomize() 前提是需要通过rand变量声明,在后续的通过对象调用randomize()函数才能随机化变量。constraint约束也可以同随机变量一同在类里面声明。
4、权重分布
关键词dist可以在约束里面产生随机数值的权重分布,dist操作符带有一个值得列表以及相应的权重,用:= 或者:/分开,值或者权重可以是常数或者变量,最主要的是权重不用百分比表示,权重的和也不必是100。:=操作符表示值范围内的每一个值的权重是相同的,:/操作符表示权重要平均分到值范围内的每一个值。
5、inside运算符
inside是常见的约束运算符,表示变量应该属于某一个值的集合,除非还存在其他约束,否则随机变量在集合重取值的概率是相等的。集合里面也可以使用变量。除此之外还可以使用“$”来表示最大值和最小值
- rand int c ;
- int lo, hi;
- constraint c_range{
- c insede {[lo:hi]}; //lo<=c<=hi
- }
-
- rand bit [6:0] b; //0<=b<=127
- rand bit [5:0] e; //0<=b<=63
- constraint c_range{
- b insede {[$:4],[20:$]}; //0<=b<=4 ||20<=b<=127
- e insede {[$:4],[20:$]}; //0<=b<=4 ||20<=b<=63
- }
6、条件约束
可以通过—>或者if-else来让一个约束表达式在特定的时间有效
6、双向约束
约束块是声明性的代码,是并行的,所有的约束表达式同时有效。同时,约束也是双向的,这表示它会同时计算所有的随机变量的约束。增加或删除任何一个变量的约束都会直接或间接影响所有相关的值的选取。
7、引导概率分布
可以使用solve...before约束引导SV的求解器 ,solve...before约束不会改变解的个数,只会改变各个值得概率分布。
- class SloveBefore;
- rand bit x;
- rand bit [1:0]y;
- constraint c_xy{
- (x==0)- > y==0;
- solve x before y;
- }
- endclass
solve x before y | solve y before x | ||||||
解 | x | y | 概率 | 解 | x | y | 概率 |
A | 0 | 0 | 1/2 | A | 0 | 0 | 1/8 |
B | 0 | 1 | 0 | B | 0 | 1 | 0 |
C | 0 | 2 | 0 | C | 0 | 2 | 0 |
D | 0 | 3 | 0 | D | 0 | 3 | 0 |
E | 1 | 0 | 1/8 | E | 1 | 0 | 1/8 |
F | 1 | 1 | 1/8 | F | 1 | 1 | 1/4 |
G | 1 | 2 | 1/8 | G | 1 | 2 | 1/4 |
H | 1 | 3 | 1/8 | H | 1 | 3 | 1/4 |
1、打开或者关闭约束块
使用内建的constraint_mode()函数打开或者关闭约束,可以用handle_constrain.constraint_mode()来控制一个约束块,handle.constraint_mode()控制对象的所有约束。
2、内嵌约束
SV允许使用randomize() with 来增加额外的约束,这和再类里面增加约束是等价的。可以增加soft软约束,在有冲突的时候,优先级会更低
assert(t.randomize() with{addr>=50;addr<=1500;data<10;});
3、产生唯一元素值得数组
1、随机函数
有时需要在调用randomize()之前或之后立即执行一些操作,例如在随机前设置类例的一些非随机变量(上下、条件值、权重),或者在随机化之后需要计算随机数据的误差、分析和记录随机数据等。SV提供了两个预定义的void类型函数pre_ randomize()和post_ randomize( )函数。用户可以类中定义这两个函数,分别在其中定义随机化前的行为和随机化后的行为。如果某个类中定义了pre_ randomize( )或者post_ _randomize()函数,那么对象在执行了randomize()之前或者之后会分别执行这两个函数。所以,pre_ randomize( )和post_ randomize( )可以看做是randomize( )函数的回调函数(callback function)。
2、随机数函数
$random()平均分布,返回32位有符号随机数;$urandom( )平均分布,返回32位无符号随机数;$urandom_ range() 在指定范围内的平均分布
3、随机化个别变量
在调用randomize( )时可以传递变量的一个子集,这样只会随机化类里的几个变量。只有参数列表里的变量才会被随机化,其它变量会被当做状态变
量而不会被随机化。所有的约束仍然保持有效。这种应用针对的是类里所有被指定或者没有被指定rand的变量都可以作为randomize( )的参数而被随机化。
1、foreach对数组元素约束
1、随机序列
产生随机序列的一个方法是使用SV里面的randsequence结构
2、随机控制
可以使用randcase来建立随机决策树
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。