UVM建造測試用例

(1)加入base_test

????????在一個實際應用的UVM驗證平臺中,my_env并不是樹根,通常來說,樹根是一個基于uvm_test派生的類真正的測試用例都是基于base_test派生的一個類

class base_test extends uvm_test;my_env         env;function new(string name = "base_test", uvm_component parent = null);super.new(name,parent);endfunctionextern virtual function void build_phase(uvm_phase phase);extern virtual function void report_phase(uvm_phase phase);`uvm_component_utils(base_test)
endclassfunction void base_test::build_phase(uvm_phase phase);super.build_phase(phase);env  =  my_env::type_id::create("env", this); uvm_config_db#(uvm_object_wrapper)::set(this,"env.i_agt.sqr.main_phase","default_sequence",my_sequence::type_id::get());
endfunctionfunction void base_test::report_phase(uvm_phase phase);uvm_report_server server;int err_num;super.report_phase(phase);server = get_report_server();err_num = server.get_severity_count(UVM_ERROR);if (err_num != 0) begin$display("TEST CASE FAILED");endelse begin$display("TEST CASE PASSED");end
endfunction

????????base_test派生自uvm_test,使用uvm_component_utils宏來注冊到factory中。在build_phase中實例化my_env,并設置sequencer的 default_sequence。需要注意的是,這里設置了default_sequence,其他地方就不需要再設置了。
????????除了實例化env外,base_test中做的事情在不同的公司各不相同。上面的代碼中出現了report_phase,在report_phase中根據 UVM_ERROR的數量來打印不同的信息。一些日志分析工具可以根據打印的信息來判斷DUT是否通過了某個測試用例的檢查。report_phase也是UVM內建的一個phase,它在main_phase結束之后執行。
????????除了上述操作外,還通常在base_test中做如下事情:第一,設置整個驗證平臺的超時退出時間;第二,通過config_db設置驗 證平臺中某些參數的值。這些根據不同的驗證平臺及不同的公司而不同,沒有統一的答案。
????????在把my_env放入base_test中之后,UVM樹的層次結構變為如圖2-11所示的形式。
????????top_tb中run_test的參數從my_env變成了base_test,并且config_db中設置virtual interface的路徑參數要做如下改變:

?

initial beginrun_test("base_test");
endinitial beginuvm_config_db#(virtual my_if)::set(null, "uvm_test_top.env.i_agt.drv", "vif", input_if);uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.env.i_agt.mon", "vif", input_if);uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.env.o_agt.mon", "vif", output_if);
end

(2)UVM中測試用例的啟動

????????要測試一個DUT是否按照預期工作,需要對其施加不同的激勵,這些激勵被稱為測試向量或pattern。一種激勵作為一個測試 用例,不同的激勵就是不同的測試用例。測試用例的數量是衡量驗證人員工作成果的最直接目標。
????????伴隨著驗證的進行,測試用例的數量一直在增加,在增加的過程中,很重要的一點是保證后加的測試用例不影響已經建好的 測試用例。在前面所有的例子中,通過設置default_sequence的形式啟動my_sequence。假如現在有另外一個my_sequence2,如何在 不影響my_sequence的前提下將其啟動呢?最理想的辦法是在命令行中指定參數來啟動不同的測試用例。
????????無論是在my_env中設置default_sequence,還是在base_test中或者top_tb中設置,都必須修改相關的設置代碼才能啟動 my_sequence2,這與預期相去甚遠。為了解決這個問題,先來看兩個不同的測試用例。my_case0的定義如下:

`ifndef MY_CASE0__SV
`define MY_CASE0__SV
class case0_sequence extends uvm_sequence #(my_transaction);my_transaction m_trans;function  new(string name= "case0_sequence");super.new(name);endfunction virtual task body();if(starting_phase != null) starting_phase.raise_objection(this);repeat (10) begin`uvm_do(m_trans)end#100;if(starting_phase != null) starting_phase.drop_objection(this);endtask`uvm_object_utils(case0_sequence)
endclassclass my_case0 extends base_test;function new(string name = "my_case0", uvm_component parent = null);super.new(name,parent);endfunction extern virtual function void build_phase(uvm_phase phase); `uvm_component_utils(my_case0)
endclassfunction void my_case0::build_phase(uvm_phase phase);super.build_phase(phase);uvm_config_db#(uvm_object_wrapper)::set(this, "env.i_agt.sqr.main_phase", "default_sequence", case0_sequence::type_id::get());
endfunction`endif

my_case1的定義如下:

