UVM糖果爱好者教程 - 19.Analysis FIFO

匿名 (未验证) 提交于 2019-12-03 00:30:01

jelly beans; 一个流是用于“期望的”jelly beans,另一个是用于“实际的”jelly beans。 同时假设jelly beans被异步喂入记分板。 为了同步jelly beans,我使用了两个analysis FIFO:


jelly bean计分板

这是实现上述记分牌的示例代码。下面的代码应该是不言自明的。需要注意的是,获取FIFO的下一个项目的方法是阻塞任务(第43和44行)。不过,不管怎样,这个任务在UVM类参考文献中没有记录。

2015年2月14日:更改为明确使用get_peek_export,而不是使用未记录的获取任务。

当期望的jelly bean和实际的jelly bean都可用时,记分板将它们比较(第45行)。在完成仿真(extract_phase)之前,计分板将检查FIFO中是否有任何存在残留的jelly bean。这不容易吗?

class asynchronous_jelly_bean_scoreboard extends uvm_component;    `uvm_component_utils( asynchronous_jelly_bean_scoreboard )      uvm_analysis_export  #( jelly_bean_transaction ) expected_analysis_export;    uvm_analysis_export  #( jelly_bean_transaction )   actual_analysis_export;    uvm_tlm_analysis_fifo#( jelly_bean_transaction ) expected_jelly_bean_fifo;    uvm_tlm_analysis_fifo#( jelly_bean_transaction )   actual_jelly_bean_fifo;      // Function: new    //-------------------------------------------------------------------------    function new( string name, uvm_component parent );       super.new( name, parent );    endfunction: new      // Function: build_phase    //-------------------------------------------------------------------------    virtual function void build_phase( uvm_phase phase );       super.build_phase( phase );         expected_analysis_export = new( "expected_analysis_export", this );         actual_analysis_export = new(   "actual_analysis_export", this );       expected_jelly_bean_fifo = new( "expected_jelly_bean_fifo", this );         actual_jelly_bean_fifo = new(   "actual_jelly_bean_fifo", this );    endfunction: build_phase      // Function: connect_phase    //-------------------------------------------------------------------------    virtual function void connect_phase( uvm_phase phase );       super.connect_phase( phase );         expected_analysis_export.connect( expected_jelly_bean_fifo.analysis_export );         actual_analysis_export.connect(   actual_jelly_bean_fifo.analysis_export );    endfunction: connect_phase      // Task: main_phase    //-------------------------------------------------------------------------    virtual task main_phase( uvm_phase phase );       jelly_bean_transaction expected_jelly_bean;       jelly_bean_transaction   actual_jelly_bean;         super.main_phase( phase );       forever begin          expected_jelly_bean_fifo.get_peek_export.get( expected_jelly_bean );            actual_jelly_bean_fifo.get_peek_export.get(   actual_jelly_bean );          if ( expected_jelly_bean.compare( actual_jelly_bean ) == 0 ) begin             `uvm_error( "main_phase",                          { "jelly bean mismatch: ",                           "expected:", expected_jelly_bean.convert2string(),                           "actual:",     actual_jelly_bean.convert2string() } )          end       end    endtask: main_phase      // Function: extract_phase - checks leftover jelly beans in the FIFOs    //-------------------------------------------------------------------------    virtual function void extract_phase( uvm_phase phase );       jelly_bean_transaction jelly_bean;         super.extract_phase( phase );       if ( expected_jelly_bean_fifo.try_get( jelly_bean ) ) begin          `uvm_error( "expected_jelly_bean_fifo",                       { "found a leftover jelly bean: ", jelly_bean.convert2string() } )       end         if ( actual_jelly_bean_fifo.try_get( jelly_bean ) ) begin          `uvm_error( "actual_jelly_bean_fifo",                      { "found a leftover jelly bean: ", jelly_bean.convert2string() } )       end    endfunction: extract_phase endclass: asynchronous_jelly_bean_scoreboard


您可以在EDA Playground上查看和编译代码。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!