設計模式在芯片驗證中的應用——模板方法

一、模板方法

模板方法(Template Method)設計模式是一種行為設計模式, 它在父類中定義了一個功能的框架, 允許子類在不修改結構的情況下重寫功能的特定步驟。也就是模板方法定義了一組有序執行的操作,將一些步驟的實現留給子類,同時保持整體功能結構。該技術通常也用于為主要操作提供預處理和后處理的鉤子(hook)。

UVM庫用了很多模板方法,比如uvm_sequence里的pre_body()和post_body()就是body()方法的鉤子,在分別允許用戶在body()執行之前和之后做一些其它處理。

模板方法設計模式主要包括以下幾個組件:

  • 抽象類 (Abstract-Class):會聲明完成一個功能所需各個步驟的方法, 以及依次調用它們實際步驟。 功能步驟可以被聲明為抽象類型, 也可以提供一些默認實現。另外也可以提供一些放在主要功能步驟之前或之后的可選步驟方法(鉤子),這些方法為子類提供額外的功能擴展點。
  • 具體類 (Concrete-Class):可以重寫所有步驟實現, 但不能重寫模板方法自身執行各個步驟方法的順序。

我們以UVM中的monitor來舉個模板方法應用的例子,利用模板方法可以擴展monitor主要功能,而且不容易誤破壞monitor主功能。在base monitor組件中定義了非virtual的collect_transactions()模板方法,并提供了空的pre_collect()和post_ collect ()鉤子方法。在繼承的子monitor中,通過實現pre_ collect ()和post_ collect ()的具體內容,來提供了特定項目需求的操作。然后使用UVM factory方法將子monitor的對象去替換base monitor的對象。

下圖為模板方法設計模式在monitor中應用的UML類圖。

二、參考代碼

monitor的模板方法設計模式參考代碼如下:

class base_monitor extends uvm_monitor;`uvm_component_utils (base_monitor)function new(string name = " base_monitor ", uvm_component parent=null);super.new(name, parent);endfunction : newtask collect_transactions();pre_collect();collect();post_collect();endtask : collect_transactionsvirtual task pre_collect();`uvm_info("PRE_COLLECT", "EMPTY method", UVM_LOW)endtask : pre_collecttask collect();`uvm_info("COLLECT", "collect begin", UVM_LOW)`uvm_info("COLLECT", "collect end", UVM_LOW)endtask : collectvirtual task post_collect();`uvm_info("POST_COLLECT", "EMPTY method", UVM_LOW)endtask : post_collectendclass : base_monitor

模板方法設計模式-具有空鉤子的base monitor

class son_monitor extends base_monitor;`uvm_component_utils (son_monitor)function new(string name = " son_monitor ", uvm_component parent=null);super.new(name, parent);endfunction : newvirtual task pre_collect();`uvm_info("PRE_COLLECT", "PRE: collect item", UVM_LOW)endtask : pre_collectvirtual task post_collect();`uvm_info("POST_COLLECT", "POST: collect item", UVM_LOW)endtask : post_collectendclass : son_monitor

模板方法設計模式-帶有實現鉤子的son monitor

模擬測試代碼如下:

