UVM中的config_db機制傳遞interface

(1)定義interface

interface my_if(input clk, input rst_n);logic [7:0] data;logic valid;endinterface

(2)在tb中使用interface

????????定義了interface后,在top_tb中實例化DUT時,就可以直接使用。
????????先實例化interface

  my_if input_if(clk, rst_n);my_if output_if(clk, rst_n);

? ? ? ? 將interface與dut綁定

dut my_dut(.clk(clk),.rst_n(rst_n),.rxd(input_if.data),.rx_dv(input_if.valid),.txd(output_if.data),.tx_en(output_if.valid));

(3)在driver中使用interface

????????不能在class中直接例化interface,向下面的代碼是錯誤的:

class my_driver extends uvm_driver;
my_if drv_if;
…
endclass

????????在類中使用的是virtual interface。如下面的代碼所示:

class my_driver extends uvm_driver;virtual my_if vif;...
endclass

????????在聲明了vif后,就可以在main_phase中使用如下方式驅動其中的信號:

task my_driver::main_phase(uvm_phase phase);phase.raise_objection(this);`uvm_info("my_driver", "main_phase is called", UVM_LOW);vif.data <= 8'b0; vif.valid <= 1'b0;while(!vif.rst_n)@(posedge vif.clk);for(int i = 0; i < 256; i++)begin@(posedge vif.clk);vif.data <= $urandom_range(0, 255);vif.valid <= 1'b1;`uvm_info("my_driver", "data is drived", UVM_LOW);end@(posedge vif.clk);vif.valid <= 1'b0;phase.drop_objection(this);
endtask

(4)把top_tb中的input_if和my_driver中的vif對應起來

????????最簡單的方法莫過于直接賦值。此時一 個新的問題又擺在了面前:在top_tb中,通過run_test語句建立了一個my_driver的實例,但是應該如何引用這個實例呢?不可能像 引用my_dut那樣直接引用my_driver中的變量:top_tb.my_dut.xxx是可以的,但是top_tb.my_driver.xxx是不可以的。這個問題的終極 原因在于UVM通過run_test語句實例化了一個脫離了top_tb層次結構的實例,建立了一個新的層次結構。
????????對于這種脫離了top_tb層次結構,同時又期望在top_tb中對其進行某些操作的實例,UVM引進了config_db機制。在config_db機 制中,分為set和get兩步操作。所謂set操作,讀者可以簡單地理解成是“寄信”,而get則相當于是“收信”。在top_tb中執行set操作

initial beginuvm_config_db#(virtual my_if)::set(null, "uvm_test_top", "vif", input_if);
end

????????在my_driver中,執行get操作:

   virtual function void build_phase(uvm_phase phase);super.build_phase(phase);`uvm_info("my_driver", "build_phase is called", UVM_LOW);if(!uvm_config_db#(virtual my_if)::get(this, "", "vif", vif))`uvm_fatal("my_driver", "virtual interface must be set for vif!!!")endfunction

????????這里引入了build_phase。與main_phase一樣,build_phase也是UVM中內建的一個phase當UVM啟動后,會自動執行 build_phase。build_phase在new函數之后main_phase之前執行在build_phase中主要通過config_db的set和get操作來傳遞一些數據, 以及實例化成員變量等。需要注意的是,這里需要加入super.build_phase語句,因為在其父類的build_phase中執行了一些必要的操 作,這里必須顯式地調用并執行它。build_phase與main_phase不同的一點在于,build_phase是一個函數phase,而main_phase是一個 任務phase,build_phase是不消耗仿真時間的。build_phase總是在仿真時間($time函數打印出的時間)為0時執行
????????在build_phase中出現了uvm_fatal宏,uvm_fatal宏是一個類似于uvm_info的宏,但是它只有兩個參數,這兩個參數與uvm_info宏 的前兩個參數的意義完全一樣。與uvm_info宏不同的是,當它打印第二個參數所示的信息后,會直接調用Verilog的finish函數來結 束仿真。uvm_fatal的出現表示驗證平臺出現了重大問題而無法繼續下去,必須停止仿真并做相應的檢查。所以對于uvm_fatal來 說,uvm_info中出現的第三個參數的冗余度級別是完全沒有意義的,只要是uvm_fatal打印的信息,就一定是非常關鍵的,所以無 需設置第三個參數。
????????config_db的set和get函數都有四個參數,這兩個函數的第三個參數必須完全一致。set函數的第四個參數表示要將哪個interface 通過config_db傳遞給my_driver,get函數的第四個參數表示把得到的interface傳遞給哪個my_driver的成員變量set函數的第二個參 數表示的是路徑索引,即在2.2.1節介紹uvm_info宏時提及的路徑索引。在top_tb中通過run_test創建了一個my_driver的實例,那么 這個實例的名字是什么呢?答案是uvm_test_topUVM通過run_test語句創建一個名字為uvm_test_top的實例
????????無論傳遞給run_test的參數是什么,創建的實例的名字都為uvm_test_top。由于set操作的目標是my_driver,所以set函數的第二 個參數就是uvm_test_top。
????????set函數與get函數使用雙冒號是因為這兩個函數都是靜態函數,而 uvm_config_db#(virtual my_if)則是一個參數化的類,其參數就是要寄信的類型,這里是virtual my_if。

