UVM寄存器模型與通道機制

接續UVM基礎入門文章。


前言

重點講述UVM常用的接口連接方式。


寄存器模型:

UVM寄存器模型(Register Model)是一組高級抽象的類,用于對DUT(Design Under Test)中具有地址映射的寄存器和存儲器進行建模,通過提供寄存器操作的抽象接口進行讀寫操作,這樣簡化了對寄存器的驗證。

寄存器模型模擬了DUT內部的存儲器件,一個簡單的寄存器模型如圖:

上述的圖中可以看出寄存器模型的大致框架,內部含有眾多寄存器和存儲器,這些元件通過地址圖與DUT內部的寄存器形成映射關系。

不過寄存器的保留域可以不用管,無法寫入,讀出的數據是復位值,在提取寄存器功能點時也常常忽略保留域。

寄存器讀寫:

寄存器模型與DUT的數據交互復雜多樣,整體方式其實就是通過前門訪問和后門訪問。

前門訪問過程:

1.測試用例或者參考模型會調用寄存器模型的read() 或者 write() 方法,指定為前門訪問方式。一旦寄存器模型被上層調用后,這個寄存器模型就會產生一個有關讀寫操作事務。

2.寄存器模型通過調用adapter的reg2bus函數將寄存器讀寫事務轉換成總線事務。

3.該總線事務會交給關聯的sequencer發送給driver,然后再驅動給DUT。

4.monitor監測響應,然后給到端口傳出去,這個端口可以是analysis_port端口。

5.寄存器模型通過analysis_port端口獲取響應后調用adapter的bus2reg函數將事務轉換成寄存器操作

6.寄存器模型自動更新鏡像值

后門訪問過程:

1. 在寄存器模型中,通過?add_hdl_path()?或?add_hdl_path_slice()?為內部的每個寄存器或字段域指定對應的RTL信號路徑,這個過程理解為映射。

2. 調用寄存器模型的read() 或者? write() 函數,方式指定為后門路徑。

3.通過DPI-C接口或者force/release直接修改或者讀取對應路徑的寄存器值.

4.寫入的數值或者讀出的數值都會自動更新到寄存器鏡像里。

如圖所示:

紅色線條表示的是參考模型寫數據到DUT內部的路徑,綠色線條表示參考模型從DUT寄存器里讀出數據,黑色線條表示后門訪問。

參考模型一般都不會寫數據,想要讀寄存器數據可以通過前門后門或者讀取鏡像值來獲取數據。

通道機制:

在UVM的端口連接機制中,最為常用的有3種端口連接機制。

一對一接口:

1.put_port:在完成transaction的打包后,通過port.put(trans)將事務發送出去。(blocking_put_port接口也屬于put_port的一種,屬于阻塞接口,不支持反向)

2.get_port:在需要transaction的時候,通過port.get(trans)獲取事務。(get_blocking_prot就是get_port的一種,它屬于阻塞端口)

一對多接口:

analysis_port接口為廣播接口,可以向所有組件發送事務信息。

接口轉接:

tlm_fifo作為中間傳輸的緩存器,可以用于不同接口之間的連接。當存在兩個接口的定義不相同時,通過將接口連接到fifo對應的接口上實現轉接。

tlm_fifo分為有ap端口的fifo 和沒有ap端口的fifo。

通常agent發送的transaction不止一個組件使用,因此在agent中通常使用的analysis_port實現廣播,而在參考模型或者記分板中并不需要廣播功能。

因此在不需要廣播功能的組件中,通常可以不用analysis_port端口。

以agent到scoreboard的端口連接為例簡單的講述一下常用的接口連接機制:

1.多對一連接:

analysis_port------env.tlm_fifo------scoreboard.get_blocking_port。

這屬于不同類型的接口連接,由于scoreboard不是時刻都需要事務的,因此需要一個緩沖功能的接口。

analysis_port--------scoreboard.tlm_fifo

由于fifo中自帶了get()函數,通常也可以省略get_blocking_port接口,直接在scoreboard里面實例化兩個fifo存儲數據用于對比。

雖然使用fifo簡單易懂,但是很多時候一個組件需要獲取多組數據的情況,這種情況下例化很多fifo是不現實的。

原因在于如果不同agent之間發送事務的phase不同,而scoreboard里面沒有選擇合適的phase,那么環境的調試將會變得十分困難。

而且想要從fifo里面獲取數據需要在特定的phase里面執行。

analysis_port ------------- scoreboard.imp

imp,我在B站上看到的視頻解釋為通道的意思,如果組件中有多個imp接口的話,需要使用·uvm_analysis_imp_decl宏定義創建多個imp類去分別對應不同的通道,還要再組件中定義具有相同后綴名的函數。

2.一對一連接:

常見一對一的端口連接方式有:

阻塞式單向傳輸uvm_blocking_put_port(發送)?+?uvm_blocking_put_imp(接收)

