当前位置: 首页 > news >正文

get_reg_by_offset函数

get_reg_by_offset函数如下:

在建立了寄存器模型后,可以直接通过层次引用的方式访问寄存器:

rm.invert.read(...);

但是出于某些原因,如果依然要使用地址来访问寄存器模型,那么此时可以使用get_reg_by_offset函数通过寄存器的地址得到 一个uvm_reg的指针,再调用此uvm_reg的read或者write就可以进行读写操作:

virtual task read_reg(input bit[15:0] addr, output bit[15:0] value);uvm_status_e status;uvm_reg target;uvm_reg_data_t data;uvm_reg_addr_t addrs[];target = p_sequencer.p_rm.default_map.get_reg_by_offset(addr);if(target == null)`uvm_error("case0_cfg_vseq", $sformatf("can't find reg in register model with address: 'h%0h", addr))target.read(status, data, UVM_FRONTDOOR);void'(target.get_addresses(null,addrs));if(addrs.size() == 1)value = data[15:0];else beginint index;for(int i = 0; i < addrs.size(); i++) beginif(addrs[i] == addr) begindata = data >> (16*(addrs.size() - i));value = data[15:0];break;endendend
endtask

通过调用最顶层的reg_block的get_reg_by_offset,即可以得到任一寄存器的指针。

如果如7.4.1节(白皮书)那样使用了层次的寄存器模型,从最顶层的reg_block的get_reg_by_offset也可以得到子reg_block中的寄存器。即假如buf_blk的地址偏移是'h1000,其中有偏移为'h3的寄存器(即此寄存器的实际物理地址是'h1003),那么可以直接由p_rm.get_reg_by_offset('h1003)得到此寄存器,而不必使用p_rm.buf_blk.get_reg_by_offset('h3)。

如果没有使用7.4.4节所示的多地址寄存器,那么情况比较简单,上述代码会运行第39行的分支。当存在多个地址的情况下, 通过get_addresses函数可以得到这个函数的所有地址,其返回值是一个动态数组addrs。其中无论是大端还是小端,addrs[0]是LSB 对应的地址。即对于7.3.2节DUT中的counter(此DUT是大端),那么addrs[0]中存放的是‘h6。而假如是小端,两个地址分别 是'h1005和'h1006,那么addrs[0]中存放的是'h1005。第41到48行通过比较addrs中的地址与目标地址,最终得到要访问的数据。

相关文章:

  • Halcon滤波器 laplace 算子
  • Flutter 小技巧之升级适配 Xcode15
  • 「JavaSE」类和对象2
  • 容器化IAC部署
  • 如何使用Imagewheel搭建一个简单的的私人图床无公网ip也能访问
  • 鸿蒙Harmony--状态管理器--@Prop详解
  • 【自控实验】2. 采样控制系统特性
  • Hologres + Flink 流式湖仓建设
  • java性能优化-String对象的优化
  • 新时代研究生学术英语综合教程2unit7课文中英文翻译
  • FPGA 原理图细节--画引脚
  • 【C语言】指针进阶
  • 水经注语义化版本控制规范1.2.0版
  • 2023年NAND闪存行业回顾
  • 划重点!多微信号一键定时发圈,省时省力!
  • [笔记] php常见简单功能及函数
  • android 一些 utils
  • java第三方包学习之lombok
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • JS数组方法汇总
  • MySQL几个简单SQL的优化
  • Webpack 4x 之路 ( 四 )
  • XForms - 更强大的Form
  • 包装类对象
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 面试遇到的一些题
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 延迟脚本的方式
  • 一道面试题引发的“血案”
  • 译自由幺半群
  • 最简单的无缝轮播
  • C# - 为值类型重定义相等性
  • #DBA杂记1
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (14)Hive调优——合并小文件
  • (day6) 319. 灯泡开关
  • (Ruby)Ubuntu12.04安装Rails环境
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (四)图像的%2线性拉伸
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • **CI中自动类加载的用法总结
  • .net core使用ef 6
  • .NET Standard 的管理策略
  • .net 程序发生了一个不可捕获的异常
  • .NET 发展历程
  • .NET 反射的使用
  • .net 受管制代码
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET构架之我见
  • .NET业务框架的构建
  • .NET运行机制
  • /etc/sudoer文件配置简析