初識m_sequencer、p_sequencer和uvm_declare_p_sequencer巨集

来源:https://www.cnblogs.com/ChengMobai/archive/2023/02/26/m_sequencer-p_sequencer-uvm_declare_p_sequencer.html
-Advertisement-
Play Games

一、m_sequencer 1、什麼是m_sequencer m_sequencer是定義在uvm_sequencer_item中的,uvm_sequencer_base類型的句柄,也就是說 m_sequencer是uvm_sequencer_item的成員變數 m_sequencer是指向uvm_ ...


一、m_sequencer

1、什麼是m_sequencer

m_sequencer是定義在uvm_sequencer_item中的,uvm_sequencer_base類型的句柄,也就是說

  • m_sequencer是uvm_sequencer_item的成員變數
  • m_sequencer是指向uvm_sequencer_base的句柄
  • 任何派生於uvm_sequencer_item的類都會擁有一個m_sequencer

m_sequencer源碼如下:

  class uvm_sequence_item extends uvm_transaction;
      ...
   protected uvm_sequencer_base m_sequencer;
      ...
  endclass

m_sequencer在類庫中的關係如下圖紫色箭頭所示:

2、為什麼要有m_sequencer

sequence屬於object,sequencer屬於component。

正常來說,sequence無法與sequencer進行交互,也不可能通過component的結構層次獲得頂層配置及其他信息。因此需要一個能溝通sequence和sequencer的橋梁,m_sequencer就是這個橋梁。

3、怎麼使用m_sequencer

通常調用uvm_do系列巨集時,uvm能夠自動根據傳入的sequence或sequence_item調用對應的方法。使m_sequencer由指向uvm_sequencer_base,變為指向用戶指定的sequencer,(例如類庫中的your_sequencer),如下圖藍色虛線將變為紫色實線。

由此搭建了sequence和sequencer的橋梁,調用其他方法同理(不管是什麼方法,沒有改變m_sequencer指向給定的sequencer這一本質)。

因此使用者只需要調用所需方法,有關於m_sequencer的使用由uvm自動完成了。

值得註意的一點是用戶指定的sequencer是uvm_sequencer_base的子類,對於m_sequencer而言,此時是父類句柄指向了子類對象,這也為下麵的動態轉換打下了基礎。

二、p_sequencer

1、什麼是p_sequencer

p_sequencer是由`uvm_decalre_p_sequencer巨集,定義在用戶指定的sequence(例如類庫中的your_sequence)中的,用戶指定的類型的句柄(例如類庫中的your_sequencer),也就是說

  • p_sequencer是由uvm_decalre_p_sequencer巨集產生的
  • p_sequencer是用戶指定的sequence的成員變數(這裡是your_sequence的成員變數,因為`uvm_decalre_p_sequencer巨集是在your_sequence中使用的)
  • p_sequencer是指向用戶指定的類型的句柄(這裡是your_sequencer的成員變數)

p_sequencer源代碼如下:

  `define uvm_declare_p_sequencer(SEQUENCER) 
    SEQUENCER p_sequencer; //SEQUENCER是由用戶指定的類型
    virtual function void m_set_p_sequencer();
      super.m_set_p_sequencer(); //父類的m_set_p_sequencer是空函數
      if (!$cast(p_sequencer, m_sequencer)) 
      `uvm_fatal("DCLPSQ", $sformatf("%m %s Error casting p_sequencer, please verify that this sequence/sequence item is intended to execute on this type of sequencer", get_full_name())) 
    endfunction

可能到這裡還是有些抽象,接下來我們進行一個更為形象的說明。

2、為什麼需要p_sequencer

在sequence機制中,sequence就像是一個快遞,它可以裝入商品(sequence_itm),也可以裝入另一個快遞(sequence);sequencer就像是商家,他把快遞交給物流公司(driver),物流公司再把快遞交給用戶(DUT)。

當有很多個快遞時,物流公司怎麼知道把哪個快遞交給哪個用戶呢,這就需要商家給快遞上註明收貨人和發貨人的信息(your_sequencer中的dmac和smac等)。

