前言
很多时候,我们在写sequence激励的时候,有一些变量需要做一些简单的随机,但是又不希望引入其他的类,这个时候我们可以利用std::randomize()来处理。
一、std::randomize()处理随机变量
如下代码所示,利用std::randomize()对变量进行随机约束,assert用于断言随机是否成功。
对于size变量来说,希望size是集合式带权重分配,其中0到3的权重分别是10,4到7的权重分别是5,8到10的权重分别是1。
对于a和b变量来说,可以约束其范围,以及他们之间的相互关系。
val变量中4个bit为1,其余为0。
class smoke_vseq extends base_vseq;
rand bit[3:0] size;
rand int a, b;
rand bit[100:0] val;
task body()
assert(std::randomize(size) with {
size dist {[0:3] :=10, [4:7] := 5, [8:10] := 1};
});
assert(std::randomize(a, b) with {
a>=0; a<1024;
b>=0; b<1024;
a != b;
});
void'(std::randomize(val) with { $countones(val) inside {4};});
//十个数相加和为50,每个数都小于7
bit [5:0] d1[10];
void'(std::randomize(d1) with {d1.sum() with ((item<7) ? item : 0) == 50;});
//随机出任意5个小于10的数
bit [5:0] d1[10];
void'(std::randomize(d1) with {d1.sum() with (int'(item<10 )) == 5;}); //需要加上int
endtask : body
endclass : smoke_vseq
总结
总的来说,利用std::randomize()函数可以很方便的在sequence内部对变量进行随机,而不用额外引入类。