Statements inside sequential control constructs are executed
sequentially.
- if-else Statement
- case Statement
- repeat loop
- for loop
- while loop
- do-while
- foreach
- Loop Control
- randcase Statements
if-else Statement : The if-else statement is the general form of selection statement.
case Statement : The case statement provides for multi-way branching.
repeat loop : Repeat statements can be used to repeat the execution of a statement or statement block a fixed number of times.
for loop : The for construct can be used to create loops.
while loop : The loop iterates while the condition is true.
do-while : condition is checked after loop iteration.
foreach : foreach construct specifies iteration over the elements of an single dimensional fixed-size arrays, dynamic arrays and SmartQs.
Loop Control : The break and continue statements are used for flow control within loops.
EXAMPLE : if program main ;
integer i;
initialbegin i = 20;
if( i == 20)
$display(" I is equal to %d ",i);
else $display(" I is not equal to %d ",i);
end endprogram RESULTS
I is equal to 20
EXAMPLE : case and repeat program main ;
integer i;
initialbegin repeat(10)begin i = $random();
case(1) begin (i<0) :$display(" i is less than zero i==%d\n",i);
(i>0) :$display(" i is grater than zero i=%d\n",i);
(i == 0):$display(" i is equal to zero i=%d\n",i);
end end end endprogram
RESULTS
i is grater than zero i=69120 i is grater than zero i=475628600 i is grater than zero i=1129920902 i is grater than zero i=773000284 i is grater than zero i=1730349006 i is grater than zero i=1674352583 i is grater than zero i=1662201030 i is grater than zero i=2044158707 i is grater than zero i=1641506755 i is grater than zero i=797919327
EXAMPLE : forloop program for_loop;
integer count, i;
initialbegin for(count = 0, i=0; i*count<50; i++, count++)
$display("Value i = %0d\n", i);
end endprogram
RESULTS
Value i = 0 Value i = 1 Value i = 2 Value i = 3 Value i = 4 Value i = 5 Value i = 6 Value i = 7
EXAMPLE : whileloop program while_loop;
integer operator=0;
initialbegin while (operator<5)begin operator += 1;
$display("Operator is %0d\n", operator);
end end endprogram
RESULTS
Operator is 1 Operator is 2 Operator is 3 Operator is 4 Operator is 5
EXAMPLE : dowhile program test;
integer i = 0;
initialbegin do begin $display("i = %0d \n", i);
i++;
end while (i < 10);
end endprogram
RESULTS
i = 0 i = 1 i = 2 i = 3 i = 4 i = 5 i = 6 i = 7 i = 8 i = 9
The foreach construct specifies iteration over the elements of an array. Its argument is an identifier that designates any type of array (fixed-size, dynamic, or associative) followed by a list of loop variables enclosed in square brackets. Each loop variable corresponds to one of the dimensions of the array. The foreach construct is similar to a repeat loop that uses the array bounds to specify the repeat count instead of an expression.
The mapping of loop variables to array indexes is determined by the dimension cardinality, as described in multidimentional topic.
The foreach arranges for higher cardinality indexes to change more rapidly.
// 1 2 3 3 4 1 2 -> Dimension numbers
int A [2][3][4]; bit [3:0][2:1] B [5:1][4];
foreach( A [ i, j, k ] ) ...
foreach( B [ q, r, , s ] ) ...
The first foreach causes i to iterate from 0 to 1, j from 0 to 2, and k from 0 to 3. The second foreach causes q to iterate from 5 to 1, r from 0 to 3, and s from 2 to 1 (iteration over the third index is skipped).
EXAMPLE : foeach program example;
string names[$]={"Hello", "SV"};
int fxd_arr[2][3] = '{'{1,2,3},'{4,5,6}};
initialbegin foreach (names[i])
$display("Value at index %0d is %0s\n", i, names[i]);
foreach(fxd_arr[,j])
$display(fxd_arr[1][j]);
end endprogram
RESULTS
Value at index 0 is Hello
Value at index 1 is SV
4 5 6
EXAMPLE : randcase program rand_case;
integer i;
initialbegin repeat(10)begin randcase begin 10: i=1;
20: i=2;
50: i=3;
end $display(" i is %d \n",i);end end endprogram
RESULTS
i is 3 i is 2 i is 3 i is 3 i is 3 i is 3 i is 1 i is 1 i is 1 i is 2
Enhanced For Loop
In Verilog, the variable used to control a for loop must be declared prior to the loop. If loops in two or more parallel procedures use the same loop control variable, there is a potential of one loop modifying the variable while other loops are still using it.
SystemVerilog adds the ability to declare the for loop control variable within the for loop. This creates a local variable within the loop. Other parallel loops cannot inadvertently affect the loop control variable.
For example:
module foo;
initialbegin for (int i = 0; i <= 255; i++)
...
end
initialbegin loop2: for (int i = 15; i >= 0; i--)
...
end endmodule
Unique:
A unique if asserts that there is no overlap in a series of if...else...if conditions, i.e., they are mutually exclusive and hence it is safe for the expressions to be evaluated in parallel. In a unique if, it shall be legal for a condition to be evaluated at any time after entrance into the series and before the value of the condition is needed. A unique if shall be illegal if, for any such interleaving of evaluation and use of the conditions, more than one condition is true. For an illegal unique if, an implementation shall be required to issue a warning, unless it can demonstrate a legal interleaving so that no more than one condition is true.
EXAMPLE : module uniq;
initial begin for (int a = 0;a< 6;a++)
unique if ((a==0) || (a==1) ) $display("0 or 1");
elseif (a == 2) $display("2");
elseif (a == 4) $display("4"); // values 3,5,6 cause a warning
end endmodule
RESULTS:
0 or 1 0 or 1 2 RT Warning: No condition matches in 'unique if' statement. 4 RT Warning: No condition matches in 'unique if' statement.
Priority:
A priority if indicates that a series of if...else...if conditions shall be evaluated in the order listed. In the preceding example, if the variable a had a value of 0, it would satisfy both the first and second conditions, requiring priority logic. An implementation shall also issue a warning if it determines that no condition is true, or it is possible that no condition is true, and the final if does not have a corresponding else.
EXAMPLE: module prioriti;
initial for(int a = 0;a<7;a++)
priorityif (a[2:1]==0) $display("0 or 1");
elseif (a[2] == 0) $display("2 or 3");
else $display("4 to 7"); //covers all other possible values, so no warning
endmodule
RESULTS:
0 or 1 0 or 1 2 or 3 2 or 3 4 to 7 4 to 7 4 to 7
If the case is qualified as priority or unique, the simulator shall issue a warning message if no case item matches. These warnings can be issued at either compile time or run time, as soon as it is possible to determine the illegal condition.
EXAMPLE: module casee;
initial begin
for(int a = 0;a<4;a++)
unique case(a) // values 3,5,6,7 cause a warning
0,1: $display("0 or 1");
2: $display("2");
4: $display("4");
endcase
for(int a = 0;a<4;a++)
prioritycasez(a) // values 4,5,6,7 cause a warning
3'b00?: $display("0 or 1");
3'b0??: $display("2 or 3");
endcase
end endmodule
RESULTS:
0 or 1 0 or 1 2 Warning: No condition matches in 'unique case' statement. 0 or 1 0 or 1 2 or 3 2 or 3