以下代码具有两个类-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
答案 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。