2014-11-12 4 views
3

У меня вопрос о виртуальном секвенсере в UVM. Давайте подумаем, что у меня N равных интерфейсов, управляемых N равными драйверами, каждый из которых связан с собственным секвенсором. То, что я хочу сделать, это иметь сделку как:Виртуальный секвенсер UVM: выберите правильный дочерний секвенсер

class my_transaction extends uvm_sequence_item; 
     logic data; 
     int num_if; 
    endclass 

, которые при выполнении с `uvm_do() посылается на номер водителя num_if. Моя идея в том, что для такой работы мне нужен виртуальный секвенсор, который «переводит» транзакцию в правый секвенсор (число num_if). Правильно ли это? Если да, как это можно сделать? Спасибо.

ответ

3

Хотя ответ Tudor будет работать технически, концептуально решение о том, какой из интерфейсов для запуска (num_if) является значением, которое не должно принадлежать транзакции, а последовательностью, которая его вызывает (что также должно быть рандомизированы). Транзакции должны содержать только представление значения, которое перемещается от А к В, и способ, которым он перемещается для этого протокола. Спецификация , которая A и B обычно не входит в компетенцию транзакции.

В этом случае, вариация на тему вашей сделки и последовательности Тюдора будет выглядеть следующим образом:

class my_transaction extends uvm_sequence_item; 
    rand logic data; 
endclass 

..и ..

class some_virtual_sequence extends uvm_sequence; 
    `uvm_declare_p_sequencer(virtual_seqr) 
    rand int num_if; constraint..... 
    task body(); 
    my_transaction trans = my_transaction::type_id::create("my_transaction"); 
    start_item(trans, , p_sequencer.seqrs[num_if]); 
    trans.randomize(); // randomization should be done after start_item() 
    finish_item(trans); 
    endtask 
endclass 

..running на виртуальном секвенсор, как говорит Tudor :

class virtual_seqr extends uvm_sequencer; 
    my_sequencer seqrs[10]; 
endclass 

Вышеуказанный подход также позволяет рандомизировать в правильном месте: после start_item() ret урны и непосредственно перед вызовом finish_item(), который завершает элемент последовательности.

+0

Я также согласен с тем, что параметр 'num_if' не относится к элементу транзакции« bus ». –

1

Вы правы в отношении виртуального секвенсора. Я покажу вам идею о том, как это сделать (весь псевдокод, вам придется самому разобраться с деталями).

Скажем, у нас есть виртуальный секвенсор, который содержит массив всех шинных секвенсоров:

class virtual_seqr extends uvm_sequencer; 
    my_sequencer seqrs[10]; 
endclass 

мы предполагаем, что эти ручки получить прошло правильно. В нашей виртуальной последовательности мы можем создать транзакцию, рандомизировать ее, а затем отправить ее в соответствующий секвенсор.

class some_virtual_sequence extends uvm_sequence; 
    `uvm_declare_p_sequencer(virtual_seqr) 

    task body(); 
    my_transaction trans = my_transaction::type_id::create("my_transaction"); 
    my_transaction.randomize(); 
    start_item (my_transaction, , p_sequencer.seqrs[my_transaction.num_if]); 
    finish_item(my_transaction); 
    endtask 
endclass 

Мы не можем использовать uvm_do, потому что не знает, куда направить. Мы также не можем использовать uvm_do_on, потому что поле num_if должно быть рандомизировано раньше, чтобы узнать, куда отправить этот пункт.