UVM中啓動sequence的方式有兩種方式,分別爲手工啓動和自動啓動。
第一種(手工啓動):在某個component的main_phase中啓動sequence,如以my_env和my_sequencer爲例:
my_env:
首先創建一個my_sequence的實例seq,之後調用start任務。start任務的參數是一個sequencer指針,如果不指明此指針,則sequence不知道將產生的transaction交給哪個sequencer。在UVM中,objection一般伴隨着sequence,通常只在sequence出現的地方纔提起和撤銷objection。
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時,會自動做如下相關操作,seq是sequencer中自帶一個sequence類型句柄:
因此,可以在sequence中使用starting_phase進行提起和撤銷objection,只有將sequence作爲sequencer的某動態運行phase的default_sequence時,其starting_phase纔不爲null:
從而,objection完全與sequence關聯在一起,在其他任何地方都不必再設置objection。
還有一種是virtual sequence啓動,也是自動的,流程差不多,不多贅述。