UVM糖果爱好者教程 - 23.将Jelly Bean Taster移植到UVM 1.2

我的第一批UVM教程(#1至#6)已于三年前发布。 从那以后,UVM(以及我的知识)已经发展,我一直想更新我的文章和代码。 但这并不容易,因为我的文章和代码紧密结合,读者的一些评论甚至提到了特定的代码行。

UVM 1.2

大约两个月前,Accellera发布了新的UVM 1.2,它激励我更新我的 jelly bean taster。 我认为是时候进行大修了。 有趣的是,我的代码几乎不需要修改。 我做的唯一改变是利用了uvm_sequence_base类的新自动phase objection。 set_automatic_phase_objection函数在执行序列之前自动提出objection,并在结束序列(第25行)后丢弃objection。

class jelly_bean_test extends uvm_test;
  `uvm_component_utils( jelly_bean_test )
 
  jelly_bean_env jb_env;
 
  function new( string name, uvm_component parent );
    super.new( name, parent );
  endfunction: new
 
  function void build_phase( uvm_phase phase );
    super.build_phase( phase );
 
    jelly_bean_transaction::type_id::set_type_override( 
      sugar_free_jelly_bean_transaction::get_type() );
    jb_env = jelly_bean_env::type_id::create( .name( "jb_env" ), .parent( this ) );
  endfunction: build_phase
 
  task main_phase( uvm_phase phase );
    gift_boxed_jelly_bean_sequence jb_seq;
 
    jb_seq = gift_boxed_jelly_bean_sequence::type_id::create( .name( "jb_seq" ) );
    assert( jb_seq.randomize() );
    `uvm_info( "jb_seq", jb_seq.convert2string(), UVM_NONE )
    jb_seq.set_starting_phase( phase );
    jb_seq.set_automatic_phase_objection( .value( 1 ) );
    jb_seq.start( jb_env.jb_agent.jb_seqr );
  endtask: main_phase
endclass: jelly_bean_test

借此机会,我还简化了记分板,因为环境中使用的分层记分板总是让新手感到困惑。以下是验证组件的简化层次结构。请注意,jelly_bean_sb_subscriber周围的包装已被删除。如果您有兴趣,可以将此图与“概述”中的图形进行比较。


jelly_bean_sb_subscriber已经相应地被简化了。write函数自己检查口味是否具有期望值。

class jelly_bean_sb_subscriber extends uvm_subscriber#( jelly_bean_transaction );
  `uvm_component_utils( jelly_bean_sb_subscriber )
 
  function new( string name, uvm_component parent );
    super.new( name, parent );
  endfunction: new
 
  function void write( jelly_bean_transaction t );
    if (     t.flavor == CHOCOLATE && t.sour   && t.taste == YUMMY ||
         ! ( t.flavor == CHOCOLATE && t.sour ) && t.taste == YUCKY ) begin
      `uvm_error( get_name(), { "You lost sense of taste!", t.convert2string() } )
    end else begin
      `uvm_info( get_name(), { "You have a good sense of taste.", t.convert2string() }, UVM_LOW )
    end
  endfunction: write  
endclass: jelly_bean_sb_subscriber

jelly_bean_env直接实例化没有包装的jelly_bean_sb_subscriber(第16行)。

class jelly_bean_env extends uvm_env;
  `uvm_component_utils( jelly_bean_env )
 
  jelly_bean_agent         jb_agent;
  jelly_bean_fc_subscriber jb_fc;
  jelly_bean_sb_subscriber jb_sb;
 
  function new( string name, uvm_component parent );
    super.new( name, parent );
  endfunction: new
 
  function void build_phase( uvm_phase phase );
    super.build_phase( phase );
    jb_agent = jelly_bean_agent        ::type_id::create( .name( "jb_agent" ), .parent( this ) );
    jb_fc    = jelly_bean_fc_subscriber::type_id::create( .name( "jb_fc"    ), .parent( this ) );
    jb_sb    = jelly_bean_sb_subscriber::type_id::create( .name( "jb_sb"    ), .parent( this ) );
  endfunction: build_phase
 
  function void connect_phase( uvm_phase phase );
    super.connect_phase( phase );
    jb_agent.jb_ap.connect( jb_fc.analysis_export );
    jb_agent.jb_ap.connect( jb_sb.analysis_export );
  endfunction: connect_phase  
endclass: jelly_bean_env


您现在可以在EDA Playground上查看并运行新代码!对于那些不了解EDA Playground的人来说,它是由Victor EDA,Inc.开发的基于网络的仿真器。大约两周前,他们添加了Aldec的Riviera-PRO EDU仿真器,这使我们能够使用SystemVerilog的全部功能,包括随机化,SVA和功能覆盖率。多么美妙!谢谢Victor EDA和Aldec!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值