2013-12-07 3 views
1

Мне нужно параметризовать uvm_sequence_item как изменение ширины сигнала на основе конфигурации.
Это хорошая идея объявить объект конфигурации внутри uvm_sequence_item?Является ли хорошей идеей объявлять объект конфигурации в uvm_sequence_item

Или можно параметризуем uvm_sequence_item как следующий ?:

class my_sequence#(int width) extends uvm_sequence_item;

ответ

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

+0

Из этой статьи не ясно, как достичь параметризации. Кажется, что изменение параметра приведет к сбою переопределения. Может быть, dave_59 вскочит с примером кода? – nguthrie

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); 

Я не проверял это, но он должен работать, потому что все пар 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 

Вы должны сделать кастинг, как это, потому что вы не можете объявить параметризации на основе динамических значений. Параметры должны быть известны во время компиляции.

+0

Итак, базовый класс будет содержать все, кроме параметризованных полей, и параметризованный класс будет содержать поля, которые параметризуются? Как создать драйвер, который использует этот класс? Код драйвера должен знать обо всех полях, но если драйвер написан для потребления базового класса, то он не будет иметь эту информацию, не так ли? Я пробовал что-то подобное, но застрял в этой точке. – nguthrie

+0

Означает ли это, что нам также необходимо создать аналогичный базовый класс для драйвера и выполнить заводское переопределение драйвера в соответствии с элементом последовательности? – nguthrie

+0

Ну, драйвер действительно связывается с секвенсором с использованием базовых элементов, но он также имеет ту же конфигурацию, что и последовательность, запускающая параметризованные элементы (или, соответственно, она должна). Это значит, что вы можете бросить. Это действительно действительно работает, если у вас ограниченное количество значений параметров, потому что вам нужно сделать серьезное кастинг (см. Выше). –

Смежные вопросы