在verilog中,使用disable宣告來從執行流程中的某一點跳轉到另一點。特別地,disable宣告使執行流程跳轉到標註名字的宣告組末尾,或者乙個任務的末尾。
verilog中的disable命令用法有很多,下面是乙個簡單的例子,解釋了disable的作用範圍:
1 // find first bit set within a range of bits在begin塊和for迴圈塊中加入名字,然後在disable宣告中使用,就可以明確指定跳出的位置。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
disable宣告同樣可以用於在task中所有宣告執行完之前提前跳出task:
1 task add_up_to_max (input [ 5:0] max,disable宣告同樣可以用來從外部關閉乙個並行的程序或者task。不過外部的disable不可綜合。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
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];break宣告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
類c語言的break宣告立即結束迴圈操作。迴圈不會重新執行,除非執行流程重新到達迴圈的起點。break的例子如下:
1 // find first bit set within a range of bitssystem verilog中的break宣告與c語言中的break語句用法相同。c語音也會使用break語句從switch語句中退出。而system verilog不會使用break宣告從case語句中離開,因為verilog中case宣告會在某個分支執行後自動退出,不需要break語句。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
return宣告
system verilog增加了類c語言的return宣告,用於從乙個非void函式中返回數值或者從乙個void函式或任務返回。return宣告可以在任務或函式執行流程的任意一點執行。當return宣告執行後,任務或者函式立即退出而不需要執行到任務或者函式的末尾。
1 task add_up_to_max (input [ 5:0] max,return宣告可以用來從任務或函式提前退出。verilog中disable宣告只能從任務中提前退出,而不能用在函式中。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
1 function automatic int log2 (input int n);注意在任務或者void函式中,return關鍵字後不能跟隨表示式;而在非void函式中,return關鍵字後必須跟隨表示式。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
綜合規則
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...