Я пытаюсь применить ограничения к некоторым случайным пакетам (я мог бы применить к фиксированным пакетам), которые я должен отправить DUT - PullRequest
0 голосов
/ 05 июля 2019

Следующий код имеет два класса - пакет и пакет_1;Класс пакета имеет свойства длины и режима, класс пакета имеет ограничения, необходимые для длины и режима.В классе packet_1 я хочу создать 30 таких пакетов и хочу применить ограничение длины = 6 для 10 случайных пакетов, я мог бы сделать это для одного конкретного (не случайного) пакета, пожалуйста, дайте мне знать, если это правильный путь и каксделать это для 10 случайных пакетов?

Следующий код сгенерировал 30 пакетов с 4-м пакетом, имеющим длину = 6 и соответствующим другим ограничениям, но как сделать то же самое для 1 случайного пакета (не фиксированного 4-го пакета)) или 10 случайных пакетов из 30.

 class packet;
 rand bit[1:0] mode;
 rand int length;
 int num;
 constraint mod_len {mode==0 -> length inside {[1:5]};
                  mode==1 -> length inside {[6:10]};
                  mode==2 -> length inside {[11:15]};
                  mode==3 -> length inside {[16:20]};};
 endclass

 class packet_1;  
  packet p1;
  task pack(); 
  p1=new;
  p1.num=0;

  repeat(30)
  begin 
  p1.num++;
  if(p1.num==4)
    p1.randomize with {(p1.length==6);} ;
  else
  p1.randomize ;
  $display("packet is %p",p1);
  end
  endtask
 endclass


  module a;
  packet_1 p2;
  initial 
  begin
  p2=new();
  p2.pack();
  end
  endmodule

1 Ответ

2 голосов
/ 08 июля 2019

Если вы хотите точно определенное количество пакетов, то мы можем использовать очередь / массив, в котором хранится случайные индексы ограниченного значения для хранения.

class packet_1;  
   packet p1;
   int NUM_CONSTRAINED_PKTS=10; // Number of pkts to be constrained
   int NUM_TOTAL_PKTS=30; // total number of pkts to be generated
   rand int q[$];
   constraint c1{
     q.size == NUM_CONSTRAINED_PKTS; // random indices = total constrained pkts generated
     foreach(q[i]){q[i]>=0; q[i]<NUM_TOTAL_PKTS;} // indices from 0-total_pkts
       unique {q}; // unique indices
   };
  task pack(); 
    p1=new;
    p1.num=0;
    this.randomize(); // randomize indices in q
    for(int i=0;i<NUM_TOTAL_PKTS;i++) begin 
      if(i inside {q}) begin // check if index matches
        p1.randomize with {(p1.length==6);} ;
        p1.num++; // debug purpose
      end
      else
        p1.randomize ;    
      $display("packet is %p",p1);
    end
    if(p1.num != NUM_CONSTRAINED_PKTS) $error("Error: p1.num=%0d",p1.num); // 10 pkts with constrained value
    else $display("Pass!!");
  endtask
endclass

Другой метод заключается виспользуйте оператор dist для переменной length с некоторой связующей логикой для генерации взвешенного распределения в выходных данных.

...