System verilog uvm_序列的参数化uvm_事件

System verilog uvm_序列的参数化uvm_事件,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)

在我的验证环境中,我为可重用性设置了一些常见序列:

    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
我得到了编译错误:类专门化参数必须是常量,用于带有_事件#(我的_序列,我的_事件)行的公共_序列

我猜这意味着传递给类的参数必须是常量。那么,在这种情况下,为什么它接受reset_序列,它也是作为参数传入的呢


还有,有没有更好的方法来实现我想要实现的目标?

类型参数必须是传递给类型的<代码>我的_事件是一个变量,而不是类型。您没有显示
my\u sequence
reset\u sequence
的声明,但我假设它们是类类型。您甚至需要参数
E
?它是否总是
uvm\u事件

my\u序列和reset\u序列像任何正常序列一样声明:my\u序列扩展了uvm\u序列(#事务);因此,您只需删除
类型E
参数声明