【问题标题】:Factory overriding parameterized class in UVMUVM中的工厂覆盖参数化类
【发布时间】:2020-05-30 05:58:13
【问题描述】:

我有一个参数化的 seq_item 如下

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_item 工厂覆盖所有 seq_item 实例。不同的实例会有不同的 A 参数值。我如何工厂覆盖它?

问题是 seq_item 来自通用抵押品,它对 rand 变量 v 具有通用约束,适用于所有 IP。对于我的 IP,我需要为 extended_seq_item 中给出的 v 添加一个额外的约束。我的 IP 使用了 reg_adapter,它预计会采用 extended_seq_item 并添加额外的约束

感谢和问候, 基兰

【问题讨论】:

  • 如果可能,您应该研究是否可以将A 设为类的成员/变量而不是参数。应谨慎使用参数。如果没有,@dave_59 的答案就是要走的路。
  • 我更新了描述。我需要 A 作为变量 v 的位宽,因此它不能是另一个类的变量,它必须是一个参数

标签: system-verilog uvm


【解决方案1】:

不幸的是,具有不同参数值的参数化类(specializations 是 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());

如果您可以将此代码放入 A 已经参数化的位置,例如在参数化环境或代理的 build_phase 中,那么它可能不会像上面那样痛苦。


现在我看到了更多代码,问题出在这一行中的类范围,应该被捕获为错误

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

应该写成

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

【讨论】:

  • 不幸的是,这还行不通,因为我们必须按如下方式注册 seq_item `uvm_object_param_utils(seq_item#(A))。如果我们展开宏,它会调用 m_uvm_object_registry_param(T) 定义哪里有 uvm_object_registry#(T) 的 typedef。这意味着 uvm_object_registry 的另一个参数 Tname 仍然是“”。如果 type_name 未知,我们不能做 type_override。你能帮忙吗?
  • 如果你使用我展示的语法,你的陈述是不正确的。您可能想阅读go.mentor.com/mcem。它也适用于 UVM。
  • 我尝试了你的建议,但我没有看到课程被覆盖。我进入代码查看原因,我看到这个条件没有得到满足 function uvm_object_wrapper uvm_default_factory::find_override_by_type(uvm_object_wrapper requested_type, string full_inst_path);
  • 您应该编辑原始问题以显示更完整的示例。
  • 更新了描述。可以回复一下吗?
猜你喜欢
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 2017-02-03
  • 1970-01-01
相关资源
最近更新 更多