底部检测的do…while循环
1、while循环可能从未执行
while循环有可能根本没有执行过。当执行流首次执行到循环的开头,控制值就为假的时候就会发生这种情况。
为了保证循环的每个输出都与循环的输入变量保持一致,使用这种在开头检测的while循环需要在循环之前增加代码。
always_comb
beginif(addr < 128 || addr >255)begindone = 0;outofBound = 1;out = mem[128];endelse while(addr >= 128 && addr <= 255)beginif(addr == 128)begindone = 1;outofBound=0;endelsebegindone = 0;outofBound =0;endout=mem[addr];addr -=1;end
end
2、do…while循环至少执行一次
do...while循环的基本语法如下:
do<语句或语句块>
while(<条件>);
always_comb
begin
do beigndone = 0;outofBound =0;out=mem[addr];if(addr < 128 || addr >255)beginoutofBound = 1;out = mem[128];endelse if(addr == 128)begindone = 1;addr -=1;endwhile(addr >= 128 && addr <= 255);
end
3、foreach数组循环结构
SystemVerilog增加了foreach循环,它可用来对一维和多维数组的元素进行迭代,而不必指定数组每个维度的尺寸。
新的跳转语句–break、continue、return
4、disable语句即可用作继续执行也可用于使执行过程停止。
//在一定范围的位中找到第一个值为1的
always@*
beginbegin:loopinteger i;first_bit =0;for(i=0;i<=63;i=i+1)begin:passif(i < start_range)disable pass;//继续循环if(i>end_range)disable loop;//跳出循环if(data[i])beginfirst_bit = i;disable loop;//跳出循环endend//一次循环结束
end//整个循环结束
...//根据第一个1的位置左数据处理
end
disable语句还可以用作返回语句
disable语句还可以使任务的所有语句全部执行完之前提前从任务中返回。
task add_uo_to_max(input [5:0] max,output[63:0] result
);
integer i;
beginresult = 1;if(max ==0)disable add_up_to_max;//退出任务for(i=1;i<=63;i=i+1)beginresult =result + result;if(i == max)disable add_up_to_max;//退出任务end
end
endtask
另外,也可以使用disable语句来外部禁止一个并发进程或任务的执行,只是这种外部的disable语句是不可综合的。
5、continue语句
使用continue语句不需要在代码中增加begin…end命名块
logic [15:0] array[0:255];
always_comb
beginfor(int i=0;i<=255;i++)begin:loopif(array[i]==0)continue;//跳过空元素transform_function(array[i]);end//循环结束
end
6、break语句
break语句会立即中止循环的执行。除非过程块的执行流再一次到达这个循环语句的开头,否则循环不会再次执行。
//在一定范围的位中找到第一个值为1的位
always_comb
beginfirst_bit =0;for(int i=0;i<=63;i=i+1)beginif(i<start_range) continue;if(i>end_range) break;//跳出循环if(data[i])beginfirst_bit = i;break;//跳出循环endend//整个循环结束....//根据第一个1的位置情况做数据处理
end
不用break跳出case语句(相当于C语言的swict语句)。case语句在分支执行结束后就会自动退出,不需要执行break。
7、return语句
return语句,用来从非空函数返回或从空函数或任务中跳出。return语句可以在任务或函数执行流的任意时间执行,执行后立即从任务或函数中退出,无需到达任务或函数的结尾。
task add_up_to_max(input [5:0] max,output [63:0] result
);
result = 1;
if(max=0) return;//退出任务
for(int i=1;i<=63;i=i+1)
beginresult = result + result;if(i==max) result;//退出任务
end
endtask
return语句可以用来函数或任务中提前退出。
注意:在任务或空函数中,关键字return后面不能有表达式,而在非空函数中return后面一定要有表达式。