`ifndef MY_CASE1__SV
`define MY_CASE1__SV
class case1_sequence extends uvm_sequence #(my_transaction);my_transaction m_trans;function  new(string name= "case1_sequence");super.new(name);endfunction virtual task body();if(starting_phase != null) starting_phase.raise_objection(this);repeat (10) begin`uvm_do_with(m_trans, { m_trans.pload.size() == 60;})end#100;if(starting_phase != null) starting_phase.drop_objection(this);endtask`uvm_object_utils(case1_sequence)
endclassclass my_case1 extends base_test;function new(string name = "my_case1", uvm_component parent = null);super.new(name,parent);endfunction extern virtual function void build_phase(uvm_phase phase); `uvm_component_utils(my_case1)
endclassfunction void my_case1::build_phase(uvm_phase phase);super.build_phase(phase);uvm_config_db#(uvm_object_wrapper)::set(this, "env.i_agt.sqr.main_phase", "default_sequence", case1_sequence::type_id::get());
endfunction`endif

????????在case1_sequence中出現了uvm_do_with宏,它是uvm_do系列宏中的一個,用于在隨機化時提供對某些字段的約束
????????要啟動my_case0,需要在top_tb中更改run_test的參數:

initial begin
run_test("my_case0");
end

????????而要啟動my_case1,也需要更改:

initial begin
run_test("my_case1");
end

????????當my_case0運行的時候需要修改代碼,重新編譯后才能運行;當my_case1運行時也需如此,這相當不方便。事實上,UVM提 供對不加參數的run_test的支持:

initial beginrun_test();
end

????????在這種情況下,UVM會利用UVM_TEST_NAME從命令行中尋找測試用例的名字,創建它的實例并運行。如下所示的代碼可 以啟動my_case0:

<sim command>
… +UVM_TEST_NAME=my_case0

????????而如下所示的代碼可以啟動my_case1:

<sim command>
… +UVM_TEST_NAME=my_case1

????????整個啟動及執行的流程如下圖所示

????????????????????????????????????????????????圖1 測試用例的啟動及執行流程
啟動后,整棵UVM樹的結構如下圖所示。

????????????????????????????????????????圖2 每個測試用例建立的UVM樹

????????圖2-13與圖2-11的唯一區別在于樹根的類型從base_test變成了my_casen。

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

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

相關文章

14-2(C++11)類型推導、類型計算

14-2&#xff08;C11&#xff09;類型推導、類型計算 類型推導auto關鍵字auto類型推斷本質auto與引用 聯用auto關鍵字的使用限制 類型計算類型計算分類與類型推導相比四種類型計算的規則返回值后置 類型推導 auto關鍵字 C98中&#xff0c;auto表示棧變量&#xff0c;通常省略…

Leetcode刷題筆記題解(C++):25. K 個一組翻轉鏈表

思路&#xff1a;利用棧的特性&#xff0c;K個節點壓入棧中依次彈出組成新的鏈表&#xff0c;不夠K個節點則保持不變 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ #include <stack> class Solution { …

在國內,現在月薪1萬是什么水平?

看到網友發帖問&#xff1a;現在月薪1W是什么水平&#xff1f; 在現如今的情況下&#xff0c;似乎月薪過萬這個標準已經成為衡量個人能力的一個標準了&#xff0c;尤其是現在互聯網橫行的時代&#xff0c;好像年入百萬&#xff0c;年入千萬就應該是屬于大眾的平均水平。 我不是…

kafka入門(四):消費者

消費者 (Consumer ) 消費者 訂閱 Kafka 中的主題 (Topic) &#xff0c;并 拉取消息。 消費者群組&#xff08; Consumer Group&#xff09; 每一個消費者都有一個對應的 消費者群組。 一個群組里的消費者訂閱的是同一個主題&#xff0c;每個消費者接收主題的一部分分區的消息…

大師學SwiftUI第18章Part2 - 存儲圖片和自定義相機

存儲圖片 在前面的示例中&#xff0c;我們在屏幕上展示了圖片&#xff0c;但也可以將其存儲到文件或數據庫中。另外有時使用相機將照片存儲到設備的相冊薄里會很有用&#xff0c;這樣可供其它應用訪問。UIKit框架提供了如下兩個保存圖片和視頻的函數。 UIImageWriteToSavedPh…

JAVA后端自學技能實操合集

JAVA后端自學技能實操 內容將會持續更新中,有需要添加什么內容可以再評論區留言,大家一起學習FastDFS使用docker安裝FastDFS(linux)集成到springboot項目中 內容將會持續更新中,有需要添加什么內容可以再評論區留言,大家一起學習 FastDFS 組名&#xff1a;文件上傳后所在的 st…

leetcode 100.相同的樹

涉及到遞歸&#xff0c;最好多畫圖理解&#xff0c;希望對你們有幫助 100.相同的樹 題目 給你兩棵二叉樹的根節點 p 和 q &#xff0c;編寫一個函數來檢驗這兩棵樹是否相同。 如果兩個樹在結構上相同&#xff0c;并且節點具有相同的值&#xff0c;則認為它們是相同的。 題目鏈接…

GPIO的使用--滴答定時器--pir人體紅外傳感器

