0

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

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

我的目标是只覆盖seq2seq3其类型扩展seq2的类型)。我没有收到任何错误,但原始序列运行,我做错了什么?

提前致谢,

伊扎尔

4

1 回答 1

2

按实例进行类型覆盖(我认为)在概念上适用于派生自 的类的实例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 论文

于 2014-09-29T14:17:46.147 回答