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

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

從零開始,搭建一個簡單的UVM驗證平臺(一)

2022-10-10 23:38 作者:不吃蔥的酸菜魚  | 我要投稿

前言

? ? ? ? 這篇系列將從0開始搭建一個UVM驗證平臺,來幫助一些學習了SV和UVM知識,但對搭建完整的驗證環(huán)境沒有概念的朋友。

驗證平臺的組成

? ? ? ? ① 驗證平臺要模擬DUT的各種真實使用情況,這意味著要給DUT施加各種激勵,激勵的功能是由driver來實現(xiàn)的。

? ? ? ? ② 驗證平臺要能夠根據(jù)DUT的輸出來判斷DUT的行為是否與預期相符合,完成這個功能的是計分板(scoreboard,在SV中被稱為checker)。

? ? ? ? ③ 驗證平臺要收集DUT的輸出并把它們傳遞給scoreboard,完成這個功能的是monitor。

? ? ? ? ④ 驗證平臺要能夠給出預期結果。假設DUT是一個加法器,那么當在它的加數(shù)和被加數(shù)中分別輸入1,即輸入1+1時,期望DUT輸出2。當DUT在計算1+1的結果時,驗證平臺也必須相應完成同樣的過程,也計算一次1+1。在驗證平臺中,完成這個過程的是參考模型(reference model)。

? ? ? ? 一個簡單的驗證平臺框圖如圖所示。

DUT編寫(Design Under Test)

????????driver是驗證平臺最基本的組件,是整個驗證平臺數(shù)據(jù)流的源泉。

假設有一個DUT(design under test)被如下描述:

? ? ? ? 有如上一個DUT需要被我們驗證,上面這個設計的功能非常簡單,輸入數(shù)據(jù)data_i和其數(shù)據(jù)有效信號data_i_valid,打一拍輸出。data_o_valid是輸出數(shù)據(jù)有效信號。

Driver搭建

? ? ? ? UVM是一個庫,在這個庫中所有的東西幾乎都是用類(class)實現(xiàn)的。類是System verilog 面向?qū)ο缶幊陶Z言中最偉大的發(fā)明之一,是面向?qū)ο蟮木琛?/p>

? ? ? ? 類有函數(shù)(function)和任務(task),通過這些函數(shù)和任務可以完成driver的輸出激勵功能、完成monitor的監(jiān)測功能、完成參考模型的計算功能、完成scoreboard的比較功能。

? ? ? ? 類的三要素封裝、繼承和多態(tài),繼承是類最總要的特性之一,我們在搭建驗證環(huán)境時,要保證驗證平臺中所有的組件應該繼承于UVM中的類。

? ? ? ? UVM驗證平臺中的driver應該派生自uvm_driver,一個簡單的driver可以如下所示。

? ? ? ? 這個driver的功能就是向data_i發(fā)送256個隨機數(shù)據(jù),同時將輸入數(shù)據(jù)有效信號data_i_valid拉高,當數(shù)據(jù)發(fā)送完畢后,將data_i_valid信號拉低。在這個driver中有兩點需要注意:

? ? ? ? ① 所有派生自uvm_driver的類的new函數(shù)有兩個參數(shù),一個是string類型的name,一個是uvm_component類型的parent。這兩個參數(shù)是必不可少的是uvm_component所要求的。每一個派生自uvm_component或其派生的類在其new函數(shù)中需要指明兩個參數(shù):name和parent,這是uvm_componet類的一大特征。uvm_driver是一個派生自uvm_component的類,所以自然也會有name和parent兩個參數(shù)。

? ? ? ? ② driver所做的事幾乎都在main_phase中完成。UVM由phase來管理驗證平臺的運行,這些phase統(tǒng)一咦xxxx_phase來命名,且都有一個類型為uvm_phase、名字為phase的參數(shù)。main_phase是uvm_driver中預先定義好的一個任務。因此幾乎可以簡單地認為,實現(xiàn)一個driver等于實現(xiàn)其main_phase。

? ? ? ? 上圖為一個完整的phase全過程。?


? ? ? ? driver中還出現(xiàn)了uvm_info宏(除此之外還有uvm_error宏和uvm_warning宏),它有三個參數(shù),第一個參數(shù)是字符串,用于打印的信息歸類;第二個參數(shù)也是字符串,是具體需要打印的信息;第三個參數(shù)是冗余級別,表示這個命令的緊急程度。針對第三點,在驗證平臺中,某些信息是非常關鍵的,這樣的信息可以設置為UVM_LOW,而有些信息可有可無就可以設置為UVM_HIGH,介于兩者之間則是UVM_MEDIUM。UVM默認只顯示UVM_MEDIUM或者UVM_LOW的信息。

? ? ? ? uvm_info宏非常強大,它包含了打印信息的物理文件來源、邏輯節(jié)點信息(在UVM樹種的路徑索引)、打印時間、對信息的分類組織及打印的信息。因此在搭建驗證平臺時應該盡量使用uvm_info宏取代display語句。

? ? ? ? 定義了my_driver類后還需要將其實例化類的定義和類的實例化是存在區(qū)別的,類的定義是class-end塊,定義一個類,告訴類有哪些功能。而類的實例化是使用new()函數(shù)來創(chuàng)建一個實例。

