close

Verilog 程式區塊(Procedural Blocks)


        共可分為兩種。所有的程式區塊(Procedural Blocks)都是以同時性(Concurrently)的方式同時執行所有程式區塊。


        # 以下程式範例片段中的beginend可視為C語言中的大括號,用來界定block的程式範圍。與C語言相同之處在於,若只有一行程式內容時,beginend一樣可以省略不寫。


1.        initial block


a、    initial為主的程式區塊,只會在一開始時執行一次。


b、    通常用於Testbench,屬於不可合成電路的區塊。


 


Exp : Verilog HDL語法


Initial


        begin


                <程式片段>


        end


 


2.        always block


a、    always為主的程式區塊,只有每當觸發條件成立時,執行一次,執行完後需要等待下一次的觸發條件成立才會再次執行。


 


Exp : Verilog HDL語法


Always @(<運算條件1> or <運算條件2> or …)


                begin


                        <程式片段>


End


        # 設計多個always block時,當條件滿足會同時執行(平行處理)


        # always blocking的所有輸出一定要宣告成reg


                Always是指條件符合時會再進入block內執行程式,當條件不符合時,必須維持上一次輸出的數值! 所以選擇reg作為輸出腳位的型態宣告。(宣告有分兩種1.wireà不具有記憶性2.regà具有記憶性)


        # 特定值改變 (範例)


                always@(b or c)


                        out = a|b|c;


        上述是指當b or c的訊號改變時,將結果運算後存入out中。這樣的code合成出的電路會有問題。因為單從out=a|b|c;就會合成出一個OR;輸入三個訊號,然後輸出為out。但是因為always@(b or c);的關係變成了當a有改變時,out輸出絕對不會改變。這在邏輯上是不合常理的。


        # 當有多個always blocks存在同一個模組時,需注意的事項。


        舉例:


                宣告一個reg a;然後再一個always block中設計a=1;另一個設計a=0; 這在合成電路時會出錯,因為若兩個always條件都符合時,a線路該讓哪個always block來寫入? 因此多個always block是禁止對同一條線路進行寫入,但是輸出不會發生衝突。

arrow
arrow
    全站熱搜

    jk3527101 發表在 痞客邦 留言(0) 人氣()