我试图对必须发送到DUT的一些随机数据包(我可以应用于固定数据包)施加约束

时间:2019-07-05 04:30:10

标签: constraints uvm

以下代码具有两个类-packet和packet_1;数据包类具有长度和模式属性,数据包类具有长度和模式所需的约束。在packet_1类中,我想创建30个这样的数据包,并想对10个随机数据包应用length = 6的约束,我可以对一个特定的(非随机)数据包执行此操作,请让我知道这是否是正确的方法以及如何要做10个随机数据包?

以下代码生成了30个数据包,其中第4个数据包的长度为6,并且符合其他约束,但是如何对30个中的1个随机数据包(不是固定的第4个数据包)或10个随机数据包执行相同的操作。

 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 个答案:

答案 0 :(得分:2)

如果您想要确切数量的数据包,那么我们可以使用一个队列/数组来存储要存储的约束值的随机索引

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

另一种方法是对 length 变量使用 dist 运算符,并带有一些粘合逻辑,以在输出中生成weighted distribution