在verilog中,使用disable聲明來從執行流程中的某一點跳轉到另一點。特別地,disable聲明使執行流程跳轉到標注名字的聲明組末尾,或者一個任務的末尾。
verilog中的disable命令用法有很多,下面是一個簡單的例子,解釋了disable的作用范圍:
1 // find first bit set within a range of bits 2 always @* begin 3 begin: loop 4 integer i; 5 first_bit = 0; 6 for (i=0; i<=63; i=i+1) begin: pass 7 if (i < start_range) 8 disable pass; // continue loop 9 if (i > end_range) 10 disable loop; // break out of loop 11 if ( data[i] ) begin 12 first_bit = i; 13 disable loop; // break out of loop 14 end 15 end // end of one pass of loop 16 end // end of the loop 17 // process data based on first bit set 18 ... 19 end
在begin塊和for循環塊中加入名字,然后在disable聲明中使用,就可以明確指定跳出的位置。
disable聲明同樣可以用於在task中所有聲明執行完之前提前跳出task:
1 task add_up_to_max (input [ 5:0] max, 2 output [63:0] result); 3 integer i; 4 begin 5 result = 1; 6 if (max == 0) 7 disable add_up_to_max; // exit task 8 for (i=1; i<=63; i=i+1) begin 9 result = result + result; 10 if (i == max) 11 disable add_up_to_max; // exit task 12 end 13 end 14 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聲明時是必要的。
1 logic [15:0] array [0:255]; 2 always_comb begin 3 for (int i = 0; i <= 255; i++) begin : loop 4 if (array[i] == 0) 5 continue; // skip empty elements 6 transform_function(array[i]); 7 end // end of loop 8 end
break聲明
類C語言的break聲明立即結束循環操作。循環不會重新執行,除非執行流程重新到達循環的起點。break的例子如下:
1 // find first bit set within a range of bits 2 always_comb begin 3 first_bit = 0; 4 for (int i=0; i<=63; i=i+1) begin 5 if (i < start_range) continue; 6 if (i > end_range) break; // exit loop 7 if ( data[i] ) begin 8 first_bit = i; 9 break; // exit loop 10 end 11 end // end of the loop 12 ... // process data based on first bit set 13 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聲明執行后,任務或者函數立即退出而不需要執行到任務或者函數的末尾。
1 task add_up_to_max (input [ 5:0] max, 2 output [63:0] result); 3 result = 1; 4 if (max == 0) return; // exit task 5 for (int i=1; i<=63; i=i+1) begin 6 result = result + result; 7 if (i == max) return; // exit task 8 end 9 endtask
return聲明可以用來從任務或函數提前退出。verilog中disable聲明只能從任務中提前退出,而不能用在函數中。
1 function automatic int log2 (input int n); 2 if (n <=1) return 1; // exit function early 3 log2 = 0; 4 while (n > 1) begin 5 n = n/2; 6 log2++; 7 end 8 return log2; 9 endfunction // log2
注意在任務或者void函數中,return關鍵字后不能跟隨表達式;而在非void函數中,return關鍵字后必須跟隨表達式。
綜合規則
break,continue和return跳轉聲明是可綜合的結構。綜合結果與verilog中使用disable實現同樣功能時綜合結構相同。