最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

UVM基礎(chǔ)-組件(driver、monitor、agent...)

2022-09-21 01:12 作者:不吃蔥的酸菜魚  | 我要投稿

UVM組件

????????UVM里中的十大類

?UVM里中的十大類

????????本篇專欄聊到的組件,都是繼承于uvm_component。在SV環(huán)境中的驗證組件按照功能需要,被稱之為激勵器(stimulator)、檢測器(monitor)和檢查器(checker)。這三個核心組件與驗證環(huán)境的三個關(guān)鍵特性相對應(yīng):激勵(sequencer)、檢測(monitor)和檢查(scoreboard)。

????????uvm_agent、uvm_env、uvm_test在UVM中所承擔(dān)的功能并不多,主要起到構(gòu)建環(huán)境層次的作用。

????????從uvm_component類繼承的類,均可以構(gòu)成驗證環(huán)境,這是因為它們都從uvm_component類繼承了phase機(jī)制,也都會經(jīng)歷各個phase階段。

????????主要常見的組件類為:uvm_driver、uvm_monitor、uvm_sequencer、uvm_agent、uvm_scoreboard、uvm_env、uvm_test。

uvm_driver

????????該類會從uvm_sequencer中獲取事務(wù)(transaction),經(jīng)過轉(zhuǎn)化進(jìn)而在接口中對DUT進(jìn)行時序激勵。任何繼承于uvm_driver的類需要注意的是,該類是參數(shù)化類,因此在定義時需要聲明參數(shù)的類型。

????????用戶定義新的driver類時,應(yīng)當(dāng)聲明該類所需獲取的事務(wù)參數(shù)REQ類型,默認(rèn)情況下,RSP參數(shù)類型同REQ類型保持一致。 如上代碼段,默認(rèn)的REQ類型是uvm_sequence_item類型。(REQ? request;RSP response)

????????uvm_driver在uvm_component基礎(chǔ)上沒有擴(kuò)展新的函數(shù),而只是擴(kuò)展了一些用來通信的端口和變量:

????????driver和sequencer類之間的通信就是為了獲取新的事務(wù)對象,這一操作是通過pull的方式實現(xiàn)的:

定義一個driver:

????????這里extern 聲明了一個task,會發(fā)現(xiàn)這個task沒有endtask配對,這是因為這里不是對task的功能進(jìn)行描述,而是利用extern做一個聲明,告訴大家我已經(jīng)定義一個task,名叫run_phase,占一個坑,然后在外部定義具體功能。

????????如果沒有extern,那么就要在聲明的同時,下面接著定義task的功能,然后再endtask;這兩種定義task的方法均可以,沒有任何區(qū)別,就是coding風(fēng)格不一樣而已;那么什么時候使用extern,什么時候不使用呢?

????????在商業(yè)的代碼里,就可能會采用extern的形式,然后把定義包裝成.svh的head文件,這樣你在查閱代碼的時候,就不會出現(xiàn)三百行代碼里還有一大部分是task的實現(xiàn),方便你快速閱讀和理解,然后在配套寫一個.sv文件,其中.svh用來聲明和定義,.sv則具體到如何實施;或者在商業(yè)的VIP里,為了保密,而不把具體內(nèi)容寫在task里,而是用extern定義外部實現(xiàn)的方式來做,你只要知道如何使用就行了,而不被允許知道如何實現(xiàn)。

uvm_monitor

????????從名字來看,這個類是為了監(jiān)測接口數(shù)據(jù),而任何需要用戶自定義數(shù)據(jù)監(jiān)測行為的monitor都應(yīng)當(dāng)繼承于該類。

????????雖然uvm_monitor與它的父類相比,并沒有增添新的成員變量和方法,理論上繼承于uvm_monitor和繼承于uvm_component是一樣的,但還是建議coding過程中,遵循UVM模板,將新定義的monitor類繼承uvm_monitor,有助于實現(xiàn)uvm_monitor的方法和特性。

執(zhí)行的工作:

????????觀測DUT的interface,并且收集總線信息;

????????永遠(yuǎn)保持PASSIVE模式,只能做監(jiān)測,不做任何主動修改信號的操作,即永遠(yuǎn)不會驅(qū)動DUT;

????????在總線協(xié)議或者內(nèi)部信號協(xié)議觀察時,可以做一些功能和時序的檢查;

????????對于更加復(fù)雜的檢查要求,它們可以將數(shù)據(jù)發(fā)送至其他驗證組件,例如scoreboard、reference model或者coverage collector。

????????外部定義了task run_phase,在serial_monitor中聲明一下,

uvm_sequencer

????????uvm_sequencer就如同一個管道,從這個管道中會連續(xù)傳遞激勵事務(wù)(sequence產(chǎn)生事務(wù),sequencer傳遞事務(wù)),并最終通過TLM端口送至driver一側(cè)。

