sv激励约束:
DUT对某些数据标识有要求,eg:在DUT buffer中不可以出现同一ID号,一个ID号对应一个transaction。
定义队列,用来存储sequence 发出去的所有的id号,对每一次随机后的结果在队列中查找,如果没有相似id号,表明该transaction可以发送,否则继续随机id直到没有相似id号:
rand bit[7:0] tag[$]; //store all send out tag
bit[7:0] gen_tag; //generate random tag
int same_tag_cnt; //count same tag
virtual task body();
for(int i=0; i<1000; i++) begin
if(tag.size()>64) //buffer size=64
tag.pop_front();
assert(std::randomize(gen_tag) whith {gen_tag inside {['h0:'hff]}});
while(1) begin
same_tag_cnt = tag.find_first_index with (item == gen_tag);
if(same_tag_cnt.size() >0) begin
assert(std::randomize(gen_tag) whith {gen_tag inside {['h0:'hff]}});
end
else begin
tag.push_back(gen_tag);
break;
end
end
`uvm_do_on_with(..., ..., {id == local::gen_tag})
end //for
endtask:body