UVM——寄存器模型相关的一些函数
0. 引言
在UVM支持的寄存器操作中,有get、update、mirror、write等等一些方法,在这里整理一下他们的用法。
寄存器模型中的寄存器值应该与DUT保持同步,但是由于DUT的值是实时更新的,所以寄存器模型并不能实时知道这种更新,在寄存器模型中专门有个值来尽可能与DUT中寄存器的值保持一致,叫镜像值(mirrorred value)。寄存器模型中还有一个值叫期望值(respected value),这个值保存我们希望写入寄存器的值。比如希望向DUT某个寄存器写入'h1,用set函数设置期望值,然后用update任务(update会比较镜像值和期望值,如果不一样,将期望值写入DUT,并更新镜像值)。
1. 函数
1.1 set
virtual function void set ( uvm_reg_data_t value, string fname = "",int lineno = 0 )
设置模型中寄存器的期望值,不会改变DUT中这个寄存器的值。
1.2 get
virtual function uvm_reg_data_t get( string fname = "", int lineno = 0 )
返回模型中寄存器的期望值,而不是DUT中的寄存器值。
1.3 get_mirrored_value
virtual function uvm_reg_data_t get_mirrored_value( string fname = "", int lineno = 0 )
返回模型中寄存器的镜像值。
1.4 get_reset
virtual function uvm_reg_data_t get_reset( string kind = "HARD" )
返回寄存器的复位值。
1.5 predict
virtual function bit predict ( uvm_reg_data_t value,
uvm_reg_byte_en_t be = -1,
uvm_predict_e kind = UVM_PREDICT_DIRECT,
uvm_path_e path = UVM_FRONTDOOR,
uvm_reg_map map = null,
string fname = "",
int lineno = 0 )
更新模型中的镜像值。新的镜像值通过value参数传入。
当在DUT中实现一个计数器的时候,模型中的计数器是静止的。如果想在模型中得到DUT的技术值,这就需要手动更新镜像值,又不能对DUT进行操作,这可以通过predict函数。
第三个参数是uvm_predict_e枚举类型,他有如下三个元素:
| UVM_PREDICT_DIRECT | Predicted value is as-is |
| UVM_PREDICT_READ | Predict based on the specified value having been read |
| UVM_PREDICT_WRITE | Predict based on the specified value having been written |
如果想要更新镜像值又不对DUT进行操作,要用UVM_PREDICT_DIRECT。
write、read、peek和poke在完成对DUT的读写之后也会调用这个函数,更新镜像值。
1.6 randomize
无论是uvm_reg,还是uvm_field、uvm_block,都是支持randomize()。
assert(rm.invert.reg_data.randomize());
assert(rm.invert.randomize());
assert(rm.randomize()):
当寄存器随机化后,期望值会被随机,但是镜像值不变,之后调用update任务,可以更新DUT中的寄存器值。
但是一个field能够被随机化,需要:
1. 在filed的configure第八个参数设为1.
2. filed为rand类型。
3. filed的读写类型为可写的。
2. 任务
2.1 update
virtual task update( output uvm_status_e status,
input uvm_path_e path = UVM_DEFAULT_PATH,
input uvm_reg_map map = null,
input uvm_sequence_base parent = null,
input int prior = -1,
input uvm_object extension = null,
input string fname = "",
input int lineno = 0 )
将模型中的期望值更新到DUT中。改变DUT中的寄存器。update会检查模型中的期望值和镜像值,如果两者不相等,那么将期望值更新到DUT中,并且更新镜像值。update与mirror操作相反。
如果镜像值和期望值相同,那么不会写DUT寄存器,也就不会产生总线transaction。
2.2 mirror
virtual task mirror( output uvm_status_e status,
input uvm_check_e check = UVM_NO_CHECK,
input uvm_path_e path = UVM_DEFAULT_PATH,
input uvm_reg_map map = null,
input uvm_sequence_base parent = null,
input int prior = -1,
input uvm_object extension = null,
input string fname = "",
input int lineno = 0 )
读DUT中寄存器的值,与update操作相反。如果第二个参数check为UVM_CHECK,那么会检查读取的值与镜像值是否一样,如果不一样报错。通过mirror读取DUT的寄存器值之后,会调用predict函数,更新镜像值。
mirror有两种应用场景:一是在仿真中不断调用,但此时是UVM_NO_CHECK,保证镜像值与DUT中的值相等;二是在仿真结束的时候调用,这时是UVM_CHECK检查模型中的镜像值与DUT中的寄存器值是否一致。
2.3 write
virtual task write( output uvm_status_e status,
input uvm_reg_data_t value,
input uvm_path_e path = UVM_DEFAULT_PATH,
input uvm_reg_map map = null,
input uvm_sequence_base parent = null,
input int prior = -1,
input uvm_object extension = null,
input string fname = "",
input int lineno = 0 )
模仿DUT的行为,通过前门或者后门方式向DUT中写入寄存器值,会产生总线transaction。并且调用predict更新镜像值。
uvm_path_e定义寄存器操作类型,如下:
| UVM_FRONTDOOR | Use the front door |
| UVM_BACKDOOR | Use the back door |
| UVM_PREDICT | Operation derived from observations by a bus monitor via the uvm_reg_predictor class. |
| UVM_DEFAULT_PATH | Operation specified by the context |
我在使用中,如果用set_auto_predict(1)——采取自动更行镜像值的方式,write之后,调用get和get_mirrored_value都能得到新写入的值。
如果关闭auto_predict,用uvm_reg_predict来更新镜像值,我在在使用中write之后,调用get和get_mirrored_value得到0。
如果是read任务,那么无论是auto_predict还是uvm_reg_predict都会自动更新镜像值和期望值。
链接:https://github.com/east1203/uvm_codes/tree/master/tb1_wd/a.uvm_reg_predict
2.4 read
virtual task read( output uvm_status_e status,
output uvm_reg_data_t value,
input uvm_path_e path = UVM_DEFAULT_PATH,
input uvm_reg_map map = null,
input uvm_sequence_base parent = null,
input int prior = -1,
input uvm_object extension = null,
input string fname = "",
input int lineno = 0 )
模仿DUT的行为,通过前门或者后门方式读取DUT中寄存器的值,并更新镜像值,会产生总线transaction。
2.5 peek
virtual task poke( output uvm_status_e status,
input uvm_reg_data_t value,
input string kind = "",
input uvm_sequence_base parent = null,
input uvm_object extension = null,
input string fname = "",
input int lineno = 0 )
通过后门访问方式读取寄存器的值,不关心DUT的行为,即使寄存器的读写类型是不能读,也可以将值读出来。
对于read clear类型的field,peek读操作不会clear。所以有的时候peek和read操作结果不一样
2.6 poke
virtual task peek( output uvm_status_e status,
output uvm_reg_data_t value,
input string kind = "",
input uvm_sequence_base parent = null,
input uvm_object extension = null,
input string fname = "",
input int lineno = 0 )
通过后门访问方式写入寄存器的值,不关心DUT的行为,即使寄存器的读写类型是不能写,也可以将值写进去。
对于write clear类型的filed,poke操作不会clear,所以有的时候poke和write操作结果不一样。
UVM——寄存器模型相关的一些函数的更多相关文章
- UVM RAL模型和内置seq
转载:UVM RAL模型:用法和应用_寄存器 (sohu.com) 在系统设计中通常会面临两大挑战:缩小技术节点的规模和上市时间(TTM,Time to Market).为了适应激烈的市场竞争,大多数 ...
- posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序
posix 线程(一):线程模型.pthread 系列函数 和 简单多线程服务器端程序 一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属 ...
- (笔记)Linux内核中内存相关的操作函数
linux内核中内存相关的操作函数 1.kmalloc()/kfree() static __always_inline void *kmalloc(size_t size, gfp_t flags) ...
- uvm_reg_sequence——寄存器模型(六)
寄存器模型 uvm_reg_sequence是UVM自带所有register sequence 的基类. 该类包含model, adapter, reg_seqr(uvm_sequencer). 感觉 ...
- uvm_reg_model——寄存器模型(一)
对于一个复杂设计,寄存器模型要能够模拟任意数量的寄存器域操作.UVM提供标准的基类库,UVM的寄存器模型来自于继承自VMM的RAL(Register Abstract Layer),现在可以先将寄存器 ...
- [炼丹术]UNet图像分割模型相关总结
UNet图像分割模型相关总结 1.制作图像分割数据集 1.1使用labelme进行标注 (注:labelme与labelImg类似,都属于对图像数据集进行标注的软件.但不同的是,labelme更关心对 ...
- Entity Framework 6 Recipes 2nd Edition(10-5)译 -> 在存储模型中使用自定义函数
10-5. 在存储模型中使用自定义函数 问题 想在模型中使用自定义函数,而不是存储过程. 解决方案 假设我们数据库里有成员(members)和他们已经发送的信息(messages) 关系数据表,如Fi ...
- OVERLAPPED相关的socket函数介绍
OVERLAPPED相关的socket函数介绍 上一篇文章介绍了<Windows核心编程>OVERLAPPED结构与内核对象IOCompletionPort相关概念,见http://www ...
- Mariadb MySQL逻辑条件判断相关语句、函数使用举例介绍
MySQL逻辑条件判断相关语句.函数使用举例介绍 By:授客 QQ:1033553122 1. IFNULL函数介绍 IFNULL(expr1, expr2) 说明:假如expr1 不为NULL,则 ...
随机推荐
- Django对接SQL Server服务
1.环境描述环境:Win7 + Django2.1.10 + SQL Server 2014 + Python3.6 + PyCharm 2017.2.3 x64 2.安装插件由于Django默认是不 ...
- wav封装格式
wav文件格式作为一种常用的多媒体音频文件格式,其由MS在1991年8月在Windows 3.1上推出,文件扩展名为WAV,是WaveFom的简写.通常存储未压缩的pcm数据,也可存储压缩的pcm数据 ...
- ajax前台数据到后台
var username = $("#id").val(); var user={"userAccount":username,"userPasswo ...
- vim文件时,误用了ctrl+z命令,该怎么办?
linux中,当正在使用vim命令编辑文件,退出时,如果误使用了 ctrl+z ,当前目录中会多一个隐藏文件. 比如我正在编辑 t.txt 文件时,误以为我之前使用的是 tail 命令,直接使用 ct ...
- 服务器小白的我,是如何将 node+mongodb 项目部署在服务器上并进行性能优化的
前言 本文讲解的是:做为前端开发人员,对服务器的了解还是小白的我,是如何一步步将 node+mongodb 项目部署在阿里云 centos 7.3 的服务器上,并进行性能优化,达到页面 1 秒内看到 ...
- python学习之并发编程
目录 一.并发编程之多进程 1.multiprocessing模块介绍 2.Process类的介绍 3.Process类的使用 3.1 创建开启子进程的两种方式 3.2 获取进程pid 3.3验证进程 ...
- (五十)c#Winform自定义控件-滑块
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...
- python 25 类的成员
目录 1. 类的私有成员 -- __ 1.1 类的私有静态属性 1.2 类的私有方法 1.3 对象的私有方法 2. 类的其他方法 2.1 类方法 @classmethod 2.2 静态方法 @stat ...
- JavaScript String 小球重力弹回
JavaScript String 小球重力弹回 <!DOCTYPE html> <html lang="en"> <head> <met ...
- Zookeeper之Leader选举过程
Leader在集群中是一个非常重要的角色,负责了整个事务的处理和调度,保证分布式数据一致性的关键所在.既然Leader在ZooKeeper集群中这么重要所以一定要保证集群在任何时候都有且仅有一个Lea ...