`uvm_do宏如何与底层的driver进行交互

文章目录

  • 前言
  • 一、`uvm_do宏与底层driver交互的方式
  • 总结


前言

在张强《UVM实战》中的179页,提到了“uvm_do系列宏其实是将下述动作封装在一个宏中”,这句话大概的提到了uvm_do这个宏里边的具体实现,但是这些内容是怎么通过sequencer,与底层的driver进行交互的,确不得而知。本文主要记录一下,uvm_do这个宏,与底层driver交互的方式,从而进一步帮助我们理解数据的传递方式。


一、`uvm_do宏与底层driver交互的方式

`uvm_do宏如何与底层的driver进行交互_第1张图片
上图中展示了,底层driver与sequencer之间,数据包传递控制的细节,具体描述如下:
1、sequence中的uvm_do宏展开分为四个操作,分别是创建、开始、随机、结束。
创建,uvm_create(req)宏:
2、sequence先是创建一个数据包,接着等待他的父组件sequencer授予许可,去开启一个数据传输。
开始,start_item(req):
3、sequencer的许可来自driver调用get_next_item(req),sequencer和driver之间通过seq_item_port这个TLM进行连接。
4、sequencer对来自sequence的数据包进行仲裁和授权。
5、sequence接着对启动完成的数据包进行标记。
随机,req.randomize():
6、sequence对数据包进行随机。
结束,finish_item(req):
7、sequence调用finish_item(req),让sequencer将数据包通过TLM接口传递给driver,driver接收到数据包后,对数据包进行处理,然后通过TLM端口发出完成确认。
8、sequence通过调用end_tr,将数据包标记为结束,再继续开启下一个数据包的发送。

注意:
自动记录数据包的功能可以通过如下的编译开关进行关闭,但是请谨慎使用,因为他是一个全局开关。

+define+UVM_DISABLE_AUTO_ITEM_RECORDING

在UVM-1.2和IEEE UVM中,可以通过调用driver中的接口方法seq_item_port.disable_auto_item_recording(),单独关闭自动记录数据包的功能。

class driver extends uvm_driver#(packet); // other code not shown
    packet pkt_q[$];
    virtual task run_phase(uvm_phase phase);
        `ifndef UVM_VERSION_1_1
        seq_item_port.disable_auto_item_recording(); // UVM-1.2 & IEEE
        `endif
        // All versions can use +UVM_DISABLE_AUTO_ITEM_RECORDING option
        fork
            get_item();
            execute_item();
        join
    endtask
endclass

总结

本文主要记录一下uvm_do这个宏的具体实现,以及与底层driver之间的交互过程。

你可能感兴趣的:(UVM,UVM,uvm_do,交互,具体实现)