在uvm_sequence_item中声明配置对象是个好主意

时间:2013-12-07 00:40:44

标签: verilog verification system-verilog uvm

我需要根据配置将uvm_sequence_item参数化为信号宽度变化 在uvm_sequence_item中声明配置对象是个好主意吗?

或者是否可以像uvm_sequence_item一样参数化?:

class my_sequence#(int width) extends uvm_sequence_item;

2 个答案:

答案 0 :(得分:1)

这个想法是,如果你有一个具有某个参数的特定基类,那么为该参数定义不同值的子类不是类型兼容的:

// base class
class my_base_class #(int PARAM = 1);
endclass

PARAM值为2和3的子类与类型不兼容。

您可以在以下情况下执行以下操作:

// common base class, no subclass
class my_base_item extends uvm_sequence_item;
  // ...
endclass

// parameterized class
class my_param_item #(int PARAM = 1) extends my_base_item;
  // ...
endclass

在您的序列中,您将商品定义为my_base_item:

class my_sequence extends uvm_sequence;
   my_base_item item;

   task body();
     item = my_base_item::type_id::create("item");
   endtask
endclass

在某处你可以根据配置设置类型覆盖:

my_base_item::type_id::set_type_override(my_param_item #(32))::get_type(), 1);

我没有对此进行测试,但它应该可以使用,因为'my_param_item的所有参数化仍然是my_base_item类型。

在驱动程序中,您必须根据您的参数值进行一些投射:

task drive();
  // ...
  case (param) begin
    16:
      begin
        my_param_item #(16) m_item;
        $cast(m_item, item);  // item is the base item you got from the sequencer
        do_drive_16(m_item);
      end
    32:
      // ...
  end
endtask

你必须这样做,因为你不能根据动态值声明参数化。必须在编译时知道这些参数。

答案 1 :(得分:0)

最好的方法是使用工厂覆盖机制而不是config_db机制来选择所需的参数化序列/ _item。

见下面的链接。它已经在那里提到了。

https://verificationacademy.com/cookbook/usingfactoryoverrides

https://forum.verificationacademy.com/forum/verification-methodology-discussion-forum/uvm-forum/31530-parameterized-uvm-sequence-item-and-usage-sequence