uvm set_inst_override用于序列

时间:2014-09-29 12:50:11

标签: system-verilog uvm

我正在尝试按实例覆盖序列。 示例代码将最好地描述它:

class my_vir_seq extends base_vir_seq;
    my_seq_c seq1, seq2;

    `uvm_object_utils_begin(my_vir_seq)
      `uvm_field_object(seq1,  UVM_ALL_ON)
      `uvm_field_object(seq2,  UVM_ALL_ON)
    `uvm_object_utils_end

    `uvm_declare_p_sequencer(v_seqr)

    function new(string name = "my_vir_seq");
      super.new(name); 
    endfunction // new 

    virtual task body();
        `uvm_do_on(seq1, p_sequencer.my_seqr)
        `uvm_do_on(seq2, p_sequencer.my_seqr)
    endtask // body
endclass

class my_err_vir_seq extends my_vir_seq;
    my_err_seq_c seq3;

    `uvm_object_utils_begin(my_err_vir_seq)
       `uvm_field_object(seq3,  UVM_ALL_ON)
    `uvm_object_utils_end

    `uvm_declare_p_sequencer(v_seqr)

    function new(string name = "my_err_vir_seq");
      super.new(name); 
      my_seq_c::type_id::set_inst_override(my_err_seq_c::get_type(), "sve.v_seqr.my_err_vir_seq.seq2" );
    endfunction // new 
endclass

我的目标是仅使用seq2覆盖seq3(其类型扩展为seq2的类型)。 我没有得到任何错误,但原始序列运行, 我做错了什么?

提前致谢,

以斯哈

1 个答案:

答案 0 :(得分:1)

按实例进行类型覆盖是(我认为)概念性地用于派生自uvm_component的类的实例,因为它们具有特定的分层路径。

对于序列也有一个技巧,使用音序器的路径作为set_inst_override(...)的参数(你试过的那种)。但是,您需要对序列进行一些更改以支持此操作。在创建seq1seq2时,您必须为他们提供一个上下文(仅显示seq2),以便工厂可以找到它们:

// get_full_name() is the third argument
// - the second argument is empty, it's not a typo
seq2 = my_seq_c::type_id::create("seq2", , get_full_name());

创建序列后,您可以使用start(...)

启动序列
seq2.start(p_sequencer.my_seqr, this);

您可以在此处找到DVCon 2013论文:DVCon 2013 paper