Systemverilog Queue

Queue in SystemVerilog 


A queue is a variable-size, ordered collection of homogeneous elements.
  • like dynamic array, queues can grow and shrink
  • queue supports adding and removing elements anywhere. 

Queues are declared using the same syntax as unpacked arrays, but specifying $ as the array size. In queue 0 represents the first, and $ representing the last entries.

Queue can be bounded or unbounded.
  • bounded queue     - queue with number of entries limited or queue size specified
  • unbounded queue - queue with unlimited entries or queue size not specified

Queue Declaration:


    data_type queue_name[$];
        where:        
        data_type        -  data type of the queue elements.        
        queue_name    -  name of the queue.

Queue Declaration Example:


   bit    queue_1[$];     // queue of bits  (unbound queue)
   int    queue_2[$];     // queue of int  
   byte   queue_3[$:255]; // queue of byte (bounded queue with 256 entries)
   string queue_4[$];     // queue of strings

Queue Initialization:


   queue_1  = {0,1,2,3};  
   queue_4  = {“Red”,"Blue”,"Green”};

Unbounded Queue


SystemVerilog Queue
SystemVerilog queue


Bounded Queue


SystemVerilog Bounded Queue
Bounded queue

Queue Methods:


    size()            -->    returns the number of items in the queue.
    insert()          -->    inserts the given item at the specified index position.
    delete()         -->    deletes the item at the specified index position.
    push_front()  -->    inserts the given element at the front of the queue.
    push_back() -->    inserts the given element at the end of the queue.
    pop_front()   -->    removes and returns the first element of the queue.
    pop_back()   -->    removes and returns the last element of the queue.

Unbounded Queue Declaration, Initialization, Size, Insert and Delete Method 


This example shows declaration and usage Queue methods.

module queues_array;
  //declaration
  bit    [31:0] queue_1[$]; //unbounded queue
  string  queue_2[$];  
  
  initial begin
    //Queue Initialization:
    queue_1 = {0,1,2,3};
    queue_2 = {"Red","Blue","Green"};
    
    //Size-Method
    $display("----- Queue_1 size is %0d  -----",queue_1.size());
    foreach(queue_1[i]) $display("\tqueue_1[%0d] = %0d",i,queue_1[i]);    
    $display("----- Queue_2 size is %0d  -----",queue_2.size());
    foreach(queue_2[i]) $display("\tqueue_2[%0d] = %0s",i,queue_2[i]);
    
    //Insert-Method
    queue_2.insert(1,"Orange");
    $display("----- Queue_2 size  after inserting Orange is %0d  -----",queue_2.size());
    foreach(queue_2[i]) $display("\tqueue_2[%0d] = %0s",i,queue_2[i]);
    
    //Delete Method
    queue_2.delete(3);
    $display("----- Queue_2 size after Delete is %0d  -----",queue_2.size());
    foreach(queue_2[i])$display("\tqueue_2[%0d] = %0s",i,queue_2[i]);
  end

endmodule

 Simulator Output  


----- Queue_1 size is 4 -----
queue_1[0] = 0
queue_1[1] = 1
queue_1[2] = 2
queue_1[3] = 3
----- Queue_2 size is 3 -----
queue_2[0] = Red
queue_2[1] = Blue
queue_2[2] = Green
----- Queue_2 size after inserting Orange is 4 -----
queue_2[0] = Red
queue_2[1] = Orange
queue_2[2] = Blue
queue_2[3] = Green
----- Queue_2 size after Delete is 3 -----
queue_2[0] = Red
queue_2[1] = Orange
queue_2[2] = Blue
Execute the above code on 



Queue, push_front(), push_back(), pop_front() and pop_back() Method


SystemVerilog Queue Operations
Queue Operations


module queues_array;
  //declaration
  bit    [31:0] queue_1[$]; 
  int    lvar;  
  
  initial begin
    //Queue Initialization:
    queue_1 = {0,1,2,3};
    
    //Size-Method
    $display("\tQueue_1 size is %0d",queue_1.size());   
    
    //Push_front Method
    queue_1.push_front(22);
    $display("\tQueue_1 size after push_front is %0d",queue_1.size());
    
    //Push_back  Method
    queue_1.push_back(44);
    $display("\tQueue_1 size after push_back is %0d",queue_1.size());

 //Pop_front Method
 lvar = queue_1.pop_front();
    $display("\tQueue_1 pop_front value is %0d",lvar);

 //Pop_back Method
 lvar = queue_1.pop_back();
    $display("\tQueue_1 pop_back value is %0d",lvar);
  end
