Jump to content

flush function of uvm_tlm_fifo class does not work as expected


Recommended Posts

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

 

 

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 ?

Link to comment
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...