阻塞式雙向傳輸uvm_blocking_transport_port(發送)?+?uvm_blocking_transport_imp(接收)

非阻塞式單向傳輸uvm_nonblocking_put_port(發送)?+?uvm_nonblocking_put_imp(接收)

例如:

class scoreboard extends uvm_component;`uvm_component_param_utils(scoreboard #(transaction))// 定義兩個IMP端口:一個接收預期數據,一個接收實際數據uvm_blocking_put_imp #(transaction, scoreboard #(transaction)) expected_imp;uvm_blocking_put_imp #(transaction, scoreboard #(transaction)) actual_imp;// 存儲預期和實際數據的隊列transaction expected_queue[$];transaction actual_queue[$];function new(string name = "scoreboard", uvm_component parent = null);super.new(name, parent);expected_imp = new("expected_imp", this);actual_imp = new("actual_imp", this);endfunction// 實現expected_imp的put方法virtual task put(transaction tr);`uvm_info("SCOREBOARD", $sformatf("Received Expected Data: %0h", tr.data), UVM_MEDIUM);expected_queue.push_back(tr);endtask// 實現actual_imp的put方法virtual task put(transaction tr);`uvm_info("SCOREBOARD", $sformatf("Received Actual Data: %0h", tr.data), UVM_MEDIUM);actual_queue.push_back(tr);endtask// 比對邏輯(可在run_phase或單獨的任務中調用)task compare();if (expected_queue.size() != actual_queue.size()) begin`uvm_error("SCOREBOARD", "Mismatch in number of transactions!");end else beginforeach (expected_queue[i]) beginif (expected_queue[i].data !== actual_queue[i].data) begin`uvm_error("SCOREBOARD", $sformatf("Data mismatch at index %0d!", i));endendendexpected_queue.delete();actual_queue.delete();endtask
endclass

總結

不同種類的端口一般不能直接相連,需要FIFO轉接,或者將兩個要相連的端口類型聲明為一致的。

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

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

相關文章

12.NModbus4在C#上的部署與使用 C#例子 WPF例子

一、Modbus TCP/IP是什么Modbus TCP/IP是一種基于TCP/IP協議的工業自動化通信協議。它在Modbus協議的基礎上,利用TCP/IP網絡進行數據傳輸,使得工業設備之間的通信更加便捷和高效。常用的Modbus功能碼包括0x03(讀保持寄存器)、0x06…

硬件開發2-匯編1(ARMv7-A)- 基本概要

一、匯編基本概要1、ARM數據和指令類型2、ARM字節順序即可大端存儲也可小端存儲,默認小端存儲(不建議修改)、kernel(內核)中的,CPSR(當前程序狀態寄存器)可修改大小端存儲3、ARM處理…

Linux中進程和線程常用的API詳解

進程與線程基礎及 Linux 進程間通信(IPC)詳解 一、程序與進程 1. 程序(靜態文件) 程序是存儲在磁盤上的可執行文件,是靜態實體,不占用 CPU、內存等運行時資源,僅占用磁盤空間。不同操作系統的可…

VS Code 插件開發教程

VS Code 插件開發教程 概述 Visual Studio Code(簡稱 VS Code)是一款由 Microsoft 開發的開源輕量級編輯器,支持跨平臺(Windows、macOS、Linux)。 其最大的優勢之一是強大的插件系統,開發者可以通過編寫擴…

Docker技術解析

1.Docker安裝 1.如果Ubuntu自帶的Docker版本太低,我們需要卸載舊版本并安裝新的 sudo apt-get remove docker docker-engine docker.io containerd runc2. 備份原有軟件源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak3.選擇合適的鏡像源 # 或者使用…

TCP套接字的使用

Java中使?TCP協議通信,使用ServerSocket來建立鏈接,使用Socket進行通信.ServerSocketServerSocket是創建TCP服務端Socket的api,主要方法:方法簽名說明ServerSocket(int port)創建一個服務端流套接字Socket,并綁定指定端口Socket accpet()開始監聽指定端口,有客戶端鏈接后,返回…

linux執行systemctl enable xxxxx 報 Failed to execute operation: Bad message

linux執行systemctl enable redis.service 報 Failed to execute operation: Bad message 如果在執行 systemctl enable 命令時遇到 "Failed to execute operation: Bad message" 錯誤,可能是由于以下幾個原因導致的。你可以按照以下步驟進行排查和解決&a…

終端之外:解鎖Linux命令行的魔法與力量

