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.mzph.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;为来自不同地区的专家代表们提供一…