这篇文章将解释如何使用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上查看和编译代码。