Ch6 模組化與階層化

6.1 Top Module

  • Module可以有無限多個,但Top Module只能有一個

6.2 By Name, In Order

  • 連接module的方式分別有By Name和In Order兩種
  • 指定名稱By Name,依原模組名稱來連接,複雜時較不易出錯
  • 依照順序In Order,依原模組定義之埠列來連接

By Name範例:

// 連接除頻器module
wire _CLK, _RST, _CLKo;

Freq_Divider FD_1Hz(
    .CLK( _CLK ), 
    .CLKo( _CLKo ),
    .RST( _RST )
);

In Order範例:

// 連接除頻器module
wire _CLK, _RST, _CLKo;

Freq_Divider FD_1Hz(
    _CLK,
    _RST,
    _CLKo
);

6.3 函數Function

  • 一定有回傳值
  • 至少要有一個以上的Input
  • 只能有一個Output( 可以使用連接運算子{} )
  • 可引用其他的Function但不能引用Task
  • 不可使用negedge和posedge,且只能合成組合邏輯
  • 只能用於行為層次( Behavior Level ),且不能包含always

範例:

function <資料大小> <函數名稱>;
    input <輸入埠宣告>;
    reg <資料型態宣告>;

    begin
        <敘述>;
    end
endfunction

6.4 任務Task

  • 沒有回傳值
  • 可以擁有零個或數個Input、Output、InOut
  • 可引用其他的Function與Task
  • 不可使用negedge和posedge
  • 只能用於行為層次( Behavior Level ),且不能包含always

範例:

task <任務名稱>;
    input <輸入埠宣告>;
    output <輸出埠宣告>;
    reg <資料型態宣告>;

    begin
        <敘述>;
    end
endtask

6.5 實際範例

一位元全加器程式碼:

module Top_Module( A, B, Cin, Sum, Cout );

    input A, B, Cin;
    output Sum, Cout;

    Full_Adder FAD(    // 使用 always 的 Full_Adder
        .A(A),
        .B(B),
        .Cin(Cin),
        .Sum(Sum),
        .Cout(Cout)
    );

endmodule