1.通过寄存器模型进行随机化
assert(p_rm.randomize());
p_rm.updata(status, UVM_FRONTDOOR);
(1)对随机化进行constraint
assert(p_rm.reg1.randomize() with { reg_data.value == 5'h3;});
assert(p_rm.reg2.randomize() with { reg_data.value >= 7'h9;});
或者调用整体随机化,针对单个寄存器进行constraint
assert(p_rm.randomize() with {reg1.reg_data.value == 5'h3; reg2.reg_data.value >= 7'h9});
或者通过重载
class dreg1 extends my_reg1;
constraint{
reg_data.value == 5'h3;
}
endclass
class dreg2 extends my_reg2;
constraint{
reg_data.value >= 7'h9;
}
endclass
2.使用单独的参数类
如需要跨寄存器进行constraint:
assert(p_rm.randomize() with {rega.field0.value + regb.field0.value >=100;});
如果对所有测试用例都适用,可写在模型里
class reg_model extends uvm_reg_block;
constraint reg_ab_cons{
rega.field0.value + regb.field0.value >=100;
}
endclass
也可针对DUT中需随机化的参数建立一个dut_parm类,并在其中指定默认约束:
class dut_parm extends uvm_object;
reg_model p_rm;
…
rand bit[15:0] a_field0;
rand bit[15:0] b_field0;
constraint ab_field_cons{
a_field0 + b_field0 >= 100;
}
task update_reg();
p_rm.rega.write(status, a_field0, UVM_FROTDOOR);
p_rm.regb.write(status, b_field0, UVM_FROTDOOR);
endtask
endclass
这段代码中指定了一个update_reg任务,用于当参数随机化完成后把相关的参数更新到DUT中。
在virtual sequence中可以实例化这个新类,随机化并调用update_reg任务:
class case0_cfg_vseq extends uvm_sequence;
…
virtual task body();
dut_parm pm;
pm = new("pm");
assert(pm.randomize());
pm.p_rm = p_sequencer.p_rm;
pm.update_reg();
endtask
…
endclass