3

我有一个从模型在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 方式中,驱动程序项始终来自从用户测试级别执行序列的定序器。但是现在在这种情况下,没有序列 - 只有从监视器检测到的数据包。

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

4

1 回答 1

7

您想要的也称为反应代理。不要将其与被动代理相混淆,被动代理是仅监视信号但不驱动信号的代理。

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

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

于 2015-02-11T07:30:12.057 回答