我在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
,让它处理它并发送回复?如果是这样,我该怎么做?
还有更好的办法吗?
答案 0 :(得分:6)
您想要的也被称为反应剂。不要将它与被动代理混淆,被动代理只是一种监控信号但不驱动信号的代理。
你在这样的代理中做的只是在驱动奴隶项目的音序器上开始无限循环。
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