繰り返しの量を減らすために使用できるいくつかのアプローチを次に示します。
出発点
これは、2 つのサブモジュールを接続する簡単な例です。質問で指摘したように、それらをつなぎ合わせるには多くの繰り返しが必要です。
module source(output A, output B);
assign A = 0;
assign B = 1;
endmodule
module sink(input A, input B);
initial begin
#1 $display("A=%0d B=%0d", A, B);
end
endmodule
module top();
wire A;
wire B;
source the_source(
.A(A),
.B(B)
);
sink the_sink(
.A(A),
.B(B)
);
endmodule
インプリシット ワイヤの使用
Verilog では、ワイヤを暗黙的に宣言できます。したがって、以下に示すように、A
andB
をワイヤーとして宣言する必要はありません。それらがポート マップに表示される場合、それらは暗黙的に宣言されます。これに関する唯一の問題は、それらが常にシングル ビット ワイヤ/ネットとして宣言されることです。したがって、これはシングルビット信号に対してはうまく機能しますが、バスに対しては相互接続を明示的に宣言する必要があります。
// Verilog, implicit wires
module top();
source the_source(
.A(A),
.B(B)
);
sink the_sink(
.A(A),
.B(B)
);
endmodule
Verilog モードの AUTO の使用
Verilog-Modeのemacs パッケージは、モジュールをつなぎ合わせるために必要なタイピングの量を大幅に削減するのに役立ちます。上記の AUTO を使用した例を次に示します。
AUTO を展開する前に:
// Verilog, explicit connections using AUTOs
module top();
/*AUTOWIRE*/
source the_source (/*AUTOINST*/);
sink the_sink (/*AUTOINST*/);
endmodule
AUTO を展開した後:
// Verilog, explicit using AUTOs
module top();
/*AUTOWIRE*/
// Beginning of automatic wires (for undeclared instantiated-module outputs)
wire A; // From the_source of source.v
wire B; // From the_source of source.v
// End of automatics
source the_source (/*AUTOINST*/
// Outputs
.A (A),
.B (B));
sink the_sink (/*AUTOINST*/
// Inputs
.A (A),
.B (B));
endmodule
ブライアンが回答で指摘したように、Verilog-Mode を使用するために emacs を使用する必要はありません。私も Vim を使用しており、この Vim スクリプトを使用して Vim内から Verilog-Mode を有効にしています。
SystemVerilog オプション
SystemVerilog を使用できる場合は、ドット スター表記を使用してポートを名前で接続できます。これは非常に便利ですが、ピア モジュール間の相互接続用のワイヤを宣言する必要があります。
// SystemVerilog, dot-star notation
module top();
wire A;
wire B;
source the_source(.*);
sink the_sink(.*);
endmodule