インターフェイスは、ブロック間の通信を指定するために使用します。インターフェイスとは、モジュール間の接続を容易にする目的でまとめられたネットおよび変数のグループです。基本的なインターフェイスの構文は、次のとおりです。
interface interface_name; parameters and ports; items;
endinterface : interface_name
最後の interface_name
はオプションで、コードを読みやすくする目的で追加されています。次に例を示します。
module bottom1 ( input clk,
input [9:0] d1,d2, input s1,
input [9:0] result, output logic sel,
output logic [9:0] data1, data2, output logic equal);
//logic// endmodule
module bottom2 ( input clk, input sel,
input [9:0] data1, data2, output logic [9:0] result);
//logic// endmodule
module top ( input clk, input s1,
input [9:0] d1, d2, output equal);
logic [9:0] data1, data2, result; logic sel;
bottom1 u0 (clk, d1, d2, s1, result, sel, data1, data2, equal); bottom2 u1 (clk, sel, data1, data2, result);
endmodule
上記のコードでは、共通する信号を持つ 2 つの下位モジュールがインスタンシエートされています。
これらの共通信号はすべてインターフェイスを使用して指定できます。
interface my_int
logic sel;
logic [9:0] data1, data2, result;
endinterface : my_int
2 つの bottom モジュールは次のように変更できます。
module bottom1 (
my_int int1,
input clk,
input [9:0] d1, d2,
input s1,
output logic equal);
2 つ目のモジュールの例:
module bottom2 (
my_int int1,
input clk);
これらのモジュール内では、sel
、data1
、data2
、result
へのアクセス方法を変更することもできます。これは、モジュールの視点からは、これらの名前のポートが存在しないからです。その代わりに、my_int
という名前のポートがあります。これには、次の変更を加える必要があります。
if (sel)
result <= data1;
to:
if (int1.sel)
int1.result <= int1.data1;
最後に、最上位モジュールにそのインターフェイスをインスタンシエートする必要があります。これで、インスタンスでそのインターフェイスが参照されます。
module top(
input clk,
input s1,
input [9:0] d1, d2,
output equal);
my_int int3(); //instantiation
bottom1 u0 (int3, clk, d1, d2, s1, equal);
bottom2 u1 (int3, clk);
endmodule