【问题标题】:uvm set_inst_override for a sequence用于序列的 uvm set_inst_override
【发布时间】:2014-09-29 12:50:11
【问题描述】:

我正在尝试逐个覆盖序列。 一个示例代码将最好地描述它:

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

我的目标是只用seq3 覆盖seq2(它的类型扩展了seq2 的类型)。 我没有收到任何错误,但原始序列运行, 我做错了什么?

提前致谢,

伊扎尔

【问题讨论】:

  • 首先,做一个小澄清,因为您似乎对 UVM 中的覆盖机制有点困惑。覆盖时,您不会用另一个实例替换对象的特定实例。您正在控制对象将具有的类型。因此,陈述您的目标的正确方法是:“将seq2 的类型从my_seq_c 覆盖到my_err_seq_c”。您无需定义 seq3 字段即可从覆盖机制中受益(从代码中也可以看出,您根本没有使用它)。

标签: system-verilog uvm


【解决方案1】:

按实例进行类型覆盖(我认为)在概念上适用于派生自 uvm_component 的类的实例,因为它们具有特定的层次结构路径。

对于序列也有一个技巧,使用序列器的路径作为set_inst_override(...) 的参数(你尝试过的那种)。不过,您需要对序列进行一些更改以支持这一点。在创建 seq1seq2 时,您必须为它们提供上下文(仅针对 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 的一篇论文,您可以在这里找到:DVCon 2013 paper

【讨论】:

  • 另外,当您从 my_err_vir_seq 进行覆盖时,请确保您按类型进行类型覆盖以替换 my_vir_seq
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多