转载:

译文:https://blog.csdn.net/zhajio/article/details/80731435

原文:http://cluelogic.com/2013/02/uvm-tutorial-for-candy-lovers-register-access-methods/

UVM的寄存器抽象层(RAL)提供了几种访问寄存器的方法。 这篇文章将解释寄存器访问方法的工作原理。 在Register Abstraction中,我们介绍了RAL的概述并解释了如何定义寄存器。 在这篇文章中,我们将介绍如何访问寄存器。

uvm_reg_field的属性

在深入了解寄存器访问方法之前,让我们看看如何存储寄存器值。 如寄存器抽象中所示,uvm_reg_field是表示寄存器的位的最低寄存器抽象层。 uvm_reg_field使用多个属性来存储各种寄存器字段值:

  • m_reset [“HARD”]存储硬重置值(hard reset)。 请注意,m_reset是一种带有一种重置键的关联数组。
  • m_mirrored存储我们在待测试设计(DUT)中所认为应该存储的值。
  • m_desired存储我们想要设置给DUT的值。
  • value将要采样的值存储在功能覆盖率中,或者当该字段被随机化时将value约束。

请注意,在这些属性中,只有值属性是公共的。 其他属性是本地的,因此我们无法直接从类外访问它们。 稍后我们将向您介绍如何使用寄存器访问方法访问这些本地属性。

  

                                              uvm_reg_field的属性

configure()

我们在创建uvm_reg_field后执行的第一件事是配置它。在寄存器抽象中,我们如下配置flavor字段。请注意,在Register Abstraction中,我们将flavor字段定义为“WO”(只写),但我们在此将其定义为“RW”(读/写),以使该字段更通用。

flavor = uvm_reg_field::type_id::create( "flavor" );
flavor.configure( .parent ( this ),
.size ( 3 ),
.lsb_pos ( 0 ),
.access ( "RW" ),
.volatile ( 0 ),
.reset ( 0 ),
.has_reset ( 1 ),
.is_rand ( 1 ),
.individually_accessible( 0 ) );

如果has_reset参数为1,则复位参数的值将被视为“HARD”复位值。如果has_reset值为0,则复位值将被忽略。复位值应与DUT的复位状态相匹配。如果您想在配置后修改复位值,可以使用set_reset()方法。

flavor.set_reset( .value( 0 ), .kind( "HARD" ) ); // kind == "HARD" by default

                                              configure()和set_reset()方法如何工作

reset()

如果m_reset [kind]存在,reset()方法将重置寄存器字段的属性。默认类型是“HARD”。如果m_reset [kind]不存在,则reset()方法不执行任何操作。请注意,reset()方法不会复位DUT中的寄存器。它只复位寄存器字段对象的属性。

flavor.reset( .kind( "HARD" ) ); // kind == "HARD" by default

                                reset()方法如何工作

set()

set()方法设置寄存器字段的期望值。 set()方法不会将值设置为DUT中的寄存器的值。它只将值设置为m_desired和寄存器字段对象的值属性。要真正将值设置为DUT中的寄存器,请使用write()或update()方法。这些方法将在稍后解释。

flavor.set( .value( 1 ) );

get()

get()方法获取寄存器字段的期望值。 get()方法不会从DUT中的寄存器获取值。它只获取m_desired属性的值。要实际从DUT获取值,请使用read()或mirror()方法。这些方法将在稍后解释。与get()方法类似,还有两个getter访问本地属性。 get_reset()检索m_reset [kind]属性的值,而get_mirrored_value()方法检索m_mirrored属性的值。

uvm_reg_data_t desired_value  = flavor.get();
uvm_reg_data_t reset_value = flavor.get_reset( .kind( "HARD" ) ); // kind == "HARD" by default
uvm_reg_data_t mirrored_value = flavor.get_mirrored_value();

randomize()

randomize()方法是一个SystemVerilog方法。它随机化一个寄存器字段对象的值属性。随机化后,post_randomize()方法将value属性的值复制到m_desired属性。请注意,如果value属性的rand_mode为OFF,则pre_randomize()方法会将m_desired的值复制到value属性。

assert( flavor.randomize() );

write()

write()方法实际上向DUT写入一个值。

uvm_status_e status;
flavor.write( .status( status ), .value( 1 ) );

write()方法涉及多个步骤。

  1. 创建与写入操作对应的uvm_reg_item对象。
  2. uvm_reg_adapter将写入操作转换为相应的总线事务。
  3. uvm_driver执行到DUT的总线事务。
  4. uvm_monitor捕获总线事务。
  5. uvm_reg_predictor要求uvm_reg_adapter将总线事务转换为相应的寄存器操作。
  6. 寄存器操作转换为uvm_reg_item。
  7. uvm_reg_item用于更新值,m_mirrored和m_desired属性。

