In today’s blog we will study loops that are used in computer programming also, and which we already know about, and almost all the functions are the same, just the syntax will be a little different in Verilog. So let’s check that
In Verilog, looping statements are classified into four types: while, for, repeat, and forever. Only initial or always blocks can include looping statements. Delay expressions can be used in loops.
While Loop
This loop is specified with the keyword while. The while loop runs until the while-expression is false. When the loop is entered when the while-expression is false, the loop is not performed.
These operators can be used to specify any logical expression. If numerous statements are to be run in a loop, they must be separated by the keywords begin and end. The while loop is seen in the example below.
//Increment count from 0 to 255 and exit at count 256. integer count; initial begin count = 0; while (count < 256) //exit at count 256 begin $display("Count = %d", count); count = count + 1; end end
For loops are commonly employed when the loop has a definite beginning and finish.
If the loop is merely looping on a condition, the while loop is preferable.
Let’s see another example of a while loop with output so that its concept will be clearer.
module while_example(); reg [5:0] loc; reg [7:0] data; always @ (data or loc) begin loc = 0; // If Data is 0, then loc is 32 (invalid value) if (data == 0) begin loc = 32; end else begin while (data[0] == 0) begin loc = loc + 1; data = data >> 1; end end $display ("DATA = %b LOCATION = %d",data,loc); end initial begin #1 data = 8'b11; #1 data = 8'b100; #1 data = 8'b1000; #1 data = 8'b1000_0000; #1 data = 8'b0; #1 $finish; end endmodule
The output of the above example is shown below as programmed.
Fig 1: While Loop Output
For Loop
The loop is specified with the keyword for. The loop is divided into three sections:
- a starting point
- a test to determine whether the termination condition is true
- a procedural assignment to modify the control variable’s value
The for loop includes the initialization condition and the incrementing procedural assignment, so they do not need to be given individually. As a result, the for loop has a more compact loop structure than the while loop.
However, the while loop is more broad in nature than the for loop. The for loop cannot be used instead of the while loop in several cases.
The counter in the above example may be written as a for loop, as shown below.
integer count; initial for ( count=0; count <256; count = count + 1) $display(“count = %d”, count);
Let’s look at an example using Verilog.
module for_example(); integer i; reg [7:0] ram [0:255]; initial begin for (i = 0; i < 256; i = i + 1) begin #1 $display(" Address = %g Data = %h",i,ram[i]); ram[i] <= 0; // Initialize the RAM with 0 #1 $display(" Address = %g Data = %h",i,ram[i]); end #1 $finish; end endmodule
Fig 2: For loop Output
We will not be able to show the whole output as it would be very long, but you can run the code if you want to see the example properly.
As the output shows, it shows that it counts till 255 as programmed.
Repeat Loop
This loop uses the keyword repeat. The repeat construct runs the loop a certain number of times.
A repeat construct cannot be used to loop over a logical expression in general. A while loop is used to do this.
A number, which might be a constant, a variable, or a signal value, must be included in a repeat construct. If the number is a variable or signal value, it is evaluated just when the loop begins, not throughout loop execution.
The example that is shown above may be stated using the repeat loop, as illustrated in the below example.
//count from 0 to 255 using repeat loop integer count; initial begin count = 0; repeat(256) begin $display(“ count = %d”,count); count =count +1; end end
Let us explain with another example so that it is easier to grasp.
module repeat_example(); reg [3:0] opcode; reg [15:0] data; reg temp; always @ (opcode or data) begin if (opcode == 10) begin // Perform rotate repeat (8) begin #1 temp = data[15]; data = data << 1; data[0] = temp; end end end // Simple test code initial begin $display (" TEMP DATA"); $monitor (" %b %b ",temp, data); #1 data = 18'hF0; #1 opcode = 10; #10 opcode = 0; #1 $finish; end endmodule
The output of the above code is shown below :
Fig 3: Repeat Loop Output
Forever Loop
This loop is expressed with the term forever. The loop has no expressions and runs indefinitely until the $finish task is encountered.
The loop is equal to a while loop with a true-or-false statement, such as while (1). The disable statement can be used to end an eternal loop.
In most cases, a forever loop is used in combination with temporal control components. Without the usage of timing control techniques, the Verilog simulator would execute this statement indefinitely without advancing simulation time, and the rest of the design would never be executed.
As we saw in our earlier piece on verilog test benches, one of the most popular use cases for the forever loop in a verilog test programme is creating a clock signal.
Below example demonstrates how to utilise the forever statement.
//clock generation with forever loop module forever_example (); reg clk; initial begin #1 clk = 0; forever begin #5 clk = ! clk; end end initial begin $monitor ("Time = %d clk = %b",$time, clk); #100 $finish; end endmodule
Fig 4: Forever loop Output
To begin, keep in mind that we are using the Verilog beginning block, which is another example of a procedural statement.
Any code we write in an initial block is only run once at the start of a simulation.
Hence, we can see the output of the above example as the time-increment clock runs periodically.
So we studied the various types of blogs that we use in Verilog.
Let’s have some questions for you to summarise the whole blog
- What do you mean by loops?
- What are the types of loops in Verilog?
- What is the difference between a while and a for loop, and can you explain it with examples?
- How do you use repeat loop?
- What do you mean by “forever loop”?