? ? ? ? 仿真器接到new的指令后,就會在內(nèi)存中劃分出一塊空間,在劃分前,會首先檢查是否已經(jīng)預先定義過這個類,在已經(jīng)定義過的情況下,按照定義中所指示的“條文”分配空間,并且把這塊空間的指針返回給a_inst,之后就可以通過a_inst來查看類中的各個成員變量,調(diào)用成員函數(shù)/任務等。對于大部分類來說,如果只定義而不實例化,是沒有任何意義的;而如果不定義就直接實例化,仿真器就會報錯。

? ? ? ? 對my_driver實例化并且最終搭建的驗證平臺如下:? ? ? ??

仿真結果:

?在仿真窗口中可以看到,data is drived 被輸出了256次。

factory機制

? ? ? ? 到這里我們實現(xiàn)了使用driver給DUT送激勵的驗證操作,但其實用簡單的SV也能實現(xiàn)這樣的功能,使用UVM的特性需要引入factory機制,實現(xiàn):自動創(chuàng)建一個類的實例并調(diào)用其中的函數(shù)(function)和任務(task)。

在我們原來寫的生成激勵的driver.sv上做些修改:

????和之前的driver不同的是在class定義的中間加入了注冊宏:

? ? ? ? 引入了工廠機制之后,就可以自動化的運行類中的function和task,非常方便。在top_tb.sv文件中將my_driver的實例化和main_phase的調(diào)用替換為run_test("my_driver")

? ? ? ? 之所以會自動運行是因為,在注冊了工廠之后,run_test語句會自動創(chuàng)建一個my_driver的實例,并且會自動調(diào)用my_drivermain_phase。傳遞給run_test的是一個字符串,UVM會根據(jù)這個字符串創(chuàng)建了其所代表的一個實例。

? ? ? ? 注意:所有派生自uvm_component及其派生類的類,注冊的時候都應該使用uvm_componet_utils()宏注冊。

? ? ? ? 但從仿真的結果我們會發(fā)現(xiàn),輸出了main phase is called但是沒有輸出256次data is drived,而main_phase是一個完整的任務,沒理由只執(zhí)行第一句,而后面的代碼不執(zhí)行。這就牽扯到了UVM的objection機制。?

objection機制? ? ? ??

? ? ? ? 在上面的代碼中,我們并沒有使用finish函數(shù)來終止驗證平臺,但驗證平臺確實是關閉了。在UVM中通過objection機制來控制驗證平臺的關閉。

? ? ? ? 在每個phase中,UVM會檢查是否有objection被提起(raise_objection),如果有,那么等待這個objection被撤銷(drop_objection)后停止仿真;如果沒有,則馬上結束當前phase。

? ? ? ? 我們在前面使用工廠機制自動創(chuàng)建并執(zhí)行main_phase的實例my_driver中沒有提起objection,但是還是執(zhí)行了my_driver的第一條語句:

? ? ? ? 是不是和我們這里說的“如果沒有提起objection,則馬上結束當前phase”矛盾呢?其實不是的,這涉及到一個仿真時間片的概念,仿真器首先要進入到my_driver,才能檢測本實例是否把objection提起,在進入my_driver的0時刻,宏定義uvm_info就已經(jīng)執(zhí)行了,與此同時,仿真器沒檢測到objection被提起,繼而退出,這并不與uvm_info被執(zhí)行排斥。

? ? ? ? 加入objection機制在my_driver的main_phase首尾,在頭部raise_objection,在task尾部,drop_objection。

修改my_driver.sv的代碼為:

在執(zhí)行drop_objection語句之前,必須先調(diào)用raise_objection語句,這兩者總是成對出現(xiàn)。

? ? ? ? ?加入了raise_objection和drop_objection之后我們會發(fā)現(xiàn)"data is drived"按照預期輸出了256次。

????另外再提一點,UVM檢查是否提起objection,就是在進入main_phase的瞬間,因此,在進入main_phase之后就必須立刻提起objection,而不能經(jīng)過任何帶有延時的語句譬如@(posedge clk)或者 #1,但凡在raise_objection之前帶有延時語句,那么這個objection就不會被檢測到,進而導致main_phase立即退出。

? ? ? ? 至此,我們的一個僅含有driver的驗證平臺就搭建完了,到此為止我們總共涉及了幾個知識點:類的繼承與派生、factory工廠機制、phase機制、objection機制。后面我們還會在這基礎之上添加virtual interface、添加 transaction、monitor組件、agent組件以及sequence組件等等。



從零開始,搭建一個簡單的UVM驗證平臺(一)的評論 (共 條)

分享到微博請遵守國家法律
绥阳县| 右玉县| 中西区| 新宁县| 金阳县| 佛冈县| 曲麻莱县| 资溪县| 彩票| 论坛| 天津市| 卓资县| 上饶市| 铜山县| 西藏| 隆回县| 四川省| 诏安县| 张家口市| 博客| 临夏县| 东方市| 大埔县| 义马市| 衢州市| 班戈县| 抚顺市| 长子县| 花莲市| 舞阳县| 五华县| 应城市| 镇江市| 大庆市| 平顶山市| 根河市| 类乌齐县| 乌兰察布市| 阿拉善左旗| 土默特右旗| 双辽市|