源自於https://hom-wang.gitbooks.io/verilog-hdl/content/Chapter_06.html
輸出入埠敘述
表示法:
module 模組名稱( In1, In2, Out1, Out2, InOut1 );
input in1, in2; // 敘述輸出入型態
output Out1, Out2;
inout InOut1;
… … … …
endmodule
Top Module
Module可以有無限多個,但Top Module只能有一個
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
);
函數Function :
一定有回傳值 至少要有一個以上的Input
只能有一個Output( 可以使用連接運算子{} )
可引用其他的Function但不能引用Task
不可使用negedge和posedge,且只能合成組合邏輯
只能用於行為層次( Behavior Level ),且不能包含always
範例:
function <資料大小> <函數名稱>;
input <輸入埠宣告>;
reg <資料型態宣告>;
begin
<敘述>;
end
endfunction
任務Task
沒有回傳值 可以擁有零個或數個Input、Output、InOut
可引用其他的Function與Task
不可使用negedge和posedge
只能用於行為層次( Behavior Level ),且不能包含always
範例:
task <任務名稱>;
input <輸入埠宣告>;
output <輸出埠宣告>;
reg <資料型態宣告>;
begin
<敘述>;
end
endtask
實際範例
一位元全加器程式碼:
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
module Full_Adder ( A, B, Cin, Sum, Cout );
input A, B, Cin;
output reg Sum, Cout;
always @( A, B, Cin ) begin
{ Cout, Sum } = A + B + Cin;
end
endmodule
//================================// 時間單位 100ns, 時間精確度10 ps
`timescale 100ns/10ps
module Test_bench;
// input A, B, Cin;
// output Sum, Cout;
wire Sum, Cout;
reg A=1'b0;
reg B=1'b0;
reg Cin=1'b0;
Top_Module DUT ( .A(A), .B(B), .Cin(Cin), .Sum(Sum), .Cout(Cout) );
// initial程序結構區塊, 產生A、B輸入信號波形
initial begin
$monitor( A, B, Cin, Sum, Cout );
#100; // 100ns
A=1'b0; B=1'b0 ; Cin=1'b1 ; // “001”
#100; // 200ns
A=1'b0 ; B=1'b1 ; Cin=1'b0 ; // “010”
#100; // 300ns
A=1'b0 ; B=1'b1 ; Cin=1'b1 ; // “011"
#100; // 400ns
A=1'b1 ; B=1'b0 ; Cin=1'b0 ; // “100"
#100; // 500ns
A=1'b1 ; B=1'b0 ; Cin=1'b1 ; // “101"
#100; // 600ns
A=1'b1 ; B=1'b1 ; Cin=1'b0 ; // “110"
#100; // 700ns
A=1'b1 ; B=1'b1 ; Cin=1'b1 ; // “111"
end
initial
begin
#800; // 模擬終止時間 400 ns
$stop;
end
endmodule
//================================
沒有留言:
張貼留言