簡介
在initial或always外的assign賦值語句稱為連續賦值語句,一般在描述純組合電路時使用。
數據流的描述是採用連續賦值語句(assign )語句來實現的。語法如下:
assign net_type =表達式;
連續賦值語句用於組合邏輯的建模。等式左邊是wire類型的變數。等式右邊可以是常量、由運算符如邏輯運算符、算術運算符參與的表達。
數據流建模
Verilog模型可以是實際電路不同級別的抽象,因此有多種不同的建模方法。其中最常用的建模方法有以下三種:
1)門級結構建模
2)行為描述建模
3)數據流建模
數據流的建模方式就是通過對數據流在設計中的具體行為的描述的來建模。最基本的機制就是用連續賦值語句。在連續賦值語句中,某個值被賦給某個線網變數(信號),語法如下:
assign [delay] net_name = expression;
如:assign #2 A = B;
在數據流描述方式中,還必須藉助於HDL提供的一些運算符,如按位邏輯運算符:邏輯與(&),邏輯或(|)等。對數據流的建模方式主要有連續賦值語句、阻塞賦值語句、非阻塞賦值語句等。
實例
wire [3:0] Z, Preset, Clear; //線網說明
assign Z = Preset & Clear; //連續賦值語句
wire Cout, C i n ;
wire [3:0] Sum, A, B;
. . .
assign {Cout, Sum} = A + B + Cin;
assign Mux = (S = = 3)? D : 'bz;
特點
連續賦值語句的執行是:只要右邊表達式任一個變數有變化,表達式立即被計算,計算的結果立即賦給左邊信號。
連續賦值語句之間是並行語句,因此與位置順序無關。
語法上,有關鍵字“assign”來標識;
左側被賦值的數據類型必須是線網型數據(wire);
連續賦值語句不能出現在過程塊中(initial/always);
連續賦值語句主要用來對組合邏輯進行建模以及線網數據間進行描述;
連續賦值語句產生作用後,賦值表達式中信號的任何變化都將立即被反映到賦值線網型數據的取值上;
1.連續賦值語句的執行是:只要右邊表達式任一個變數有變化,表達式立即被計算,計算的結果立即賦給左邊信號。
2.連續賦值語句之間是並行語句,因此與位置順序無關。
3.語法上,有關鍵字“assign”來標識;
4.左側被賦值的數據類型必須是線網型數據(wire);
5.連續賦值語句不能出現在過程塊中(initial/always);
6.連續賦值語句主要用來對組合邏輯進行建模以及線網數據間進行描述;
7.連續賦值語句產生作用後,賦值表達式中信號的任何變化都將立即被反映到賦值線網型數據的取值上;
與過程賦值區別
過程賦值 | 連續賦值 | |
assign | 無assign(過程性連續賦值除外) | 有assign |
符號 | 使用“=”或“《=” | 只使用“=” |
位置 | 在always語句或initial語句中均可出現 | 不可出現於always語句和initial語句 |
執行條件 | 與周圍其他語句有關 | 等號右端運算元的值發生變化時 |
用途 | 驅動暫存器 | 驅動線網 |
●連續賦值用於數據流行為建模,多用於組合邏輯電路,過程賦值用於順序行為建模,用於順序行為建模。
●連續賦值等號右邊運算元發生變化就需要執行(上電便一直執行),而過程性賦值語句只是執行一次,注意我這裡的一次是指:在initial塊中,過程性賦值只順序執行一次,而在always塊中,每一次滿足always的條件時,都要順序執行一次該 always塊中的語句。連續賦值適用於線網,過程賦值適用於暫存器。