Verilog 程式區塊(Procedural Blocks)
共可分為兩種。所有的程式區塊(Procedural Blocks)都是以同時性(Concurrently)的方式同時執行所有程式區塊。
# 以下程式範例片段中的begin與end可視為C語言中的大括號,用來界定block的程式範圍。與C語言相同之處在於,若只有一行程式內容時,begin與end一樣可以省略不寫。
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是禁止對同一條線路進行寫入,但是輸出不會發生衝突。
留言列表