Идея заключается в том, что если у вас есть определенный базовый класс с определенным параметром, то подклассы, которые определяют различные значения для этого параметра не совместимы по типу:
// 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);
Я не проверял это, но он должен работать, потому что все пар ameterizations of 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 вскочит с примером кода? – nguthrie