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

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

UVM基礎(chǔ)-TLM通信機制(二)

2022-12-06 04:13 作者:不吃蔥的酸菜魚  | 我要投稿

?目錄

????????TLM 2.0 通信

????????????????端口定義

????????????????傳送數(shù)據(jù)? ? ?

????????????????時間標記

????????同步通信元件

????????????????uvm_event

????????????????????????總結(jié)

????????????????uvm_barrier

????????????????uvm_callback

TLM 2.0 通信

????????TLM 2.0是System C模型之間的核心傳輸方式,通常情況下我們都用TLM 1通信,但當遇到模型是使用System C編寫的時,UVM要將System C模型繼承到驗證環(huán)境里做reference model的時候會用到TLM 2.0通信。

端口定義

? ? ? ? 與TLM 1.0相比,TLM 2.0提供更加強大的傳輸特性,主要包括:① 雙向的阻塞或者非阻塞接口;(TLM 1.0也有) ② 時間標記; (從一個組件到另一個組件到底花了多長數(shù)據(jù)傳輸)③ 統(tǒng)一的數(shù)據(jù)包。通過這些特性,TLM 2.0使得接口之間的通信趨于標準化,更容易為系統(tǒng)構(gòu)建抽象模型。

? ? ? ? 在定義TLM 2.0的過程中,仍然有initiator和target的概念,也有port、export以及imp端口類型。對于port類型,它是用來發(fā)起請求并調(diào)用target一端的傳輸方法;export用來傳導這一需求;最后由imp端口所在組件來實現(xiàn)數(shù)據(jù)傳輸方法。

? ? ? ? 為了區(qū)別于TLM 1.0對于端口類型的稱謂,UVM將TLM 2.0端口類型稱之為socket。它們是由port、export和imp組合而成的。一個socket是雙向傳輸?shù)?。socket則按照blocking 和 unblocking的傳輸方式,組合initiator或者target的發(fā)起端區(qū)別,可以分為:

? ? ? ? socket類型都繼承與uvm_port_base,具有同TLM 1.0端口一樣的基礎(chǔ)函數(shù),而在這些socket內(nèi)部,它們是通過例化port、export以及imp最終實現(xiàn)數(shù)據(jù)雙向傳輸?shù)?/strong>。匹配的方法不再是put()、get()、peek()而是變成了b_transport()、nb_transport_fw()和nb_transport_bw()。

? ? ? ? socket通過內(nèi)置這些端口,就可以實現(xiàn)了數(shù)據(jù)的雙向傳輸。

傳送數(shù)據(jù)? ? ?

? ? ??TLM 1.0中傳輸?shù)臄?shù)據(jù)類型是用戶自定義的,這就會產(chǎn)生一些限制,如果端口傳輸數(shù)據(jù)類型不同,則端口無法連接,針對傳輸不同數(shù)據(jù)類型的TLM端口,相應(yīng)的傳送方法也要做出調(diào)整。

? ? ? TLM 2.0對傳送數(shù)據(jù)的類型提出了一致性的要求,統(tǒng)一的數(shù)據(jù)類型由uvm_tlm_generic_payload 表示,即傳輸方法中使用的數(shù)據(jù)類型都應(yīng)該為 uvm_tlm_generic_payload。

? ? ? ? TLM 2.0標準制定的背景就是為了解決總線級別的抽象問題,所以它的統(tǒng)一數(shù)據(jù)格式也是按照總線數(shù)據(jù)的內(nèi)容來定義的。

????????bit [63:0] m_address:數(shù)據(jù)的讀寫地址。14.28

????????uvm_tlm_command_e m_command:數(shù)據(jù)的讀寫命令。

? ? ? ? byte unsigned data[]:寫入的數(shù)據(jù)或者讀出的數(shù)據(jù),由byte unsigned類型構(gòu)成動態(tài)數(shù)組。

? ? ? ? int unsigned length:data數(shù)組的長度。

? ? ? ? uvm_tlm_response_status_e m_response_status:由target返回的狀態(tài)值,表示數(shù)據(jù)傳輸是否完成和有效。

? ? ? ? byte unsigned m_byte_enable[]:用來標記寫入數(shù)據(jù)的有效性,標記哪個byte應(yīng)該寫入。

? ? ? ? int unsigned m_byte_enable_length:該數(shù)值應(yīng)該等于m_byte_enable數(shù)組的容量值。

? ? ? ? m_stream_width:用來表示連續(xù)傳輸時的數(shù)據(jù)傳輸長度。

? ? ? ? uvm_tlm_extension_base m_extensions[uvm_tlm_extension_base]:如果一些數(shù)據(jù)不在上面的部分,那么可以在這個數(shù)據(jù)延伸域中添加。

時間標記

? ? ? ? 不同的時間標記間隔是System C可以構(gòu)建不同時間精度模型的重要手段。

