uvm_do系列宏浅析

 

uvm_do系列宏浅析

外表篇:

uvm_do系列宏包括:

  • `uvm_do
  • `uvm_do_pri
  • `uvm_do_with
  • `uvm_do_pri_with
  • `uvm_do_on
  • `uvm_do_on_pri
  • `uvm_do_on_with
  • `uvm_do_on_pri_with

宏的形式记忆:

  细心的读者,从上面的排列总就能发现一个简答的规律,帮组记忆。金字塔记忆方法。

  总共8个,分两组:一组带on,一组不带on。每组都是由 pri,with的有无来组合,所以每组有四个。

宏的参数记忆:

  其实可以从宏的形式来知道,其到底传了什么参数。并且能方便记忆参数的位置。

  首先,所有宏都有参数:“SEQ_OR_ITEM",该参数可以使sequence或者transaction。与do对应。

  其次,带有on的宏,其要传一个”SEQR“的参数,该参数是sequencer,用来指定在要将后面产生的transaction发给哪一个sequencer。与on对应。

  然后,带有pri的宏,都要给其传一个“PRIORITY"的参数,该参数是大于-1的整数,表示产生的transaction的优先级。与pri对应。

  最后,带有with的宏,都有传一个”CONSTRAINT“的参数,该参数是由{ }包括的约束,表示对SEQ_OR_ITEM的一个约束。与with对应。 

  所以,`uvm_do_on_pri_with的具体形式为:`uvm_do_on_pri_with(SEQ_OR_ITEM, SEQR, PRIORITY, CONSTRAINT)。   

 

内在篇:

代码解析:

  虽然说uvm_do系列宏有八个,但是每一个宏最终的落脚点都是在`uvm_do_on_pri_with,这8个是统一的。具体源码里面怎么实现的呢?

  • 宏中没有on的,其实是`uvm_do_on_pri_with( SEQ_OR_ITEM , m_sequencer, PRIORITY, CONSTRAINT)
  • 宏中没有pri的,其实是`uvm_do_on_pri_with(SEQ_OR_ITEM, SEQR, -1, CONSTRAINT)
  • 宏中没有with的,其实是`uvm_do_on_pri_with(SEQ_OR_ITEM, SEQR, PRIORITY, {}) 

  一句话总结:就是SEQR的默认参数是m_sequencer, PRIORITY的默认参数是-1, with的默认参数是{},不指明参数的将用默认参数代替。  

  下面来具体分析`uvm_do_on_pri_with。

  源码如下:

里面有个uvm_create_on函数,其定义如下:

这里面又调用ceate_item函数,创建一个SEQ_OR_ITEM。create_item函数是uvm_sequence_base类的一个函数,为此,这就说明了uvm_do系列宏只能在sequence类里面用

create_item宏定义如下:

最终调用factory.create_object_by_type来实例化SEQ_OR_ITEM。并且指定SEQ_OR_ITEM的m_sequencer(SEQR),和parent_sequence(this)。位start_item做准备。

下面回到`uvm_do_on_pri_with中。

SEQ_OR_ITEM被返回后,后面要先判断SEQ_OR_ITEM是SEQ还是ITEM,从而为执行不同的动作。

  1. 如果是ITEM,则start_item(SEQ_OR_ITEM, PRIORITY) , randomize, finish_item(SEQ_OR_ITEM, PRIORITY)。
  2. 如果是SEQ,则调用start(SEQR,this,PRIORITY, 0)。

后面分两次分析start方法,以及start_item和finish_item。

原文地址:https://www.cnblogs.com/htaozy/p/8051849.html