阻塞與非阻塞賦值的語言結構是Verilog語言中最難理解的概念之一。 有這樣的兩個要點: (1)在描述組合邏輯的always塊中用阻塞賦值,則綜合成組合邏輯的電路結構; (2)在描述時序邏輯的always塊中用非阻塞賦值,則綜合成時序邏輯的電路結構。這樣做的原因是: 這是因為要使綜合前模擬和綜合後模擬一致的緣故。 為了更好地理解上述要點,我們需要對Verilog語言中的阻塞賦值和非阻塞賦值的功能和執行時間上的差別有深入的理解。我們定義下面的兩個關鍵字:RHS——方程式右手方向的表示式或變數可分別縮寫成 RHS表示式或RHS變數;LHS ——方程式左手方向的表示式或變數可分別縮寫成LHS 表示式或LHS變數。 IEEE Verilog標準定義了有些語句有確定的執行時間,有些語句沒有確定的執行時間。若有兩條或兩條以上的語句準備在同一時間執行,但由於語句的排列順序不同,卻產生了不同的輸出結果。這就是造成Verilog模組冒險和競爭的原因。為了避免產生競爭,理解阻塞和非阻塞賦值在執行時間上的差別是至關重要的。 1、阻塞賦值 阻塞賦值用等號(=)表示。為什麼稱這種賦值為阻塞賦值呢?因為在賦值時先計算RHS部分的值,這是賦值語句不允許任何別的Verilog語言的干擾,直到現行的賦值完成時刻,即把RHS賦值給LHS的時刻,它才允許別的賦值語句的執行。 一般可綜合的賦值操作在RHS不能設定延時(即使是0延時也不允許)。從理論上講,它與後面的賦值語句只有概念上的先後,而無實質的延遲。若在RHS上加延遲,則在延遲時間會阻止賦值語句的執行,延遲後才進行賦值,這種賦值語句是不可綜合的,在需要綜合的模組設計中不可使用這種風格的程式碼。 所謂阻塞的概念是指在同一個always塊中,其後面的賦值語句從概念上是在前一句賦值語句結束之後再開始賦值的。 2、非阻塞賦值 非阻塞賦值用小於等於號(<=)表示。為什麼稱這種賦值為非阻塞賦值呢?因為在賦值開始時計算RHS表示式,賦值操作時刻結束時更新LHS。在計算非阻塞賦值的RHS表示式和更新LHS期間,其他的Verilog語句,包括其他的非阻塞賦值語句都可能計算RHS表示式和更新LHS。非阻塞賦值允許其他的Verilog語句同時進行操作。非阻塞賦值可以看作兩個步驟的過程:(1)在賦值開始時,計算非阻塞賦值RHS表示式;(2)在賦值結束時,更新非阻塞賦值LHS表示式。 非阻塞賦值操作只能用於對暫存器型別變數進行賦值,因此只能用在“initial”塊和“always”塊等過程塊中,而非阻塞賦值不允許用於連續賦值。
阻塞與非阻塞賦值的語言結構是Verilog語言中最難理解的概念之一。 有這樣的兩個要點: (1)在描述組合邏輯的always塊中用阻塞賦值,則綜合成組合邏輯的電路結構; (2)在描述時序邏輯的always塊中用非阻塞賦值,則綜合成時序邏輯的電路結構。這樣做的原因是: 這是因為要使綜合前模擬和綜合後模擬一致的緣故。 為了更好地理解上述要點,我們需要對Verilog語言中的阻塞賦值和非阻塞賦值的功能和執行時間上的差別有深入的理解。我們定義下面的兩個關鍵字:RHS——方程式右手方向的表示式或變數可分別縮寫成 RHS表示式或RHS變數;LHS ——方程式左手方向的表示式或變數可分別縮寫成LHS 表示式或LHS變數。 IEEE Verilog標準定義了有些語句有確定的執行時間,有些語句沒有確定的執行時間。若有兩條或兩條以上的語句準備在同一時間執行,但由於語句的排列順序不同,卻產生了不同的輸出結果。這就是造成Verilog模組冒險和競爭的原因。為了避免產生競爭,理解阻塞和非阻塞賦值在執行時間上的差別是至關重要的。 1、阻塞賦值 阻塞賦值用等號(=)表示。為什麼稱這種賦值為阻塞賦值呢?因為在賦值時先計算RHS部分的值,這是賦值語句不允許任何別的Verilog語言的干擾,直到現行的賦值完成時刻,即把RHS賦值給LHS的時刻,它才允許別的賦值語句的執行。 一般可綜合的賦值操作在RHS不能設定延時(即使是0延時也不允許)。從理論上講,它與後面的賦值語句只有概念上的先後,而無實質的延遲。若在RHS上加延遲,則在延遲時間會阻止賦值語句的執行,延遲後才進行賦值,這種賦值語句是不可綜合的,在需要綜合的模組設計中不可使用這種風格的程式碼。 所謂阻塞的概念是指在同一個always塊中,其後面的賦值語句從概念上是在前一句賦值語句結束之後再開始賦值的。 2、非阻塞賦值 非阻塞賦值用小於等於號(<=)表示。為什麼稱這種賦值為非阻塞賦值呢?因為在賦值開始時計算RHS表示式,賦值操作時刻結束時更新LHS。在計算非阻塞賦值的RHS表示式和更新LHS期間,其他的Verilog語句,包括其他的非阻塞賦值語句都可能計算RHS表示式和更新LHS。非阻塞賦值允許其他的Verilog語句同時進行操作。非阻塞賦值可以看作兩個步驟的過程:(1)在賦值開始時,計算非阻塞賦值RHS表示式;(2)在賦值結束時,更新非阻塞賦值LHS表示式。 非阻塞賦值操作只能用於對暫存器型別變數進行賦值,因此只能用在“initial”塊和“always”塊等過程塊中,而非阻塞賦值不允許用於連續賦值。