constraint con{
delay dist {0:/10};
}
上述寫法可能導致constraint很難解,不要用上述寫法。
2. 對與求和的約束的寫法(防止和溢出)
bd_len_q.sum with(int'(item)) == 20
3. 數組元素不重複
class A;
rand bit [31:0] arr[];
constraint arr_size { arr.size() inside {[10:15]}; }
constraint arr_uniq { unique {arr}; }
endclass
4. 二維數組的約束
class A;
rand bit [11:0] width [];
rand bit [11:0] height [];
rand bit [11:0] rows_cols [][];
constraint width_cst {
width.size() inside{[100:5]};
height.size() inside {[200:700]};}
constraint c {rows_cols.size() == width.size();
foreach(rows_cols[ii])
rows_cols[ii].size == height.size();
}
constraint each_element {foreach(rows_cols[ii,jj])
rows_cols[ii][jj] inside {[1:255]};}
endclass
5.多個數組相互關聯
有三個數組,每個元素的取值範圍是1-9,三個數組的和是100,三個數組中5的個數不能超過10個。
此類問題的核心解法: 分步求解。
class multi_queue_con;
rand int q1_sum;
rand int q2_sum;
rand int q3_sum;
rand int q1_size;
rand int q2_size;
rand int q3_size;
rand bit[4:0] q1[];
rand bit[4:0] q2[];
rand bit[4:0] q3[];
constraint c_sum{
q1_sum + q2_sum + q3_sum < 100;
q1.sum() with(int'(item)) == q1_sum;
q2.sum() with(int'(item)) == q2_sum;
q3.sum() with(int'(item)) == q3_sum;
q1.size() == q1_size;
q2.size() == q2_size;
q3.size() == q3_size;
}
針對“三個數組中5的個數不能超過10個”有兩種方案:
1. 三個數組中在randomize時就讓 item != 5,randomize後再向數組中填充或替換5;
constraint c_item{
foreach(q1[ii]){
q1[ii] inside {[1:4],[6:9]};
}
foreach(q2[ii]){
q2[ii] inside {[1:4],[6:9]};
}
foreach(q3[ii]){
q3[ii] inside {[1:4],[6:9]};
}
}
function post_randomize();
.../完成插入5或替換5,(替換策略:由於sum有約束,所以找數組中小於5的元素進行替換)
endfunction
2. 把5的權重調低點,多randomize幾次,直到符合要求。
constraint c_item{
foreach(q1[ii]){
q1[ii] dist {[1:4]:=10,5:=5,[6:9]:=10};
}
foreach(q2[ii]){
q2[ii] inside {[1:4]:=10,5:=5,[6:9]:=10};
}
foreach(q3[ii]){
q3[ii] inside {[1:4]:=10,5:=5,[6:9]:=10};
}
}
//in seq
int tq[$];
`uvm_create_on(vseq)
s_seq.new_trans.randomize()with{};
while(1)begin
tq = s_seq.new_trans.find_index with(item ==5);
if(tq.size()>10)
s_seq.new_trans.randomize()with{};
else
break;
end
`uvm_send(vseq)