在verilog中,使用disable聲明來從執行流程中的某一點跳轉到另外一點。特別地,disable聲明使執行流程跳轉到標註名字的聲明組末尾,或者一個任務的末尾。函數
verilog中的disable命令用法有不少,下面是一個簡單的例子,解釋了disable的做用範圍:oop
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聲明中使用,就能夠明確指定跳出的位置。ui
disable聲明一樣能夠用於在task中全部聲明執行完以前提早跳出task:spa
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不可綜合。code
system verilog增長了相似C語言的跳轉聲明:break,continue和return。這些跳轉聲明能夠使代碼更加intuitive和concise。system verilog不包含C語言中的goto語句。
verilog的disable聲明和這些新的跳轉聲明的一個重要區別是:disable聲明適用於全部現行的task或者block的invocation,然而break,continue和return只適用於當前的執行流程。orm
continue聲明blog
類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聲明ip
類C語言的break聲明當即結束循環操做。循環不會從新執行,除非執行流程從新到達循環的起點。break的例子以下:ci
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實現一樣功能時綜合結構相同。