Виртуальный секвенсор UVM: выберите правильный дочерний секвенсор

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

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

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


person arandomuser    schedule 12.11.2014    source источник


Ответы (2)


Хотя ответ Тюдора будет работать технически, концептуально решение о том, какой из интерфейсов запускать (num_if) - это значение, которое должно принадлежать не транзакции, а последовательности, которая ее вызывает (которая, конечно, также должна быть рандомизирована). Транзакции должны содержать только представление значения, которое перемещается от A к B, и пути, которым оно перемещается для этого протокола. Определение 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

..бегая на виртуальном секвенсоре, как говорит Тюдор:

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

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

person Gordon A    schedule 13.11.2014
comment
Я также согласен с тем, что параметр num_if не относится к элементу транзакции шины. - person Tudor Timi; 13.11.2014

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

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

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 должно быть рандомизировано, чтобы знать, куда отправить элемент.

person Tudor Timi    schedule 12.11.2014