Welcome ! This website will help YOU (recent graduates/professionals) learn verification languages like SystemVerilog and UVM. Register for free and access more content !

When size of a collection is unknown or the data space is sparse, an associative array is a better option. Associative arrays do not have any storage allocated until it is used, and the index expression is not restricted to integral expressions, but can be of any type.

An associative array implements a look-up table of the elements of its declared type. The data type to be used as an index serves as the lookup key and imposes an ordering.

Syntax

 
  // Value     Array_Name          [ key ];
  data_type    array_identifier    [ index_type ];
 

Initialization Example

 
module tb;
 
  int     array1 [int];       // An integer array with integer index
  int     array2 [string];     // An integer array with string index
  string  array3 [string];     // A string array with string index
 
    initial begin
        // Initialize each dynamic array with some values
      array1 = '{ 1 : 22,
                6 : 34 };
 
    array2 = '{ "Ross" : 100,
                "Joey" : 60 };
 
    array3 = '{ "Apples" : "Oranges",
                "Pears" : "44" };
 
        // Print each array
      $display ("array1 = %p", array1);
      $display ("array2 = %p", array2);
      $display ("array3 = %p", array3);
    end
endmodule
 
Simulation Log
ncsim> run
array1 = '{1:22, 6:34}
array2 = '{"Joey":60, "Ross":100}
array3 = '{"Apples":"Oranges", "Pears":"44"}
ncsim: *W,RNQUIE: Simulation is complete.

Click to try this example in a simulator!   

Dynamic Array Methods

Function Description
function int num (); Returns the number of entries in the associative array
function int size (); Also returns the number of entries, if empty 0 is returned
function void delete ( [input index] ); index when specified deletes the entry at that index, else the whole array is deleted
function int exists (input index); Checks whether an element exists at specified index; returns 1 if it does, else 0
function int first (ref index); Assigns to the given index variable the value of the first index; returns 0 for empty array
function int last (ref index); Assigns to given index variable the value of the last index; returns 0 for empty array
function int next (ref index); Finds the smallest index whose value is greater than the given index
function int prev (ref index); Finds the largest index whose value is smaller than the given index

SystemVerilog Dynamic Array Method Example

 
module tb;
    int      fruits_l0 [string];
 
    initial begin
      fruits_l0 = '{ "apple"  : 4, 
                     "orange" : 10,
                     "plum"   : 9,
                     "guava"  : 1 };
 
 
      // size() : Print the number of items in the given dynamic array
      $display ("fruits_l0.size() = %0d", fruits_l0.size());
 
 
      // num() : Another function to print number of items in given array
      $display ("fruits_l0.num() = %0d", fruits_l0.num());
 
 
      // exists() : Check if a particular key exists in this dynamic array
      if (fruits_l0.exists ("orange"))
        $display ("Found %0d orange !", fruits_l0["orange"]);
 
      if (!fruits_l0.exists ("apricots"))
        $display ("Sorry, season for apricots is over ...");
 
      // Note: String indices are taken in alphabetical order
      // first() : Get the first element in the array
      begin
        string f;
        // This function returns true if it succeeded and first key is stored
        // in the provided string "f"
        if (fruits_l0.first (f))
          $display ("fruits_l0.first [%s] = %0d", f, fruits_l0[f]);
      end
 
      // last() : Get the last element in the array
      begin
        string f;
        if (fruits_l0.last (f))
          $display ("fruits_l0.last [%s] = %0d", f, fruits_l0[f]);
      end
 
      // prev() : Get the previous element in the array
      begin
        string f = "orange";
        if (fruits_l0.prev (f))
          $display ("fruits_l0.prev [%s] = %0d", f, fruits_l0[f]);
      end
 
      // next() : Get the next item in the array
      begin
        string f = "orange";
        if (fruits_l0.next (f))
          $display ("fruits_l0.next [%s] = %0d", f, fruits_l0[f]);
      end
    end
endmodule
 
Simulation Log
ncsim> run
fruits_l0.size() = 4
fruits_l0.num() = 4
Found 10 orange !
Sorry, season for apricots is over ...
fruits_l0.first [apple] = 4
fruits_l0.last [plum] = 9
fruits_l0.prev [guava] = 1
fruits_l0.next [plum] = 9
ncsim: *W,RNQUIE: Simulation is complete.

Click to try this example in a simulator!   

Creating a dynamic array of associative arrays

 
module tb;
  // Create an associative array with key of type string and value of type int
  // for each index in a dynamic array
  int fruits [] [string];
 
  initial begin
    // Create a dynamic array with size 2
    fruits = new [2];
 
    // Initialize the associative array inside each dynamic array index
    fruits [0] = '{ "apple" : 1, "grape" : 2 };
    fruits [1] = '{ "melon" : 3, "cherry" : 4 };
 
    // Iterate through each index of dynamic array
    foreach (fruits[i])
      // Iterate through each key of the current index in dynamic array
      foreach (fruits[i][fruit])
        $display ("fruits[%0d][%s] = %0d", i, fruit, fruits[i][fruit]);
 
  end
endmodule
 
Simulation Log
ncsim> run
fruits[0][apple] = 1
fruits[0][grape] = 2
fruits[1][cherry] = 4
fruits[1][melon] = 3
ncsim: *W,RNQUIE: Simulation is complete.

Click to try this example in a simulator!   

Embedding a dynamic array within each index of an associative array

 
// Create a new typedef that represents a dynamic array
typedef int int_da [];
 
module tb;
  // Create an associative array where key is a string 
  // and value is a dynamic array
  int_da fruits [string];
 
  initial begin
    // For key "apple", create a dynamic array that can hold 2 items 
    fruits ["apple"] = new [2];
 
    // Initialize the dynamic array with some values
    fruits ["apple"] = '{ 4, 5};
 
    // Iterate through each key, where key represented by str1
    foreach (fruits[str1]) 
      // Iterate through each item inside the current dynamic array ie.fruits[str1]
      foreach (fruits[str1][i])
        $display ("fruits[%s][%0d] = %0d", str1, i, fruits[str1][i]);
 
  end
endmodule
 
Simulation Log
ncsim> run
fruits[apple][0] = 4
fruits[apple][1] = 5
ncsim: *W,RNQUIE: Simulation is complete.

Click to try this example in a simulator!   

Was this article helpful ?

We use cookies to personalize content and ads, to provide social media features and to analyze our traffic. You consent to our cookies if you continue to use our website. To find out more about the cookies we use and how to delete them, see our privacy policy.

  I accept cookies from this site.
Agree
EU Cookie Directive plugin by www.channeldigital.co.uk