Verilog 在uvm_sequence_项中声明配置对象是个好主意吗

Verilog 在uvm_sequence_项中声明配置对象是个好主意吗,verilog,verification,system-verilog,uvm,Verilog,Verification,System Verilog,Uvm,我需要参数化uvm\u序列\u项,因为我的信号宽度根据配置而改变。 在uvm_sequence_项中声明配置对象是好主意吗 或者是否可以像下面那样参数化uvm\u序列\u项目: class my_sequence#(int-width)扩展了uvm_sequence#项最好的方法是使用工厂覆盖机制而不是配置数据库机制来选择所需的参数化序列/\u项 请参阅下面的链接。上面已经提到了 最好的方法是使用工厂覆盖机制而不是配置数据库机制来选择所需的参数化序列/\u项 请参阅下面的链接。上面已经提到了

我需要参数化
uvm\u序列\u项
,因为我的信号宽度根据配置而改变。
在uvm_sequence_项中声明配置对象是好主意吗

或者是否可以像下面那样参数化
uvm\u序列\u项目


class my_sequence#(int-width)扩展了uvm_sequence#项

最好的方法是使用工厂覆盖机制而不是配置数据库机制来选择所需的参数化序列/\u项

请参阅下面的链接。上面已经提到了


最好的方法是使用工厂覆盖机制而不是配置数据库机制来选择所需的参数化序列/\u项

请参阅下面的链接。上面已经提到了


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

// base class
class my_base_class #(int PARAM = 1);
endclass
参数值为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
在序列中,您将项目定义为“我的基本项目”:

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

您必须这样进行转换,因为您不能基于动态值声明参数化。参数必须在编译时已知。

其思想是,如果您有一个具有特定参数的特定基类,那么为该参数定义不同值的子类就不兼容类型:

// base class
class my_base_class #(int PARAM = 1);
endclass
参数值为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
在序列中,您将项目定义为“我的基本项目”:

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

您必须这样进行转换,因为您不能基于动态值声明参数化。必须在编译时知道参数。

那篇文章不清楚如何实现参数化。似乎更改参数会导致覆盖失败。也许dave_59会给出一个代码示例?这篇文章不清楚如何实现参数化。似乎更改参数会导致覆盖失败。也许dave_59会给出一个代码示例?那么基类将包含参数化字段以外的所有内容,而参数化类将包含参数化字段?如何创建使用此类的驱动程序?驱动程序代码需要知道所有字段,但是如果驱动程序是为了使用基类而编写的,那么它就不会有这些信息,对吗?我尝试过类似的方法,但在这一点上遇到了问题。这是否意味着我们还需要为驱动程序创建一个类似的基类,并对驱动程序进行工厂重写以匹配序列项?嗯,驱动程序确实使用基类项与序列器通信,但它也与启动参数化项的序列共享相同的配置(或者应该是这样)。这意味着你可以投。这只有在参数值数量有限的情况下才有效,因为必须进行一些严肃的强制转换(见上文)。如果参数值很多,我认为@nguthrie设置驱动程序覆盖的想法会更好。因此基类将包含除参数化字段以外的所有内容,参数化类将包含参数化的字段?如何创建使用此类的驱动程序?驱动程序代码需要知道所有字段,但是如果驱动程序是为了使用基类而编写的,那么它就不会有这些信息,对吗?我尝试过类似的方法,但在这一点上遇到了问题。这是否意味着我们还需要为驱动程序创建一个类似的基类,并对驱动程序进行工厂重写以匹配序列项?嗯,驱动程序确实使用基类项与序列器通信,但它也与启动参数化项的序列共享相同的配置(或者应该是这样)。这意味着你可以投。这只有在参数值数量有限的情况下才有效,因为必须进行一些严肃的铸造(见上文)。如果参数值很多,我认为@nguthrie设置驱动程序覆盖的想法会更好。