Реализация UVM-агента в подчиненном режиме

У меня есть подчиненная модель, реализованная в uvm_agent. Под «ведомым» я имел в виду, что он не может сам инициировать транзакцию. Транзакция всегда инициируется другой стороной (главным DUT). Таким образом, это своего рода пассивный агент (хотя он все еще может передавать ответный пакет).
Когда ведомое устройство обнаруживает пакет от DUT, оно автоматически отвечает/ответит (на основе своего протокола) другим пакетом. Ведомый агент имеет монитор для прослушивания передачи, инициируемой DUT. И поскольку он может передавать пакеты, подчиненный агент также имеет драйвер для отправки ответного пакета.

+------------+  master initiate transfer  +------------------------+
| Master DUT |  ------------------------> | UVM Agent - slave mode |
|            |                            | Monitor                |
|            |                            | Driver     Sequencer   |
+------------+                            +------------------------+


+------------+                            +------------------------+
| Master DUT |                            | UVM Agent - slave mode |
|            |   slave auto reply         | Monitor                |
|            | <------------------------- | Driver     Sequencer   |
+------------+                            +------------------------+

Мой вопрос в том, как он предполагает отправить ответный пакет? Непосредственно из своего драйвера? Так как в uvm элемент драйвера всегда из секвенсора, который выполняет последовательность с уровня пользовательского теста. Но теперь в этом случае последовательности нет - только обнаруженный пакет от монитора.

Моя первая идея заключается в том, что мне нужно обеспечить своего рода обратную связь от monitor к sequencer и реализовать там свою функцию протокола.
Или я должен передать пакет напрямую от monitor к driver, позволить ему обработать его и отправить ответ? Если да, то как мне это сделать? Есть ли лучший способ?


person AldoT    schedule 11.02.2015    source источник


Ответы (1)


То, что вы хотите, также называется реактивным агентом. Не путайте его с пассивным агентом, который только отслеживает сигналы, но не управляет ими.

Что бы вы сделали в таком агенте, так это просто запустили бы бесконечный цикл в секвенсоре, который управляет ведомыми элементами.

class slave_sequence extends uvm_sequence;
  task body();
    forever begin
      `uvm_do(slave_item)
    end
  endtask
endclass

Драйвер будет ждать, пока мастер начнет транзакцию (как это происходит, это зависит от протокола), и когда он увидит ее, он вызовет get_next_item(...), направит ответ и вернется к ожиданию другой транзакции.

class slave_driver extends uvm_driver;
  task run_phase(uvm_phase phase);
    forever begin
      wait @(master_requests);
      seq_item_port.get_next_item(req);
      drive_response(req);
      seq_item_port.item_done();
    end
  endtask
endclass

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

Взгляните на следующую ссылку для конкретного примера: https://verificationacademy.com/cookbook/sequences/slave

person Tudor Timi    schedule 11.02.2015