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). Я не получаю никаких ошибок, но исходная последовательность выполняется. Что я делаю не так?

Заранее спасибо,

Ижар


person user3627210    schedule 29.09.2014    source источник
comment
Прежде всего, небольшое уточнение, потому что вы, кажется, немного запутались в механизме переопределения в UVM. При переопределении вы не заменяете конкретный экземпляр объекта другим экземпляром. Вы контролируете, какой тип будет иметь объект. Таким образом, правильный способ сформулировать вашу цель: изменить тип seq2 с my_seq_c на my_err_seq_c. Вам не нужно определять поле seq3, чтобы воспользоваться механизмом переопределения (также, как вы можете видеть из вашего кода, вы его вообще не используете).   -  person Tudor Timi    schedule 29.09.2014


Ответы (1)


Переопределение типов по экземплярам (я думаю) концептуально предназначено для экземпляров классов, которые являются производными от 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);

Идея взята из статьи DVCon 2013, которую вы можете найти здесь:

person Tudor Timi    schedule 29.09.2014
comment
Кроме того, когда вы выполняете переопределение из своего my_err_vir_seq, убедитесь, что вы выполняете переопределение типа по типу, чтобы заменить им my_vir_seq. - person Tudor Timi; 29.09.2014