UVM糖果爱好者教程 -- 36.寄存器回调函数(Register Callbacks)

看了XtremeDV对cluelogic.com的“UVM Tutorial for Candy Lovers”系列的翻译,翻译的很棒。

看原文还有两节没有翻译,自己尝试翻译一下,有不合适地方,敬请谅解并帮忙指出,进行修改。

https://blog.csdn.net/zhajio/category_9272893.html

Jelly_Bean_Taster的寄存器

在UVM的寄存器抽象层(RAL)那一节,我们定义了两个寄存器:RECIPE和TASTE。寄存器RECIPE有4个只写的域(sour,sugar_free,color和flavor)。寄存器TASTE只有一个只读的域(taste)。

Jelly_Bean_Taster的寄存器

复位后,DUT和寄存器模型的寄存器值如下。 

寄存器复位值

现在让我们用一个sour-green apple食谱来写寄存器RECIPE(第24行)。

class jelly_bean_reg_sequence extends uvm_reg_sequence;
    `uvm_object_utils(jelly_bean_reg_sequence)

    function new(string name = "");
        super.new(name);
    endfunction : new

    virtual task body();
        jelly_bean_reg_block       jb_reg_block;
        jelly_bean_types::flavor_e flavor;
        jelly_bean_types::color_e  color;
        bit                        sugar_free;
        bit                        sour;
        jelly_bean_types::taste_e  taste;
        uvm_status_e               status;
        uvm_reg_data_t             value;

        $cast(jb_reg_block, model);
        flavor     = jelly_bean_types::APPLE;
        color      = jelly_bean_types::GREEN;
        sugar_free = 0;
        sour       = 1;
 
        jb_reg_block.jb_recipe_reg.write(status, {sour, sugar_free, color, flavor});
        taste  = jelly_bean_types::taste_e'(jb_reg_block.jb_taste_reg.taste.get_mirrored_value());
        `uvm_info("body", $sformatf("taste=%s", taste.name()), UVM_NONE)
    endtask : body

endclass : jelly_bean_reg_sequence

 寄存器写完后,DUT内部的寄存器值变成如下:

write后DUT的寄存器值

值得注意的是,DUT也会更新TASTE寄存器当进行写RECIPE寄存器。然后,寄存器模型(register model)的TASTE寄存器不变仍然是NO_TASTE,你可以从log文件里看到。因为寄存器模型不知道如何更新TASTE寄存器。

write后寄存器模型的寄存器值

UVM_INFO sequences.svh(59) @ 20: uvm_test_top.jb_env.jb_agent.jb_seqr@@jb_reg_seq [body] taste=NO_TASTE

 定义一个寄存器回调函数(Register Callback)

为了更新TASTE寄存器,我们准备为RECIPE寄存器定义一个callback(jelly_bean_recipe_reg_callback)。每当写RECIPE寄存器时,这个回调函数就会更新TASTE寄存器。我们继承于uvm_reg_cbs类(line1),该类定义了task: pre_write, post_write, pre_read和post_read。如名字所示,pre_write在寄存器写操作之前被调用,post_write在寄存器写操作后被调用。pre_read在寄存器读之前调用,post_read在寄存器读之后调用。

在本文中,我们只定义task post_write(line10)。当uvm_reg类的write task被调用时,会create一个uvm_reg_item类的object然后调用post_write。寄存器写value存储在uvm_reg_item object的value[0]中。第14行和15行从寄存器中抽出了一些域的值。最后,task基于写进去的值(line18-20)更新TASTE寄存器的taste 域。

class jelly_bean_recipe_reg_callback extends uvm_reg_cbs;
  `uvm_object_utils( jelly_bean_recipe_reg_callback )
 
  jelly_bean_taste_reg jb_taste_reg;
 
  function new( string name = "jelly_bean_recipe_reg_callback" );
    super.new( name );
  endfunction: new
 
  virtual task post_write( uvm_reg_item rw );
    jelly_bean_types::flavor_e flavor;
    bit                        sour;
 
    flavor = jelly_bean_types::flavor_e'( rw.value[0][2:0] ); // rw.value[0] holds the written value
    sour   = rw.value[0][6];
    `uvm_info( "post_write", $sformatf( "%s, flavor=%s sour=%b", rw.convert2string(), flavor.name(), sour ), UVM_DEBUG )
 
    if ( flavor == jelly_bean_types::CHOCOLATE && sour )
      assert( jb_taste_reg.taste.predict( jelly_bean_types::YUCKY ) );
    else
      assert( jb_taste_reg.taste.predict( jelly_bean_types::YUMMY ) );
  endtask: post_write
 
