我需要根据配置将uvm_sequence_item
参数化为信号宽度变化
在uvm_sequence_item中声明配置对象是个好主意吗?
或者是否可以像uvm_sequence_item
一样参数化?:
class my_sequence#(int width) extends uvm_sequence_item;
答案 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