也就是說your_sequence要訪問your_sequencer中的成員變數dmac和smac,雖然這是your_sequence中的m_sequencer經過調用`uvm_do後已經指向了your_sequencer,但此時他的類型還是uvm_sequencer_base,而uvm_sequencer_base是your_sequencer的父類。父類句柄直接訪問子類對象是不允許的。

因此我們需要將m_sequencer的類型轉換成子類類型(也就是your_sequencer)。

首先我們在your_sequencer中聲明瞭一個your_sequencer類型的句柄x_sequencer,再將m_sequencer動態轉換成子類句柄,這樣your_sequence就可以訪問your_sequencer的成員變數了。

代碼如下:

  class your_sequence extends uvm_sequence #(your_transaction);
	your_trasaction your_trans;
	`uvm_object_utils(your_squence)
	...
	
	virtual task body();
		your_sequencer x_sequencer;//聲明x_sequencer
		...
		$cast(x_sequencer,m_sequencer);//動態轉換
		...
	repeat(10) 
		begin
		`uvm_do_with(m_trans,{your_trans.dmac==x_sequencer.dmac;
		                      your_trans.smac==x_sequencer.smac;})//訪問your_sequencer中的變數
		end
	...
  endclass

如此一來,快遞(your_sequence)上就有了一個標明瞭收貨發貨信息(dmac和smac)的快遞面單,物流公司(driver)就可以按照快遞單來派送了。

但是每次都需要通過聲明x_sequencer,再動態轉換就像人工手寫快遞面單一樣繁瑣,因此uvm將上述過程封裝成立巨集`uvm_declare_p_sequencer,以後就可以自動列印快遞面單了

3、怎麼使用p_sequencer

只需要在你需要的sequence中調用巨集uvm_declare_p_sequencer(SEQUENCER) ,uvm將自動做以下事情:

  • 聲明一個x_sequencer,指向SEQUENCER(這裡your_sequencer)。
  • 將m_sequencer動態轉換成子類句柄。

你所需要做的只是考慮需要把哪些信息列印到快遞面單上了。

參考資料

1.《UVM實戰 捲Ⅰ》 張強著
2.《晶元驗證漫游指南——從系統理論到UVM的驗證全視界》劉斌著
3. 晶元驗證面試必考題:m_sequencer​與p_sequencer的區別是什麼?https://zhuanlan.zhihu.com/p/436911218


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 模板 函數模板 template<typename T1,typename T2,……> 定義了必須使用,否則報錯 template<typename T> T add(T a,T b) { return a + b; } 根據具體的使用情況生成模板函數 add(1.1,2.1); //生成doub ...
  • 一、繼承的基本概念 ​ 繼承:子類繼承父類的屬性和行為 ​ 作用:代碼復用 繼承分類: 1. 按訪問屬性分為public、private、protected三類 1)public: 父類屬性無更改,pubic, private, protected 仍是自己本身(子類成員函數可以訪問父類的publi ...
  • 引言 使用Spring Innitializer創建SpringBoot項目 解決方案 引言 筆者使用的IDEA版本為2020.2.4, 在使用Spring Innitializer創建SpringBoot項目後, SpringBoot項目無法被識別IDEA正常識別, 本文將來解決這個問題. 使用S ...
  • 1、錯誤提示信息如下: com.alibaba.fastjson.JSONException: exepct '[', but string, pos 4, json : "[{"attrId":33,"attrName":"粗跟"},{"attrId":44,"attrName":"厚底"}]" ...
  • Java流程式控制制:用戶交互Scanner、選擇結構 用戶交互Scanner Scanner類用於獲取用戶的輸入 基本語法: Scanner s = new Scanner(System.in);s.close(); package com.qiu.first.scanner;​import java ...
  • 1 func absInt(x int) int { 2 if x < 0 { 3 return -x 4 } 5 return x 6 } 下麵會用到此方法, int類型值取絕對值 1 type sp_item struct { 2 x int 3 y int 4 g int 5 h int 6 ...
  • (Java刷題常用的數據結構總結) 1. 基礎運算 //int型相關操作 Integer.INT_MAX;//int型最大值 Integer.INT_MIN;//int型最小值 long name;//註意:沒有c語言裡面的long long (int)n1%(int)n2;//取餘運算,針對int ...
  • 歡迎關註個人公眾號:愛喝可可牛奶 LeetCode 39. 組合總和 40.組合總和II 131.分割迴文串 LeetCode 39. 組合總和 分析 回溯可看成對二叉樹節點進行組合枚舉,分為橫向和縱向 每次往sum添加新元素時,必須明確從can哪個位置開始,定義變數pos 返回條件 sum == ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...