学习目标:
SV绿皮书第六章:随机化
学习内容:
1.数组大小约束
class dyn_size;
rand logic [31:0]d[];
constraint d_size {d.size() inside {[1:10];}
endclass
2.约束数组中元素
class good_sum5;
rand uint_len[];
constraint c_len{
foreach (len[i]) len[i] inside {[1:255]};
len.sum()<1024;
len.size() inside {[1:8];}
endclass
还可以在约束中结合数组的其他方法sum(),product(),and(),or()和xor()
3.产生唯一元素值的数组
class UniqueSlow;
rand bit [7:0] ua[64];
constraint c{
foreach (ua[i])
foreach (ua[j])
if(i!=j)
ua[i]!=ua[j];
}
4.利用randc变量来生成唯一元素值的数组
class randc8;
randc bit [7:0]val;
endclass
class LittleUniqueArray;
bit [7:0]ua[64];
function void pre_randomize();
randc8 rc8;
rc8=new();
foreach (ua[i]) begin
assert(rc8.randomize());
ua[i]=rc8.val;
end
endfunction
endclass
调用randomize前,系统会自动帮我们调用pre_randomize()
5.数据约束例子
class packet;
rand bit [3:0]da[];
constraint da{
da.size() inside {[3:5]};
foreach(da[i]) da[i]<=da[i+1]; //i=4时会产生错误,da最大为[4],却有da[4]<=da[5],应该加if限制防止超范围
}
endclass
packet p;
initial begin
p=new();
p.randomize() with {da.size() inside{3,5};};
end
6*.随机化句柄数组的功能:随机化数组中的每一个句柄所指向的对象。(每一个句柄都必须是非悬空的)
如果想要产生多个随即对象,你可以建立随机句柄数组。(随机求解器不会创建对象)
动态数组事先分配最大数量的元素,然后使用时用约束减小数组的大小。(在随机化时,动态句柄数组大小只能不变/减小)
parameter MAX_SIZE=10;
class RandStuff;
bit [1:0] value=1; //未声明未随机变量
endclass
class RandArray;
rand RandStuff array[]; //声明随机句柄数组
constraint c{
array.size() inside {[1:MAX_SIZE]};}
function new();
//分配最大容量
array =new[MAX_SIZE];
foreach (array[i])
array[i]=new();
endfunction
endclass
RandArray ra;
initial begin
//构造数组和所有对象
ra=new();
//随机化数组,但可能会减小数组
assert(ra.randomize());
foreach(ra.array[i])
$display(ra.array[i].value);
end
ra.randomize() with {array.size==2}的解为array[0].value=1,array[1].value=1
随机化函数随机化了句柄所指对象,但因为数组元素未被声明为随机变量,所以句柄值固定
7.randsequence和randcase
randsequence的相关功能在协调激励组件和测试用例时用到
randcase则对应着随机约束中的dist权重约束+if-else条件约束的组合
问题:
学习时间:
晚:20-22