(5)通過config_db機 制向變量傳遞值

????????假如要向my_driver的var變 量傳遞一個int類型的數據,那么可以使用如下方式:

initial begin
uvm_config_db#(int)::set(null, "uvm_test_top", "var", 100);
end

????????而在my_driver中應該使用如下方式:

class my_driver extends uvm_driver;int var;virtual function void build_phase(uvm_phase phase);super.build_phase(phase);`uvm_info("my_driver", "build_phase is called", UVM_LOW);if(!uvm_config_db#(virtual my_if)::get(this, "", "vif", vif))`uvm_fatal("my_driver", "virtual interface must be set for vif!!!")if(!uvm_config_db#(int)::get(this, "", "var", var))`uvm_fatal("my_driver", "var must be set!!!")
endfunction

????????從這里可以看出,可以向my_driver中“寄”許多信。上文列舉的兩個例子是top_tb向my_driver傳遞了兩個不同類型的數據,其 實也可以傳遞相同類型的不同數據。假如my_driver中需要兩個my_if,那么可以在top_tb中這么做:

initial beginuvm_config_db#(virtual my_if)::set(null, "uvm_test_top", "vif", input_if);uvm_config_db#(virtual my_if)::set(null, "uvm_test_top", "vif2", output_if);
end

????????在my_driver中這么做:

virtual my_if vif;
virtual my_if vif2;virtual function void build_phase(uvm_phase phase);super.build_phase(phase);`uvm_info("my_driver", "build_phase is called", UVM_LOW);if(!uvm_config_db#(virtual my_if)::get(this, "", "vif", vif))`uvm_fatal("my_driver", "virtual interface must be set for vif!!!")if(!uvm_config_db#(virtual my_if)::get(this, "", "vif2", vif2))`uvm_fatal("my_driver", "virtual interface must be set for vif2!!!")
endfunction

???????????????注意:set和get函數,這兩個函數的第三個參數必須完全一致

參考:UVM實戰



?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214270.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214270.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214270.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【面試總結】Java面試題目總結(一)

&#xff08;以下僅為個人見解&#xff0c;如果有誤&#xff0c;歡迎大家批評并指出錯誤&#xff0c;謝謝大家&#xff09; 1.項目中的驗證碼功能是如何實現的&#xff1f; 第一步&#xff1a;在項目的pom.xml文件中導入 EasyCaptcha 的依賴&#xff1b; <dependency>…

軟件崩潰時Visual Studio中看不到有效的調用堆棧,使用Windbg動態調試去分析定位

目錄 1、問題說明 2、使用Windbg查看崩潰時詳細的函數調用堆棧

SQL命令---修改字段名

介紹 使用sql語句修改字段名。 命令 alter table 表名 change 舊字段名 新字段名 新數據類型;例子 將a表id字段名改為id1 alter table a change id id1 int(12) NOT NULL;

20231207給NanoPC-T4(RK3399)開發板刷Android12的挖掘機方案的LOG

20231207給NanoPC-T4(RK3399)開發板刷Android12的挖掘機方案的LOG 2023/12/7 23:50 SDK&#xff1a;rk356x_android12_220722.tgz 只修改DTS的DTC部分就【直接】可以跑NanoPC-T4 參考資料&#xff1a; http://www.friendlyelec.com.cn/agent.asp http://www.friendlyelec.com.c…

[python高級編程]:01-數據結構

此系列主要用于記錄Python學習過程中查閱的優秀文章&#xff0c;均為索引方式。其中內容只針對本作者一人&#xff0c;作者熟悉了解的內容不再重復記錄。 目錄 01-列表推導式 列表推導同filter和map的比較 02-元組 元組拆包 具名元組 01-列表推導式 列表推導同filter和map的比…

實現安裝“自由化”!在Windows 11中如何繞過“您嘗試安裝的應用程序未通過微軟驗證”

這篇文章描述了如果你不能安裝應用程序,而是當你在Windows 11中看到消息“您嘗試安裝的應用程序未通過微軟驗證”時該怎么辦。完成這些步驟將取消你安裝的應用程序必須經過Microsoft驗證的要求。 使用設置應用程序 “設置”應用程序提供了繞過此警告消息的最簡單方法,以便你…

Windows10下MySQL5.7.31解壓版安裝與卸載

一、安裝 1進入官網下載MySQL5.7.31解壓版&#xff1a; MySQL :: Download MySQL Community Server (Archived Versions) 2解壓文件 解壓目錄到D:\developer_tools\MySQL\mysql-5.7.31-winx64&#xff0c;在bin同級目錄下創建my.ini文件&#xff0c;寫入以下代碼&#xff1…

python簡易學生管理 + MySQL

數據庫表 Python代碼部分 import pymysqlclass StMgmt(object):def tips(self):"""提示用戶選擇的操作"""print("""學生管理系統 1.01.查看所有信息2.查看學生信息3.修改學生信息4.增加學生信息5.退出學生系統"""…

【網絡安全技術】傳輸層安全——SSL/TLS

一、TLS位置及架構 TLS建立在傳輸層TCP/UDP之上&#xff0c;應用層之下。 所以這可以解決一個問題&#xff0c;那就是為什么抓不到HTTP和SMTP包&#xff0c;因為這兩個在TLS之上&#xff0c;消息封上應用層的頭&#xff0c;下到TLS層&#xff0c;TLS層對上層消息整個做了加密&…

數的劃分(遞歸)

題目名字 數的劃分 題目鏈接 題意 給數字n&#xff0c;講數字n分為m份&#xff0c;共有多少種分法&#xff0c;不能重復&#xff0c;分成一樣的數字也不行 思路 看到這種分數字的先化成有多少個球要分到多少個籃子里去再想兩個分法并且加起來&#xff0c;一個是每個籃子最多只…

<JavaEE> 經典設計模式之 -- 單例模式(“餓漢模式”和“懶漢模式”實現單例模式)

目錄 一、單例模式概述 二、“餓漢模式”實現單例模式 三、“懶漢模式”實現單例模式 3.1 單線程下的“懶漢模式” 3.2 多線程下的“懶漢模式” 一、單例模式概述 1&#xff09;什么是單例模式&#xff1f; 單例模式是一種設計模式。 單例模式可以保證某個類在程序中只存…

【Java數據結構 -- 順序表】

List和ArrayList與順序表 一. List1.1 List介紹2.1 常見接口介紹3.1 List的使用 二. ArrayList與順序表1.線性表2.順序表2.1 接口的實現2.2 順序表的創建2.3 順序表的打印2.4 順序表的插入2.5 順序表的按索引位置插入數據2.6 判斷順序表是否包含某個數2.7 返回順序表某個數的索…

Java 22種設計模式詳解

22種設計模式詳解 創建型模式單例模式工廠方法模式抽象工廠模式建造者模式原型模式 結構型模式適配器模式橋接模式組合模式裝飾器模式代理模式外觀模式享元模式享元模式原理&#xff1a;享元模式角色&#xff1a;示例代碼&#xff1a; 行為型模式模板方法模式原理角色示例代碼命…

UEFI 學習筆記

引言 相比于Windows/MacOS/Linux等主流的操作系統,大部分人對于固件BIOS(Basic Input & Output System)并不熟悉,它誕生于1981年出產的第一代個人計算機IBM PC,在那時工程師將硬件檢測代碼、最基本的外圍設備I/O處理程序和操作系統引導程序代碼寫入僅有32KB大小的PRO…

(1)(1.4) ESP32 wifi telemetry

文章目錄 前言 1 用于ESP32的DroneBridge 2 推薦的硬件 3 下載和燒錄固件 4 為ESP32配置DroneBridge 前言 ESP32 是現成的 Wi-Fi 模塊&#xff0c;具有完整的 TCP/IP 協議棧和微控制器功能。它們提供專用的 UART、SPI 和 I2C 接口。它們可與任何 ArduPilot 自動駕駛控制器…

2023-12學習筆記

1.NonNull要手動寫無參構造器 這是一個我今天研究了很久的問題&#xff0c;開始不知道原因是在這里&#xff0c;還在那想是不是Data覆蓋了無參構造&#xff0c;結果當然不是。先說下解決歷程 1.問題起因 通過RequestBody接收前端報文的時候報錯&#xff0c;大致是說我構造方…

python中tkinter實現GUI程序:三個實例

python中tkinter實現GUI程序 寫在最前面Python中使用Tkinter實現GUI程序的基本元素Tkinter簡介基本元素1. 根窗口&#xff08;Root Window&#xff09;2. 小部件&#xff08;Widgets&#xff09;3. 布局管理4. 事件處理 1.用 tkinter實現一個簡單的 GUI程序,單擊“click”按鈕&…

項目方看過來,詳解Moonbeam Grants申請技巧

Grants加速計劃是Moonbeam基金會發起的生態資助計劃&#xff0c;旨在支持生態系統中的不同項目、社區和個人&#xff0c;幫助他們順利進入Moonbeam發展&#xff0c;依靠早期的生態扶持迅速成長。 每一份Grant計劃旨在融合社區參與、包容性和透明度等特性&#xff0c;加速Moonb…

Java項目-瑞吉外賣Day3

填充公共字段&#xff1a; 目的&#xff1a;由于某些屬性&#xff0c;例如createdTime這些需要填充的字段會在多個地方出現&#xff0c;所以考慮使用公共字段自動填充的辦法減少重復代碼。 在對應屬性上加入TableField注解。通過fill字段表明策略&#xff0c;是插入/更新的時候…

Android studio之ConstraintLayout使用

文章目錄 優勢使用ConstraintLayout的步驟使用多種方式定義控件的位置 優勢 ConstraintLayout是一個相對布局&#xff0c;是在Android 2.3版本中引入的。它可以在不同的屏幕大小和分辨率中提供一致的布局&#xff0c;并且是支持復雜布局的最佳選擇之一。ConstraintLayout相對于…