Verilog語言關(guān)鍵字模塊例化實例講解
關(guān)鍵字:例化,generate,全加器,層次訪問
在一個模塊中引用另一個模塊,對其端口進行相關(guān)連接,叫做模塊例化。模塊例化建立了描述的層次。信號端口可以通過位置或名稱關(guān)聯(lián),端口連接也必須遵循一些規(guī)則。
命名端口連接
這種方法將需要例化的模塊端口與外部信號按照其名字進行連接,端口順序隨意,可以與引用 module 的聲明端口順序不一致,只要保證端口名字與外部信號匹配即可。
下面是例化一次 1bit 全加器的例子:
full_adder1 u_adder0( .Ai (a[0]), .Bi (b[0]), .Ci (c==1'b1 ? 1'b0 : 1'b1), .So (so_bit0), .Co (co_temp[0]));
如果某些輸出端口并不需要在外部連接,例化時 可以懸空不連接,甚至刪除。一般來說,input 端口在例化時不能刪除,否則編譯報錯,output 端口在例化時可以刪除。例如:
//output 端口 Co 懸空 full_adder1 u_adder0( .Ai (a[0]), .Bi (b[0]), .Ci (c==1'b1 ? 1'b0 : 1'b1), .So (so_bit0), .Co ()); //output 端口 Co 刪除 full_adder1 u_adder0( .Ai (a[0]), .Bi (b[0]), .Ci (c==1'b1 ? 1'b0 : 1'b1), .So (so_bit0));
順序端口連接
這種方法將需要例化的模塊端口按照模塊聲明時端口的順序與外部信號進行匹配連接,位置要嚴格保持一致。例如例化一次 1bit 全加器的代碼可以改為:
full_adder1 u_adder1( a[1], b[1], co_temp[0], so_bit1, co_temp[1]);
雖然代碼從書寫上可能會占用相對較少的空間,但代碼可讀性降低,也不易于調(diào)試。有時候在大型的設(shè)計中可能會有很多個端口,端口信號的順序時不時的可能也會有所改動,此時再利用順序端口連接進行模塊例化,顯然是不方便的。所以平時,建議采用命名端口方式對模塊進行例化。
端口連接規(guī)則
輸入端口
模塊例化時,從模塊外部來講, input 端口可以連接 wire 或 reg 型變量。這與模塊聲明是不同的,從模塊內(nèi)部來講,input 端口必須是 wire 型變量。
輸出端口
模塊例化時,從模塊外部來講,output 端口必須連接 wire 型變量。這與模塊聲明是不同的,從模塊內(nèi)部來講,output 端口可以是 wire 或 reg 型變量。
輸入輸出端口
模塊例化時,從模塊外部來講,inout 端口必須連接 wire 型變量。這與模塊聲明是相同的。
懸空端口
模塊例化時,如果某些信號不需要與外部信號進行連接交互,我們可以將其懸空,即端口例化處保留空白即可,上述例子中有提及。
output 端口正常懸空時,我們甚至可以在例化時將其刪除。
input 端口正常懸空時,懸空信號的邏輯功能表現(xiàn)為高阻狀態(tài)(邏輯值為 z)。但是,例化時一般不能將懸空的 input 端口刪除,否則編譯會報錯,例如:
//下述代碼編譯會報Warning full_adder4 u_adder4( .a (a), .b (b), .c (), .so (so), .co (co));
//如果模塊full_adder4有input端口c,則下述代碼編譯是會報Error full_adder4 u_adder4( .a (a), .b (b), .so (so), .co (co));
一般來說,建議 input 端口不要做懸空處理,無其他外部連接時賦值其常量,例如:
full_adder4 u_adder4( .a (a), .b (b), .c (1'b0), .so (so), .co (co));
位寬匹配
當(dāng)例化端口與連續(xù)信號位寬不匹配時,端口會通過無符號數(shù)的右對齊或截斷方式進行匹配。
假如在模塊 full_adder4 中,端口 a 和端口 b 的位寬都為 4bit,則下面代碼的例化結(jié)果會導(dǎo)致:u_adder4.a = {2'bzz, a[1:0]}, u_adder4.b = b[3:0] 。
full_adder4 u_adder4( .a (a[1:0]), //input a[3:0] .b (b[5:0]), //input b[3:0] .c (1'b0), .so (so), .co (co));
端口連續(xù)信號類型
連接端口的信號類型可以是,1)標識符,2)位選擇,3)部分選擇,4)上述類型的合并,5)用于輸入端口的表達式。
當(dāng)然,信號名字可以與端口名字一樣,但他們的意義是不一樣的,分別代表的是 2 個模塊內(nèi)的信號。
用 generate 進行模塊例化
當(dāng)例化多個相同的模塊時,一個一個的手動例化會比較繁瑣。用 generate 語句進行多個模塊的重復(fù)例化,可大大簡化程序的編寫過程。
重復(fù)例化 4 個 1bit 全加器組成一個 4bit 全加器的代碼如下:
module full_adder4( input [3:0] a , //adder1 input [3:0] b , //adder2 input c , //input carry bit output [3:0] so , //adding result output co //output carry bit ); wire [3:0] co_temp ; //第一個例化模塊一般格式有所差異,需要單獨例化 full_adder1 u_adder0( .Ai (a[0]), .Bi (b[0]), .Ci (c==1'b1 ? 1'b1 : 1'b0), .So (so[0]), .Co (co_temp[0])); genvar i ; generate for(i=1; i<=3; i=i+1) begin: adder_gen full_adder1 u_adder( .Ai (a[i]), .Bi (b[i]), .Ci (co_temp[i-1]), //上一個全加器的溢位是下一個的進位 .So (so[i]), .Co (co_temp[i])); end endgenerate assign co = co_temp[3] ; endmodule
`timescale 1ns/1ns module test ; reg [3:0] a ; reg [3:0] b ; //reg c ; wire [3:0] so ; wire co ; //簡單驅(qū)動 initial begin a = 4'd5 ; b = 4'd2 ; #10 ; a = 4'd10 ; b = 4'd8 ; end full_adder4 u_adder4( .a (a), .b (b), .c (1'b0), //端口可以連接常量 .so (so), .co (co)); initial begin forever begin #100; if ($time >= 1000) $finish ; end end endmodule // test
仿真結(jié)果如下,可知 4bit 全加器工作正常:
層次訪問
每一個例化模塊的名字,每個模塊的信號變量等,都使用一個特定的標識符進行定義。在整個層次設(shè)計中,每個標識符都具有唯一的位置與名字。
Verilog 中,通過使用一連串的 . 符號對各個模塊的標識符進行層次分隔連接,就可以在任何地方通過指定完整的層次名對整個設(shè)計中的標識符進行訪問。
層次訪問多見于仿真中。
例如,有以下層次設(shè)計,則葉單元、子模塊和頂層模塊間的信號就可以相互訪問。
//u_n1模塊中訪問u_n3模塊信號: a = top.u_m2.u_n3.c ; //u_n1模塊中訪問top模塊信號 if (top.p == 'b0) a = 1'b1 ; //top模塊中訪問u_n4模塊信號 assign p = top.u_m2.u_n4.d ;
以上就是Verilog語言關(guān)鍵字模塊例化實例講解的詳細內(nèi)容,更多關(guān)于Verilog語言關(guān)鍵字模塊例化的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
關(guān)于學(xué)習(xí) Flex 的一點建議(轉(zhuǎn)載)
關(guān)于學(xué)習(xí) Flex 的一點建議(轉(zhuǎn)載)...2007-01-01linux Shell學(xué)習(xí)筆記最后一節(jié),溫故與知新
linux Shell學(xué)習(xí)筆記最后一節(jié),這節(jié)是對前面章節(jié)的小結(jié),學(xué)習(xí)shell編程的朋友可以參考下。2010-12-12腳本發(fā)生錯誤怎么解決 當(dāng)前頁的腳本發(fā)生錯誤的解決方法小結(jié)
我們經(jīng)常在訪問網(wǎng)頁的時候,右下角經(jīng)常出現(xiàn)腳本錯誤提示,記得一家國外的銀行因為這個原因?qū)е聵I(yè)務(wù)受到很大的影響,如果放到網(wǎng)站上對用戶也容易產(chǎn)生一些錯覺,網(wǎng)站有問題,不安全等等疑問2011-12-12- 本文主要介紹幾種軟件測試方法,這里對軟件測試做了幾種分類和匯總,在做軟件測試的時候可以用適當(dāng)?shù)姆椒?,有需要的小伙伴可以參考?/div> 2016-08-08
最新評論