数组的约束
约束数组的大小和总和
class transaction;
rand bit [31:0] data[];
constraint c_data{
data.size() inside {[5:10]};
data.sum() == 20;
}
endclass
注:动态数组添加约束的时候一定要设置上限,否则会影响仿真的资源,导致随机求解器要用很长的时间才能求解。
约束数组的每一个元素
SystemVerilog可以用foreach语句对数组的每一个元素进行约束。
// 约束每一个元素
class transaction;
rand bit [31:0] data[];
constraint c_data {
foreach(data[i])
data[i] inside {[1:100]};
data.sum < 1000;
data.size() inside {[20:50]};
}
endclass
// 产生一个递增的数组
class transaction;
rand bit [31:0] data[];
constraint c_data {
foreach(data[i])
if(i > 0)
data[i] > data[i-1];
data.size() inside {[10:20]};
}
endclass
约束数组生成唯一元素数值
// 方法一
class transaction;
rand bit [31:0] data[];
constraint c_data {
data.size() inside {[10:20]};
foreach(data[i])
foreach(data[j])
if(i != j)
data[i] != data[j];
}
endclass
// 方法二:借用randc
class transaction;
randc bit [31:0] data;
endclass
class generate_array;
bit [31:0] array[100];
function void pre_randomize;
transaction tr;
tr = new();
foreach(array[i])begin
tr.randomize();
array[i] = tr.data;
end
endfunction
endclass
注:产生唯一元素数值的数组的方法有很多,以上仅作两种参考。