在Verilog HDL中存在著四種類型的循環語句,用來控制執行語句的執行次數。其語法和用途與C語言很類似
- forever 連續執行過程語句。
- repeat 連續執行一條語句 n 次。
- while 執行一條語句直到某個條件不滿足。如果一開始條件即不滿足(為假), 則語句一次也不能被執行。
- for 通過以下三個步驟來決定語句的循環執行。
- 先給控制循環次數的變量賦初值。
- 判定控制循環的表達式的值,如為假則跳出循環語句,如為真則執行指定的語句后,轉到第三步。
- 執行一條賦值語句來修正控制循環變量次數的變量的值,然后返回第二步。
forever語句
forever語句的格式如下:
forever begin
多條語句
end
forever循環語句常用于產生周期性的波形,用來作為仿真測試信號。它與always語句不同處在于不能獨立寫在程序中,而必須寫在initial塊中。forever循環的應用示例如下:
initial
forever begin
if(d) a = b + c;
else a = 0;
end
repeat語句
repeat語句的格式如下:
repeat(表達式) begin
多條語句
end
在repeat語句中,其表達式通常為常量表達式。如果循環計數表達式的值不確定,即為x或z時,那么循環次數按0處理。
下面的例子中使用repeat循環語句及加法和移位操作來實現一個乘法器。
while語句
while語句的格式如下:
while(表達式) begin
多條語句
end
while循環執行過程賦值語句直到制定的條件為假。如果條件表達式在開始不為真(包括假、x以及z),那么過程語句將永遠不會被執行。
下面舉一個while語句的例子,該例子用while循環語句對rega這個8位二進制數中值為1的位進行計數。
更完整點的寫法:
module mult_8b_while(
a, b, q
);
parameter bsize = 8;
input [bsize-1 : 0] a, b;
output [2*bsize-1 : 0] q;
reg [2*bsize-1 : 0] q, a_t;
reg [bsize-1 : 0] b_t;
reg [bsize-1 : 0] cnt;
always @(a or b) begin
q = 0;
a_t = a;
b_t = b;
cnt = bsize;
while(cnt > 0) begin
if (b_t[0]) begin
q = q + a_t;
end
else begin
q = q;
end
cnt = cnt - 1;
a_t = a_t << 1;
b_t = b_t >> 1;
end
end
endmodule
for語句
for語句的一般形式為:
for(表達式1; 表達式2; 表達式3) 語句
它的執行過程如下:
- 先求解表達式1;
- 求解表達式2,若其值為真(非0),則執行for語句中指定的內嵌語句,然后執行下面的第3步。若為假(0),則結束循環,轉到第5步。
- 若表達式為真,在執行指定的語句后,求解表達式3。
- 轉回上面的第2步驟繼續執行。
- 執行for語句下面的語句。
for語句最簡單的應用形式是很易理解的,其形式如下:
for(循環變量賦初值;循環結束條件;循環變量增值)
執行語句
for循環語句實際上相當于采用while循環語句建立以下的循環結構:
begin
循環變量賦初值;
while(循環結束條件)
begin
執行語句
循環變量增值;
end
end
這樣對于需要8條語句才能完成的一個循環控制,for循環語句只需兩條即可。
下面分別舉兩個使用for循環語句的例子。例1用for語句來初始化memory。例2則用for循環語句來實現前面用repeat語句實現的乘法器。
[例1]:
[例2]:
在for語句中,循環變量增值表達式可以不必是一般的常規加法或減法表達式。下面是對rega這個8位二進制數中值為1的位進行計數的另一種方法。見下例:
其他參考資料:關于Verilog 中的for語句的探討
Verilog-2001更新了generate循環,使用方法參考: