Verilog語(yǔ)言關(guān)鍵字模塊例化實(shí)例講解
關(guān)鍵字:例化,generate,全加器,層次訪問(wèn)
在一個(gè)模塊中引用另一個(gè)模塊,對(duì)其端口進(jìn)行相關(guān)連接,叫做模塊例化。模塊例化建立了描述的層次。信號(hào)端口可以通過(guò)位置或名稱關(guān)聯(lián),端口連接也必須遵循一些規(guī)則。
命名端口連接
這種方法將需要例化的模塊端口與外部信號(hào)按照其名字進(jìn)行連接,端口順序隨意,可以與引用 module 的聲明端口順序不一致,只要保證端口名字與外部信號(hào)匹配即可。
下面是例化一次 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]));
如果某些輸出端口并不需要在外部連接,例化時(shí) 可以懸空不連接,甚至刪除。一般來(lái)說(shuō),input 端口在例化時(shí)不能刪除,否則編譯報(bào)錯(cuò),output 端口在例化時(shí)可以刪除。例如:
//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));
順序端口連接
這種方法將需要例化的模塊端口按照模塊聲明時(shí)端口的順序與外部信號(hào)進(jìn)行匹配連接,位置要嚴(yán)格保持一致。例如例化一次 1bit 全加器的代碼可以改為:
full_adder1  u_adder1(
    a[1], b[1], co_temp[0], so_bit1, co_temp[1]);
雖然代碼從書(shū)寫(xiě)上可能會(huì)占用相對(duì)較少的空間,但代碼可讀性降低,也不易于調(diào)試。有時(shí)候在大型的設(shè)計(jì)中可能會(huì)有很多個(gè)端口,端口信號(hào)的順序時(shí)不時(shí)的可能也會(huì)有所改動(dòng),此時(shí)再利用順序端口連接進(jìn)行模塊例化,顯然是不方便的。所以平時(shí),建議采用命名端口方式對(duì)模塊進(jìn)行例化。
端口連接規(guī)則
輸入端口
模塊例化時(shí),從模塊外部來(lái)講, input 端口可以連接 wire 或 reg 型變量。這與模塊聲明是不同的,從模塊內(nèi)部來(lái)講,input 端口必須是 wire 型變量。
輸出端口
模塊例化時(shí),從模塊外部來(lái)講,output 端口必須連接 wire 型變量。這與模塊聲明是不同的,從模塊內(nèi)部來(lái)講,output 端口可以是 wire 或 reg 型變量。
輸入輸出端口
模塊例化時(shí),從模塊外部來(lái)講,inout 端口必須連接 wire 型變量。這與模塊聲明是相同的。
懸空端口
模塊例化時(shí),如果某些信號(hào)不需要與外部信號(hào)進(jìn)行連接交互,我們可以將其懸空,即端口例化處保留空白即可,上述例子中有提及。
output 端口正常懸空時(shí),我們甚至可以在例化時(shí)將其刪除。
input 端口正常懸空時(shí),懸空信號(hào)的邏輯功能表現(xiàn)為高阻狀態(tài)(邏輯值為 z)。但是,例化時(shí)一般不能將懸空的 input 端口刪除,否則編譯會(huì)報(bào)錯(cuò),例如:
//下述代碼編譯會(huì)報(bào)Warning
full_adder4  u_adder4(
    .a      (a),
    .b      (b),
    .c      (),
    .so     (so),
    .co     (co));
//如果模塊full_adder4有input端口c,則下述代碼編譯是會(huì)報(bào)Error
full_adder4  u_adder4(
    .a      (a),
    .b      (b),
    .so     (so),
    .co     (co));