? ? ? ? 在TLM 2.0傳輸中,由于可以標定延時時間,使得target端可以模擬延遲,并且在準確的延遲時刻做出響應(yīng)。為了便于標記延遲時間,譬如1.1ns(SV和Verilog一樣,只能使用整數(shù)的延遲方式),UVM新建了一個時間類uvm_tlm_time。這個時間類使得用戶可以隨時設(shè)置它的時間單位,也解決了不同模塊或數(shù)據(jù)包之間出現(xiàn)的不同時間單位和精度單位的問題。

? ? ? ? 上面的代碼定義了兩個component類型,一個從從comp1一個comp2,以及調(diào)用它們的頂層env1。可以看到,我們通過“uvm_tlm_b_initiator_socket”在comp1中定義了一個initiator,自然的我們就需要在comp2中定義一個target類型的端口和它對應(yīng)“uvm_tlm_b_target_socket”,TLM端口用的都是socket類型。

同步通信元件

? ? ? ? SV中用來做線程同步的幾種元件為:event、semaphore和mailbox。在UVM中,需要同步線程不僅僅在同一個對象中,還需要解決不同組件之間的線程同步問題。

UVM為了解決封閉性的問題,定義了如下的類來滿足組件之間的同步要求:

※ uvm_event, uvm_event_pool和uvm_event_callback

※ uvm_barrier, uvm_barrier_pool

????????上面的兩組類分別用于兩個組件之間的同步多個組件之間的同步。

uvm_event

uvm_event

? ? ? ? 不同組件可以共享同一個uvm_event,這不需要通過跨層次傳遞uvm_event對象句柄來實現(xiàn)共享,該共享方式是通過uvm_event_pool這一全局資源池來實現(xiàn)的。uvm_event_pool是uvm_object_string_pool #(T) 的子類,它可以生成和獲取通過字符串索引的uvm_event對象。

? ? ? ? 通過全局資源池uvm_event_pool(唯一的),環(huán)境中的任何組件都可以從資源池獲取共享的對象句柄,這就避免了組件之間的互相依賴(跨層次通信)。

下面來看一個結(jié)合了uvm_event、uvm_event_pool和回調(diào)函數(shù)的代碼:

代碼輸出結(jié)果:

? ? ? ? ?該段代碼中,組件c1和c2之間完成了從c1到c2的同步,而且在同步過程中通過uvm_event e1傳遞了數(shù)據(jù)edata,并且調(diào)用了回調(diào)函數(shù)類ecb的pre_trigger()和post_trigger()方法。pre_trigger()和post_trigger()是uvm_event_callback自帶的回調(diào)函數(shù)。event在將要被trigger時,被trigger之前會執(zhí)行pre_trigger(),在被trigger之后會執(zhí)行post_trigger。

? ? ? ? pre_trigger有返回值,如果返回值為1,則表示uvm_event不會被trigger,也就不會再執(zhí)行post_trigger,如果返回值為0,則會繼續(xù)triiger該事件對象。

總結(jié)

? ? ? ? uvm_event類與event相比,有一定的區(qū)別:

? ? ? ? ① event被->觸發(fā)之后,會觸發(fā)使用@等待該事件的對象;uvm_event通過trigger()來觸發(fā),會觸發(fā)使用wait_trigger()等待該事件的對象。

? ? ? ? ② 如果要再次等待事件觸發(fā),event只需要再次用->來觸發(fā),而uvm_event需要先通過reset()方法重置初始狀態(tài),再使用trigger()來觸發(fā)。

? ? ? ? ③ event無法攜帶更多的信息,而uvm_event可以通過trigger(T data = null)的可選參數(shù),將伴隨觸發(fā)的數(shù)據(jù)對象都寫入到該觸發(fā)事件中,而等待該事件的對象可以通過方法wait_trigger_data(output T data)來獲取事件觸發(fā)時寫入的數(shù)據(jù)對象。

? ? ? ? ④ event觸發(fā)時無法直接觸發(fā)回調(diào)函數(shù),而uvm_event可以通過add_callback(uvm_event_callback cb,? bit append = 1)函數(shù)來添加回調(diào)函數(shù)。

? ? ? ? ⑤ event無法直接獲取等待它的進程數(shù)目,而uvm_event可以通過get_num_waiters()來獲取等待它的進程數(shù)目

? ? ? ? uvm_event解決了一個重要問題,那就是在一些uvm_objectuvm_component對象之間如果要發(fā)生同步,但是無法通過TLM完成數(shù)據(jù)傳輸,因為TLM傳輸必須是在組件和組件之間進行的。如果要在sequence與sequence之間進行同步,或者sequence與driver之間進行同步,就可以借助uvm_event來實現(xiàn)。

uvm_barrier

? ? ? ?UVM提供了一個新的類uvm_barrier來對多個組件進行同步協(xié)調(diào),?同時為了解決組件獨立運作的封閉性需要,也定義了新的類uvm_barrier_pool來全局管理這些uvm_barrier對象。uvm_barrier_pool同之前的uvm_event_pool一樣,也是基于通用參數(shù)類uvm_object_string_pool來定義的。