endmodule

 Simulator Output  

Queue_1 size is 4
Queue_1 size after push_front is 5
Queue_1 size after push_back is 6
Queue_1 pop_front value is 22
Queue_1 pop_back value is 44
Execute the above code on 



Bounded queue declaration and accessing


Number of entries of bounded queue are limited, push_back to the bounded queue (after the queue full condition) will not impact any changes to the queue.  push_front to the bounded queue (after the queue full condition) will delete the last entry from queue and stores new entry in 0th index of queue.

Bounded Queue Operations
Bounded Queue Operations


module queues_array;
  //declaration
  int    queue[$:2];
  int    index;
  int  temp_var;
   
  initial begin
    //Queue Initialization:
    queue = {7,3,1};
     
    $display("Queue elements are,");
    $display("\tqueue = %p",queue);
    
    queue.push_back(10);
    
    $display("After push_back Queue elements are,");
    $display("\tqueue = %p",queue);
    
    queue.push_front(10);
    
    $display("After push_front Queue elements are,");
    $display("\tqueue = %p",queue);
  end
 
endmodule

 Simulator Output  

Queue elements are,
queue = '{7, 3, 1}
After push_back Queue elements are,
queue = '{7, 3, 1}
After push_front Queue elements are,
queue = '{10, 7, 3}
Execute the above code on 




Accessing random element of queue


In below example, random queue entry will be accessed by using index. Unlike pop_front/pop_back option queue entry will not get deleted on accessing with index of queue.

module queues_array;
  //declaration
  int    queue[$];
  int    index;
  int  temp_var;
   
  initial begin
    //Queue Initialization:
    queue = {7,3,1,0,8};
     
    $display("----- Queue elements with index -----");
    foreach(queue[i]) 
      $display("\tqueue[%0d] = %0d",i,queue[i]);
    $display("-------------------------------------\n");
    
    $display("Before Queue size is %0d",queue.size());
    repeat(2) begin //{
      index    = $urandom_range(0,4); //index of queue is from 0 to 4
      temp_var = queue[index];
      $display("Value of Index %0d in Queue is %0d",index,temp_var);
    end //} 
    $display("After Queue size is %0d",queue.size());
  end
endmodule

 Simulator Output  

----- Queue elements with index -----
queue[0] = 7
queue[1] = 3
queue[2] = 1
queue[3] = 0
queue[4] = 8
-------------------------------------

Before Queue size is 5
Value of Index 3 in Queue is 0
Value of Index 0 in Queue is 7
After Queue size is 5

Execute the above code on 





Deleting random element of queue with index


Calling queue.delete(index) method will delete the entry stored with 'index'.

module queues;
  //declaration
  int    queue[$];
  int    index;
  int  temp_var;
   
  initial begin
    //Queue Initialization:
    queue = {7,3,1,0,8};
     
    $display("Queue entries are %p",queue);
    $display("Before Queue size is %0d",queue.size());
    index    = $urandom_range(0,4); //index of queue is from 0 to 4
    $display("Index %0d is deleted",index);
    queue.delete(index);
    $display("After Queue size is %0d",queue.size());
    $display("Queue entries are %p",queue);
   
    $display("\nQueue entries are %p",queue);
    $display("Before Queue size is %0d",queue.size());
    index    = $urandom_range(0,3); //index of queue is from 0 to 4
    $display("Index %0d is deleted",index);
    queue.delete(index);
    $display("After Queue size is %0d",queue.size());
    $display("Queue entries are %p",queue);    
  end
endmodule

 Simulator Output  

Queue entries are '{7, 3, 1, 0, 8}
Before Queue size is 5
Index 3 is deleted
After Queue size is 4
Queue entries are '{7, 3, 1, 8}

Queue entries are '{7, 3, 1, 8}
Before Queue size is 4
Index 0 is deleted
After Queue size is 3
Queue entries are '{3, 1, 8}

Execute the above code on 

Deleting complete queue


Calling queue.delete() method will delete the complete queue, which leads to deletion of all the entries of queue.

module qu_delete;
  //queue declaration
  int qu[$];  
  
  initial begin

    qu.push_back(2);
    qu.push_back(13);
    qu.push_back(5);
    qu.push_back(65);
    
    $display("[Before-Delete] Queue size is %0d",qu.size());
    qu.delete();
    $display("[After -Delete] Queue size is %0d",qu.size());    
    
  end
endmodule

 Simulator Output  

[Before-Delete] Queue size is 4
[After -Delete] Queue size is 0

Execute the above code on