1.条件选择语句
(1)if...else语句
if...else语句根据不同的条件执行不同的分支
if(expression)
begin...end
else
begin...end
(2)case 语句
case语句为程序提供了分支选择控制的功能。case要求分之表达式和case条件表达式做全等比较(===)而不是逻辑比较(==)。一个分支只有在其表达式完全匹配case条件语句表达式时,才会被选中执行。
case(expression)
constant_expression:statement_block;
constant_expression:statement_block;
...
default:statement_block
endcase
2.循环语句
(1)for循环
基本格式:
for(initializing_expression;terminating_expression;loop_increment_expression)
begin
...
end
在Verilog中,用来控制for循环的变量必须在循环体之前声明。如果两个或多个并行程序中的循环使用相同的循环控制变量,那么就有可能出现一个循环修改其他循环还在使用的循环控制变量的情况。在for循环中,SystemVerilog添加了声明for循环控制变量的能力。这种方式会在循环内产生一个本地变量,其他并行循环不会偶然地影响这个循环控制变量。
(2)while循环
while(expression)
begin
...
end
例子:
module while_example();
intial
begin:counts
logic [7:0] tempreg;
count = 0;
tempreg = 8'b11110000;
while(tempreg) begin
if(tempreg[0])
counts++;
tempreg>>=1;
end
end
endmodule
(3)do...while循环语句
do…while循环语句和while循环语句有一点区别,也就是do…while循环语句在循环体的结束处评估循环条件,也就是do…while循环至少执行一次循环体。
do
begin
...
end
while(expression)
(4)repeat循环语句
repeat循环对循环体执行固定的次数。如果表达式被评估为未知或者高阻,那么应该认为是零次,不应执行循环体。
repeat(expression)
begin
...
end
(5)forever循环语句
forever循环语句持续执行一个循环体
forever
begin
...
end
为了防止循环体在delta时间内产生无限循环,导致仿真挂起,forever循环体内部必须带有时序控制或者disable语句。下例是一个利用forever循环生成周期性时钟的例子,时钟clock周期为20ns,时钟clock2周期为10ns。
module forever_example();
logic clock1,clock2;
intiial begin
clock1<=0;
clock2<=0;
fork
forever #10ns clock1 = ~clock1;
#5 forever #5ns clock2 = ~clock2
join
end
endmodule
(6)foreach循环语句
foreach循环语句中指定数组后,程序会逐个遍历数组成员。
foreach(array_name) [< loop_varables>] <statement>
它的自变量可以是一个指定的任意类型数组(固定尺寸的、动态的及联合数组),然后紧跟着一个包围在方括号内的循环变量的列表。每一个循环变量对应于数组的某一维。foreach结构类似于一个repeat循环,它使用数组范围替代一个表达式来指定重复次数。foreach循环语句实例下例如源代码所示。
module foreach_example();
string words[2] = '{"hello world"};
int prod [1:8][1:3];
initial begin
foreach(words[j])
$display(j,words[j]);
prod[k][m] = k*m;
end
endmodule
循环变量的数目必须匹配数组变量的维数。空循环变量可以用来表示在对应的数组维数上没有迭代,并且处于尾部的连续空循环变量可以被忽略。循环变量是自动的、只读的,
并且它们的作用范围对于循环来讲是本地的。每一个循环变量的类型被隐含地声明成与数组索引的类型一致。