實(shí)戰(zhàn)學(xué)習(xí)第二章筆記_第1頁
實(shí)戰(zhàn)學(xué)習(xí)第二章筆記_第2頁
實(shí)戰(zhàn)學(xué)習(xí)第二章筆記_第3頁
實(shí)戰(zhàn)學(xué)習(xí)第二章筆記_第4頁
實(shí)戰(zhàn)學(xué)習(xí)第二章筆記_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

UVM實(shí)戰(zhàn)學(xué)第一章:UVM(語法沿用1.1特點(diǎn)1.是一個標(biāo)準(zhǔn)的驗證平臺模板,2.具備有一套完備的源碼庫3.支持受約束激勵的產(chǎn)4.支持覆蓋率驅(qū)動的驗證模式,5.代碼重用性好,可移植性1.2基UVM最大的優(yōu)點(diǎn)在于他有一個源碼庫,從而支持他可以在同一平臺進(jìn)行多種驗證,并包含有第二章:簡單的UVM驗證平臺的搭一個簡單的驗證平臺由driver,scor,monitor,referencemodel(所有的組件在建立時,都是派生自uvm中的基類)組成。在引入agentsequence的概念之后建立起了典型的結(jié)構(gòu)。driver的建注:uvm驗證平臺中所有的組件都應(yīng)該是派生自uvm中的類的。 ponents的類的new都有兩個參數(shù),一個是string類型的名字,一個 ponents的類型parent。(driver也是派生自 driver中所做的事情幾乎都是在main_phase(uvm定義的)中完成。uvmphase來管理平臺運(yùn)行,采用xxxx_phase命名,并帶有一個類型為uvm_phase的參數(shù)和名字為phase的參數(shù);`uvm_info("string1","string2",level);(作用和disy函數(shù)很像,但是比他強(qiáng)大level:UVM_LOW表示信息非常關(guān)鍵;UVM_HIGH:表示信息可有可無;UVM_MEDIUM介于兩者在使用uvm搭建平臺是,在top層需要加`include"uvm_macro.svh"http:// 包含了uvm的import 包含uvm必要得內(nèi)factory注:所有派生 ponent及其派生的類都應(yīng)該采 ponent_utils優(yōu)點(diǎn):不用在top中進(jìn)行類,他會自動創(chuàng)建一個類語法:1.在類中加上 2.在top中不用進(jìn)行類的初始化和和對main_phase的顯示調(diào)用,直接運(yùn)行類的程序,采用run_test("class_name")initialuvm里面只要采 ponent_utils,那么在實(shí)例化類時候,就會自動調(diào)用執(zhí)objection機(jī)注意:在每個phase中,uvm會檢查是否有objection被提起,有的話會等待objection被撤銷才因此,需要在phase里面加入objection才可以objection必須在第一個耗時語句前。加入虛接口(virtual使用宏(但對于信號復(fù)雜時候,可能需要定義很多宏,反而不方便了使用接在類中,需要采用虛接口的方式把接口傳遞給他。只有模塊名,可直接用于類中interface獨(dú)立定義,不需要從 ponent中擴(kuò)展,在top里面進(jìn)行實(shí)例化后(input_if)進(jìn)行調(diào)用。在driver里面必須采用虛接口的方式(vif)對其進(jìn)行定義,然后使用。問題來了:怎么把topdrive里面的接口對應(yīng)起來呢?引入了config_db分兩步:setget完成。top完成set設(shè)置initialuvm_config_db#(virtualmy_if)::set(null,"uvm_test_top","vif",input_if);my_driver中設(shè)置virtualfunctionviodbuild_phase(uvm_phasephase)if(!uvm_config_bd#(virtualmy_if)::get(this,"","vif",vif))//使用::的都是靜態(tài)函`uvm_fatal("my_driver","virtualinterfacemustbesetforvif")說明:set和get有四個參數(shù):第三個參數(shù)需要保持一致,第四個參數(shù)表示需要傳遞和接受uvm是通過run_test來判斷誰是uvm_test_top的加入其它組簡單點(diǎn)看就是傳遞的數(shù)據(jù)包注意:1,transction基類是uvm_sequence_item2.采用uvm_object_utils()進(jìn)在完成transction后,可以在driver中實(shí)例化-隨機(jī)化-把transction要傳遞的內(nèi)容壓縮成數(shù)據(jù)(滿足傳輸協(xié)議對數(shù)據(jù)進(jìn)行處理,壓縮),之后傳給dirver里的輸入端口內(nèi)env相當(dāng)于一個容器用來實(shí)例化各個組件;(這是因為前面講的run_test只能實(shí)例化一個模擴(kuò)展于注意采用factory機(jī)制,2.在build_phase里面完成模塊的實(shí)例化--這里模塊的實(shí)例化不是通過new函數(shù)的,而是通過drv=my_driver::type_id::create("drv",this)的語法完成例化(例化前需要先聲3.此時,top里面run_test(env)變成env了,env變成了uvm樹的樹根,其他的是build_phase里面實(shí)例化的因為driver不再是樹根了,因此測試接口傳遞的uvm_config_dbsetget的路徑產(chǎn)生了變化monitor是收集dut的端口數(shù)據(jù),并將其轉(zhuǎn)換成transction交給后續(xù)的referencemodel或scor處理注意:1,所有monitor來自于uvm_monitor,采用factory機(jī)制if(!uvm_config_db#(virtual`uvm_fatal("my_driver","virtualinterfacemustbesetfor捕獲接口taskmy_monitor::main_phase(uvm_phasephase);my_transctiontr;while(1)begin因為monitor時刻捕捉數(shù)據(jù),所以采用while(1)循環(huán)達(dá)到這個目的當(dāng)收集完一個transction后利用在transction中定義一個print把他打印出來,當(dāng)然,后面有一field_object機(jī)制可以直接采用自帶的print函數(shù)輸出在my_env類中將其,并在build_phase中將其例化注意,monitor會在輸入和輸出的地方都進(jìn)行例化,也就是有兩個monitor這樣的優(yōu)點(diǎn)是monitordriver是由不同的人員設(shè)計時候,可以大大減少一方對于協(xié)議理解的錯誤。這兩個monitor都需要在top模塊里面采用config機(jī)制引入接口。封裝agent用來封裝driver/monitor/sequencer,不同的agent其實(shí)代表了不同的協(xié)議。采用factory機(jī)制build_phase中根據(jù)is_active變量決定是否創(chuàng)建drv,is_active==UVM_AVTIVE則實(shí)例化還引入了一個connect_phase但是暫時沒在env中,在build_phase中例化agent,這個地方例化時,因為uvm平臺中有兩個agent,所以需要例化兩次,區(qū)別在于,一個的i_agt.is_active=UVM_ACTIVE,另一個引入agent之后,uvm樹發(fā)生變化,對于接口的config里面的路徑發(fā)生變化referencereferencemodel完成和dut相同的功能,他的輸出傳給scor用于和monitor比較,他的復(fù)雜度取決于dut的復(fù)雜度。派生 因為referencemodel是從agent獲得transction然后傳輸給是scor。也就是要實(shí)現(xiàn)通信,所以會引入數(shù)據(jù)在不同的component的傳輸。一般采用TLMtransctionlevelmodel通信,它具備 monitor采用了uvm_ysis_port#(needed_transction)ap;來發(fā)送transction數(shù)據(jù)在monitor中定義這個參數(shù)化的在monitor的build_phase中,將其實(shí)例化,ap=new("ap",this)ps:因為這個類來自內(nèi)部所有直接用new,要是自己定義的類就要用::type_id::create()的方式例化之后再monitormain_phase里面完成transction的收集之后,將他用write內(nèi)建函數(shù)寫入ap里面就完成了發(fā)送到ap的作用了(ap.write(tr))采用了uvm_block_get_port#(needed_transctionport;來接受數(shù)據(jù)在model中定義這個參數(shù)化的ps:因為這個類來自uvm內(nèi)部所有直接用new,要是自己定義的類就要用的方式例化之后再monitor的main_phase,直接通過port.get(tr)得到這個數(shù)在monitor和model中定義實(shí)現(xiàn)了各自的端口后,通信功能其實(shí)還沒有實(shí)現(xiàn),還要my_env中定義一個fifo將兩個連起來才行,這個地方通過定義connect_phase實(shí)現(xiàn):在my_env中定義uvm_tlm_ysis_fifo#(my_transction)在build_phase中對其進(jìn)行實(shí)例化;直接采用在my_env中定義一個connect_phase的類,在類中完成連functionvoidmy_env::connect_phase(uvm_phasephase);注意:這個地方一般都會在agent里面也定義一個和monitor一樣參數(shù)化的類uvm_ysis_port#(needed_transction)ap;然后定義一個connect_phase把這個ap指向monitorap:functionvoidmy_agent::connect_phase(uvm_phasephase);functionvoidmy_env::connect_phase(uvm_phasephase); 的數(shù)據(jù)要從兩個部分獲取,一個來自referencemodel,一個來自于輸出的monitor。 兩個uvm_block_get_port#(needed_transction)port;main_phase中要有兩個進(jìn)程來處理從這兩個方面得到的數(shù)據(jù),把從referencemodel得到的數(shù)據(jù)放在一個期待transction里,然后從期待transction里彈出數(shù)據(jù)(pop_front)和仿真獲得的transction數(shù)據(jù)進(jìn)行比較(compare數(shù))

同時在my_env里面采用fifo完成portap的連接傳輸機(jī)制面很多模塊里都引入了 pare函數(shù),其實(shí)在uvm里可以采field_automation機(jī)制自動實(shí)現(xiàn)這三個函數(shù):在transction里面用這里采用field了所有字段,當(dāng)之后就可以直接調(diào)用系統(tǒng)自帶的copy,compare,和函數(shù)了另外一個好處就是,可以極大的簡化drivermonitor里面把數(shù)據(jù)壓縮成包或者幀的過程。driver里面:可以采用pack_bytestr的所有字段變?yōu)閎yte流放入data_q里面,數(shù)據(jù)的排列按照field中的順序(data_size=tr.pack_bytes(data_q)/8)monitor里面可以采用unpack_bytes把數(shù)據(jù)流打散,注意unpack_bytes操作的必須是動態(tài)數(shù)組,因此在同時,如果打散的數(shù)劇里面有動態(tài)數(shù)組,在進(jìn)行unpack_bytes之前要先確定它的大小,否則打散UVM的終極大作squence機(jī)制用于產(chǎn)生激勵,是uvm最大的特征之一。在規(guī)范化的uvm里面,driver只負(fù)責(zé)驅(qū)動transction,不負(fù)責(zé)產(chǎn)生transction。1.加入采用factorysequencer產(chǎn)生transction,driver驅(qū)動transction。一般在定義driver時候也是參數(shù)化的形式,他要驅(qū)動的類。采用參數(shù)化形式定義driver時候,就不用再對傳遞的transction進(jìn)行和例化,直接采用內(nèi)置的一個req來代表傳遞的transction。(有點(diǎn)類似Perl里面的$_變量)sequencer被加到agent里面,在agent中完成,在build_phase完成例化sequence機(jī)sequence不屬于驗證平臺的任何一部分,他是為了幫助實(shí)現(xiàn)sequencer的價值建立的區(qū)別:sequence擴(kuò)展于uvm_object,sequencer擴(kuò)展于 ponent。所以sequence是一個短classmy_sequenceextendsuvm_sequence#(my_transction);my_transctionm_trans;functionnew(string ponentparent);virtualtaskbody();repeat(10)factory機(jī)制必須構(gòu)建為帶參數(shù)的類,擴(kuò)展于每一個sequence都有一個body任務(wù),當(dāng)sequence啟動,body走動執(zhí)行`uvm_do宏定義,完成功能:1.創(chuàng)建一個my_transction實(shí)例,2,將其隨機(jī)化,3.最終送sequencesequence發(fā)送一個transction;BUT,driver怎么sequencertransction呢?采用的是uvm的內(nèi)置的變量傳遞!?。。?!driver里有seq_item_portuvm_sequencer里有seq_item_export,然后相當(dāng)于在seq_item_port<=>seq_item_export之間構(gòu)建了通道,傳遞在定義他們時候所帶的參數(shù)agentconncect_phase中把兩者連接起來連接好了之后,在drivermain_phase中,采用seq_item.port.get_next_item(transction)任務(wù)向sequencertransction,并得到transction。這里一般采用while(1)循環(huán)體持續(xù)獲得驅(qū)動sequence怎么向sequencertransction呢?采用的是`uvm_do的宏完成transction生成和傳遞。在driver取走transction后,uvm_do會一直等到item_done信號到來后才會結(jié)束。sequencesequencer連接機(jī)制在某一個componentmain_phase中就可以完成sequence的啟動:my_sequence例化sq采用start函數(shù)啟動:sq.start(需要定位到要傳遞transction給到的squencer的位置);注:objection一般伴隨著sequence,通常只有在sequence出現(xiàn)的時候才需要提起和撤銷default_sequence是常用的啟動sequence的方式:使用它的方式十分簡單virtualfunctionvoidbuild_phase(uvm_phasephase);config_db通常情況下是成對存在的,但在這個地方不需要再設(shè)置其他的了,uvm已經(jīng)自行設(shè)置好default_sequence怎樣提起和撤銷objection呢采用default_sequence時候會在sequencer中自動配置一個叫start_phase的成員(無需寫代碼sequence中,直接利用start_phase進(jìn)行提起和撤銷objectionvirtualtaskbody();repeat(10)begin建造測試用

面都是把env當(dāng)做uvm的樹根。但是其實(shí)在正常的uvm中,是把基于uvm_test的類作為樹真正的測試用例都是基于bast_test派生的類1.派生于采 ponent_utils在build_phase中實(shí)例化env,并設(shè)置default_sequenc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論