2014-09-29 4 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', чтобы извлечь выгоду из механизма переопределения (также как вы можете видеть из своего кода, вы его вообще не используете). –

ответ

1

Doing переопределения типа экземпляр (я думаю) концептуально предназначено для экземпляров классов, которые вытекают из uvm_component, потому что они имеют определенный иерархический путь.

Есть и трюк, чтобы сделать это для последовательностей, используя путь секвенсора в качестве аргумента для set_inst_override(...) (вид того, что вы пробовали). Однако вам нужно сделать несколько изменений в вашей последовательности, чтобы поддержать это. При создании seq1 и seq2 вы должны дать им контекст (отображается только для 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'. –