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,從而為執行不同的動作。
- 如果是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。