UVM糖果爱好者教程 - 7.虚拟序列

你知道如果将两个柠檬和两个椰子混合,jelly beans会产生柠檬酥皮派的味道吗?而两种草莓和两种香草的混合,jelly beans会产生草莓脆饼的味道?这篇文章将提供关于创建这些新jelly beans食谱的虚拟序列的解释。

Overview

第一个图显示了本文中使用的验证组件的关系。前一篇文章中的jelly_bean_taster(DUT)是“增强的”,通过两个jelly_bean_ifs同时接受两种jelly-bean的风味。这个新的DUT被称为jelly_bean_taster_subsystem。为了驱动两个接口,使用两个jelly_bean_agent实例。 jelly_bean_recipe_virtual_sequence协调创建jelly-bean的风味,以创造出新的风味。页面底部的第二个图显示了类图中的验证组件,第三个图显示了类图中的验证对象。

Virtual Sequence

虚拟序列在第二行定义了三个新的jelly-bean食谱(LEMON_MERINGUE_PIE,STRAWBERRY_SHORTCAKE和CANDY_APPLE)。每个配方需要两种jelly-bean味。例如,要创建LEMON_MERINGUE_PIE配方,需要两个LEMON jelly beans和两个COCONUT jelly beans。创建两个子序列(same_flavored_jelly_beans_sequence)(第19行)以生成两种风味。 21行的case语句根据食谱准备了两种 jelly-bean味道。在body task末尾,两个子序列并行启动(第42行)。

class jelly_bean_recipe_virtual_sequence extends uvm_sequence#( uvm_sequence_item );
   typedef enum bit[1:0] { LEMON_MERINGUE_PIE,   // 2 LEMON      + 2 COCONUT
                           STRAWBERRY_SHORTCAKE, // 2 STRAWBERRY + 2 VANILLA
                           CANDY_APPLE           // 2 APPLE      + 1 CINNAMON
                           } recipe_e;
   rand recipe_e recipe;
 
   jelly_bean_sequencer jb_seqr1;
   jelly_bean_sequencer jb_seqr2;
 
   same_flavored_jelly_beans_sequence jb_seq1;
   same_flavored_jelly_beans_sequence jb_seq2;
 
   function new( string name = "" );
      super.new( name );
   endfunction: new
 
   task body();
      jb_seq1 = same_flavored_jelly_beans_sequence::type_id::create( .name( "jb_seq1" ), .contxt( get_full_name() ) );
      jb_seq2 = same_flavored_jelly_beans_sequence::type_id::create( .name( "jb_seq2" ), .contxt( get_full_name() ) );
      case ( recipe )
        LEMON_MERINGUE_PIE: begin
           jb_seq1.flavor          = jelly_bean_transaction::LEMON;
           jb_seq2.flavor          = jelly_bean_transaction::COCONUT;
           jb_seq1.num_jelly_beans = 2;
           jb_seq2.num_jelly_beans = 2;
        end
        STRAWBERRY_SHORTCAKE: begin
           jb_seq1.flavor          = jelly_bean_transaction::STRAWBERRY;
           jb_seq2.flavor          = jelly_bean_transaction::VANILLA;
           jb_seq1.num_jelly_beans = 2;
           jb_seq2.num_jelly_beans = 2;
        end
        CANDY_APPLE: begin
           jb_seq1.flavor          = jelly_bean_transaction::APPLE;
           jb_seq2.flavor          = jelly_bean_transaction::CINNAMON;
           jb_seq1.num_jelly_beans = 2;
           jb_seq2.num_jelly_beans = 1;
        end
      endcase // case ( recipe )
      `uvm_info( get_name(), { "\n", this.sprint() }, UVM_LOW )
      fork
         jb_seq1.start( .sequencer( jb_seqr1 ), .parent_sequence( this ) );
         jb_seq2.start( .sequencer( jb_seqr2 ), .parent_sequence( this ) );
      join
   endtask: body
 
   `uvm_object_utils_begin( jelly_bean_recipe_virtual_sequence )
      `uvm_field_enum  ( recipe_e, recipe, UVM_ALL_ON )
      `uvm_field_object( jb_seq1,          UVM_ALL_ON )
      `uvm_field_object( jb_seq2,          UVM_ALL_ON )
   `uvm_object_utils_end
endclass: jelly_bean_recipe_virtual_sequence

Test

jelly_bean_recipe_test类创建上述虚拟序列。首先,测试将两个jelly_bean_sequencer分配给虚拟序列(第13行和第14行)。通过这样做,子序列jb_seq1将在代理#1中的序列发生器(sequencer)上运行,而子序列jb_seq2将在代理#2中的序列发生器上运行。该测试将随机化虚拟序列并在第15行和第16行上启动序列。请注意,由于没有与虚拟序列关联的序列发生器,因此启动任务的sequencer参数为空。

class jelly_bean_recipe_test extends jelly_bean_base_test;
   `uvm_component_utils( jelly_bean_recipe_test )
 
   function new( string name, uvm_component parent );
      super.new( name, parent );
   endfunction: new
 
   task main_phase( uvm_phase phase );
      jelly_bean_recipe_virtual_sequence jb_vseq;
 
      phase.raise_objection( .obj( this ) );
      jb_vseq = jelly_bean_recipe_virtual_sequence::type_id::create( .name( "jb_vseq" ), .contxt( get_full_name() ) );
      jb_vseq.jb_seqr1 = jb_env.jb_agent1.jb_seqr;
      jb_vseq.jb_seqr2 = jb_env.jb_agent2.jb_seqr;
      assert( jb_vseq.randomize() );
      jb_vseq.start( .sequencer( null ) );
      #100ns ;
      phase.drop_objection( .obj( this ) );
   endtask: main_phase
endclass: jelly_bean_recipe_test

Simulation

让我们运行一个仿真来看看虚拟序列产生的新味道。在我的例子中,这个序列产生了一个CANDY_APPLE配方。它依次使第一个序列(jb_seq1)生成两个APPLE果冻豆,并使第二个序列(jb_seq2)生成一个CINNAMON果冻豆。

UVM_INFO jb.sv(266) @ 0: reporter@@jb_vseq [jb_vseq]
------------------------------------------------------------------------------------
Name                           Type                                Size  Value
------------------------------------------------------------------------------------
jb_vseq                        jelly_bean_recipe_virtual_sequence  -     @1196
  recipe                       recipe_e                            2     CANDY_APPLE
  jb_seq1                      same_flavored_jelly_beans_sequence  -     @1200
    num_jelly_beans            integral                            32    'h2
    flavor                     jelly_bean_transaction::flavor_e    3     APPLE
    req                        object                              -
    rsp                        object                              -
  jb_seq2                      same_flavored_jelly_beans_sequence  -     @1204
    num_jelly_beans            integral                            32    'h1
    flavor                     jelly_bean_transaction::flavor_e    3     CINNAMON
    req                        object                              -
    rsp                        object                              -
  depth                        int                                 32    'd1
  parent sequence (name)       string                              0     ""
  parent sequence (full name)  string                              0     ""
  sequencer                    string                              0     ""
  req                          object                              -
  rsp                          object                              -
------------------------------------------------------------------------------------

                                

                                                                        Component Class Diagram


                                        Object Class Diagram

我希望这篇教程能帮助你理解虚拟序列。哦,对于那些对更多jelly-bean食谱感兴趣的人,请咨询本网站。

github获取源码


EDA Playground上查看或者运行代码


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值