[SV]Constraint 遇到的問題

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)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章