2014-09-29 43 views
0

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

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

由于提前,

以斯哈

+0

首先,小CLAR因为你似乎对UVM的首要机制有点困惑。重写时,您不会用另一个实例替换对象的特定实例。你正在控制对象的类型。因此,说明您的目标的正确方法是:“将'seq2'的类型从'my_seq_c'覆盖到'my_err_seq_c'”。您不需要定义'seq3'字段以从重写机制中获益(也可以从您的代码中看到,您根本没有使用它)。 – 2014-09-29 14:14:15

回答

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); 

的想法是从2013 DVCon纸,你可以在这里找到:DVCon 2013 paper

+0

另外,当您正在从my_err_vir_seq执行覆盖时,请确保您按类型进行类型覆盖以用它替换my_vir_seq。 – 2014-09-29 14:39:06