SystemVerilog offers great flexibility when creating complex data structures using different types of arrays. These arrays allow you to store and manipulate data efficiently. Let’s take a closer look at the four main types of arrays in SystemVerilog: Static Arrays, Dynamic Arrays, Associative Arrays, and Queues.

1. What is a Static Array in SystemVerilog?

A static array has a size that is fixed before compilation. You define its size during the declaration, and it cannot be changed at runtime. Let’s look at an example where we declare a static array of 8-bit values, assign some values to it, and print them.

Static Array Example:

module tb;
    bit [7:0] m_data;  // 1D packed array with 8 bits

    initial begin
        // 1. Assign a value to the array
        m_data = 8'hA2;

        // 2. Iterate through each bit of the array and print its value
        for (int i = 0; i < $size(m_data); i++) begin
            $display("m_data[%0d] = %b", i, m_data[i]);
        end
    end
endmodule

This code demonstrates how to work with static arrays in SystemVerilog. Static arrays can be further categorized into packed arrays and unpacked arrays.

Static Arrays: Packed vs Unpacked

  • Packed arrays: These arrays store multiple bits together as one element. Example: bit [2:0][7:0] m_data;
  • Unpacked arrays: These arrays store individual values with each index pointing to a different element. Example: bit [15:0] m_mem [10:0];

2. What are Dynamic Arrays in SystemVerilog?

A dynamic array does not have a fixed size during compilation. Instead, its size is determined during runtime and can change as needed. Dynamic arrays are identified by empty square brackets ([]).

Dynamic Array Example:

int m_mem[];  // Dynamic array holding integer values

With dynamic arrays, you can resize the array at runtime, which gives you the flexibility to store data that changes in size. This is particularly useful when the number of elements is not known in advance.

3. Understanding Associative Arrays in SystemVerilog

An associative array stores data using a key-value pair. The key can be any type, such as integers or strings, and is used to access the associated value. Associative arrays are declared with a key inside the square brackets.

Associative Array Example:

int m_data[int];         // Key is of type int, and data is of type int
int m_name[string];      // Key is of type string, and data is of type int

m_name["Rachel"] = 30;   // Store value with a string key
m_name["Orange"] = 2;

m_data[32'h123] = 3333;  // Store value with a hexadecimal key

In this example, the associative array m_name uses strings as keys, and the array m_data uses integers as keys. Associative arrays are a great way to store data where each element can be accessed using a unique identifier.

4. What are Queues in SystemVerilog?

A queue is a dynamic data structure where you can push and pop elements. You can add new elements to the end of the queue or remove them from the front. Queues are often used in scenarios where the order of data is important.

Queue Example:

int m_queue[$];  // Unbound queue with no fixed size

m_queue.push_back(23);  // Push value into the queue

int data = m_queue.pop_front(); // Pop value from the front of the queue

In this example, the $ symbol indicates that the queue has no fixed size. You can continue adding or removing data from the queue dynamically during runtime.


Comparison of SystemVerilog Array Types

Array TypeDescriptionSize Characteristics
Static ArraysFixed size, known at compile timeCannot be resized at runtime
Dynamic ArraysSize determined at runtime, can grow or shrinkSize can be changed during execution
Associative ArraysKey-value pairs for data storageSize is dynamic, accessed via keys
QueuesData can be added (pushed) or removed (popped)Dynamic size, FIFO (First In, First Out) structure

Final Thoughts on SystemVerilog Arrays

Understanding the types of arrays in SystemVerilog is crucial for managing data structures efficiently in your designs. Each array type offers unique benefits:

  • Static arrays are ideal when the size is known beforehand.
  • Dynamic arrays offer flexibility with resizing.
  • Associative arrays are perfect for storing data with a unique key.
  • Queues help manage data in a dynamic, ordered way.

By keeping these concepts in mind, you can choose the best type of array based on your design needs. Whether you’re working on a project with fixed or dynamic data, SystemVerilog arrays provide the tools to manage your data effectively.

Scroll to Top