uvm_reg_bus_op中byte_en詳解

在使用寄存器模型的adapter進行數據轉換時,會直接對uvm_reg_bus_op進行操作,其包含變量有操作類型、地址、數據等,除byte_en的描述不太清晰外,其他幾個都比較好懂。從字面意思來看,該變量似乎是對數據按字節操作進行使能,但實際并不一定,本文將從源碼的角度來解讀byte_en。

//
//定義在uvm_reg_item.svh//
/
typedef struct {// Variable: kind//// Kind of access: READ or WRITE.//uvm_access_e kind;// Variable: addr//// The bus address.//uvm_reg_addr_t addr;// Variable: data//// The data to write. If the bus width is smaller than the register or// memory width, ~data~ represents only the portion of ~value~ that is// being transferred this bus cycle.//uvm_reg_data_t data;// Variable: n_bits//// The number of bits of <uvm_reg_item::value> being transferred by// this transaction.int n_bits;/*constraint valid_n_bits {n_bits > 0;n_bits <= `UVM_REG_DATA_WIDTH;}*/// Variable: byte_en//// Enables for the byte lanes on the bus. Meaningful only when the// bus supports byte enables and the operation originates from a field// write/read.//uvm_reg_byte_en_t byte_en;// Variable: status//// The result of the transaction: UVM_IS_OK, UVM_HAS_X, UVM_NOT_OK.// See <uvm_status_e>.//uvm_status_e status;} uvm_reg_bus_op;

先看定義,可見該變量的位寬為總線位寬/8,每一位代表對應字節的使能。

///
//uvm_reg_defines.svh//
///// Macro: `UVM_REG_DATA_WIDTH
//
// Maximum data width in bits
//
// Default value is 64. Used to define the <uvm_reg_data_t> type.
//
`ifndef UVM_REG_DATA_WIDTH`define UVM_REG_DATA_WIDTH 64
`endif// Macro: `UVM_REG_BYTENABLE_WIDTH
//
// Maximum number of byte enable bits
//
// Default value is one per byte in <`UVM_REG_DATA_WIDTH>.
// Used to define the <uvm_reg_byte_en_t> type.
//
`ifndef UVM_REG_BYTENABLE_WIDTH `define UVM_REG_BYTENABLE_WIDTH ((`UVM_REG_DATA_WIDTH-1)/8+1) 
`endif/
//uvm_reg_model.svh//
/// Type: uvm_reg_byte_en_t
//
// 2-state byte_enable value with <`UVM_REG_BYTENABLE_WIDTH> bits
//
typedef  bit unsigned [`UVM_REG_BYTENABLE_WIDTH-1:0]  uvm_reg_byte_en_t ;

該變量看起來似乎是在對寄存器讀寫的時候可以對寄存器的某些byte進行單獨的讀寫,但我在源碼中只發現了do_predict()函數對byte_en有直接使用,只對寄存器模型進行了預測,而不是對總線前門訪問數據的byte進行使能。現對uvm_reg.svh和uvm_reg_field.svh中的使用進行分析。

///
//uvm_reg.svh//
///function void uvm_reg::do_predict(uvm_reg_item      rw,uvm_predict_e     kind = UVM_PREDICT_DIRECT,uvm_reg_byte_en_t be = -1);uvm_reg_data_t reg_value = rw.value[0];m_fname = rw.fname;m_lineno = rw.lineno;rw.status = UVM_IS_OK;if (m_is_busy && kind == UVM_PREDICT_DIRECT) begin`uvm_warning("RegModel", {"Trying to predict value of register '",get_full_name(),"' while it is being accessed"})rw.status = UVM_NOT_OK;return;endforeach (m_fields[i]) beginrw.value[0] = (reg_value >> m_fields[i].get_lsb_pos()) &((1 << m_fields[i].get_n_bits())-1);m_fields[i].do_predict(rw, kind, be>>(m_fields[i].get_lsb_pos()/8));endrw.value[0] = reg_value;endfunction: do_predict/
//uvm_reg_field.svh//
/
function void uvm_reg_field::do_predict(uvm_reg_item      rw,uvm_predict_e     kind = UVM_PREDICT_DIRECT,uvm_reg_byte_en_t be = -1);uvm_reg_data_t field_val = rw.value[0] & ((1 << m_size)-1);if (rw.status != UVM_NOT_OK)rw.status = UVM_IS_OK;// Assume that the entire field is enabledif (!be[0])return;......endfunction: do_predict

在uvm_reg.svh的do_predict可以看到,有一個對be(byte_en)的移位操作,這里get_lsb_pos獲取的是field在reg中的首位置,整個移位操作就是看field在哪個byte。比如field是[3:1],那么就相當于是be>>(1/8)=be;如果是[9:8]那么就相當于be>>(8/8)=be>>1,右移一位,移動后的be被傳到了uvm_reg_field.svh的do_predict里面,該do_predict被field調用。

在uvm_reg_field.svh中,前幾行有對be的判斷,看be[0]是否為0,如果是0就return,不進行操作,就相當于不使能這個field。be的默認值是-1,因為是unsigned類型,所以是全1,默認不屏蔽。

單這么說有點抽象,舉個例子,假如有一個寄存器位寬32,里面4個field,每個field占1個byte,be的值是4'b1101,對于第一個field,它收到的be是be>>(0/8)=be>>0=4'b1101,它的be[0]是1,那么就代表它不會被屏蔽,能夠進行后續操作;而對于第二個field,他收到的be是be>>(8/8)=be>>1=4'b110,它的be[0]就是0,被屏蔽,沒有操作;第三個第四個be[0]都是1,能夠被操作。所以在這種情況下,就相當于對第二個byte沒使能。

但對于一個reg的field,很多情況下不一定是一個完整的byte,假如field1是[1:0],field2是[5:2],field3是[9:6],be依然是4'b1101的情況下,field123的be都是4'b1101,因為field3的be為be>>(6/8)=be>>0=4'b1101,此時field3就不會被屏蔽,即第二個byte的前兩位(field3[9:8])沒有屏蔽,此時按byte使能實際就不是byte了,這里也是命名的歧義所在,也是使用限制。

其他地方暫時還沒有找到對byte_en的使用,如果解析有錯誤歡迎打臉討論。

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

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

相關文章

【RHCE】SHELL for循環練習

目錄 1.編寫腳本for1.sh,使用for循環創建20賬戶&#xff0c;賬戶名前綴由用戶從鍵盤輸入&#xff0c;賬戶初始密碼由用戶輸入&#xff0c;例如:test1、test2、test3、……、test10 2.編寫腳本for2.sh,使用for循環,通過ping命令測試網段的主機連通性&#xff0c;IP前3段由用戶…

江科大stm32學習筆記——【3-2】GPIO輸出:LED閃爍LED流水燈蜂鳴器

&#xff08;一&#xff09; 硬件連接 1.LED閃爍 LED燈正極連接面包板電源正極&#xff0c;LED負極連接單片機A0口 (也可以LED負極連面包板負極&#xff0c;LED正極連接單片機A0口) 跳線連接單片機3.3和面包板正極&#xff0c;連接單片機GND和面包板負極 2.LED流水燈 3.蜂鳴…

在UE5中制作UI環形進度條

在日常開發中&#xff0c;經常會有環形進度條UI的效果&#xff0c;例如技能CD時間、加載動畫等&#xff0c;本文將通過材質球節點實現該效果&#xff0c;相較于準備美術素材&#xff0c;這樣的做法更為方便&#xff0c;效果如下&#xff1a; 1.制作環狀效果材質函數 在內容面…

迭代器是干什么的?為什么需要他?

有時候&#xff0c;我們需要一個一個地訪問集合中的每個元素&#xff0c;就像你一個一個地拿出盒子里的玩具一樣。迭代器就像是一個指示器&#xff0c;可以幫助我們逐個訪問集合中的元素&#xff0c;這樣我們就可以處理集合中的每個元素了。 Hashtable是干嘛的&#xff1f;為什…

【云動世紀:Apache Doris 技術之光】

本文節選自《基礎軟件之路&#xff1a;企業級實踐及開源之路》一書&#xff0c;該書集結了中國幾乎所有主流基礎軟件企業的實踐案例&#xff0c;由 28 位知名專家共同編寫&#xff0c;系統剖析了基礎軟件發展趨勢、四大基礎軟件&#xff08;數據庫、操作系統、編程語言與中間件…

MySQL-七種SQL優化

一、插入數據 普通插入&#xff1a; 采用批量插入&#xff08;一次插入的數據不建議超過1000條&#xff09; insert into tb_test values(1,Tom),(3, Cat),(3, Jerry)....手動提交事務 start transaction; insert into tb_test values(1,Tom),(3, Cat),(3, Jerry); insert …

LeetCode 2878.獲取DataFrame的大小

DataFrame players: ------------------- | Column Name | Type | ------------------- | player_id | int | | name | object | | age | int | | position | object | | … | … | ------------------- 編寫一個解決方案&#xff0c;計算并顯示 players 的 行數和列數。 將結…

maven插件wagon-ssh、os-maven-plugin、buildnumber-maven-plugin使用詳解

文章目錄 前言一、os-maven-plugin的使用二、buildnumber-maven-plugin使用1、時間戳策略2、數字策略 三、wagon-ssh使用1、上傳文件/文件夾2、執行Linux命令或者shell腳本 總結 前言 有時我們在構建項目時&#xff0c;希望能自動生成版本號或者生成不同操作系統標識的版本后綴…

Java實戰:Spring Boot實現郵件發送服務

本文將詳細介紹如何在Spring Boot應用程序中實現郵件發送服務。我們將探討Spring Boot集成郵件發送服務的基本概念&#xff0c;以及如何使用Spring Boot和第三方郵件服務提供商來實現郵件發送。此外&#xff0c;我們將通過具體的示例來展示如何在Spring Boot中配置和使用郵件發…

RS?FSVA3000 信號與頻譜分析儀

R&SFSVA3000 信號與頻譜分析儀 非常適用于實驗室以及生產過程中的高要求信號分析任務。R&SFSVA3000 信號與頻譜分析儀的分析帶寬高達 1 GHz&#xff0c;并具有低至 –120 dBc/Hz 的相位噪聲和高動態范圍&#xff0c;適用于要求嚴格的 5G NR 測量應用。分析儀測量速度快…

代碼隨想錄算法訓練營第二天

● 今日學習的文章鏈接和視頻鏈接 ● 自己看到題目的第一想法 977.有序數組的平方 方法一&#xff1a; 思路&#xff1a; 先將數據所有數據平方將數組排序 代碼&#xff1a; class Solution { public:vector<int> sortedSquares(vector<int>& nums) {vect…

vue后臺管理添加水印簡單方式watermark-package

詳情參考:https://www.npmjs.com/package/watermark-package 示例方法 <el-button type"primary" click"AddWatermark">添加水印</el-button><el-button type"primary" click"RemoveWatermark">清除水印</el-but…

Linux調試器——gdb的基礎使用

目錄 1.背景 2.指令的使用 2.1gdb的使用和退出 2.2顯示源代碼 2.3運行程序 2.4調試 1.打斷點 2.查斷點 3.去斷點 4.運行 5.關閉斷點 6.啟用斷點 7.逐過程 8.進入函數 9.顯示變量的值 1.背景 眾所周知&#xff0c;我們的程序發布有兩種&#xff0c;分別是debug模式和release模式…

18.貪心算法

排序貪心 區間貪心 刪數貪心 統計二進制下有多少1 int Getbit_1(int n){int cnt0;while(n){nn&(n-1);cnt;}return cnt; }暴力加一維前綴和優化 #include <iostream> #include <climits> using namespace std; #define int long long const int N2e510; in…

uni-app 經驗分享,從入門到離職(五)——由淺入深 uni-app 數據緩存

文章目錄 &#x1f4cb;前言?關于專欄 &#x1f3af;什么是數據存儲&#x1f9e9;數據存儲——存儲&#x1f4cc; uni.setStorage(OBJECT)&#x1f4cc; uni.setStorageSync(KEY,DATA) &#x1f9e9;數據存儲——獲取&#x1f4cc; uni.getStorage(OBJECT)&#x1f4cc; uni.g…

2024年【起重機司機(限橋式起重機)】找解析及起重機司機(限橋式起重機)考試總結

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 2024年【起重機司機(限橋式起重機)】找解析及起重機司機(限橋式起重機)考試總結&#xff0c;包含起重機司機(限橋式起重機)找解析答案和解析及起重機司機(限橋式起重機)考試總結練習。安全生產模擬考試一點通結合國家…

[AI]部署安裝有道QanyThing

前提條件&#xff1a; 1、win10系統更新到最新的版本&#xff0c;系統版本最好為專業版本 winver 查看系統版本&#xff0c;內部版本要大于19045 2、CPU開啟虛擬化 3、開啟虛擬化功能&#xff0c;1、2、3每步完成后均需要重啟電腦&#xff1b; 注&#xff1a;windows 虛擬…

CSS輕松學:簡單易懂的CSS基礎指南

css基礎 更多web開發知識歡迎訪問我的專欄>>> 01-CSS初體驗 層疊樣式表 (Cascading Style Sheets&#xff0c;縮寫為 CSS&#xff09;&#xff0c;是一種 樣式表 語言&#xff0c;用來描述 HTML 文檔的呈現&#xff08;美化內容&#xff09;。 書寫位置&#xff1a;…

基于HAL庫的STM32-ADC學習(附帶代碼)

1.前言 STM32ADC是一種模擬/數字轉換器&#xff0c;可以將模擬信號轉換為數字信號。STM32ADC有多個通道&#xff0c;可以選擇不同的輸入源、轉換模式、觸發方式和采樣時間。STM32ADC的轉換結果可以通過中斷、DMA或者寄存器讀取。 在本文中&#xff0c;我將介紹如何使用STM32C…

第九屆大數據與計算國際會議 (ICBDC 2024) 即將召開!

2024年第九屆大數據與計算國際會議&#xff08;ICBDC 2024&#xff09;將于2024年5月24至26日在泰國曼谷舉行。本次會議由朱拉隆功大學工程學院工業工程系主辦。ICBDC 2024的宗旨是展示大數據和計算主題相關科學家的最新研究和成果&#xff0c;為來自不同地區的專家代表們提供一…