Verilog人人都可以寫,但是要記得一件很重要的事情,verilog必須要有好的coding style,程式碼才能讓一些邏輯分析以及合成的EDA Tool(Design compiler etc.)合出自己如自己所預期的電路,否則常常會合出一些行為跟自己所預期不一樣的電路。
首先最重要的觀念就是,要將負責組合電路的block跟負責時序電路的block分開寫。
在組合電路中使用blocking的敘述,而在時序電路則使用non-blocking的敘述。
舉個例子:
通常數位電路的設計,主要就是在設計一個FSM(finite-state-machine),讓電路根據現在處於什麼state以及input為何來做控制以及轉state的功能。
儲存state的部分屬於時序電路的範疇,因為其有記憶的特性,因此我們把它用non-blocking的方式來描述:
reg state;
reg n_state; //next_state
always@(posedge clk)begin
state<=n_state;
end
這就會在clock來到上升緣(resing edge)的時候,將n_state的值傳給state。
但是state改變之後,他仍然必須根據一些input來決定下個state為何,這部分屬於邏輯判斷的部分,因此用組合電路來實現(blocking敘述):
input control; //input signal
always @ (state) begin
if (control)
n_state=S0 ; //S0:state 0
else
n_state=S1 ; //S1:state 1
end
如此一來,我們就將負責時序電路(flip-flop)以及組合電路的行為分成兩個不同部分來撰寫,這種寫法是一個比較好的coding style,在合成電路的時候比較不會出錯。
沒有留言:
張貼留言