Параметризованные uvm_events для uvm_sequence

#system-verilog #uvm

#system-verilog #uvm

Вопрос:

В моей среде проверки у меня есть несколько общих последовательностей, настроенных для повторного использования:

     class common_sequence(type T = uvm_sequence) extends uvm_sequence#(uvm_sequence_item);

       `uvm_object_param_utils(common_sequence_t#(T))

       function new(string name="common_sequence");
          super.new(name);
       endfunction

       T sequence;

       virtual task body();
          `uvm_do(sequence);
       endtask
    endclass
  

Я хотел бы создать что-то подобное, где я мог бы передать событие.

     class common_sequence_with_event(type T = uvm_sequence, type E = uvm_event) extends uvm_sequence#(uvm_sequence_item);

       `uvm_object_param_utils(common_sequence_t#(T,E))

       function new(string name="common_sequence");
          super.new(name);
       endfunction

       T sequence;
       E event;

       virtual task body();
          event.wait_trigger();
          `uvm_do(sequence);
       endtask
    endclass
  

Я бы установил это событие из моего теста следующим образом:

 class my_test extends uvm_test;
   `uvm_component_utils(my_test)
   uvm_event my_event;

   function new(string name = "my_test", uvm_component parent=null);
      super.new(name,parent);
   endfunction

   virtual function void build_phase(uvm_phase phase);
      super.build_phase(phase);

      uvm_event my_event = new ("my_event");
   endfunction

   virtual function void end_of_elaboration_phase(uvm_phase phase);
      super.end_of_elaboration_phase(phase);

      // Schedule sequences with sequencers
      uvm_config_db#(uvm_object_wrapper)::set(this,
                                              "env.my_agent.sequencer.reset_phase",
                                              "default_sequence",
                                              common_sequence#(reset_sequence)::get_type());

      uvm_config_db#(uvm_object_wrapper)::set(this,
                                              "env.my_agent.sequencer.main_phase",
                                              "default_sequence",
                                              common_sequence_with_event#(my_sequence, my_event )::get_type());

   endfunction

endclass
  

Я получаю ошибку компиляции: параметр специализации класса должен быть постоянным для строки common_sequence_with_event#(my_sequence, my_event).

Я предполагаю, что это означает, что параметры, передаваемые классам, должны быть постоянными. Итак, в этом случае, почему он принимает reset_sequence, который также передается в качестве параметра.

Кроме того, есть ли лучший способ сделать то, чего я хочу достичь?

Ответ №1:

Параметры типа должны быть переданными типами. my_event является переменной, а не типом. Вы не показали объявления для my_sequence or reset_sequence , но я предполагаю, что они являются типами классов. Вам вообще нужен параметр E ? Разве так не будет всегда uvm_event ?

Комментарии:

1. my_sequence и reset_sequence объявляются как любая обычная последовательность: my_sequence расширяет uvm_sequence(#транзакция);

2. Итак, все, что вам нужно сделать, это удалить type E объявление параметра