在从属模式下实现 UVM Agent

Implementing UVM Agent in slave mode

我在 uvm_agent 中实现了一个从模型。 "slave" 我的意思是它不能自己发起交易。事务始终由另一方(主 DUT)发起。所以它是一种被动代理(尽管它仍然能够传输回复数据包)。
当从设备检测到来自 DUT 的数据包时,它将自动(根据其协议)response/reply 与另一个数据包。 从代理有一个监视器来监听 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 方式中,驱动程序项始终来自从用户测试级别执行序列的定序器。但现在在这种情况下,没有序列 - 只有来自监视器的检测到的数据包。

我的第一个想法是,我需要提供从 monitorsequencer 的某种反馈,并在那里实现我的协议功能。
或者我应该直接将数据包从 monitor 传递到 driver,让它处理并发送回复?如果是这样,我该怎么做? 有没有更好的办法?

你要的也叫反应剂。不要将它与被动代理混淆,被动代理是只监视信号但不驱动信号的代理。

你在这样的代理中要做的只是在驱动从项的定序器上启动一个无限循环。

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

从代理使用的序列项主要用于随机化响应延迟和读取数据。您甚至可以创建更奇特的东西,例如从属序列(一个简单的数组)内的内存模型。当来自某个地址的读取到来时,你从你的内存模型中传送数据,你只是随机化你的延迟。

具体例子请看下面link:https://verificationacademy.com/cookbook/sequences/slave