system verilog中的跳轉操做

在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實現一樣功能時綜合結構相同。

相關文章
相關標籤/搜索