在张强的《UVM实战》的5.2.3节中提到,控制objection的最佳选择,是在sequence中去控制。那么如何去控制比较简洁、美观、通用性强呢,本文主要介绍如何在sequence中,有效的控制objection。
如下代码所示,建立一个sequence的基类,如果用的是UVM-1.2,则在new函数中打开objection的开关;如果用的是UVM-1.1,则分别在pre_start和post_start任务中去raised/dropped。
class base_sequence extends uvm_sequence; // other code not shown
function new(string name = "base_sequence");
super.new(name);
`ifdef UVM_POST_VERSION_1_1
set_automatic_phase_objection(1); // UVM-1.2 & IEEE UVM Only!
`endif
endfunction : new
virtual task pre_start();
`ifdef UVM_VERSION_1_1
if (get_parent_sequence() == null && starting_phase != null)
starting_phase.raise_objection(this); // UVM-1.1 ONLY!
`endif
endtask : pre_start
virtual task post_start();
`ifdef UVM_VERSION_1_1
if (get_parent_sequence() == null && starting_phase != null)
starting_phase.drop_objection(this); // UVM-1.1 ONLY!
`endif
endtask : post_start
virtual task body();
endtask : body
endclass : base_sequence
其他的sequence只需要从这个基类中继承过来,在body的task中写测试激励就可以了。
class test_sequence extends base_sequence;
function new(string name = "test_sequence");
super.new(name);
endfunction : new
virtual task body();
// TODO:
endtask : body
endclass : test_sequence
本文主要介绍,在sequence中,有效的控制objection的方法。