底部检测的do...while循环

底部检测的do…while循环

1、while循环可能从未执行
while循环有可能根本没有执行过。当执行流首次执行到循环的开头,控制值就为假的时候就会发生这种情况。
为了保证循环的每个输出都与循环的输入变量保持一致,使用这种在开头检测的while循环需要在循环之前增加代码。

always_comb
begin
	if(addr < 128 || addr >255)
	begin
		done = 0;
		outofBound = 1;
		out = mem[128];
	end
	else while(addr >= 128 && addr <= 255)
	begin
		if(addr == 128)
		begin
			done = 1;
			outofBound=0;
		end
		else
		begin
			done = 0;
			outofBound =0;
		end
		out=mem[addr];
		addr -=1;
	end
end

2、do…while循环至少执行一次

do...while循环的基本语法如下:
do<语句或语句块>
while(<条件>);
always_comb
begin
do beign
		done = 0;
		outofBound =0;
		out=mem[addr];
	if(addr < 128 || addr >255)
	begin
		outofBound = 1;
		out = mem[128];
	end
	else	if(addr == 128)
		begin
			done = 1;
			addr -=1;
		end
   while(addr >= 128 && addr <= 255);
end

3、foreach数组循环结构
SystemVerilog增加了foreach循环,它可用来对一维和多维数组的元素进行迭代,而不必指定数组每个维度的尺寸。
新的跳转语句–break、continue、return
4、disable语句即可用作继续执行也可用于使执行过程停止。

//在一定范围的位中找到第一个值为1的
always@*
begin
	begin:loop
		integer i;
		first_bit =0;
		for(i=0;i<=63;i=i+1)
		begin:pass
			if(i < start_range)
				disable pass;//继续循环
			if(i>end_range)
				disable loop;//跳出循环
			if(data[i])
			begin
				first_bit = i;
				disable loop;//跳出循环
			end
		end//一次循环结束
end//整个循环结束
...//根据第一个1的位置左数据处理
end

disable语句还可以用作返回语句
disable语句还可以使任务的所有语句全部执行完之前提前从任务中返回。

task add_uo_to_max(
		input [5:0] max,
		output[63:0] result
);
integer i;
begin
	result = 1;
	if(max ==0)
		disable add_up_to_max;//退出任务
	for(i=1;i<=63;i=i+1)
	begin
		result =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
begin
	for(int i=0;i<=255;i++)
	begin:loop
		if(array[i]==0)
			continue;//跳过空元素
			transform_function(array[i]);
	end//循环结束
end

6、break语句
break语句会立即中止循环的执行。除非过程块的执行流再一次到达这个循环语句的开头,否则循环不会再次执行。

//在一定范围的位中找到第一个值为1的位
always_comb
begin
	first_bit =0;
	for(int i=0;i<=63;i=i+1)
	begin
		if(i<start_range) continue;
		if(i>end_range) break;//跳出循环
		if(data[i])
		begin
			first_bit = i;
			break;//跳出循环
		end
	end//整个循环结束
	....//根据第一个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)
begin
	result = result + result;
	if(i==max) result;//退出任务
end
endtask

return语句可以用来函数或任务中提前退出。
注意:在任务或空函数中,关键字return后面不能有表达式,而在非空函数中return后面一定要有表达式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻童:CPU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值