内嵌约束:
SV允许使用 randomize()with{} 来增加额外的约束,这和在类里增加约束是等效的。
当没有soft修饰时,约束发生冲突则报错;当soft修饰时,则以外部约束的优先级高于内部
class chnl_generator extends uvm_component;
rand int pkt_id = 0;
rand int ch_id = -1;
rand int data_nidles = -1;
rand int pkt_nidles = -1;
rand int data_size = -1;
rand int ntrans = 10;
constraint cstr{
soft ch_id == -1;
soft pkt_id == 0;
soft data_size == -1;
soft data_nidles == -1;
soft pkt_nidles == -1;
soft ntrans == 10;
}
场景1:
task send_trans();
chnl_trans req;
req = chnl_trans::type_id::create("req");
assert(req.randomize with {local::ch_id >= 0 -> ch_id == local::ch_id;
local::pkt_id >= 0 -> pkt_id == local::pkt_id;
local::data_nidles >= 0 -> data_nidles == local::data_nidles;
local::pkt_nidles >= 0 -> pkt_nidles == local::pkt_nidles;
local::data_size >0 -> data.size() == local::data_size;
endtask
场景2:
task send_trans( int pkt_id, int ch_id, int data_nidles, int pkt_nidles, int data_size, int ntrans );
chnl_trans req;
req = chnl_trans::type_id::create("req");
assert(req.randomize with {local::ch_id >= 0 -> ch_id == local::ch_id;
local::pkt_id >= 0 -> pkt_id == local::pkt_id;
local::data_nidles >= 0 -> data_nidles == local::data_nidles;
local::pkt_nidles >= 0 -> pkt_nidles == local::pkt_nidles;
local::data_size >0 -> data.size() == local::data_size;
endtask
endclass
data表示变量
当task没有传递参数时,local::data表示chnl_generator::data
当task有传递参数时,local::data表示任务传递进来的参数
local:: 表示“域”,而不是句柄,可以用local::this表示调用randmize() 函数的对象句柄。
约束体with{约束}中的变量名查找顺序默认是从被随机化对象开始查找。如果调用randomize()函数局部域中也有同名变量,那就需要使用 local:: 来显式声明该变量来源于外部函数,而非被随机化的对象。
参考: https://blog.csdn.net/lbt_dvshare/article/details/107280692