


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、看了第1/2/3/4/5/6/8/這幾個章節(jié)。第一章是綜述,第二章是一個具體的例子,學習筆記從第三章相關(guān)內(nèi)容開始。我個人覺得UVM重要的部分(特點的部分):1)factory 機制(override config_db )2)TLM傳遞3)phase 機制4)sequence-sequencer 以及 virtual seq/sqr內(nèi)容中的截圖基本來自于UVM源代碼、書自帶的例子和 應(yīng)用指南及源代碼分析這個PDF里的。需要結(jié)合書(UVM實戰(zhàn)(卷1)第1版)來看這個筆記。第3章UVM基礎(chǔ)uvm_component 和口 uvm_object常用的類名字:這個圖是從作者張強的應(yīng)用指南及源代碼分析里
2、截得,不如書上里的圖好。uvm_sequencer也是代碼里必須有的,所以我加了uvm_seque nceruvm_void是一個空的虛類。在src/base/中定義:紅框的是我們搭testbench的時候用的比較多的基類。常用的uvm_object派生類:sequencer 給 driver 的 transaction 要派生自 uvm_sequence_item,不要派生自 uvm_transaction所有的 sequenee 要派生自 uvm_sequenee 或者 uvm_sequenee 的派生類,可以理解為sequenee 是sequence_item 的組合(集合)。drive
3、r 向 sequencer 索要 item,sequencer 檢查是否有 sequenee 要發(fā)送item,當發(fā)現(xiàn)有item待發(fā)送時,就把這個item發(fā)給driver.常用的 uvm_component 派生類:所有的driver要派生自uvm_driver. driver用來把sequence_item中的信息驅(qū)動到 DUT端口上, 從 transaction-level 向 signal-level 的轉(zhuǎn)換。 uvm_driver 需要參數(shù)(REQ RSP,比 uvm_component 增加 了幾個成員。重要的是 seq_item_port 和口 req/rsp. ( src/comp
4、s/)monitor/scoreboard 派生自 uvm_monitor 和口 uvm_scoreboard,但是 uvm_monitor 和口 uvm_scoreboard 并沒有在 uvm_component基礎(chǔ)上做擴展。src/comps/virtual 匚LLvm_monLtor eKtende lvm_cornponentFunctinnt wu/And init j a 1?=? fln i nt cf th is clasR rising the normal/ cornFtriKrtor召 For <iivm_conpcnftnt.> * ririme"
5、 Is T.he namp of the/ inPbT.AnceT and parFnt If ths handle to The hierapcTiical parent.r 1 f any,functlun n=u str irig tlame, uvm_i_xjiuponent parent.iitAi' (idine, pdrtnt ;eridfun 匚tinri匚onst static string type_nsnievirtJisl line 1.ionget_"typ_nianereturn tijpenamceridP-inct-LQionce lasequ
6、encer 要派生自 uvm_sequencer.sequencer 做了很多擴展,但是如果我們自己寫的sequencer里沒有增加成員的話,可以直接寫如下代碼:typedef uvm_sequencer #( 傳遞的 sequence_item 類名) sequencer 類名;因為 Sequencer在 age nt中例化,所以一般寫在ent類文件里。reference_model 派生自 uvm_component.age nt要派生自uvm_age nt. uvm_age nt 里多了一個is_active的成員。一般根據(jù)這個active來決定是否實例化driver和sequencer
7、. is_active變量的數(shù)值需要在 env的build_phase里設(shè)置完成(可以直接設(shè) 置,也可以用 uvm_config_db#(int):set )。env 要派生自 uvm_env. uvm_env 沒有對 uvm_component 擴展。src/comps/所有的test都要派生自uvm_test或者它的派生類。uvm_test也沒擴展src/comps/uvm_object 和口 uvm_component 的 macromacro非常重要,事關(guān)把這些類的對象注冊到factory機制中去。uvm_object macro1) 對于 uvm_sequence_item 就統(tǒng)一用
8、(假設(shè)不用 parameter):2)對于uvm. 'uvm_objec 可能還需要'uvm_object_utils_begin(item 類名)eqidn淙,要加上 t_w_j_tiis類 )'uvm_declare_p_seque ncer(seque ncer 類名)的聲明uvm_comp onent macro這些uvm_component 派生類者0對于 driver mon itor refere nce_model scoreboard seque ncer case age nt env要加上:'uvm_component_utils(類名)u
9、vm_component里的成員也可以像uvm_object里成員一樣,用field_automation 機制。field_automation 機制:對于 uvm_object 派生類來說,field_automation 機制讓對象自動有的copy compare print pack unpack 等函數(shù),簡化了實現(xiàn) uvm_component派生類里一些 function/task的工作量對于uvm_component派生類來說,field_automation 機制最重要的是可以在build_phase中自動獲取uvm_config_db#():set()的數(shù)值(必須加(phase
10、)-也就是不用寫uvm_config_db#():get()注意:field_automation 的macro的類型要和 uvm_config_db的參數(shù)類型一致: 如下示例代碼,field_int vs uvm_config_db#(bit47:0)這個時候()是不起作用的。想要起作用的話,需要用clone = new + copy 源代碼中可以看到clone函數(shù)一上來會做一次create,然后調(diào) copy函數(shù)src/base/UVM的樹形結(jié)構(gòu)pare nt 指針。comp onent 的 pare nt 是什 pare nt參數(shù)設(shè)成n ull,那么uvm_component的new/cr
11、eate要注意第一個參數(shù)是名字,第二個參數(shù)是UVM真正的樹根是“ uvm_top ” .根據(jù)上面這個樹結(jié)構(gòu),可以看岀一個個 么。uvm_top的pare nt是n ull。 當一個 comp on e nt在實例化的時候,如果pare nt參數(shù)會被仿真器自動設(shè)置成uvm_root的實例uvm_top.在章節(jié)里也提到了,sequenee在uvm_config_db# (): get ()的時候,第一個參數(shù)設(shè)成"null實際就是uvm_root:get()章節(jié)也提到了這個層次結(jié)構(gòu)函數(shù):get_pare nt()get_child(stri ng name)這兩個分別獲取pare nt指針
12、和指定名字的child指針get_children(ref uvm_component children$)獲取所有的 child 指針get_num_children() 獲取 child 個數(shù)get_first_child(ref string name) get_next_child(ref string name) 獲取 child 的名字(反映至U string name 上), 返回值是0/1兩種情況應(yīng)用參考代碼如下(改動的例子中的):注意:上述代碼是在connet_phase中實現(xiàn)的。上述代碼的打印結(jié)果如下:This should be i_agt. my_age nt'
13、s n ame is uvm_testfield automati on 機制注意數(shù)組類型的 field macro比一般的要少 real和eve nt的macro. 般的對于 enum類型有3個參數(shù),而 數(shù)組的只有2個參數(shù)。聯(lián)合數(shù)組的 macro比較多常用函數(shù)需要注意pack unpack pack_bytes unpack_bytes pack_ints unpack_ints返回值都是 bit 個數(shù)。field-automati on 標記位17bit 中 bit0 copy bitlno_copy bit2 compare bit3no_compare bit4print bit5no
14、_print bit6 recordbit7 n o_record bit8pack bit9 n o_packUVM_ALL_ON 是UVM_ALL_ON|UVM_NO_PACK 這樣就會忽略掉 pack bit field-automation 的macro可以和if結(jié)合起來,參考的代碼、uvm_object_utils_begi n(m y_tra nsacti on)is_vlan變量可以饑seqdm誌UVM束成L ON或 1,來實現(xiàn)vlan或非vlan 我覺得這個地方代碼其實寫成像UV的!AlIoN) crc_error d bit的更合理一 ALLONfsNOpACb,而 crc
15、是 UVM_ALL_ON 打印信息控制 uvm_field_i nt(vlann fol, UVM_ALL_ON) port_verbosity'_lev_fjeld_i nt(vlan_i nfo2, UVM_ALL_ON) Port_verbosit_VmUV_!nVH_info3只對當前調(diào)用ON) component 起作用 Port_verbosity_Vmi_ied_(UVM_iHf4, UVM對當前及下面所有的 component 起作 simv + UVM_VERBOSITY=UVM_HIGH 命令行方式 我覺得用這個就可以了 重載打印信息:心° 'uv
16、m_field_int(ether_type, UVM_ALL_ON) poK-seuyfldaUWWAWNG/MvARffO R); -uvmfctjRhasa 及后面LL_oiisejVM_NOPACK) LERRORf一定定數(shù)量結(jié)束仿方 真VM_ALL_ON | UVM_NOPACK) port_rmuvmqojcu0ii§t)end 設(shè)成0就是無論多少 error都不退岀 get_r返回如果是0,說明無論多少error 都0不退岀設(shè)置在main_phase前調(diào)用。這個ps:UVMUVMget_reset reset reset_re上述函數(shù)都是在、con 設(shè)置JVMset r
17、e些。然后 crc error是simv +UVM_MAX_QUIT_COUNT=10我覺得應(yīng)該用不大到,就不做筆記了config_db 機制uvm_config_db#(類型):set/get(component 指針,”;"變量名字 ”,para4)都是4個參數(shù):第一個參數(shù)是一個 component指針,如果是 null的話,相當于 uvm_root:get()第二個參數(shù)是個路徑字符串,第一和第二兩個參數(shù)組和成一個完整的路徑第三個參數(shù)對于 set、get要完全一致,是變量名字set的para4是數(shù)值,get的para4是變量component中的成員變量如果:1)componen
18、t 用 uvm_component_utils 宏注冊2) 變量用field-automation 宏注冊3) component 的 build_phase 函數(shù)里有(phase)那么可以省略get語句跨層次多重set的時候,看set的第一個參數(shù),層級越高,優(yōu)先級越高。調(diào)用set的時候,第一個參數(shù)盡量使用this同層次設(shè)置的時候是時間優(yōu)先非直線設(shè)置的時候注意第一和第二參數(shù)的使用,如果需要pare nt指針,則要用config_db機制支持通配符,但是作者不推薦使用通配符。但是在對sequenee的成員set的時候需要用通配符(章節(jié))。使用如下函數(shù)調(diào)試eon fig_dbcheck_confi
19、g_usage() print_config(1/O)這兩個函數(shù)在 connect_phase 函數(shù)中調(diào)simv +UVM_CONFIG_DB_TRACE注意:第二個參數(shù)設(shè)置錯誤不會報錯!config_db機制務(wù)必要注意參數(shù)的書寫。第4章UVM中的通信TLM 是 Transaction Level Modeling 縮寫這章要搞清楚port export imp fifo 以及幾種操作 function/task 和對應(yīng)component中要實現(xiàn)的fun cti on/task下面的箭頭方向都是控制流的方向,不是數(shù)據(jù)流方向。我覺得作為一個 VMM用戶會覺得TLM有點難理解,總想用 VMM_CH
20、ANNEL去套,結(jié)果把自己搞暈。像 port 等其實是調(diào) imp 所在 component 的 task/function.我看 UVM 源代碼里有一個 uvm_seq_item_pull_port 的 class,它的基類是 uvm_port_base.在 uvm_driver 的成員seq_item_port就是這個類型的。 與它對應(yīng)的是 uvm_seq_item_pull_imp , uvm_sequencer的成員 seq_item_export就是這種類型。在中會 connect它們。端口互連port是動作的發(fā)起者,export是動作接收者,但是需要以一個imp來結(jié)束。可以 port
21、 export imp port port imp 也可以 port imp export impport imp用的較多,port port imp可以用port指針賦值來實現(xiàn) port port章節(jié))操作:put get/peek transport, transport相當于一次 put+ 一次 getpeek和get的不同(章節(jié)):使用uvm_tlm_analysis_fifo 的時候,get任務(wù)會使fifo中少一個transaction ; 而peek任務(wù)是fifo把transaction復制一份發(fā)岀,內(nèi)部緩存中的transaction不會減少。一般情況下peek完以后,還得調(diào) ge
22、t。上述操作都有阻塞和非阻塞之分。port export imp 的類型也有 blocki ng和non block ing之分。port/export/imp 類型: put/get/peek/get_peek/transport blocking/nonblocking/ 不區(qū)分 blocking-nonblocking 之分imp要多一個參數(shù),除了聲明 transaction類型(或者 REQ RSP類型)以外,還要聲明實現(xiàn)這個接口的comp onentconnect 的一定是同類型的 port/export/impTLM的關(guān)鍵在于"與 imp對應(yīng)的component中task
23、/function的實現(xiàn)”。假設(shè)(B imp),那么需要實現(xiàn)的task/function為:A portB impTask/fu ncti onFun cti onuvm block in g put portuvm block in g put impputnon block in g putnon block in g put imptry put can putputputputtry put can putblock in g_tra nsportblock in g_tra nsporttra nsportnon block in g_tra nsportnon block in g
24、_tra nsportn b_tra nsporttran sporttra nsporttra nsportn b_tra nsportget_peekget_peekget peektry_get can _get try peek can peekget/peek/get_peek和put類似, 上述task或function必須要實現(xiàn),如果用不到就寫個空函數(shù)(章節(jié))。注意 上述 task 或者 function 的參數(shù)。 put 是一個 transaction 參數(shù),get/peek 是 output 的 transaction 參 數(shù),transport 是一個 req 參數(shù)一個 o
25、utput 的rsq 參數(shù)。連接用connect函數(shù)實現(xiàn),從名字就可以看岀來,這個必須在connect_phase中調(diào)。通信方式這節(jié)應(yīng)該是本章重點。實際使用中用 analysis_portanalysis_imp 還是 port tlm_analysis_fifo port可以根據(jù)實際情況自己決定。analysis_port(analysis_export)可以連接多個 imp(一對多的通信)put和get系列端口與相應(yīng) imp的通信通常是一對一的(可以一對多,但是本書沒有給岀一對多的例子章節(jié)有介紹)。analysis_port(analysis_export)更像是一個廣播analysis_
26、port(analysis_export)沒有阻塞和非阻塞的概念。它是一個廣播,不等與它相連的其他端口的響應(yīng)。analysis_port ( analysis_export )必須連的 imp 是 analysis_imp. analysismp 所在的 component 必須定 義個 write 的 function 注意:是 function代碼示例:示例代碼的analysis_port文件夾component C 和 B 的代碼基本一致。env 的 connect_phase 函數(shù)里做 connect :comp on e nt中有多個imp的時候,如何實現(xiàn) write函數(shù)?給的例子中
27、,scoreboard 有兩個 imp,分另V從 output_agent 和口 reference-model 的 analysis_port 獲取transaction,然后做compare.這個時候需要用:'uvm_analysis_imp_decl(_ 標記) 這個 macro,然后"write "函數(shù)變成 “ write_ 標記()"函數(shù),analysis_port 所在component不用變,還是調(diào) write()函數(shù)即可。代碼示例如下:使用macro聲明write函數(shù)變名字analysis_port 所在 component 實現(xiàn)不變。使用
28、 uvm_analysis_fifo (uvm_tlm_analysis_fifo ) , analysis_fifo 的本質(zhì)是一塊緩存 + 兩個 imp. 用 fifo 來實現(xiàn) port fifo port使用fifo最重要的是 選好兩端的port類型,然后根據(jù)選好的兩端port類型,來選擇fifo上要連接的imp/export fifo 本身實現(xiàn)了 write() put() get() peek()等一系列的 function/task,在兩端 port 所在的 component中直接調(diào)就可以。連接在fifo兩端的都是port,所以connect函數(shù)的起點是兩端。的示例代碼:可以看到e
29、nv里聲明的幾個 fifo都是connect_phase函數(shù)中connect函數(shù)括號里的參數(shù)。、和是 analysis_port、和都是 block in g_get_portfifo上有很多export,但是這些 export實際都是impsrc/tlm1/上面連接的也是一個analysis_imp:源代碼中實現(xiàn)如下:src/tlm1/uvm_a nalysismp #(T, uvm_tlm_a nalysis_fifo #(T) an alysis_export;fifo 是一個 component ,可以調(diào)一些函數(shù)來 debug : used() is_empty() is_full()
30、 flush()fifo 里緩存深度可以在 new 的時候用第三個參數(shù)設(shè)置。問題: fifo 的兩端是不是一般就是 analysis_port 和 blocking_get_port ? 感覺章節(jié)開始一段文字描述是這個意思。使用 fifo 還是 imp 自己來把握。 各有各的好處。imp 可以使用 uvm_analysis_imp_decl(_ 標記 )的 macro ,有時候會很方便。而 analysis_fifo 可以用 for 循環(huán)來操作 fifo 數(shù)組,也可以帶來代碼的簡潔。 imp 不能在 connect 和 new 的時候用 for 循環(huán)。第 5 章 UVM 驗證平臺的運行phas
31、e 機制所有的 phase 如下圖:中間綠色的是 task phase, 兩頭青色的是 function phase component 的實例化是在 build_phase 中完成, object 的實例化可以在任何 phase 完成。 function phase 中除了 build_phase 都是“自下而上” 的執(zhí)行 這里的上下是指的樹結(jié)構(gòu)中的上下。 build_phase 是“自上而下”同層次的兄弟關(guān)系的component , build phase執(zhí)行順序是根據(jù) new時候name的字典序 -章節(jié)對于叔侄關(guān)系的 component, build phase執(zhí)行順序是深度優(yōu)先。例如前
32、面UVM樹中,“ scb”和"”,因為i_agt在scb前面,會執(zhí)行完 i_agt,然后 drvmo nsqr,然后 o_agt,然后 mon,然后才是 scb。所有 component 的同一個 run time phase 是同時開始的。 也就是說會等其他 component 的上一個phase 結(jié)束才開始當前 phase。(phase)一定要加,其他phase的super:可以不用加.phase之間可以跳轉(zhuǎn)。例如在正常工作的時候,發(fā)生了的reset,那么應(yīng)該是 main_phase跳轉(zhuǎn)到reset_phase. 例如:章節(jié)的示例代碼jump 導致 main_phase 的 ob
33、jection 沒有被 drop. 仿真發(fā)現(xiàn)這里會有一個 UVM WARINGING 報出來,這個問題如何解決呢? -應(yīng)該不用管它simv +UVM_PHASE_TRACE可以調(diào)試 phase超時退出機制:1) 在 test 的 build_phase 里加上 (500ns,0);2) 'defi ne UVM_DEFAULT_TIMEOUT 500ns3) simv +UVM_TIMEOUT= ”500ns,YES” 控制 objection 的時機:推薦在 sequence 里的 body() task 中實現(xiàn)控制 objection章節(jié)示例代碼:注意用 starting_phas
34、e 的判斷。給 main_phase 設(shè)置 drain_time 。所謂 drain_time ,就是 main_phase 結(jié)束之后經(jīng)過 drain_time 時間以后再 進入 post_main_phase 。在 test 的 main_phase task 中使用 set_drain_time 函數(shù): objection 的調(diào)試simv +UVM_OBJECTION_TRACE章節(jié)介紹了 domain , 我覺得基本不會用這個吧 ?第 6 章 UVM 中的 sequencesequencer 將 sequenee 傳遞給 driver.弓I入 sequenee,帶來的變化:1) uvm_
35、transaction 的派生類變成 uvm_sequence_item 的派生類2) 需要 sequencer3) driver main_phase 有變化4) 啟動 sequenee (般在 case 的 build_phase 中)上述變化反映到代碼中,如圖 章節(jié)的示例代碼 下圖中有兩種方法實現(xiàn) my_sequencer sequence 的啟動方式 (3 種):1 )在case的main_phase中:注意要設(shè)置 eseq的staring_phase。我覺得書上 6-5代碼清單里有兩個地方寫的不合理,一個是 start 的參數(shù)應(yīng)該是 sqr 的路徑,另外是少了設(shè)置 starting_
36、phase2) 注意在 case 的 build_phase 中3) 更推薦用下面這種方式:sequenee 被啟動后,會自動執(zhí)行sequenee 的 body task (以及 pre_body mid_body post_body )在同一個sequencer上可以啟動多個 sequenee,因為啟動了多個,所以不能設(shè)置default_sequnee 了,需要用上面第一種方法來啟動 sequenee. 但是 sequenee 的嵌套可以解決這個問題(上層 sequenee做 default_sequenee 章節(jié))sequenee 可以用 uvm_do_pri uvm_do_pri_wit
37、h 等 maero 來設(shè)置優(yōu)先級 priority, 當一個 sequeneer 上有多 個 sequenee 的時候,這個優(yōu)先級就有意義了。優(yōu)先級就帶來sequencer的仲裁算法。默認的仲裁算法是SEQ_ARB_FIFO(楊哥遵循陷入先岀順序,不考慮優(yōu)先級),所以設(shè)置優(yōu)先級以后,需要改變仲裁算法。在 ease 的 main_phase 中調(diào)函數(shù) set_arbitration()前面提到的"嵌套seque nee "也可以像上面這樣來設(shè)置仲裁算法。sequeneer 的操作:loek() grab() 獲取獨占權(quán)。 unloek() ungrab() 釋放獨占權(quán)is_r
38、elevant() 設(shè)置 sequenee 有效和無效。返回值 1 有效,返回值 0 無效wait_for_relevant() 當 sequeneer 發(fā)現(xiàn)啟動的所有 sequenee 都無效的時候,會自動調(diào) wat_for_relevant() task。 在 wait_for_relevant() task 中,必須使 sequenee 無效的條件清除 。is_relevant() 和 wait_for_relevant() 如果需要的話,一般是成對重載 。sequenee 相關(guān) maero 及實現(xiàn)最重要的是 uvm_do 系列宏,尤其是在引入 virtual sequeneer 以后
39、uvm_do_on 系列宏用的會很多。、uvm_do_on_pri_with(SEQ_OR_ITEM,SEQR,PRIORITY,CONSTRAINTS) uvm_d(系列 macro 都是來源于這 個最 長的 maero除了 uvm_do 系列 maero 之外,還可以用 uvm_ereate + uvm_send 。 使用 uvm_ereate + uvm_send 的 優(yōu)勢是可以在兩個 maero 之間加一些賦值操作等,當然也可以把約束隨機加在這里。uvm_ereate 是實例化 transaetion , uvm_send 是把 transaetion 發(fā)送岀去。uvm_rand_se
40、nd uvm_rand_send_pri uvm_rand_send_with uvm_rand_send_pri_with 與 uvm_do 系列 maero 類似start_item 和 finish_item 上述 maero 的實際實現(xiàn)函數(shù) 我覺得我們代碼里應(yīng)該不會用這兩個函數(shù)。task pre_do(bit is_item)funetion void mid_do(uvm_sequenee_item this_item)funetion void post_do(uvm_sequenee_item this_item)注意上述 task/funetion 的參數(shù)。 mid_do 和
41、post_do 因為參數(shù)是基類對象,函數(shù)重載里可能需要做$east.sequenee 進階應(yīng)用 前面提到了 uvm_do 系列宏既可以用在 uvm_sequence_item 上也可以用于 uvm_sequence ,所以 sequence 可以嵌套。sequence 中可以有 rand 成員,并且可以把 rand 成員和 transaction 的 rand 成員約束起來。 通過上面的約束,上層 sequence 里可以約束下層 sequence 里 transaction 的成員: sequence 的參數(shù)代表了它的 req 和 rsp 的 uvm_sequence_item 派生類的類名
42、。如果需要發(fā)送不同 uvm_sequence_item 派生類的對象, 那么需要把 sequence 、 sequencer 和 driver 參數(shù)聲明成基類 uvm_sequence_item。由于是基類,所以在 driver中(req)的時候要做$cast轉(zhuǎn)換. 因為sequenee默認參 數(shù)就是 uvm_sequence_item ,所以不用寫。示例代碼:driver 中的 cast 操作實際的 testbench 中,很可能會在 sequencer 里加入一些成員變量, 一般這種情況下要 declare p_sequencer 這個指針。用 macro -uvm_declare_p_s
43、equencer(sequencer 類名)在 sequenee中可以實現(xiàn):章節(jié)示例問題: p_sequencer 的聲明 macro 是不是一直加著 直接寫在 base_sequence 里比較好??梢宰鲆粋€ base_sequenee,需要p_sequencer的聲明的話,寫在 base_sequenee里,這樣就不用每個 sequence 都聲明 p_sequencer 指針了。virtual sequencevirtual sequence (virtual sequencer) 是特色。 如下圖所示 :系統(tǒng)級環(huán)境里可能有多個 env,帶來了多個sequencer/sequenee ,
44、這樣在case里不好維護。實現(xiàn)一個virtual sequencer,里面包括指向各個 sequencer的指針;而 virtual sequenee 就像前面介紹的" sequenee 嵌套” 一樣實現(xiàn)。由于 virtual sequencer 里有實際 sequencer的指針,所以肯定不能用“typedef uvm_sequncer .”來實現(xiàn)。同時,由于 virtual sequencer 有成員了, 所以在 virtual sequence 里要 declare p_sequencer, 并且指向 virtual sequencer.base_test 的 connect_
45、phase 函數(shù)中,要把 virtual sequencer 里的成員賦值到各個 env 的 sqr 上。 所以virtual sequencer 和各個 env 是同級的所謂“ virtual ”是說它本身不會發(fā)送 transaction ,所以 virtual sequencer 和 virtual sequence 都不用寫 transaction 的參數(shù)(用了默認的參數(shù))。章節(jié)示例代碼virtual sequence : 聲明 p_sequencer 指針,注意 uvm_do_on 的 sequencer 參數(shù)virtual sequencer 聲明指針base_test 在 conn
46、ect_phase 中連接 sequencercase:設(shè)置 virtual sequencer 的 main_phase 的 default_sequenee 為 virtual sequenee.前面提到了 objection 的控制在 sequence 的 body task 中實現(xiàn)?,F(xiàn)在引入了 virtual sequence 以后, objection 的控制就移到頂層 virtual sequence 的 body task 中。sequence 中盡量不要用 fork join_none ,避免執(zhí)行到 endtask雖然 sequence 不是 component ,但是也可以在
47、 sequence 中使用 uvm_config_db ( 類似于 tp_tb 中使用 )。 在case中對sequenee的成員用 uvm_config_db#(類型):set()的時候要注意:sequenee由于是一個 object,它的名字可能不確定,所以這里一般用通配符。而在sequence 中 get 的時候,則使用 uvm_root:get()/或者 null 和 get_full_name() ,作為前兩個參數(shù)。示例代碼 set 用通配符和 get 的路徑參數(shù)在sequenee中可以對testbench中的component的成員使用 uvm_config_db#(類型):set
48、(),同樣因為路徑 的問題,第一個參數(shù)一般是 null 或者 uvm_root:get()書上還給了一個設(shè)置sequenee自己的成員的例子,不知道有啥用.章節(jié)介紹了 uvm_config_db 的 wait_modified task ,參數(shù)只有 3 個,和 get 前三個一樣。responsesequence sequencer driver 的參數(shù)有兩個 : req 類型和 rsp 類型,默認情況下 rsp 和 req 一樣的類型。 當 sequence 需要 driver 返回 response 的時候,就需要用到 rsp 了。sequence 中在 uvm_do macro 之后調(diào)
49、get_reponse(rsp) task, 而在 driver 中增加的代碼較多: 章節(jié)示例代碼get_reponse 和 put_response 對應(yīng)。 注意 driver 中必須有 set_id_info 函數(shù)。 put_response 可以省略:需要 item_done 函數(shù)帶 rsp 參數(shù): (rsp) 但是當有多次 rsp 的時候,就不能這么用了。 多次的時候只能是調(diào)多次 get_reponse 和 put_responseget_response是一個阻塞的task,當sequenee沒有獲取到driver返回的rsp的時候,會阻塞住sequenee 的 body() ,所以
50、當 driver 不能及時返回 rsp 的時候, get_response put_response 這個機制就有問題了。 UVM 的解決方法是使用 response_handler 函數(shù):在 pre_body() 函數(shù)中 use_reponse_handler() 打開這個功能,然后重載 response_handler(uvm_sequenee_item response) 這個函數(shù) 一般需要 $east 給 sequenee 中的 rsp 成員 . 而 sequenee 的 body task 里就不用再調(diào) get_response 了章節(jié)代碼示例:rsp 和 req 的類型可以不同,這
51、個時候注意 sequenee driver sequeneer 的參數(shù)sequenee librarysequenee library 是一系列 sequenee 的結(jié)合。 uvm_sequenee_library 本身是 uvm_sequenee 的派生類。 實現(xiàn) sequenee_library 的時候要注意:1) 在 new 函數(shù)里要增加 init_sequenee_library() 函數(shù)2) 增力廿 'uvm_sequence_library_utils( 類名) 的 macro對于里面的 sequenee 只需要增加一個macro: 'uvm_add_to_seq_lib(sequenee 類名,sequence_library 類名)一個 sequence 可以加入到不同的 sequence_library 中使用 sequence_library 可以有效簡化 Testcase,因為 case 中設(shè)置 sqr 的 main_phased 的 default_sequenee 是 sequence_l
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 重慶商務(wù)職業(yè)學院《園林建筑設(shè)計(二)》2023-2024學年第二學期期末試卷
- 北京經(jīng)貿(mào)職業(yè)學院《禽生產(chǎn)學實驗》2023-2024學年第二學期期末試卷
- 保安保潔管理制度
- 2025買賣合同無效情形
- 2025關(guān)于技術(shù)轉(zhuǎn)讓合同模板
- 2025網(wǎng)站開發(fā)合同協(xié)議書范本
- 供應(yīng)鏈造價合同范例
- 中石化海砂采購合同范例
- 《2025關(guān)于技術(shù)合作經(jīng)營合同書》
- 心理健康舞動青春課件
- 小學數(shù)學北師大五年級下冊七用方程解決問題相遇問題導學單
- 雙向轉(zhuǎn)診制度與流程圖
- 施工現(xiàn)場防汛應(yīng)急培訓記錄
- 新媒體運營知識考核試題與答案
- 金屬材料的主要性能ppt課件(完整版)
- “新時代好少年”推薦表
- 規(guī)章制度文件評審表
- 草坪學實習報告模板-Copy
- K-H-V行星齒輪減速器 瞿鴻鵬
- 初中道德與法治課課堂課堂評價表
- sales-contract(中英文詳版)
評論
0/150
提交評論