外表篇:
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,从而为执行不同的动作。
- 如果是ITEM,则start_item(SEQ_OR_ITEM, PRIORITY) , randomize, finish_item(SEQ_OR_ITEM, PRIORITY)。
- 如果是SEQ,则调用start(SEQR,this,PRIORITY, 0)。
后面分两次分析start方法,以及start_item和finish_item。