Ald*_*doT 3 system-verilog 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 |
+------------+ +------------------------+
Run Code Online (Sandbox Code Playgroud)
我的问题是它如何发送回复数据包?直接来自它的司机?因为以uvm方式,驱动程序项始终来自正在执行来自用户测试级别的序列的顺控程序.但现在在这种情况下,没有序列 - 只有来自监视器的检测到的数据包.
我的第一个想法是,我需要提供一些反馈monitor,sequencer并在那里实现我的协议功能.
或者我应该直接将数据包传递monitor给driver,并让它处理它并发送回复?如果是这样,我该怎么做?有没有更好的方法?
你想要什么也被称为反应剂.不要将它与被动代理混淆,被动代理是仅监视信号但不驱动信号的代理.
你在这样的代理中做的只是在驱动从属项的音序器上启动一个无限循环.
class slave_sequence extends uvm_sequence;
task body();
forever begin
`uvm_do(slave_item)
end
endtask
endclass
Run Code Online (Sandbox Code Playgroud)
驱动程序将等待主服务器启动事务(它是如何做的,这取决于协议),当它看到它将调用它时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
Run Code Online (Sandbox Code Playgroud)
从属代理使用的序列项主要用于随机化响应延迟和读取数据.你甚至可以创建一些更奇特的东西,比如从属序列中的内存模型(一个简单的数组).当从某个地址读取数据时,您可以从内存模型中提供数据,然后随机化延迟.
请查看以下链接以获取具体示例:https://verificationacademy.com/cookbook/sequences/slave