system verilog中的跳转操作

在verilog中,使用disable声明来从执行流程中的某一点跳转到另一点。特别地,disable声明使执行流程跳转到标注名字的声明组末尾,或者一个任务的末尾。

verilog中的disable命令用法有很多,下面是一个简单的例子,解释了disable的作用范围:

 // find first bit set within a range of bits
always @* begin
begin: loop
integer i;
first_bit = ;
for (i=; i<=; i=i+) begin: pass
if (i < start_range)
disable pass; // continue loop
if (i > end_range)
disable loop; // break out of loop
if ( data[i] ) begin
first_bit = i;
disable loop; // break out of loop
end
end // end of one pass of loop
end // end of the loop
// process data based on first bit set
...
end

在begin块和for循环块中加入名字,然后在disable声明中使用,就可以明确指定跳出的位置。

disable声明同样可以用于在task中所有声明执行完之前提前跳出task:

 task add_up_to_max (input [ :] max,
output [:] result);
integer i;
begin
result = ;
if (max == )
disable add_up_to_max; // exit task
for (i=; i<=; i=i+) begin
result = result + result;
if (i == max)
disable add_up_to_max; // exit task
end
end
endtask // add_up_to_max

disable声明同样可以用来从外部关闭一个并行的进程或者task。不过外部的disable不可综合。

system verilog增加了类似C语言的跳转声明:break,continue和return。这些跳转声明可以使代码更加intuitive和concise。system verilog不包含C语言中的goto语句。
verilog的disable声明和这些新的跳转声明的一个重要区别是:disable声明适用于所有现行的task或者block的invocation,然而break,continue和return只适用于当前的执行流程。

continue声明

类C语言的continue声明跳转到循环的末尾并执行循环的控制。使用continue声明时,不需要对代码添加命名的begin...end块,而这在使用disable声明时是必要的。

 logic [:] array [:];
always_comb begin
for (int i = ; i <= ; i++) begin : loop
if (array[i] == )
continue; // skip empty elements
transform_function(array[i]);
end // end of loop
end

break声明

类C语言的break声明立即结束循环操作。循环不会重新执行,除非执行流程重新到达循环的起点。break的例子如下:

 // find first bit set within a range of bits
always_comb begin
first_bit = ;
for (int i=; i<=; i=i+) begin
if (i < start_range) continue;
if (i > end_range) break; // exit loop
if ( data[i] ) begin
first_bit = i;
break; // exit loop
end
end // end of the loop
... // process data based on first bit set
end

system verilog中的break声明与C语言中的break语句用法相同。C语音也会使用break语句从switch语句中退出。而system verilog不会使用break声明从case语句中离开,因为verilog中case声明会在某个分支执行后自动退出,不需要break语句。

return声明

system verilog增加了类C语言的return声明,用于从一个非void函数中返回数值或者从一个void函数或任务返回。return声明可以在任务或函数执行流程的任意一点执行。当return声明执行后,任务或者函数立即退出而不需要执行到任务或者函数的末尾。

 task add_up_to_max (input [ :] max,
output [:] result);
result = ;
if (max == ) return; // exit task
for (int i=; i<=; i=i+) begin
result = result + result;
if (i == max) return; // exit task
end
endtask

return声明可以用来从任务或函数提前退出。verilog中disable声明只能从任务中提前退出,而不能用在函数中。

 function automatic int log2 (input int n);
if (n <=) return ; // exit function early
log2 = ;
while (n > ) begin
n = n/;
log2++;
end
return log2;
endfunction // log2

注意在任务或者void函数中,return关键字后不能跟随表达式;而在非void函数中,return关键字后必须跟随表达式。

综合规则
break,continue和return跳转声明是可综合的结构。综合结果与verilog中使用disable实现同样功能时综合结构相同。

上一篇:第三篇:Entity Framework CodeFirst & Model 映射 续篇 EntityFramework Power Tools 工具使用


下一篇:慕课网-安卓工程师初养成-2-9 Java中的自动类型转换