UVM中的driver组件

一般UVM环境中的Driver组件,派生自uvm_driver。

uvm_dirver派生自uvm_component。  

          class  uvm_driver #(type REQ = uvm_sequence_item, type RSP = REQ)  extends uvm_component

其中定义了两个Ports:seq_item_port,driver一般用这个接口向sequencer索要sequence。

                              rsp_port,driver向相应的sequencer发送response。

还有一个new函数,再无其他。

driver内部通过调用get函数来向sequencer索要transaction

相应的uvm_sequencer,派生自uvm_sequencer_param_base,继而派生自uvm_sequencer_base。

    class  uvm_sequencer #(type REQ=uvm_sequence_item, RSP=REQ)  extends uvm_sequencer_param_base (#REQ,RSP)

定义有一个seq_item_export。提供访问这个sequencer的接口实现。

    uvm_seq_item_pull_imp #(REQ,RSP,this_type)  seq_item_export

其中接口的类型是uvm_sqr_if_base #(REQ,RSP)。

它实现的方法有:get_next_item/try_next_item,先在该sequencer中选择优先级最高的sequence,然后该sequence wait_for_grant,

                                                                    然后uvm_sequence_base::pre_do,randomized,post_do。

                       item_done,一旦上一个task被调用,那这个task也必须被调用。表示一个sequence结束,fifo可以移出。

Driver中在得到sequence后,需要将sequence变为DUT能够接收的信号类型。

在agent中必须在connect_phase中,连接driver.seq_item_port.connect(sequencer.seq_item_export)。所以sequence在执行时

        必须指定sequencer,而sequencer又与driver相连接在一起,最终完成向DUT发送transaction的目的。当然对于很简单的

         transaction也可以直接在sequence中就向DUT发送信号。

不过有一个疑惑的地方,sequence中的task body()与sequencer的seq_item_port的执行之间的关系是如何的。

       答:sequence body主要完成transaction的create/random/send,之后的transaction才会发送给driver

             sequencer会更根据poriority,phase,connect来调用正确的sequence给driver。

原文地址:https://www.cnblogs.com/-9-8/p/4487881.html