码迷,mamicode.com
首页 > 其他好文 > 详细

UVM中的sequence使用(一)

时间:2015-05-04 17:14:09      阅读:809      评论:0      收藏:0      [点我收藏+]

标签:

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)直接调用start函数。

     my_seq_start(sequencer);

第二种方式,主要用在需要对不同的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();

                                                     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的选项。

为了在sequencer中更好的控制sequence,还有lock,unlock,grab,ungrab的操作,都是为了取得sequencer的控制权,但是lock排在

       sequence的队尾,而grab排在sequence的队前。

 

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)来声明。

UVM中的sequence使用(一)

标签:

原文地址:http://www.cnblogs.com/-9-8/p/4476440.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!