2015-02-11 25 views
1

我在uvm_agent中实现了一个从属模型。对于“奴隶”,我的意思是它不能单独发起交易。交易总是由另一方(主DUT)发起。所以它是一种被动的代理(虽然它仍然能够传送回复数据包)。
当从机检测到来自DUT的数据包时,它将自动响应/根据其协议响应(与其他数据包一起)。 从属代理有一个监听器来监听DUT的初始化传输。并且由于它能够传输数据包,因此从属代理也具有驱动程序来发送回复数据包。在从属模式下实现UVM代理

+------------+ 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,让它处理它并发送回复?如果是这样,我该怎么做? 有没有更好的办法?

回答

4

你想要什么也被称为反应剂。不要将它与被动代理混淆,被动代理只能监控信号,但不会驱动它们。

你会在这样一个代理中做什么只是启动驱动从属项目的音序器的无限循环。

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