Verilog循環語句

在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. 先求解表達式1;
    1. 求解表達式2,若其值為真(非0),則執行for語句中指定的內嵌語句,然后執行下面的第3步。若為假(0),則結束循環,轉到第5步。
    1. 若表達式為真,在執行指定的語句后,求解表達式3。
    1. 轉回上面的第2步驟繼續執行。
    1. 執行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循環,使用方法參考:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370

推薦閱讀更多精彩內容