请注意,如果在配置寄存器字段时个别可访问参数为0,则包含该字段的整个寄存器会被写入,因为该字段不可单独访问。在这种情况下,m_mirrored值将用作其他字段的写入值。

read()

read()方法实际上从DUT中读取一个寄存器值。

uvm_status_e   status;
uvm_reg_data_t value; flavor.read( .status( status ), .value( value ) );

与write()方法类似,read()方法涉及多个步骤。

  1. 创建与读操作对应的uvm_reg_item对象。
  2. uvm_reg_adapter将读取操作转换为相应的总线事务。
  3. uvm_driver执行到DUT的总线事务。
  4. uvm_reg_apapter将读取数据的总线事务转换为寄存器操作。
  5. read()方法将读取值返回给调用者。
  6. 同时,uvm_monitor捕获总线事务。
  7. uvm_reg_predictor要求uvm_reg_adapter将总线事务转换为相应的寄存器操作。
  8. 寄存器操作转换为uvm_reg_item。
  9. uvm_reg_item用于更新值,m_mirrored和m_desired属性。

请注意,如果在配置寄存器字段时individually_accessible 参数为0,则会读取包含字段的整个寄存器。在这种情况下,也会为其他字段更新m_mirrored值。

update()

update()方法实际上是向DUT写入一个寄存器值。 update()方法属于uvm_reg类。 uvm_reg_field类没有update()方法。

uvm_status_e status;

jb_recipe_reg.update( .status( status ) );

write()方法和update()方法之间的区别是:

  • write()方法将一个值作为其参数,而update()方法使用m_desired属性的值作为要写入的值。
  • 只有当m_mirrored和m_desired不相等时,update()方法才写入该值。

update()方法在内部调用write(.value(m_desired))。因此,更新后,m_mirrored的值也会更新。

mirror()

mirror()方法实际上是从DUT读取一个寄存器。

uvm_status_e status;

flavor.mirror( .status( status ), .check( UVM_CHECK ) );

read()方法和mirror()方法之间的区别是:

  • read()方法返回寄存器值给调用者,而mirror()方法不返回寄存器值。 mirror()方法只更新m_mirrored属性的值。
  • 如果check参数的值为UVM_CHECK,则mirror()方法将读取值与m_desired进行比较。请注意,UVM类库文档指出,它将读取值与镜像值进行比较,但如果您查看uvm-1.1c代码库的uvm_reg.svh的第2,944行,它实际上会与所需的值进行比较,而不是针对镜像值。

2014年4月11日:uvm-1.1d代码库已纠正此问题。mirror()将读取值与镜像值进行比较。如果您对此修复感兴趣,请参阅uvm_reg.svh的第2,951行。)

关于检查的另一个警告是,如果在配置寄存器字段时将volatile参数设置为1,则即使将check参数设置为UVM_CHECK,也不会检查寄存器字段。这是因为我们无法确定性地预测寄存器字段的值,因为它可能在DUT中被更改(易失性)。

mirror()方法在内部调用do_read()方法。这是与read()方法内部调用的相同方法。因此,除m_mirrored属性外,mirror()方法还会更新值和m_desired属性。

predict()

predict()方法更新镜像值。

flavor.predict( .value( 1 ) );

predict()方法也会更新值和m_desired属性。

Summary

下表总结了每种方法如何更新寄存器字段对象的属性。

Method m_reset
["HARD"]
value m_desired m_mirrored DUT
configure
(.reset(val),
.has_reset(1))
set the value of val        
set_reset(val) set the value of val        
reset()   copy the value of m_reset
["HARD"]
copy the value of m_reset
["HARD"]
copy the value of m_reset
["HARD"]
 
set(val)   set the value of val set the value of val    
get_reset() return the value of m_reset
["HARD"]
       
get()     return the value of m_desired    
get_mirrored_value()       return the value of m_mirrored  
randomize()   randomize copy the value of value    
write(.value(val))   set the value of val set the value of val set the value of val write the value of val
read(.value(val))   set the read value set the read value set the read value read the register
update()   set the value of m_desired set the value of m_desired set the value of m_desired write the value of m_desired
mirror()   set the read value set the read value set the read value read the register
predict
(.value(val))
  set the value of val set the value of val set the value of val

在这篇文章中,我们只介绍了所谓的前门访问。我们将在单独的帖子中介绍后门访问。我希望本教程能帮助您理解寄存器的访问方法。

