Verilog 語法中,關於模塊例化有兩種方法,一種是位置相關, 另外一種是名稱相關
verilog 語言中形成一個模塊:
module module_name
(
input a,
input b,
output c,
input [31:0] d,
output [7:0] e,
.....
inout x
);
verilog 語法
...
endmodule
verilog 語言中模塊:
1)包括 module + 模塊名稱, ( ….. ); 在 ()中包括相關的輸入(input),輸出(output), 輸入輸出(inout) 端口, 注意,最后一個端口沒有’ ,’
2) 模塊中相關的verilog 語法
3) endmodule
舉例:
module add
(
input [3:0] a,
input [3:0] b,
output [4:0] c
);
assign c = a + b;
endmodule
在使用這個模塊時(模塊例化),我們有兩種方法例化, 1)按位置例化, 2)按名稱例化。
按位置例化
1)例化時,需要所有的參數順序必須和模塊本身的順序一致
2)例化時,只要寫端口名字即可。
按名稱例化
1)必須指定當前例化的端口名稱
2)例化時,端口的順序可以自由排序,不一定和模塊本身的順序相同
舉例:
// 按位置例化 add 模塊
wire [3:0] x1;
wire [3:0] x2;
wire [4:0] x3;
// 希望 x3 = x1 + x2;
add add_inst1
(
x1, //對應 模塊本身的a
x2, //對應 模塊本身的b
x3 //對應 模塊本身的c
);
下面的例化(add_inst1)是不正確的,大家要注意, 沒有按照模塊本身的順序進行例化。
add add_inst1
(
x2, //對應 模塊本身的a
x3, //對應 模塊本身的b
x1 //對應 模塊本身的c
);
// 按名稱例化 add 模塊
wire [3:0] x1;
wire [3:0] x2;
wire [4:0] x3;
add add_inst3
(
.a (x1),
.b (x2),
.c (x3)
);
按照名稱例化 , 雖然傳遞的順序和 模塊本身不一致, 但依然可以被正確使用
add add_inst4
(
.b (x2),
.c (x3),
.a (x1)
);
總結:
按位置例化, 例化時書寫比較簡單,非常類似與c語言的寫法, 缺點是位置不能變化。
按名稱例化, 例化時書寫比較多, 優點是順序可以任意更改。
兩種方法都是可以使用的, 建議初學者使用名稱例化, 雖然書寫比較多, 但保證正確還是比較關鍵的, 尤其是端口 數量比較多的情況。