• UVM中的sequence使用(一)


    UVM中Driver,transaction,sequence,sequencer之间的关系。

    UVM将原来在Driver中的数据定义部分,单独拿出来成为Transaction,主要完成数据的randomize and constrained.

    在Transaction之上有增加一层sequence,它可以调用,控制同一类型的transaction。

    在UVM中增减component名叫sequencer,来留下与sequence的接口,并控制sequence的启动,定义与UVM环境中其他的component的

             联系。

    uvm_sequence_base从uvm_sequence_item继承而来,uvm_sequence_item从uvm_transaction继承而来,uvm_transaction从

             uvm_object继承而来。

    一个sequence的启动有两种方式:

    1)将sequence设置为某个sequencer的某个phase的default_sequence。这样随着phase的执行,sequence会自动执行。

         uvm_config_db #(uvm_object_wrapper)::set(this, "env.i_agent.sqr.main_phase", "default_sequence",

                                     case0_sequence::type_id::get() );

    2)可以在任何component的task phase中直接调用start函数。

         my_seq.start(sequencer);   //一般在testcase的相应phase中启动一个sequence。

                                                 //virtual sequence/sequencer的嵌套使用,sequence中包含几个sequencer,

                                                 //在这个sequence的body中,再启动其他的sequence

    第二种方式,主要用在需要对不同的sequence的执行进行控制,或并行执行的时候。

    uvm_sequence_base中定义有一个uvm_phase类型的starting_phase的变量,一般用在sequence的body中设置objection。

    当选择使用default_sequence的方式来启动时,这个变量会被自动设置。当选择第二种方式来启动时,这个变量需要自己设置,保证不为空。

    sequence启动后,开始执行内部定义的一个task——virtual task body();  一般定义为virtual类型,方便重载。

    还有两个回调函数pre_body();  post_body();来供用户配置。

    其中在task body()中,定义的函数有:`uvm_create(m_trans)等价于m_trans=new("m_trans");

                                                         sequencer.wait_for_grant(prior);依靠指定的优先级向sequencer发出请求。

                                                         this.pre_do();执行完后,将会对transation进行随机化。

                                                         this.mid_do();    这三个do函数为callback函数。

                                                         sequencer.send_request();

                                                         sequencer.wait_for_item_done();

                                                         this.post_do();

    这些是UVM内部定义的一个task body内应该有的几个部分,但是一般可以直接new+自己的randomized+`uvm_send来完成。

    wait_for_grant和pre_do又可以组成一个start_item的宏,剩下四部分还能组成finish_item的宏。整个还可以组成uvm_do系列的宏。还可以

          增加很多priority的选项。

    sequence作为一个object,可以在任何component上进行例化/create,再调用start启动sequence。

    同一个sequencer上:

    同一个sequencer上可以同时启动多个sequence,这时sequencer通过sequence/transaction的优先级进行调用。

    在sequence中,可以通过lock,来使得该sequencer在执行完当前队列中的sequence后,在单独的执行接下来的sequence。直到unlock函数。

                                     grab则表示不等队列中的sequence执行完,在当前sequence执行完之后,sequencer便单独的执行接下来的sequence,

                                                     直到ungrab,然后再执行队列中的sequence。

                                     重载is_relevant() function可以让sequence主动放弃sequencer的使用权。

                                     重载wait_for_relevant(),通过修改环境中的变量,可以使得sequence重新有效。

    在每个sequence中,都有一个uvm_sequencer_base类型的变量,称为m_sequencer,当需要在sequence和sequencer之间传递值时,可以通过

    $cast(x_sequencer, m_sequencer),然后通过x_sequencer直接调用sequencer中的值。

    uvm中通过宏定义`uvm_declare_p_sequencer(my_sequencer)进行了封装。之后可以使用p_sequencer

    而sequencer可以通过config_db与其他的component交换配置。

    通过virtual_sequence和virtual_sequencer来进行控制

    1)定义virtual sequence---不指定transaction,内部的body task直接通过sequence.start(不同sequencer)开始不同sequencer的sequence。

    2)定义virtual sequencer--不指定uvm_sequence_item,内部包含多个具体针对不同transaction的sequencer

    3)将virtual sequencer中的sequencer在connect_phase中,连接到具体的agent上的sequencer。

    4)通过启动virtual sequencer上的sequencer,进而启动agent上的sequencer。

    5)agent上的sequencer通过export与driver上的port连接。

    推荐在virtual sequence上的控制objection。

    sequence的task函数内部还可以再启动其他的sequence,但是必须是同一transaction类型的。但是virtual sequence可以启动其他不相同

           的sequence。所以在实际的使用中,常在virtual sequencer指定default_virtual_sequence,再在其中调用需要在这个phase执行的

           sequence,从而达到控制sequence的目的。

    sequencer中的两个变量:

    m_sequencer是uvm_sequencer_base类型的的对象。定义在sequence类内部,作为一些操作的default_sequencer。

    p_sequencer相当于是m_seqencer经过$cast()处理的。是启动该sequence的那个sequencer类型的对象。可以调用更高一级的

             sequencer内的新变量。UVM内部使用宏定义`uvm_declare_psequencer(my_sequencer)来声明。

    sequence中的宏'uvm_send本质上是start_item和finish_item两个宏组合而成一体来的。'uvm_send不会完成

                      sequence的new和randomized

  • 相关阅读:
    第一模块第一章 review
    python练习题:三级菜单
    python list()总结
    python中index()、find()方法
    python中join()函数、list()函数补充的用法
    python中关键字的总结
    python中for循环的用法
    python中range()、list()函数的用法
    python中pop()函数的用法
    python中split()、os.path.split()函数用法
  • 原文地址:https://www.cnblogs.com/-9-8/p/4476440.html
Copyright © 2020-2023  润新知