インターフェイス - 2023.2 日本語

Vivado Design Suite ユーザー ガイド: 合成 (UG901)

Document ID
UG901
Release Date
2023-11-01
Version
2023.2 日本語

インターフェイスは、ブロック間の通信を指定するために使用します。インターフェイスとは、モジュール間の接続を容易にする目的でまとめられたネットおよび変数のグループです。基本的なインターフェイスの構文は、次のとおりです。

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);

これらのモジュール内では、seldata1data2result へのアクセス方法を変更することもできます。これは、モジュールの視点からは、これらの名前のポートが存在しないからです。その代わりに、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