赞
踩
rand
,通常用于修饰class中的成员变量。此外还有randc
表示周期随机性,所有可能值都出现过后才可能重复。std::randomize()
函数才能对声明了rand
的变量进行随机化。assert (xx.randomize()) else $fatal(0, "xx::randomize failed");
不同仿真器对于同一个约束类和种子值求解出的数值可能是不相同的。
关键词dist
可以在约束中产生随机数值的权重分布。使用:=
表示每一个值的权重是相同的,:/
表示权重平分到每一个值。
inside
是常用的约束运算符。使用$
可以指定最大值和最小值。
->
或者if-else
可以让约束表达式在特定时刻有效。
class xx;
rand bit [2:0] example;
constraint ex{
//example inside {[1:3]};
//example dist{0:=40, [1:3]:=60};
(mode) -> example='d1;
}
endclass
※约束块不像自上向下的程序性代码,是并行同时有效的,需要得到同时满足约束的结果。
constraint_mode()
函数1
打开或0
关闭约束。randomize() with
来增加约束。assert (x.randomize() with {xx>=100; xx<=200;});
soft
修饰的优先级低。pre_randomize()
和post_randiomize()
函数是sv预定义的两个void类型函数,对象在执行randomize()
之前或者之后会分别执行这两个函数。$random()
、$urandom()
、$urandom_range()
均返回平均分布。random(xx)
可以对个别变量(无论是否指定rand
)进行随机化。random
。此时无需对动态数组进行new()
。class darray_ex;
rand int len[];
constraint c_len{
foreach(len[i]) len[i] inside {[1:255]};
len.sum() < 1024;
len.size() inside {[1:8]};
}
endclass
rand
保证其随机化属性,同时在调用随机函数前要保证句柄数组中的每一个句柄元素都是非悬空的。class randarray;
rand xx array[];
constraint c{
array.size() inside {[1: MAX_SIZE]};
}
function new();
array = new[MAX_SIZE];
foreach(array[i])
array[i] = new();
endfunction;
endclass
※随机化后,数组array
会进行随机,相应的句柄也会进行随机,如果class中的成员变量被rand
进行修饰了则相应的成员变量也会进行随机化。
randsequence
和randcase
针对轻量级随机控制的应用。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。