UVM中啓動sequence的方法

       UVM中啓動sequence的方式有兩種方式,分別爲手工啓動和自動啓動。

       第一種(手工啓動)在某個component的main_phase中啓動sequence,如以my_env和my_sequencer爲例:

        my_env:

my_env中啓動代碼清單

       首先創建一個my_sequence的實例seq,之後調用start任務。start任務的參數是一個sequencer指針,如果不指明此指針,則sequence不知道將產生的transaction交給哪個sequencer。在UVM中,objection一般伴隨着sequence,通常只在sequence出現的地方纔提起和撤銷objection。

        my_sequencer:

my_sequencer中啓動代碼清單

        在my_sequencer中啓動與在my_env中啓動相比,唯一區別是seq.start的參數變爲了this。

 

        第二種(自動啓動):default_sequence方式啓動sequence,只需要在某個component(如my_env)的build_phase中設置如下代碼即可:(最好在最頂層的class裏面啓動sequence,比如uvm_test類或其衍生類,即測試向量 )

        set的第一個參數和第二個參數構成了sequencer的路徑。由於除了main_phase外,還存在其它任務phase,如configure_phase、reset_phase等,所以必須指定是那個phase,從而使sequencer知道在哪個phase啓動這個sequence。第三個和第四個參數,以及uvm_cofig_db#( uvm_object_wrapper)中爲什麼是uvm_object_wrapper而不是uvm_sequence或者其它,則純粹是由於UVM的規定,用戶在使用時照做即可。

       其實,除了在my_env的build_phase中設置default_sequence外,還可以在其他地方設置,比如top_tb:

       這種情況下set函數的第一個參數和第二個參數應該改變一下。另外,還可以在其他的component裏設置,比如my_agent的build_phase裏:

        只需要正確地設置set的第二個參數即可。

       通常config_db都是成對出現的,有set就有相應的get。但是在這裏不需要再sequencer中手工寫一些get相關的代碼,UVM已經做好了這些,讀者無需再把時間花在這上面。

       在uvm_sequence這個基類中,有一個變量名爲starting_phase,它的類型是uvm_phase,sequencer在啓動default_sequence時,會自動做如下相關操作,seqsequencer中自帶一個sequence類型句柄

        因此,可以在sequence中使用starting_phase進行提起和撤銷objection,只有將sequence作爲sequencer的某動態運行phase的default_sequence時,其starting_phase纔不爲null:

       從而,objection完全與sequence關聯在一起,在其他任何地方都不必再設置objection。

       還有一種是virtual sequence啓動,也是自動的,流程差不多,不多贅述。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章