1 背景
UVM的方法学激励需要施加有效约束,本文总结各种约束。
2原则
原则1:在pkt(item)中的约束要考虑周全,要适当,不能过紧,排除不可能的情况,并明确variable的关系即可。
原则2:其他约束放在sequnce中,每个sequence对应了一个case(pattern)
3. 具体原则2的约束总结
第一:在sequnce,使用系统函数$urandom,$urandom_range;目的是产生一个随机数值(经过一些运算)并将给随机后的数值赋值给pkt的一个property.
第二:在sequnce,控制pkt的rand_mode和constraint_mode,以精确控制约束和property的随机性。
第三:在sequnce,使用in_line constrait(与pkt中的constraint格式一样);示例如下
repeat(iem_count)
·uvm_do_with(req, {if (port_id == -1) sa inside { [0:10]}; else sa == port_id; da inside valid_da;})
第四:在sequnce,使用constraint; 实例如下:
class my_seq extends uvm_sequnce #(pkt);
`uvm_object_utils(my_seq)
function new(string name = "my_seq");
super.new(name);
endfucntion
rand bit[1:0] seqadd;
constraint c1 { seqadd <= 2'b01;}
task body();
`uvm_do_with(req, {addr == seqadd;})
endtask
endclass
第五: 在pre_randomize()和post_randomize()中放置合适的操作。
总之,变化的约束要放在sequnce中,不变的约束放在pkt中,UVM的其他地方不要放置约束,便于管理,维护,和debug.