????????sequencer既管理著sequence,同時也將sequence中產(chǎn)生的transaction item傳送到driver一側(cè),可以說是整個激勵環(huán)節(jié)中的“路由器”。sequencer是一個uvm_component類型,但是sequence是uvm_object類型,這也符合我們的認(rèn)知,產(chǎn)生transaction為動態(tài)創(chuàng)建的,在仿真的任何時刻都可以創(chuàng)建sequence,并且創(chuàng)建使用完后就可以扔掉,所以sequence為object類型。

????????定義my_sequencer也是三部曲,繼承、注冊和定義new函數(shù),這是最基本的,然后再在此之上定義更多的內(nèi)容譬如:接口。

uvm_agent

????????uvm_agent是一個標(biāo)準(zhǔn)的驗證環(huán)境“單位”。這也的一個標(biāo)準(zhǔn)單位通常包含一個driver、一個monitor以及一個sequence。這三者通常是聚在一起組成一個agent。

????????有的時候agent不需要發(fā)送激勵,那么就可以只包含一個monitor,而不需要driver和sequencer,這就需要一個變量來進(jìn)行有條件的例化。

????????is_active是agent的一個成員,缺省值是UVM_ACTIVE,這表示處在active模式的agent需要例化driver、monitor和sequencer;而如果is_active的值是UVM_PASSIVE,這表示agent是passive模式,只可以例化monitor。active模式的agent既有激勵功能也有監(jiān)測功能;passive模式的agent只有監(jiān)測功能。

????????如何配置agent為active模式還是passive模式呢?可以通過頂層利用config_db來配置。

????????agent的存在是為了驗證環(huán)境的復(fù)用。按照總線的傳輸方向劃分可以分為master和slave,master agent是用來向DUT發(fā)起transaction的,slave agent是用來響應(yīng)DUT的events的。

????????在my_agent中聲明了build_phase和connect_phase,在外部定義。is_active的配置可以通過外部使用config_db的方式配置。

scoreboard

????????uvm_scoreboard承擔(dān)的功能就是數(shù)據(jù)對比和報告。uvm_scoreboard本身也沒有添加額外的成員變量和方法,但UVM建議用戶將自定義的scoreboard類繼承于uvm_scoreboard類,這便于子類在日后可以自動繼承于可能被擴(kuò)充到uvm_scoreboard類中的成員。

????????在實際環(huán)境中,uvm_scoreboard會接收來自多個monitor的監(jiān)測數(shù)據(jù),繼而進(jìn)行比對和報告。

? ?????在scoreboard中通常會聲明TLM端口以供monitor傳輸數(shù)據(jù)。簡易比較的方法,可以采用UVM預(yù)定義的comparator。對于復(fù)雜的設(shè)計,可以在scoreboard中分別創(chuàng)建reference model和comparator。

????????在scoreboard中定義的端口,跟monitor相連監(jiān)測數(shù)據(jù),還有一端和out數(shù)據(jù)相連。在build_phase中,端口也要做例化。

uvm_env? ? ????

????????從驗證環(huán)境的結(jié)構(gòu)而言,uvm_env可能包含多個uvm_agent和其它component。這些不同的組件共同構(gòu)成一個完整的驗證環(huán)境,而這個環(huán)境在將來復(fù)用中可以作為子環(huán)境被進(jìn)一步集成到更高的環(huán)境中。

????????如上圖,驗證一個系統(tǒng)的時候,可以先驗證子系統(tǒng),為子系統(tǒng)或者說子模塊搭建一個驗證環(huán)境sub_env,然后驗證完畢之后,把驗證更多的功能時,可以讓top_env繼承于suv_env并增添一些接口和模塊,來實現(xiàn)垂直復(fù)用。

????????uvm_env的角色就是一個結(jié)構(gòu)化的容器,它可以容納其它組件,同時它也可以作為子環(huán)境在更高層的集成中被嵌入。

????????在實際使用中,用戶很容易混淆uvm_agent和uvm_env之間的嵌套關(guān)系,而且容易在創(chuàng)建對象階段出現(xiàn)錯誤,這時要注意:uvm_agent作為一個標(biāo)準(zhǔn)單元,在更上層的集成中應(yīng)該被例化到uvm_env,所以不要用uvm_agent去嵌套u(yù)vm_agent。uvm_env在更高層的復(fù)用中,可以被其它uvm_env所嵌套。

????????uvm_env的嵌套,要和設(shè)計的層次結(jié)構(gòu)一致,這樣才能更好的做環(huán)境的維護(hù)。

uvm_test

????????uvm_test類本身沒有什么新成員,但是作為測試用例的“代表”,它不但決定著環(huán)境的結(jié)構(gòu)和連接關(guān)系,也決定著使用哪一個測試序列。

