Loops
In SystemVerilog, loops are a powerful tool for repeating a block of statements. Loop statements can execute their bodies zero or more times, based on certain conditions. It's important to note that, like other compound statements in SystemVerilog, the body of a loop can consist of a single statement or a block of statements enclosed by begin
and end
keywords. These keywords are essential for denoting the start and end of a block, especially when there are multiple statements within the loop body.
Loop constructs in SystemVerilog need to be encapsulated within an
initial
,always
, or other procedural block. This is because loops are a procedural construct and they require a procedural context to execute.
Now, let's delve into some of the most commonly used loop constructs:
For Loop
The for
loop is the most commonly used loop in SystemVerilog. It consists of an initialization, a condition, and an increment/decrement operation.
module MyModule;
integer i;
initial begin
for(i=0; i<5; i=i+1) begin
$display("The value of i is %d", i);
end
end
endmodule
In this example, the for
loop will print the values of i
from 0 to 4.
While Loop
The while
loop repeatedly executes a block of statements as long as a specified condition is true.
module MyModule;
integer i = 0;
initial begin
while(i<5) begin
$display("The value of i is %d", i);
i = i+1;
end
end
endmodule
In this example, the while
loop will print the values of i
from 0 to 4, similar to the for
loop.
Forever Loop
The forever
loop executes a block of statements an infinite number of times. This is typically used in testbenches and event-driven simulations.
module MyModule;
integer i = 0;
initial begin
forever begin
#5 $display("The simulation time is %0d", $time);
end
end
endmodule
In this example, the forever
loop will print the simulation time every 5 time units, indefinitely.
Care should be taken when using loops, especially with
forever
loop in a simulation context, as they can lead to an infinite simulation run if not controlled properly. We talk about break and continue statement at the end of this section which allows us to control and manage loops.
Repeat Loop
The repeat
loop executes a block of statements a specified number of times.
module MyModule;
integer i = 5;
initial begin
repeat(i) begin
$display("The simulation time is %0d", $time);
end
end
endmodule
In this example, the repeat
loop will print the simulation time 5 times.
Foreach Loop
The foreach
loop in SystemVerilog is used to iterate over the elements of an array. The loop automatically traverses all elements in the array from start to end.
Here's an example of how to use a foreach
loop:
module MyModule;
integer array[5:0] = '{0, 1, 2, 3, 4, 5};
integer i;
initial begin
foreach (array[i]) begin
$display("The value of array[%0d] is %d", i, array[i]);
end
end
endmodule
In this example, the foreach
loop traverses the array
and for each index i
, it displays the index and corresponding value of the array. The output would look like this:
The value of array[0] is 0
The value of array[1] is 1
The value of array[2] is 2
The value of array[3] is 3
The value of array[4] is 4
The value of array[5] is 5
These are some of the loop constructs available in SystemVerilog. Loop statements are a fundamental part of control flow, allowing for repetitive and iterative operations. While writing loops, always remember to enclose multiple statements within the begin
and end
keywords to form a block, so that the loop is correctly implemented.
Break and Continue
In SystemVerilog, break
and continue
are two control flow statements that can change the normal sequence of execution of a loop (for
, while
, forever
, foreach
, and do while
).
The break
statement, when used inside a loop, immediately terminates the loop and transfers execution to the first statement after the loop.
Here's an example of how to use a break
statement:
module MyModule;
integer i;
initial begin
for(i=0; i<10; i=i+1) begin
if (i == 5) begin
break;
end
$display("The value of i is %d", i);
end
end
endmodule
In this example, the for
loop will stop executing as soon as i
becomes 5 due to the break
statement. So, the output will display values from 0 to 4.
The continue
statement, when used inside a loop, skips the rest of the current iteration and transfers control to the next iteration of the loop.
Here's an example of how to use a continue
statement:
module MyModule;
integer i;
initial begin
for(i=0; i<10; i=i+1) begin
if (i == 5) begin
continue;
end
$display("The value of i is %d", i);
end
end
endmodule
In this example, when i
becomes 5, the continue
statement is executed. This will skip the $display
statement for that iteration, and the loop will continue with the next iteration (i=6). So, the output will display values from 0 to 4 and 6 to 9, skipping 5.
These statements (break
and continue
) provide you with more control over the flow of your loops, allowing you to terminate or skip iterations based on certain conditions. They can be quite handy in many situations to make your SystemVerilog code more efficient and effective.
Have a Question?
Feel free to ask your question in the comments below.
Please Login to ask a question.
Login Now