这篇文章将解释如何使用Analysis FIFO。 假设我想要一个记分板来比较两种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上查看和编译代码。