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