System Verilog过程语句
(1)赋值语句
(2)条件选择语句
(3)循环语句
(4)跳转语句
(5)子程序调用
(6)事件控制
1、赋值语句四类
阻塞赋值:使用 = ;
非阻塞赋值:使用 <= ;
自加/自减赋值:使用 ++/-- ;
过程连续赋值语句:使用 assign/deassign、force/release;
例子:
initial begin
logic data;
logic data_out;
logic data_test;
data_out <= 1'b1; //阻塞赋值
data_test = 1'b1; //阻塞赋值
data_test ++ ; //变量自加
data_test -- ; //变量自减
assign data = data_test; //连续赋值
data = 1'b0; //不会改变data的数值
deassign data; //去除连续赋值
data = 1'b0; //data数值生效
force data = 1'b1; //强制赋值
release data; //释放
end
2、控制结构
2.1、条件语句:if……else……和case
case要求分支表达式和case条件表达式做全等比较(===),而不是逻辑比较 。
System Verilog提供了casex和casez
casex:case条件表达式中所有的x值都不参与比较;
casez:case条件表达式中所有的x和z值都不参与比较。
2.2、循环语句
2.2.1、for循环
System Verilog条件了声明for循环控制变量的能力,在循环内产生一个本地变量,其他并行循环不会偶然地影响这个循环控制变量。
例子:两个for循环分别在循环内产生本地变量i
initial begin
loop1:
for(int i=0,i<=10,i++)
$display("loop1 i is %d\n",i);
#1;
end
initial begin
loop2:
for(int i=10,i>=0,i--)
$display("loop2 i is %d\n",i);
#1;
end
System Verilog允许初始声明或赋值语句可以是一个或者多个用逗号分隔的语句。
例子:
for(int i=0,j=0;ij<=50;i++,j++)
$display("Value ij is %d\n", i*j);
2.2.2、while循环语句
while循环语句执行循环结构,直至条件表达式为假。若一开始为假,循环语句永远不会执行。
例子:计算reg中1的个数
initial
begin
logic [07:00] reg_test;
logic [07:00] cnt ;
reg_test = 8'b1011_0100;
cnt = 0;
while(reg_test)
begin
if(reg_test[0])
cnt ++ ;
$display("cnt value is %d",cnt);
reg_test >>= 1;
//reg_test = reg_test >> 1;
$display("reg_test value is %b",reg_test);
end
end
2.2.3、do……while循环语句
do……while语句在循环体的结束处评估循环语句,至少循环一次。
2.2.4、repeat循环语句
repeat循环对循环体执行固定的次数。表达式被评估为未知或者高阻,那么应该认为是零次,不应执行循环体。
2.2.5、forever循环语句
例子:forever生成时钟
forever #10ns
clk = ~clk;
2.2.6、foreach循环语句
foreach循环语句指定数组后,程序会逐个遍历数组成员。
例子:遍历字符数组
string words[3] = '{"hello","world","moonin"};
initial begin
foreach(words[i])
$display("words %d is %s\n",i,words[i]);
end
3、跳转语句
System Verilog增加跳转语句:break、continue和return。
break:跳出本次循环体
continue:跳转到本次循环体的尾部
return(条件):退出一个函数并返回函数值
return:退出一个任务或空函数