For loop in SV

The for loop in SystemVerilog is a powerful construct that allows repeated execution of a block of code for a specified number of iterations. It is widely used in hardware modeling and verification for tasks like initializing arrays, generating repetitive structures, and performing iterative calculations.

Basics of the for Loop

The for loop is used when the number of iterations is known or can be determined programmatically. It consists of three parts:

  1. Initialization: Sets the starting value of the loop variable.
  2. Condition: Specifies the termination condition.
  3. Increment/Decrement: Updates the loop variable after each iteration.

Syntax

for (initialization; condition; increment/decrement) begin
    // Code block to be executed
end

Example 1: Initializing an Array

module initialize_array;
    logic [7:0] arr [0:9];  // Declare an array of 10 8-bit elements

    initial begin
        // Use a for loop to initialize the array
        for (int i = 0; i < 10; i++) begin
            arr[i] = i * 2;  // Assign each element the value 2*i
        end

        // Display the array values
        for (int i = 0; i < 10; i++) begin
            $display("arr[%0d] = %0d", i, arr[i]);
        end
    end
endmodule

Explanation:

  • The first for loop initializes each element of the array with 2 * i.
  • The second for loop prints the values of the array.

Output:

arr[0] = 0
arr[1] = 2
arr[2] = 4
arr[3] = 6
arr[4] = 8
arr[5] = 10
arr[6] = 12
arr[7] = 14
arr[8] = 16
arr[9] = 18

Example 2: Nested for Loops for Multi-Dimensional Arrays

Nested for loops are used to iterate through multi-dimensional arrays.

module initialize_matrix;
    logic [3:0] matrix [0:2][0:2];  // 3x3 matrix of 4-bit elements

    initial begin
        // Initialize the matrix with row*col
        for (int i = 0; i < 3; i++) begin
            for (int j = 0; j < 3; j++) begin
                matrix[i][j] = i * j;
            end
        end

        // Display the matrix
        for (int i = 0; i < 3; i++) begin
            for (int j = 0; j < 3; j++) begin
                $display("matrix[%0d][%0d] = %0d", i, j, matrix[i][j]);
            end
        end
    end
endmodule

Explanation:

  • The outer loop iterates through rows, and the inner loop iterates through columns.
  • The matrix elements are initialized with the product of their row and column indices.

Output:

matrix[0][0] = 0
matrix[0][1] = 0
matrix[0][2] = 0
matrix[1][0] = 0
matrix[1][1] = 1
matrix[1][2] = 2
matrix[2][0] = 0
matrix[2][1] = 2
matrix[2][2] = 4

In System Verilog, we can use a for loop to simulate the behavior of a forever loop by omitting the loop condition or by using an always-true condition like 1. Here’s how we can do it:

Example: With a counter

To make the loop more practical, I am including a counter to exit the loop after a certain number of iterations.

module for_as_forever_with_counter;

  initial begin
    int counter = 0;
    for (;;) begin
      $display("Iteration %0d at time %0t", counter, $time);
      #10;
      counter++;
      if (counter == 10) begin
        $display("Exiting loop after 10 iterations.");
        $finish;
      end
    end
  end

endmodule

Output:

Iteration 0 at time 0
Iteration 1 at time 10
Iteration 2 at time 20
Iteration 3 at time 30
Iteration 4 at time 40
Iteration 5 at time 50
Iteration 6 at time 60
Iteration 7 at time 70
Iteration 8 at time 80
Iteration 9 at time 90
Exiting loop after 10 iterations.

This approach effectively allows us to create a forever-like loop while retaining the flexibility of a for loop.

Common Errors with for Loops

  1. Off-by-One Error: Misinterpreting the termination condition can lead to executing one extra or one less iteration.
for (int i = 0; i <= 10; i++) begin  // Executes 11 iterations, not 10
end

2. Incorrect Variable Scoping: Declaring loop variables incorrectly can lead to unexpected behavior in nested loops.

for (int i = 0; i < 5; i++) begin
    for (int i = 0; i < 3; i++) begin  // Inner loop i conflicts with outer loop i
    end
end

3. Non-Terminating Loops: Ensure that the loop variable is updated correctly to meet the termination condition.