目錄 一、滴答定時器的使用與原理 1、定義 2、原理 &#xff08;1&#xff09;向上計數?編輯 &#xff08;2&#xff09;向下計數 &#xff08;3&#xff09; 代碼流程 a、配置滴答時鐘喚醒頻率 b、滴答時鐘中斷函數 &#xff08;4&#xff09;結果 3、優化-->寄存…

Proxy Hook Trace JSON

Proxy var window {key: "qww",age: 22 } window new Proxy(window, {get(target, p, receiver) {console.log("target: ", target);console.log("p: ", p);// return window[username];/// 這里如果這樣寫. 有遞歸風險的...// return Reflec…

【線性代數與矩陣論】Jordan型矩陣

Jordan型矩陣 2023年11月3日 #algebra 文章目錄 Jordan型矩陣1. 代數重數與幾何重數2. Jordan塊與Jordan標準型2.1 最小多項式與Jordan標準型2.2 兩類重要矩陣 3. 矩陣的Jordan分解3.1 Jordan分解的應用 下鏈 1. 代數重數與幾何重數 在對向量做線性變換時&#xff0c;向量空間…

讀書筆記-《數據結構與算法》-摘要4[插入排序]

插入排序 核心&#xff1a;通過構建有序序列&#xff0c;對于未排序序列&#xff0c;在已排序序列中從后向前掃描(對于單向鏈表則只能從前往后遍歷)&#xff0c;找到相應位置并插入。實現上通常使用in-place排序(需用到O(1)的額外空間) 從第一個元素開始&#xff0c;該元素可…

如何主持一場知識競賽搶答賽

知識競賽主持說難不難&#xff0c;說簡單也不簡單&#xff0c;我就從易到難介紹一下。 入門級&#xff0c;題主不用練習太多其他花哨的技巧&#xff0c;只要注意一點&#xff0c;熟悉比賽流程。知識競賽需要給所有選手一個公平流暢的答題環境&#xff0c;所以題主自身必須非常…

干貨!接口中的大事務,該如何進行優化?

作為后端開發的程序員&#xff0c;我們常常會的一些相對比較復雜的邏輯&#xff0c;比如我們需要給前端寫一個調用的接口&#xff0c;這個接口需要進行相對比較復雜的業務邏輯操作&#xff0c;比如會進行&#xff0c;查詢、遠程接口或本地接口調用、更新、插入、計算等一些邏輯…

掌握iText:輕松處理PDF文檔-進階篇

簡體中文寫入 iText本身對簡體中文的支持有限&#xff0c;但可以通過引入額外的字體包來增強其對簡體中文的支持。例如&#xff0c;可以使用iTextAsian.jar這個亞洲字體包&#xff0c;它包含了幾種簡單的亞洲字體&#xff0c;其中包括簡體中文字體。只需要將iTextAsian.jar放到…

springboot 啟動之后報錯:Unsatisfied dependency through field ‘bbbClient’

springboot 啟動之后報錯&#xff1a;UnsatisfiedDepencyException:Error creating bean with name ‘aaaServiceImpl’: Unsatisfied dependency through field ‘bbbClient’。 這兩天一直在進行著日常 debugger 查看代碼。可是發生了一個挺“靈異”的事件。那就是我看的項目…

46. 全排列

46. 全排列 原題鏈接&#xff1a;完成情況&#xff1a;解題思路&#xff1a;參考代碼&#xff1a;_46全排列_構建數組回溯_46全排列_直接構建 錯誤經驗吸取 原題鏈接&#xff1a; 46. 全排列 https://leetcode.cn/problems/permutations/description/ 完成情況&#xff1a;…

codeforces D.In Love

思路 用兩個 m u l t i s e t multiset multiset 分別存 l , r l,r l,r 。你也可以寫平衡樹在 l l l 的 m u l t i s e t multiset multiset 里去查詢是否存在比最小的 r r r 大的 l l l 。 Think Twice, Code Once #include<bits/stdc.h> #define il inline #d…

小模型學習(1)-人臉識別

【寫作背景】因為最近一直在研究大模型&#xff0c;在與客戶進行交流時&#xff0c;如果要將大模型的變革性能力講清楚&#xff0c;就一定要能將AI小模型的一些原理和效果講清楚&#xff0c;進而形成對比。當然這不是一件簡單的事情&#xff0c;一方面大模型分析問題的的本質原…

Mybatis分頁插件PageHelper

PageHelper是什么&#xff1f; 是MyBatis提供的分頁插件&#xff0c;可以支持MySQL、Oracle等六種數據庫。 集成方式如下&#xff1a; 1 引入依賴 <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper --> <dependency><groupId>co…

反射加載SDK完成統一調用

文章目錄 1、需求背景2、接口抽象類具體實現類3、疑問4、存在的問題5、通過反射加載SDK并完成調用5、補充&#xff1a;關于業務網關7、補充&#xff1a;關于SDK的開發 關鍵點&#xff1a; 接口抽象類&#xff08;半抽象半實現&#xff09;具體實現類業務網關反射加載SDK&#…