一般uvm環境中的driver元件,派生自uvm_driver。
uvm_dirver派生自uvm_component。
class uvm_driver #(type req = uvm_sequence_item, type rsp = req) extends uvm_component
其中定義了兩個ports:seq_item_port,driver一般用這個介面向sequencer索要sequence。
rsp_port,driver向相應的sequencer傳送response。
還有乙個new函式,再無其他。
driver內部通過呼叫get函式來向sequencer索要transaction
相應的uvm_sequencer,派生自uvm_sequencer_param_base,繼而派生自uvm_sequencer_base。
class uvm_sequencer #(type req=uvm_sequence_item, rsp=req) extends uvm_sequencer_param_base (#req,rsp)
定義有乙個seq_item_export。提供訪問這個sequencer的介面實現。
uvm_seq_item_pull_imp #(req,rsp,this_type) seq_item_export
其中介面的型別是uvm_sqr_if_base #(req,rsp)。
它實現的方法有:get_next_item/try_next_item,先在該sequencer中選擇優先順序最高的sequence,然後該sequence wait_for_grant,
然後uvm_sequence_base::pre_do,randomized,post_do。
item_done,一旦上乙個task被呼叫,那這個task也必須被呼叫。表示乙個sequence結束,fifo可以移出。
driver中在得到sequence後,需要將sequence變為dut能夠接收的訊號型別。
在agent中必須在connect_phase中,連線driver.seq_item_port.connect(sequencer.seq_item_export)。所以sequence在執行時
必須指定sequencer,而sequencer又與driver相連線在一起,最終完成向dut傳送transaction的目的。當然對於很簡單的
transaction也可以直接在sequence中就向dut傳送訊號。
不過有乙個疑惑的地方,sequence中的task body()與sequencer的seq_item_port的執行之間的關係是如何的。
答:sequence body主要完成transaction的create/random/send,之後的transaction才會傳送給driver
sequencer會更根據poriority,phase,connect來呼叫正確的sequence給driver。
UVM中Virtual sequence的作用
virtual sequence是用來實現sequence之間的同步。從字面上理解,即虛擬的sequence。虛擬的意思就是它根本就不傳送transaction,它只是控制其他的sequence,起統一排程的作用。如圖1所示,為了使用virtual sequence,一般需要乙個virtual se...
UVM 7 3 1 UVM 中前門訪問的實現
1.前門訪問操作只有兩種 讀操作和寫操作。2.對於參考模型來說,最大問題是如何在其中啟動乙個sequence。全域性變數和config db。3.除了這兩種方式之外,如果能在參考模型中得到sequencer 的指標,也可以啟動sequence。只要在其中設定p sqr變數,並在env 中將seque...
UVM中Objection的作用
objection機制用來控制驗證平台的關閉。phase和objection與uvm驗證平台息息相關,phase恰如鐵軌,讓uvm這趟列車在鐵軌上向前執行,不會脫軌,不會跳過某一段而直接到達後一段,objection則更像是能量,給列車提供能量,控制著這趟列車的起始和終止。在乙個實際的驗證平台中,通...