如何在UVM的sequence中控制objection

双志强
2023-12-01


前言

在张强的《UVM实战》的5.2.3节中提到,控制objection的最佳选择,是在sequence中去控制。那么如何去控制比较简洁、美观、通用性强呢,本文主要介绍如何在sequence中,有效的控制objection。


一、Objections can be raised/dropped in sequence

如下代码所示,建立一个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的方法。

 类似资料: