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

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

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

2022-10-13 16:02 作者:不吃蔥的酸菜魚  | 我要投稿

前言

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

? ? ? ? 在上個上個文章中,已經(jīng)搭建了一個只有driver的驗證平臺,涉及到了類的繼承與派生、factory工廠機制、phase機制、objection機制。下面我們要對之前的平臺進行進一步完善。

interface & virtual interface

? ? ? ? 在前面的代碼中,driver的等待時鐘事件@(posedge top_tb.clk)以及DUT中輸入端口賦值(top_tb.data_i_valid <= 1'b1)都是使用的絕對路徑。假如clk信號的層次從top_tb.clk變成了top_tb.clk_inst.clk,那么就需要對原來的代碼進行大量修改。

? ? ? ? 避免使用絕對路徑的方式就是interface。在SystemVerilog中使用interface來鏈接驗證平臺與DUT的端口,interface的定義如下:

定義了interface之后,在top_tb中例化DUT時,就可以直接使用:

? ? ? ? 在module中可以聲明interface,但是如果要在driver中使用interface,因為driver是一個類,所以不能直接聲明interface(語法報錯),在類中使用的是virtual interface

? ? ? ? 因為driver類定義了interface,所以我們還需要將my_driver類中的main_phase任務(wù)中的data和valid信號用interface中的信號,修改后的含有interface的driver.sv為:

? ? ? ? 現(xiàn)在my_drive中的絕對路徑就消除了,提高了代碼的復(fù)用性。但是目前還存在一個問題:如何將top_tb中的input_if和my_driver中的vif對應(yīng)起來呢?

config_db機制

? ? ? ? 在top_tb里,我們生成激勵是用driver類來生成,driver生成激勵后送到driver中的virtual interface中的vif.data_if,如何把driver中的vif.data_if賦值給top_tb中的input_if.data_if呢?如果直接賦值:

? ? ? ? 會直接報錯,因為driver是UVM通過run_test語句實例化了一個脫離top_tb層次結(jié)構(gòu)的實例,建立了一個新的結(jié)構(gòu)。對于這種脫離top_tb層次結(jié)構(gòu),又希望在top_tb中對其進行某些操作的實例,需要用到UVM的config_db機制。

? ? ? ? config_db機制分為set和get兩個操作。

在top_tb中執(zhí)行set操作:

?在my_driver中執(zhí)行g(shù)et操作:

? ? ? ? 這里引用了build_phase,與main_phase一樣,是UVM內(nèi)建的一個phase,當(dāng)UVM啟動后,會自動執(zhí)行build_phase。build_phase在new函數(shù)之后,main_phase之前執(zhí)行。

? ? ? ? build_phase主要的作用就是通過config_db的set和get操作來做一些數(shù)據(jù)的配置和傳遞,以及實例化成員變量等。值得注意的是,super.build_phase這條語句是必須的,在父類uvm_build_phase 中執(zhí)行了一些必要的操作,必須顯式地調(diào)用并執(zhí)行它。

build_phase和main_phase的區(qū)別

? ? ? ? build_phase與main_phase的不同點在于,build_phase是一個function,而main_phase是一個task。我們知道task和function的最大區(qū)別就在于function是沒有延時的,即不消耗仿真時間,在仿真開始的瞬間就執(zhí)行了;而task類型的main_phase中則可以添加一些帶有延時的操作,譬如@(posedge clk)、wait等操作。

? ? ? ? 在build_phase中出現(xiàn)的uvm_fatal宏,這個宏和uvm_info的功能是差不多的,都是打印一些信息,它們的區(qū)別在于:uvm_fatal在打印第二個參數(shù)所示的信息后,會直接調(diào)用verilog 的finish函數(shù)來終止仿真。uvm_fatal的出現(xiàn),表示驗證平臺出現(xiàn)了重大問題而無法繼續(xù)下去,必須停止仿真并做相應(yīng)的檢查,只要是uvm_fatal打印的信息,就一定是非常關(guān)鍵的。

? ? ? ? config_db的set和get都有四個參數(shù),在set/get之前,有一個#(virtual my_if),這里跟的是我們需要傳輸?shù)臄?shù)據(jù)類型,因為我們要傳輸?shù)氖且粋€接口類型,所以填virtual my_if,如果要傳輸一個整型則寫config_db#(int)。

? ? ? ? set和get的第一和第二個參數(shù)后面再說,先講第三第四個參數(shù)。set的第二個參數(shù)是路徑索引,索引到操作的目標(biāo)所在的實例名稱;set和get的第三個參數(shù)必須完全一致(可以為變量名);set的第四個參數(shù)表示要把哪個interface傳遞給my_driver;get的第四個參數(shù)表示要把接收到的interface傳遞給my_driver的哪個成員變量。

階段代碼總結(jié)

????????到此為止,我們已經(jīng)寫了四個模塊,分別是:driver.sv、my_if.sv、top_tb.sv和dut.sv,代碼分別為:

dut.sv

driver.sv

my_if.sv

top_tb.sv

? ? ? ? 下面我們在上面的基礎(chǔ)上進行進一步的擴充和拓展。

添加transaction

? ? ? ? 接下來我們還要為我們的驗證平臺添加monitor、scoreboard、reference model等驗證平臺組件。這些組件之間的信息傳遞是基于transaction的,因此我們在添加組件之前,先要添加transaction。

? ? ? ? transaction是一個抽象的概念。一般來說,物理協(xié)議中的數(shù)據(jù)交換都是以幀或者包為單位的,通常在一幀或者一個包中要定義好各項參數(shù),一筆transactiin就是一個包。在不同的驗證平臺中會有不同的transaction。

transaction定義

? ? ? ? 在transaction定義中,有兩點值得注意:一是my_transaction的基類是uvm_sequence_item。在UVM中,所有的transaction都要從uvm_sequence_item派生,只有從uvm_sequence_item派生的transaction才可以使用UVM中強大的sequence機制;二是transaciton在使用factory機制時是使用uvm_object_utils,my_transaction和my_driver是由區(qū)別的:在整個仿真期間,driver是一直存在的,transaction不同,它在仿真的某一時間產(chǎn)生,經(jīng)過driver驅(qū)動,再經(jīng)過reference model處理,最終由scoreboard比較完成后,其生命周期就結(jié)束了。一般來說,這種類都是派生自uvm_object或者uvm_object的派生類。UVM中具有這種特征的類都要使用uvm_object_utils宏來注冊。

基于transaction的driver

? ? ? ? 完成transaction.sv的定義后,就可以在my_driver中實現(xiàn)基于transaction的驅(qū)動。

仿真結(jié)果:?

在transaction中循環(huán)了8次drive_password_trans任務(wù)。

在drive_password_trans任務(wù)中,我們傳輸一次password

drive_password_trans任務(wù)功能描述:

? ? ? ? 這里因為data_q設(shè)置的是8bit,而password一次是64bit的,所以設(shè)置data_q為隊列,需要入隊8次才能把password完整的存下來,所以我們for循環(huán)循環(huán)8次,每次讓8bit數(shù)據(jù)從隊列的尾部進入,也即push_back。

? ? ? ? 之后等待三個時鐘上升沿,然后把隊列中的首部數(shù)據(jù)(pop_front)排出送給my_driver的interface “vif”,直到隊列排空。

? ? ? ? 至此,我們就完成了添加transaction的driver設(shè)計,涉及到的知識有interface、virtual interface、config_db機制、transaction設(shè)計等內(nèi)容。至此不要忘了,我們加入transaction的目的是因為monitor、scoreboard等驗證組件之間的交互是通過transaction的,因此,接下來我們就要添加UVM的其他組件了。? ? ? ??



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

分享到微博請遵守國家法律
罗江县| 疏勒县| 安达市| 黄浦区| 淄博市| 钦州市| 济阳县| 肃宁县| 平安县| 万州区| 濮阳县| 通化市| 青海省| 榕江县| 蒙阴县| 印江| 芦山县| 青州市| 观塘区| 稻城县| 莲花县| 区。| 德州市| 肇庆市| 游戏| 靖安县| 融水| 栾川县| 贵德县| 新泰市| 宝坻区| 东至县| 临高县| 本溪| 会昌县| 金堂县| 迁安市| 嘉定区| 大渡口区| 容城县| 满洲里市|