JingWang Posted September 28, 2023 Report Share Posted September 28, 2023 Hi, I am trying to use flush function in uvm_tlm_fifo class to clear all transactions in uvm_tlm_fifo, but it can not work correctly. the code of flush function in uvm_tlm_fifo class is as below. // Function -- NODOCS -- flush // // Removes all entries from the FIFO, after which <used> returns 0 // and <is_empty> returns 1. virtual function void flush(); T t; bit r; m_clear_zombie_gets(); if( m.num() > 0 && m_pending_blocked_gets.size() != 0 ) begin uvm_report_error("flush failed" , "there are blocked gets preventing the flush", UVM_NONE); return; end r = 1; while( r ) r = m.try_get( t ) ; endfunction For " while( r ) r = m.try_get( t ) ; ", in the while loop it used mailbox m in-build function try_get(). Reference to Systemverilog IEEE 1800-2017 LRM 15.4.6 try_get(): If a message is available and the message type is equivalent to the type of the message variable, the message is retrieved, and the method returns a positive integer. m.try_get(t) returns a positive integer number, and it will be assigned to var r, but var r is bit type, so int number bit0 will be assigned to var r actually. In that case, r may be assigned to zero, and while loop can go out even when mailbox m still has transaction in it. That is the case I meet, the flush function does not work as expected. I also download previous release of UVM code. I found before UVM 2017 v1.1 Library Code for IEEE 1800.2 flush function is correct. the code is as below: // Function -- NODOCS -- flush // // Removes all entries from the FIFO, after which <used> returns 0 // and <is_empty> returns 1. virtual function void flush(); T t; bit r; r = 1; while( r ) r = try_get( t ) ; if( m.num() > 0 && m_pending_blocked_gets != 0 ) begin uvm_report_error("flush failed" , "there are blocked gets preventing the flush", UVM_NONE); end endfunction Quote Link to comment Share on other sites More sharing options...
Justin Refice Posted September 29, 2023 Report Share Posted September 29, 2023 Why do you say "before UVM 2017 v1.1 Library Code for IEEE 1800.2 flush function is correct?" Both versions of the code declare 'r' to be of type 'bit,' and therefore, both could get into the same problem of an even positive integer value incorrectly reducing to 0. I've opened https://accellera.mantishub.io/view.php?id=7933 to track the fix. Quote Link to comment Share on other sites More sharing options...
JingWang Posted October 5, 2023 Author Report Share Posted October 5, 2023 Question: Why do you say "before UVM 2017 v1.1 Library Code for IEEE 1800.2 flush function is correct? Answer: the below code is flush function of uvm_tlm_fifo.svh in 1800.2-2020-2.0 Library Code care for the Line.14, it used mailbox's in-build function try_get(); 1 virtual function void flush(); 2 T t; 3 bit r; 4 5 m_clear_zombie_gets(); 6 7 if( m.num() > 0 && m_pending_blocked_gets.size() != 0 ) begin 8 uvm_report_error("flush failed" , 9 "there are blocked gets preventing the flush", UVM_NONE); 10 return; 11 end 12 13 r = 1; 14 while( r ) r = m.try_get( t ) ; 15 16 17 endfunction the below code is flush function of uvm_tlm_fifo.svh in UVM 2017 v1.1 Library Code for IEEE 1800.2 the critical code is Line.6, it used the function try_get() in class uvm_tlm_fifo, but not the mailbox in-build function! 1 virtual function void flush(); 2 T t; 3 bit r; 4 5 r = 1; 6 while( r ) r = try_get( t ) ; 7 8 if( m.num() > 0 && m_pending_blocked_gets != 0 ) begin 9 uvm_report_error("flush failed" , 10 "there are blocked gets preventing the flush", UVM_NONE); 11 end 12 13 endfunction And in all UVM Version Library Code, the try_get() function in class uvm_tlm_fifo which is as below are all the same. The one of differences between function try_get() in class uvm_tlm_fifo and the mailbox is the return value type! the function try_get() in class uvm_tlm_fifo return type is bit, and the mailbox try_get() function return type is int. virtual function bit try_get( output T t ); if( !m.try_get( t ) ) begin return 0; end get_ap.write( t ); return 1; endfunction So in UVM-1.1d, UVM-1.2, and UVM 2017 v1.1 Library Code for IEEE 1800.2, the flush function of uvm_tlm_fifo is correct. But after UVM 2017 v1.1 Library Code for IEEE 1800.2, the flush function of uvm_tlm_fifo is wrong. I have a question: Why change the line code from while( r ) r = try_get( t ) ; to while( r ) r = m.try_get( t ) ; after UVM 2017 v1.1 Library Code for IEEE 1800.2 ? Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.