原文中有一些QA可以加深理解。

uvm Register Access Methods(16)的更多相关文章

  1. 由DBCursor的“can't switch cursor access methods”异常引发的思考

    先谈谈我是怎么用的: DBCollection dbcollection = XXXXXXXXXX(); //连接mongo DBCursor dbCursor = mergeVideoDB.find ...

  2. PatentTips - Control register access virtualization performance improvement

    BACKGROUND OF THE INVENTION A conventional virtual-machine monitor (VMM) typically runs on a compute ...

  3. Register Abstraction(9)

    This post will explain how to use the UVM Register Abstraction Layer (RAL) to generate register tran ...

  4. Access an instance through a console

    VNC or SPICE is used to view the console output of an instance, regardless of whether or not the con ...

  5. 【JavaScript】Registering JavaScript object methods as callbacks

    The registration of callback functions is very common in JavaScript web programming, for example to ...

  6. [转] stat命令输出结果中, Access,Modify,Change的含义

    先建立一个空白文件a.txt 1 [emduser@emd tmp]$ touch a.txt 2   3 [emduser@emd tmp]$ ls -al a.txt 4   5 -rw-rw-r ...

  7. Guidelines for Successful SoC Verification in OVM/UVM

    By Moataz El-Metwally, Mentor Graphics Cairo Egypt Abstract : With the increasing adoption of OVM/UV ...

  8. uvm_hdl——DPI在UVM中的实现(四)

    我们可以在uvm中实现HDL的后门访问,具体包括的function有uvm_hdl_check_path,uvm_hdl_deposit, uvm_hdl_force,uvm_hdl_release, ...

  9. Heterogeneous Self-Organizing Network for Access and Backhaul

    This application discloses methods for creating self-organizing networks implemented on heterogeneou ...

随机推荐

  1. 第25篇-虚拟机对象操作指令之putstatic

    之前已经介绍了getstatic与getfield指令的汇编代码执行逻辑,这一篇介绍putstatic指令的执行逻辑,putfield将不再介绍,大家可以自己去研究,相信大家有这个实力. putsta ...

  2. webgl 图像处理2---图像传输

    webgl 图像处理 webgl 不仅仅可以用来进行图形可视化, 它还能进行图像处理 图像处理2---图像传输 之前已经进行了点和 uv 数据的传输 webgl 进行图形处理的第二步: 传输图片到 G ...

  3. PHP中非常好玩的Calendar扩展学习

    为什么说这个 Calendar 扩展很好玩呢?因为你基本用不到它!这个扩展是一套关于日期历法的扩展,但是对于我们来说,它没有农历的相关操作,所以对于我们中国人来说这个扩展并没有什么实际的作用.不过这并 ...

  4. 使用OPCache提升PHP的性能

    对于 PHP 这样的解释型语言来说,每次的运行都会将所有的代码进行一次加载解析,这样一方面的好处是代码随时都可以进行热更新修改,因为我们不需要编译.但是这也会带来一个问题,那就是无法承载过大的访问量. ...

  5. 微信小程序适配iphoneX的实现方法

    一. 安全区域(safe area) 与iPhone6/6s/7/8相比,iPhone X 无论是在屏幕尺寸.分辨率.甚至是形状上都发生了较大的改变,下面以iPhone 8作为参照物,先看看iPhon ...

  6. 用tcping检查网站开放的端口

    麦新杰之前分享过一款小巧玲珑工具软件:tcping,即在tcp层进行端口的ping. tcping可以用来检查和确认我们的网站有哪些端口是开放的,使用很顺手.比如麦新杰这几天在研究如何关闭mysql的 ...

  7. Java基础系列(39)- 二维数组

    多维数组 多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组. 二维数组 int a[][]=new int[2][5]; 解析:以上二维数组a可以看成一个 ...

  8. chrome 的 options 参数

    在使用selenium浏览器渲染技术,爬取网站信息时,默认情况下就是一个普通的纯净的chrome浏览器,而我们平时在使用浏览器时,经常就添加一些插件,扩展,代理之类的应用.相对应的,当我们用chrom ...

  9. urllib2获取CGI请求的数据

    import urllib.request as urllib2 headers = { 'Authorization': 'Basic YWRtaW46YWRtaW4=', }#需要身份验证时,在请 ...

  10. 【Golang】三个点(...)用法

    众所周知,Go语言是严格类型语言,而开发的时候又遇到传入参数不定的情况,怎么办? 这里的三个点(-),就给我们编程人员带来很大的灵活性,具体如下 在Golang中,三个点一共会用在四个地方(话说三个点 ...