2014-09-29 65 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