uvm set_inst_override用于序列

问题描述 投票:0回答:1

我试图通过实例覆盖序列。示例代码将最好地描述它:

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的类型)。我没有得到任何错误,但原始序列运行,我做错了什么?

提前致谢,

以斯哈

system-verilog uvm
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.