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,在合成電路的時候比較不會出錯。
2011年8月12日 星期五
Verilog - blocking & non - blocking
在我研替的面試經驗中,因為投的是數位IC的工程師,因此所謂verilog的blocking & non-blocking的觀念,幾乎是每一家公司的必考題,因此我以我的見解做一個解釋,如有錯誤歡迎指正
顧名思義,所謂的blocking就是verilog大括號所刮起來的敘述中,每個敘述是必須依序執行的,例如:
always @(a or b) begin
a=#1 b;
c=#2 a;
end
這邊在always使用的是=的operator,也就是blocking的敘述。這段程式碼模擬的時候,a會在b的值變動後的一個時間單位被賦予b的值,而c會在a被賦予b的值之後的兩個時間單位,被賦予a的值。也就是說c會在b的值變動後的三個時間單位才會被賦予b的值。這是因為blocking的敘述,將每個敘述都視為要依序執行的,因此必須等前一個敘述完成之後才會執行下一個敘述。
那如果使用non-blocking的operator(<=),程式改寫如下
always@(a or b)begin
a<=#1 b;
c<=#2 a;
end
這段程式碼,會在b的值變動的一個時間單位之後,將b的值賦予給a,不過在b的值變動的第二個時間單位之後,a的值就會傳給了c,而不會到第(1+2)個時間單位過後才給值。看得出來嗎? 差別就在使用non-blocing的敘述,括號內的所有敘述都是"同時"執行的,不會有先後關係。這主要是為了硬體的特性,許多資工背景的同學,這地方就會比較難理解,因為軟體主要都是依序執行的,這種平行的觀念比較常在硬體出現。
顧名思義,所謂的blocking就是verilog大括號所刮起來的敘述中,每個敘述是必須依序執行的,例如:
always @(a or b) begin
a=#1 b;
c=#2 a;
end
這邊在always使用的是=的operator,也就是blocking的敘述。這段程式碼模擬的時候,a會在b的值變動後的一個時間單位被賦予b的值,而c會在a被賦予b的值之後的兩個時間單位,被賦予a的值。也就是說c會在b的值變動後的三個時間單位才會被賦予b的值。這是因為blocking的敘述,將每個敘述都視為要依序執行的,因此必須等前一個敘述完成之後才會執行下一個敘述。
那如果使用non-blocking的operator(<=),程式改寫如下
always@(a or b)begin
a<=#1 b;
c<=#2 a;
end
這段程式碼,會在b的值變動的一個時間單位之後,將b的值賦予給a,不過在b的值變動的第二個時間單位之後,a的值就會傳給了c,而不會到第(1+2)個時間單位過後才給值。看得出來嗎? 差別就在使用non-blocing的敘述,括號內的所有敘述都是"同時"執行的,不會有先後關係。這主要是為了硬體的特性,許多資工背景的同學,這地方就會比較難理解,因為軟體主要都是依序執行的,這種平行的觀念比較常在硬體出現。
訂閱:
文章 (Atom)
勒式交易策略
權證的交易策略有一種操作方法叫做勒式交易策略(其實這種交易策略跟選擇權是一樣的),今天來介紹一下這種操作的方法。 首先這種交易策略,適合在你 預期你的連結標的會在未來有個大趨勢 (無論是大跌或是大漲),例如總統大選,或是希臘債務 到期日等等。此時你可以買進不同履約價但是到期日一...
-
目前嵌入式系統的工程師有蠻多時候需要撰寫所謂特定device或是chip的driver,這邊先就一些基本的觀念做一點解釋。以linux來說,其程式分成兩個部分,一種運行於kernel,這種程式擁有控制硬體暫存器的權限,因此這邊的程式如果有bug,因為權限太大,很容易造成系統的記憶...
-
在我研替的面試經驗中,因為投的是數位IC的工程師,因此所謂verilog的blocking & non-blocking的觀念,幾乎是每一家公司的必考題,因此我以我的見解做一個解釋,如有錯誤歡迎指正 顧名思義,所謂的blocking就是verilog大括號所刮起來的...