一般來(lái)說(shuō),建議 input 端口不要做懸空處理,無(wú)其他外部連接時(shí)賦值其常量,例如:
full_adder4  u_adder4(
    .a      (a),
    .b      (b),
    .c      (1'b0),
    .so     (so),
    .co     (co));
位寬匹配
當(dāng)例化端口與連續(xù)信號(hào)位寬不匹配時(shí),端口會(huì)通過(guò)無(wú)符號(hào)數(shù)的右對(duì)齊或截?cái)喾绞竭M(jìn)行匹配。
假如在模塊 full_adder4 中,端口 a 和端口 b 的位寬都為 4bit,則下面代碼的例化結(jié)果會(huì)導(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ù)信號(hào)類型
連接端口的信號(hào)類型可以是,1)標(biāo)識(shí)符,2)位選擇,3)部分選擇,4)上述類型的合并,5)用于輸入端口的表達(dá)式。
當(dāng)然,信號(hào)名字可以與端口名字一樣,但他們的意義是不一樣的,分別代表的是 2 個(gè)模塊內(nèi)的信號(hào)。
用 generate 進(jìn)行模塊例化
當(dāng)例化多個(gè)相同的模塊時(shí),一個(gè)一個(gè)的手動(dòng)例化會(huì)比較繁瑣。用 generate 語(yǔ)句進(jìn)行多個(gè)模塊的重復(fù)例化,可大大簡(jiǎn)化程序的編寫(xiě)過(guò)程。
重復(fù)例化 4 個(gè) 1bit 全加器組成一個(gè) 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 ;
    //第一個(gè)例化模塊一般格式有所差異,需要單獨(dú)例化
    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]), //上一個(gè)全加器的溢位是下一個(gè)的進(jìn)位
            .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 ;
 
    //簡(jiǎn)單驅(qū)動(dòng)
    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 全加器工作正常:

層次訪問(wèn)
每一個(gè)例化模塊的名字,每個(gè)模塊的信號(hào)變量等,都使用一個(gè)特定的標(biāo)識(shí)符進(jìn)行定義。在整個(gè)層次設(shè)計(jì)中,每個(gè)標(biāo)識(shí)符都具有唯一的位置與名字。
Verilog 中,通過(guò)使用一連串的 . 符號(hào)對(duì)各個(gè)模塊的標(biāo)識(shí)符進(jìn)行層次分隔連接,就可以在任何地方通過(guò)指定完整的層次名對(duì)整個(gè)設(shè)計(jì)中的標(biāo)識(shí)符進(jìn)行訪問(wèn)。
層次訪問(wèn)多見(jiàn)于仿真中。
例如,有以下層次設(shè)計(jì),則葉單元、子模塊和頂層模塊間的信號(hào)就可以相互訪問(wèn)。
//u_n1模塊中訪問(wèn)u_n3模塊信號(hào): a = top.u_m2.u_n3.c ; //u_n1模塊中訪問(wèn)top模塊信號(hào) if (top.p == 'b0) a = 1'b1 ; //top模塊中訪問(wèn)u_n4模塊信號(hào) assign p = top.u_m2.u_n4.d ;

以上就是Verilog語(yǔ)言關(guān)鍵字模塊例化實(shí)例講解的詳細(xì)內(nèi)容,更多關(guān)于Verilog語(yǔ)言關(guān)鍵字模塊例化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
 關(guān)于學(xué)習(xí) Flex 的一點(diǎn)建議(轉(zhuǎn)載)
關(guān)于學(xué)習(xí) Flex 的一點(diǎn)建議(轉(zhuǎn)載)...2007-01-01
 linux Shell學(xué)習(xí)筆記最后一節(jié),溫故與知新
linux Shell學(xué)習(xí)筆記最后一節(jié),這節(jié)是對(duì)前面章節(jié)的小結(jié),學(xué)習(xí)shell編程的朋友可以參考下。2010-12-12
 腳本發(fā)生錯(cuò)誤怎么解決 當(dāng)前頁(yè)的腳本發(fā)生錯(cuò)誤的解決方法小結(jié)
我們經(jīng)常在訪問(wèn)網(wǎng)頁(yè)的時(shí)候,右下角經(jīng)常出現(xiàn)腳本錯(cuò)誤提示,記得一家國(guó)外的銀行因?yàn)檫@個(gè)原因?qū)е聵I(yè)務(wù)受到很大的影響,如果放到網(wǎng)站上對(duì)用戶也容易產(chǎn)生一些錯(cuò)覺(jué),網(wǎng)站有問(wèn)題,不安全等等疑問(wèn)2011-12-12
 本文主要介紹幾種軟件測(cè)試方法,這里對(duì)軟件測(cè)試做了幾種分類和匯總,在做軟件測(cè)試的時(shí)候可以用適當(dāng)?shù)姆椒?,有需要的小伙伴可以參考?/div> 2016-08-08
 利用命令進(jìn)行簡(jiǎn)單的增量文件夾備份(win/linux)
這兩天突然看到一個(gè)需求點(diǎn),需要實(shí)現(xiàn)增量備份的功能,找了一些資料,記錄一下如下命令,該命令可以利用命令行進(jìn)行簡(jiǎn)單的增量備份功能2013-03-03最新評(píng)論

