zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    使用 libevent 和 libev 提高网络应用性能
    An existing connection was forcibly closed by the remote host
    各种浏览器的兼容css
    vs输出窗口,显示build的时间
    sass
    网站设置404错误页
    List of content management systems
    css footer not displaying at the bottom of the page
    强制刷新css
    sp_executesql invalid object name
  • 原文地址:https://www.cnblogs.com/-9-8/p/4476440.html
Copyright © 2011-2022 走看看