????????uvm_test是驗證環(huán)境建立的唯一入口,要例化uvm_env,如果沒有它,整個環(huán)境都無從建立,只有通過它才能正常的運(yùn)行UVM的phase機(jī)制。在一個頂層test中,可以例化多個組件譬如uvm_env或者uvm_agent,而在仿真時通過uvm_test可以實現(xiàn)驗證環(huán)境的運(yùn)轉(zhuǎn)。

????????推薦在uvm_test中只例化一個頂層uvm_env,這便于提供一個唯一環(huán)境節(jié)點以形成樹狀的拓?fù)浣Y(jié)構(gòu)。且用戶寫的uvm_test的頂層必須繼承于uvm_test而不能繼承于uvm_component,雖然uvm_test沒有添加新的成員,但是我們在調(diào)用一些uvm_test函數(shù)時,只有繼承于uvm_test的類,系統(tǒng)才能識別這些uvm_test函數(shù),否則UVM系統(tǒng)不予承認(rèn)。

????????config_db也可以構(gòu)建一個嵌套的環(huán)境,在不同的層次中給不同的組件來做傳參。要注意的是使用uvm_config_db來做配置,一定要先配置,再創(chuàng)建組件,執(zhí)行build_phase,get config。包括在set interface的時候也是一樣,先set再做run_test()。

UVM結(jié)構(gòu)總結(jié)

????????uvm_top是uvm_root類的唯一實例,它由UVM創(chuàng)建和管理,它所在的域是uvm_pkg。uvm_top是所有test組件的頂層,所有驗證環(huán)境中的組件在創(chuàng)建時都需要指明它的父一級,如果某些組件在創(chuàng)建時父一級的參數(shù)為“null”,那么它將直接隸屬于uvm_top。

????????uvm_top提供一系列的方法來控制仿真,例如phase機(jī)制、objection防止仿真退出機(jī)制等。

????????test類是用戶自定義類的頂層結(jié)構(gòu),必須繼承于uvm_test,否則uvm_top不識別。test的目標(biāo)包括:提供不同的配置(config_db)、環(huán)境結(jié)構(gòu)配置、測試模式配置等,然后再創(chuàng)建環(huán)境、例化測試序列,掛載目標(biāo)sequencer,使其命令driver發(fā)送激勵。

????????所有需要配置的,所有需要修改參數(shù)的全都在test層次中修改(譬如測試序列、override部分),而不在其他例如env、agent修改,方便我們維護(hù)。

構(gòu)建環(huán)境的主要組件主要由三類UVM構(gòu)架模塊(基類)組成

※ uvm_component

????????繼承于uvm_report_object(進(jìn)一步繼承于uvm_object),提供消息方法;所有的驗證環(huán)境組件均繼承于uvm_component;管理驗證環(huán)境的層次。

uvm_component提供以下接口或者API:

對于uvm_component組件的構(gòu)建函數(shù),固定形式為:

????????※ string name :用來聲明當(dāng)前例化組件的名稱,用來自動和它所在的父一級層次組合為組件的整個層次名稱,可以用get_full_name()方法獲??;

????????※ uvm_component parent: 用來指示所例化的父一級句柄,通常用“this”來指代,即例化在當(dāng)前的父一級組件中。凡是繼承與uvm_component的組件,也應(yīng)該保持同樣的形式參數(shù)列表。

????????注意這里的new函數(shù)要和uvm_object的構(gòu)建函數(shù)new(string name)進(jìn)行區(qū)分,由于uvm_object并不參與組件的層次構(gòu)建,因此它只有一個形參,而沒有uvm_component parent。

※ uvm_env

????????繼承于uvm_component;沒有額外的功能,用來為環(huán)境結(jié)構(gòu)提供一個容器,方便維護(hù)和復(fù)用。

※ uvm_test

????????繼承于uvm_component;沒有額外的功能,用來提供對uvm_env的額外配置以及掛載激勵。



UVM基礎(chǔ)-組件(driver、monitor、agent...)的評論 (共 條)

分享到微博請遵守國家法律
平远县| 同江市| 彝良县| 阿鲁科尔沁旗| 富民县| 永泰县| 忻城县| 德安县| 林周县| 白水县| 库伦旗| 永嘉县| 酉阳| 远安县| 舞阳县| 班玛县| 吉林市| 文山县| 固始县| 龙里县| 改则县| 汪清县| 通道| 彭水| 贵港市| 开江县| 绵阳市| 漳浦县| 汝州市| 克拉玛依市| 水城县| 商洛市| 云浮市| 邳州市| 绍兴市| 长丰县| 军事| 长春市| 云浮市| 红安县| 桃源县|