// Use UVM factory overrde in the uvm_env
set_type_override_by_type(base_monitor::get_type(), son_monitor::get_type(), 'b0);

輸出仿真日志如下:

 | # UVM_INFO ?@ 0.000ns: uvm_test_top.env.agent.mon_h [PRE_COLLECT] EMPTY method| # UVM_INFO ?@ 0.000ns: uvm_test_top.env.agent.mon_h [COLLECT] collect begin| # UVM_INFO ?@ 0.000ns: uvm_test_top.env.agent.mon_h [COLLECT] collect end| # UVM_INFO ?@ 0.000ns: uvm_test_top.env.agent.mon_h [POST_COLLECT] EMPTY method

模板方法設計模式-帶有空鉤子的base monitor的輸出結果

 | # UVM_INFO ?@ 0.000ns: uvm_test_top.env.agent.mon_h [PRE_COLLECT] PRE: collect item| # UVM_INFO ?@ 0.000ns: uvm_test_top.env.agent.mon_h [COLLECT] collect begin| # UVM_INFO ?@ 0.000ns: uvm_test_top.env.agent.mon_h [COLLECT] collect end| # UVM_INFO ?@ 0.000ns: uvm_test_top.env.agent.mon_h [POST_COLLECT] POST: collect item

模板方法設計模式-帶有實現鉤子的子monitor的輸出結果

輸出仿真文件顯示了模板方法模式的效果。在前者中,消息由具有空pre_collect()和post_collect()鉤子的base monitor生成。在后一種情況下,將使用子monitor的實例,并使用已實現的鉤子,這些鉤子可用于特定于項目的處理,且無需修改base monitor的代碼。子monitor主要的collect()方法繼承自base monitor,因此兩種情況下保持一致。模板方法collect_transactions()確保鉤子會在主函數collect()之前和之后合適的地方被調用了。

模板方法的通常使用方式就是定義一個基本的抽象類,并且指定哪些抽象方法需要再子類中實現。模板方法的主要缺點就是,如果父類和子類都實現了復雜的功能,調試起來將非常麻煩。

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

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

相關文章

把自己的垃圾代碼發布到官方中央倉庫

參考博客:將組件發布到maven中央倉庫-CSDN博客 感謝這位博主。但是他的步驟有漏缺,相對進行補充 訪問管理頁面 網址:Maven Central 新注冊賬號,或者使用github快捷登錄,建議使用github快捷登錄 添加命名空間 注意&…

連接mysql的java代碼

要在Java中連接MySQL數據庫,你需要以下幾個步驟: 導入MySQL JDBC驅動:在項目中添加MySQL JDBC驅動的依賴。如果你使用的是Maven,可以在pom.xml中添加依賴;如果使用的是Gradle,可以在build.gradle中添加依賴;如果不使用構建工具,需要手動下載驅動并添加到項目中。 編寫J…

【Linux】進程通信實戰 —— 進程池項目

送給大家一句話: 沒有一顆星,會因為追求夢想而受傷,當你真心渴望某樣東西時,整個宇宙都會來幫忙。 – 保羅?戈埃羅 《牧羊少年奇幻之旅》 🏕?🏕?🏕?🏕?🏕?🏕? &a…

flink cdc mysql整理與總結

文章目錄 一、業務中常見的需要數據同步的場景CDC是什么FlinkCDC是什么CDC原理為什么是FlinkCDC業務場景flink cdc對應flink的版本 二、模擬案例1.阿里云flink sql2.開源flink sql(單機模式)flink 安裝安裝mysql3.flink datastream 三、總結 提示:以下是本篇文章正文…

mac中文件夾怎么顯示.git隱藏文件

1. 打開終端應用程序,然后進入到包含.git文件夾的目錄,可以使用以下命令來顯示隱藏文件和文件夾: defaults write com.apple.finder AppleShowAllFiles YES 2. 然后重啟 Finder: killall Finder

kali基本掃描工具(自帶)

免責聲明:本文僅做技術交流與學習...請勿非法破壞... 詳細用法: 命令 -h/百度/翻譯 fping 用法 hostlist 文件里面為ip fping -a -q -f hostlist -a 只看存活的 fping -g 202.100.1.1 202.100.1.255 -a -q > Ahost 輸出到Ahost文件上 nping nping -c 1 201.100.2.155-244 …

工具方法 - 如何在網上找資料

在查詢USB相關的技術資料時,官網的文檔中心里找到個spec的記錄,但下載鏈接沒有。然后在Google上搜索: fileytpe:pdf my_keyword 只找到一個收費的文檔下載網站,這讓我不開心。 于是在Yandex上搜了下,找到了兩個網站可以…

香橙派AIpro使用SSH遠程登錄

香橙派AIpro可以連接HDMI顯示器使用,也可以遠程登錄。這里采用MobaXterm軟件遠程登錄開發板。 首先要使得控制電腦和香橙派開發板連接到同一個局域網,兩者的IP地址能夠ping通。在Windows 下可以使用MobaXterm 遠程登錄開發板,首先新建一個ss…

屬于程序員的浪漫,一顆會跳動的心!!!

繪制一顆會跳動的心? 嘿嘿 可以說是程序員的專屬浪漫了吧,就像點燃一顆LED燈一樣?(我瞎說的啊,大家別當真,我很菜的!!!!) 程序就在下面啦,然…

hive結合Hbase實現實時數據處理和批量分析

問題背景 Hive主要設計為一個用于大數據集的批處理查詢引擎,并不是為實時查詢或實時數據更新而設計的。它主要用于執行數據摘要、查詢和分析。因此,Hive本身不支持實時數據更新或實時查詢,它更適合用于對大量數據進行批量處理和分析。 分析…

Java8Stream

目錄 什么是Stream? IO流: Java8Stream: 什么是流? stream圖解 獲取流 集合類,使用 Collection 接口下的 stream() 代碼 數組類,使用 Arrays 中的 stream() 方法 代碼 stream,使用 Stream 中的…

重生之 SpringBoot3 入門保姆級學習(02、打包部署)

重生之 SpringBoot3 入門保姆級學習(02、打包部署) 1.6 打包插件1.7 測試 jar 包1.8 application.properties 的相關配置 1.6 打包插件 官網鏈接 https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-starte…

【Python】 XGBoost模型的使用案例及原理解析

原諒把你帶走的雨天 在漸漸模糊的窗前 每個人最后都要說再見 原諒被你帶走的永遠 微笑著容易過一天 也許是我已經 老了一點 那些日子你會不會舍不得 思念就像關不緊的門 空氣里有幸福的灰塵 否則為何閉上眼睛的時候 又全都想起了 誰都別說 讓我一個人躲一躲 你的承諾 我竟然沒懷…

自學動態規劃—— 一和零

一和零 474. 一和零 - 力扣(LeetCode) 其實遇到這種還好說,我寧愿遇見這種,也不想遇見那些奇奇怪怪遞推公式的題目。 這里其實相當背包要滿足兩個條件,所以我們可以將dp開成二維的,之后的操作&#xff0…

Kubernetes(K8S) 集群環境搭建指南

Kubernetes(簡稱K8s)是一個開源的容器編排平臺,旨在自動化部署、擴展和管理容器化應用。K8S環境搭建過程比較復雜,涉及到非常多組件安裝和系統配置,本文將會詳細介紹如何在服務器上搭建好Kubernetes集群環境。 在學習…

C語言---求一個整數存儲在內存中的二進制中1的個數--3種方法

//編寫代碼實現:求一個整數存儲在內存中的二進制中1的個數 //第一種寫法 /*int count_bit_one(unsigned int n) {int count 0;while (n )//除到最后余數是0,那么這個循環就結束了{//這個題就是可以想成求15的二進制的過程//每次都除以2,余數…

跟小伙伴們說一下

因為很忙,有一段時間沒有更新了,這次先把菜鳥教程停更一下,因為自己要查缺補漏一些細節問題,而且為了方便大家0基礎也想學C語言,這里打算給大家開一個免費專欄,這里大家就可以好好學習啦,哪怕0基…

面試題·棧和隊列的相互實現·詳解

A. 用隊列實現棧 用隊列實現棧 實現代碼如下 看著是隊列,其實實際實現更接近數組模擬 typedef struct {int* queue1; // 第一個隊列int* queue2; // 第二個隊列int size; // 棧的大小int front1, rear1, front2, rear2; // 兩個隊列的首尾指針 } MyS…

圖像處理ASIC設計方法 筆記25 紅外成像技術:未來視覺的革命

在當今科技飛速發展的時代,紅外成像技術以其獨特的優勢,在醫療、工業檢測等多個領域扮演著越來越重要的角色。本章節(P146 第7章紅外焦平面非均勻性校正SoC)將深入探討紅外成像系統中的關鍵技術——非均勻性校正SoC,以及它如何推動紅外成像技術邁向新的高度。 紅外成像系統…

6.Redis之String命令

1.String類型基本介紹 redis 所有的 key 都是字符串, value 的類型是存在差異的~~ 一般來說,redis 遇到亂碼問題的概率更小~~ Redis 中的字符串,直接就是按照二進制數據的方式存儲的. (不會做任何的編碼轉換【講 mysql 的時候,知道 mysql 默認的字符集, 是拉丁文,插入中文…