system Verilog 跳轉操作

2021-09-29 12:40:25 字數 4106 閱讀 6691

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

System Verilog任務 函式

在system verilog中,begin end是可選的 task mytask1 output logic x,input logic y endtask還可以使用ref型別的引數對變數進行引用,類似於c中的指標,但ref不允許進行陣列引數的傳遞 還可以使用預設引數 增加了return語句 方...

SystemVerilog語言簡介 二

6.使用者定義的型別 verilog不允許使用者定義新的資料型別。systemverilog通過使用typedef提供了一種方法來定義新的資料型別,這一點與c語言類似。使用者定義的型別可以與其它資料型別一樣地使用在宣告當中。例如 typedef unsigned int uint uint a,b ...

SystemVerilog語言簡介 四

23.動態過程 verilog 通過使用 fork jion 提供了一種靜態的併發過程。每乙個分支都是乙個分離的 並行的過程。fork jion 中任何語句的執行必須在組內的每乙個過程完成後才會執行。例如 initial begin fork send packet task 1,255,0 sen...