System verilog 工厂重写UVM中的参数化类

System verilog 工厂重写UVM中的参数化类,system-verilog,uvm,System Verilog,Uvm,我有一个参数化的seq_项,如下所示 class seq_item#(int A = 64) extends uvm_sequence_item; `uvm_object_param_utils(seq_item#(A)) rand logic [A-1:0] v; constraint v_c { v inside {[0:1000]}; } endclass : seq_item class extended_seq_item#(int A = 64) extend

我有一个参数化的seq_项,如下所示

class seq_item#(int A = 64) extends uvm_sequence_item;
  `uvm_object_param_utils(seq_item#(A))
  rand logic [A-1:0] v;
  constraint v_c {
    v inside {[0:1000]};
  }
endclass : seq_item

class extended_seq_item#(int A = 64) extends seq_item#(A);
  `uvm_object_param_utils(extended_seq_item#(A))
  constraint extended_v_c {
    v inside {[10:50]};
  }
endclass : extended_seq_item

class reg_adapter#(int A = 100) extends uvm_reg_adapter;
  `uvm_object_param_utils(reg_adapter#(A))
  typedef seq_item#(A) seq_item_t;
  function new(string name = "reg_adapter")
    seq_item_t req;
    req = seq_item_t::type_id::create("req");
  endfunction
endclass : reg_adapter

class test extends uvm_test;
  `uvm_component_utils(test)
  reg_adapter#(10) adapter;
  function void build_phase(uvm_phase phase);
    seq_item#(10)::type_id::set_type_override(extended_seq_item#(10)::get_type());
    super.build_phase(phase);
    adapter = reg_adapter::type_id::create("adapter");
  endfunction : build_phase
endclass : test
在我的UVM TB中,我需要使用扩展的seq_项在工厂覆盖所有seq_项实例。不同的实例将具有不同的A参数值。我如何在工厂覆盖此参数值

问题在于,seq_项来自公共抵押品,该抵押品对rand变量v具有通用约束,该变量适用于所有IP。对于我的IP,我需要为v添加一个额外的约束,如扩展项所示。我的IP使用reg_适配器,该适配器将接受扩展的_seq_项,并添加其他约束

谢谢和问候,
Kiran

不幸的是,具有不同参数值的参数化类(专门化是LRM的术语)被视为单独的类类型,因此您需要为每个参数值提供覆盖

seq_item#(10)::type_id::set_type_override(extended_seq_item#(10)::get_type());
seq_item#(20)::type_id::set_type_override(extended_seq_item#(20)::get_type());
seq_item#(30)::type_id::set_type_override(extended_seq_item#(30)::get_type());
如果您可以将这段代码放到一个已经参数化的地方,比如在参数化环境或代理的构建阶段,那么它可能不会像上面那样痛苦


现在我看到了更多的代码,问题是这一行中的类作用域,它应该被捕获为错误

adapter = reg_adapter::type_id::create("adapter");
应写为

adapter = reg_adapter#(10)::type_id::create("adapter");

如果可能,您应该研究是否可以将
A
作为类的成员/变量而不是参数。应谨慎使用参数。如果不是的话,@dave_59的答案是正确的。我更新了描述。我需要A作为变量v的位宽度,因此它不能是来自另一个类的变量,它必须是一个参数。不幸的是,这还不起作用,因为我们必须按如下方式注册seq_item`uvm_object_param_utils(seq_item#(A))。如果我们展开宏,它将调用m_uvm_object_registry_param(T)define,其中有uvm_object_registry(T)的typedef。这意味着uvm_对象_注册表的另一个参数Tname仍然为“”。如果类型名称未知,我们无法进行类型覆盖。你能帮个忙吗?如果你使用我展示的语法,你的陈述是不正确的。你可能想读书。它也适用于UVM。我尝试了你的建议,但我没有看到该类被覆盖。我进入代码中查看原因,我看到这个条件没有得到满足函数uvm_object_wrapper uvm_default_factory::find_override_by_type(uvm_object_wrapper requested_type,string full_inst_path);您应该编辑原始问题以显示更完整的示例。更新了说明。你能回答吗?