? ? ? ? uvm_barrier可以設(shè)置一定的等待閾值(threshold),當有不少于該閾值的進程在等待對象時,才會觸發(fā)該事件,同時激活所有正在等待的進程,使其可以繼續(xù)進行。

代碼輸出結(jié)果:

? ? ? ? 從這段代碼中可以看到,c1和c2的run_phase任務(wù)之間需要同步,而同步它們的元件則是來自于頂層的一個uvm_barrier b1。

? ? ? ? c1、c2和env1都共享該對象,這使得c1和c2可以通過wait_for()來等待激活,而env1可以設(shè)置閾值來調(diào)控什么時間來“開閥”。

? ? ? ? 在一開始的時候,閾值設(shè)置為3,但由于等待該barrier的進程只有2個,無法達到閾值條件,使得兩個進程都無法激活。在env1將b1的閾值設(shè)置為2時,等待該barrier的兩個進程都被激活。通過uvm_barrier::set_threshold()和uvm_barrier::wait_for()這樣的方式,可以實現(xiàn)多個組件之間的同步,同時可以保持各個組件之間的獨立性。

uvm_callback

? ? ? ? 通常情況下得到了一個封閉的包(pkg),其中的類如果有些成員方法需要修改,或者需要擴展新的方法時,應(yīng)該怎么做呢?如果這個包是外來的,那么維護方法不建議去修改這個類本身。callback方法可以為用戶提供自定義的處理方法。

? ? ? ? uvm_object本身提供了一些callback方法供用戶定義:

copy()? <=? do_copy()

print()? ?<=? do_print()

compare() <= do_compare()

pack() <= do_pack()

? ? ? ? 默認情況下,這些回調(diào)函數(shù)do_xxx是定義為空的。如果用戶執(zhí)行了uvm_object::copy()函數(shù),那么在該函數(shù)執(zhí)行末尾會自動執(zhí)行uvm_object::do_copy()。UVM是通過兩個相關(guān)類uvm_callback_iteruvm_callbacks #(T,CB)來實現(xiàn)函數(shù)回調(diào)的順序和繼承性的。

?輸出結(jié)果:

? ? ? ? 為了保證調(diào)用uvm_callback的組件類型T與uvm_callback類型CB保持匹配,建議使用宏`uvm_register_cb(T, CB)來進行綁定。

????????如果要將component同callback作關(guān)聯(lián),需要對其進行注冊,使用uvm_register_cbcallback類和component作綁定,綁定后可以通過在build_phase中使用uvm_callbacks #(comp1)::add(c1, m_cb1)?添加callback。使用uvm_register_cb之后,如果調(diào)用的T與CB不匹配,那么在檢查完匹配注冊表之后系統(tǒng)會打印warning信息,提示用戶使用回調(diào)函數(shù)的潛在問題。

? ? ? ? 此外,宏`uvm_do_callbacks_exit_on(T, CB, METHOD, VAL)可以進一步控制執(zhí)行回調(diào)函數(shù)的層次,簡單來講,回調(diào)函數(shù)會保持執(zhí)行直到返回值與給如的VAL值相同才會返回,譬如說我們給一個component綁定了三個回調(diào)函數(shù),順序執(zhí)行,假設(shè)執(zhí)行到第二個回調(diào)函數(shù)的時候返回值和VAL值相同,那么就直接返回而不會執(zhí)行第三個回調(diào)函數(shù)。這點使得回調(diào)函數(shù)方法在執(zhí)行順序上面有了更多的可控性。

callback函數(shù)使用總結(jié):

? ? ? ? 首先定義一個回調(diào)函數(shù)繼承于uvm_callback,并在其中定義function;然后使用`uvm_register_cb(T,?CB)和`uvm_do_callbacks(comp1, cb1, do_trans())綁定及插入callback函數(shù);在頂層把組件和callback都作例化,然后將?uvm_callbacks #(comp1)::add(c1, m_cb2); 把回調(diào)函數(shù)添加到組件中,形成一個組件-callback對子。







UVM基礎(chǔ)-TLM通信機制(二)的評論 (共 條)

分享到微博請遵守國家法律
云阳县| 白银市| 五莲县| 黎城县| 五台县| 勃利县| 康保县| 河北区| 互助| 昂仁县| 伊春市| 顺平县| 大埔区| 瑞丽市| 汤阴县| 长汀县| 永宁县| 湖州市| 渑池县| 武城县| 洪江市| 亳州市| 柳河县| 丰原市| 普安县| 崇明县| 许昌县| 高陵县| 新河县| 福建省| 耿马| 青冈县| 格尔木市| 沙湾县| 苗栗市| 苗栗县| 文山县| 买车| 晋州市| 娱乐| 屯留县|