Linux命令行的核心理念 在記憶具體的指令之前,先理解它的哲學: 一切皆文件 :硬件設施,進程,目錄…在Linux中幾乎所有資源都被抽象為文件,這意味著你可以通過同樣的指令(如 ench ,cat&#xff…

CSS 動畫實戰:實現電商中“加入購物車”的拋物線效果

引言 在電商網站中,“加入購物車”動畫 是提升用戶體驗的經典交互之一。一個小小的商品圖標從頁面飄向購物車,不僅直觀地反饋了操作結果,還能增加趣味性與沉浸感。 實現這一效果的方式有很多,比如 JavaScript 計算路徑 動畫&…

深度學習之損失函數

深度神經網絡由多層網絡連接而成,網絡連接處防止線性直接相關,采用非線性函數進行逐層隔離,真正實現每層參數的獨立性,也就是只對本層提取到的特征緊密相關。因為如果是線性函數直接相連就成了一層中間網絡了,只不過參…

Oracle OCP認證考試題目詳解082系列第32題

考察知識點:Oracle profiles(配置文件) 英語題目 32.Which are two of the account management capabilities that can be configured using Oracle profiles? A.the number of days for which an account may be logged in to one or more sessions before it is locked…

Docker 部署 MongoDB:單節點與副本集的最佳實踐

Docker 部署 MongoDB:單節點與復制集的企業級最佳實踐引言:容器化有狀態服務的范式轉變第一部分:基礎概念與生產環境考量1.1 核心 Docker 概念深度解析1.2 Volume vs. Bind Mount:生產環境抉擇1.3 獲取與驗證官方鏡像官方鏡像默認…

公司本地服務器上搭建部署的辦公系統web項目網站,怎么讓外網訪問?有無公網IP下的2種通用方法教程

本地物理服務器計算機搭建部署應用包括網站等,然后在局域網內的訪問外,還需要提供外地的連接訪問,這是比較常見的跨網通信需求。如在家或在外訪問公司內部辦公系統網站,這就涉及內網IP和公網IP的轉換,或域名的解析使用…

整體設計 之 緒 思維導圖引擎 之 引 認知系統 之 引 認知系統 之 序 認知元架構 之6 拼句 之1 (豆包助手 之8)

摘要(AI生成)認知演進 中 交流句子所包含的 信息描述框架 < i , j > ( m , n )本體論基礎&#xff08;數學約束&#xff09;&#xff1a; n n元&#xff08;維度&#xff09;n次&#xff08;層次&#xff09;n個&#xff08;方程&#xff09;n場&#xff08;場景&am…

微軟的兩個調試器debugpy和python

在生成launch.json文件時&#xff0c;新版本的python擴展解釋器類型是debugpy&#xff0c;而不是就版本的type:python&#xff0c;那么兩者的區別在哪&#xff1f;1. 歷史演變背景&#xff08;1&#xff09;舊版&#xff08;Python擴展 < 2021.09&#xff09;使用 "typ…

【連載2】C# MVC 自定義錯誤頁設計:404/500 處理與 SEO 優化

在開發ASP.NET MVC 應用時&#xff0c;自定義錯誤頁是提升用戶體驗和 SEO 表現的重要環節。默認的錯誤頁不僅不美觀&#xff0c;還可能泄露技術細節&#xff0c;影響用戶體驗和搜索引擎排名。 實現自定義錯誤頁的完整代碼 配置 Web.config 自定義錯誤頁 在 ASP.NET 中&#…

mcp解讀——概述及整體架構

概念介紹 什么是模型上下文協議 &#xff08;MCP&#xff09; MCP&#xff08;模型上下文協議&#xff09;是一種用于將 AI 應用程序連接到外部系統的開源標準。 使用 MCP&#xff0c;Claude 或 ChatGPT 等人工智能應用程序可以連接到數據源&#xff08;例如本地文件、數據庫&a…

AI 賦能云端運維:基于 MCP 協議深度集成 Codebuddy CLI 與騰訊云 Lighthouse 的實戰全解

摘要 在云計算技術飛速演進的今天&#xff0c;服務器的管理與運維正經歷著從傳統手動操作、腳本自動化到智能化、對話式交互的深刻變革。本文將系統性地、全流程地展示如何將騰訊云 Lighthouse 輕量應用服務器與尖端的 AI 編程助手 Codebuddy CLI 進行深度集成。我們將從服務器…

【Proteus仿真】【51單片機】教室燈光控制器設計

文章目錄一、功能簡介二、軟件設計三、實驗現象聯系作者一、功能簡介 本項目使用Proteus8仿真51單片機控制器&#xff0c;使用LCD1602液晶、DS1302時鐘模塊、人體紅外感應模塊、開關LED指示燈、繼電器、PCF8591 ADC模塊、光敏傳感器、按鍵模塊等。 主要功能&#xff1a; 系統運…

成為一個年薪30W+的FPGA工程師是一種什么體驗?

FPGA&#xff08;Field-Programmable Gate Array&#xff09;是現場可編程門陣列&#xff0c;通過硬件描述語言設計電路&#xff0c;可實現并行計算&#xff0c;廣泛應用于通信、人工智能、工業控制等領域。FPGA工程師的工作包括RTL設計、仿真驗證、時序分析等。盡管并非所有公…