endclass: jelly_bean_recipe_reg_callback

使用寄存器回调函数

我们用callback来更新之前的jelly_bean_reg_sequence。第26行和第27行创建/实列了一个callback 类,并让它知道TASTE寄存器(并将TASTE寄存器句柄复制给它)。第28行将callback加到了RECIPE寄存器。

注意:

第28行的uvm_reg_cbuvm_callbacks的typedef而已,请不要将之前我们用到的uvm_reg_cbs和这里uvm_reg_cb混淆。uvm_callbacks类将给定的callback添加到给定的object。

typedef uvm_callbacks#(uvm_reg, uvm_reg_cbs) uvm_reg_cb;
class jelly_bean_reg_sequence extends uvm_reg_sequence;
   `uvm_object_utils( jelly_bean_reg_sequence )
 
   function new( string name = "" );
      super.new( name );
   endfunction: new
 
   virtual task body();
      jelly_bean_reg_block       jb_reg_block;
      jelly_bean_types::flavor_e flavor;
      jelly_bean_types::color_e  color;
      bit                        sugar_free;
      bit                        sour;
      jelly_bean_types::taste_e  taste;
      uvm_status_e               status;
      uvm_reg_data_t             value;
 
      jelly_bean_recipe_reg_callback jb_recipe_reg_cb;
 
      $cast( jb_reg_block, model );
      flavor     = jelly_bean_types::APPLE;
      color      = jelly_bean_types::GREEN;
      sugar_free = 0;
      sour       = 1;
 
      jb_recipe_reg_cb = jelly_bean_recipe_reg_callback::type_id::create( "jb_recipe_reg_cb" );
      jb_recipe_reg_cb.jb_taste_reg = jb_reg_block.jb_taste_reg;
      uvm_reg_cb::add( jb_reg_block.jb_recipe_reg, jb_recipe_reg_cb );
 
      jb_reg_block.jb_recipe_reg.write( status, { sour, sugar_free, color, flavor } );
      taste = jelly_bean_types::taste_e'( jb_reg_block.jb_taste_reg.taste.get_mirrored_value() );
      `uvm_info( "body", $sformatf( "taste=%s", taste.name() ), UVM_NONE )
   endtask: body
 
endclass: jelly_bean_reg_sequence

下面的图显示了本文用到的类。粉色的是UVM类,绿色的是jelly-bean类。 

本文用到的类

仿真 

 注册完callback后,当写RECIPE寄存器是,寄存器模型也会更新TASTE寄存器的值。

寄存器写后寄存器模型的寄存器值
UVM_INFO sequences.svh(59) @ 20: uvm_test_top.jb_env.jb_agent.jb_seqr@@jb_reg_seq [body] taste=YUMMY

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: uvm-1.1a.tar.gz是一个库文件,它是Universal Verification Methodology(UVM)的开源版本,旨在帮助硬件验证工程师实现更高效、更准确的系统级验证工作。该版本的发布包括完整的UVM框架和示例代码,它们可以被应用于各种验证环境中。其中包含了基于SystemVerilog的类库、通用模型、事务级建模器和随机验证,同时也包括了DPI、OVM等不同验证中间件框架的支持。该版本提供了更多的互操作性和可扩展性,让用户能够快速开发和部署大规模验证工作。UVM已经成为ASIC和FPGA验证领域的事实标准,可以在不同的平台和工具上进行移植。因为它的开源特性和流行度,UVM支持社区持续创新和最佳实践的分享,不断提高Verilog验证技术的水平和效率。 ### 回答2: uvm-1.1a.tar.gz是一种开源的验证方法学框架,为现代芯片验证提供了一种完整而灵活的解决方案。它提供了一套可重用的Class Library,包括了各种验证组件,如监控,分析器,交通形成器和交通收集器,并提供了一种现代的验证方法学,包括创建可重用的测试用例和环境。UVM框架是基于SystemVerilog语言的,是目前工业界最常用的验证环境之一。该框架可以帮助芯片设计者和验证工程师更有效地制定验证计划和执行测试,缩短开发周期,提高产品质量和可重复性。同时,UVM也在学术界和研究机构中广泛应用,为芯片验证方法学的研究和发展提供了有力的支持和平台。总之,uvm-1.1a.tar.gz是一个非常有用的开源验证方法学框架,为芯片验证提供了强大的支持和帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值