図 60: サイドチャネルありの AXI4-Stream インターフェイス
構造体の AXI4-Stream インターフェイスへのパック
AXI4-Stream インターフェイスと一緒に構造体を使用する場合は、デフォルトの合成動作が異なります。構造体のデ
フォルトの合成動作については、インターフェイス合成および構造体を参照してください。
サイドチャネルありまたはなしの AXI4-Stream インターフェイスを使用していて、関数引数が構造体の場合、Vitis HLS でその構造体のすべての要素が単一幅のデータ ベクターにまとめられます。インターフェイスは、関連する TVALID および TREADY 信号を使用して単一幅のデータ ベクターとしてインプリメントされます。
サイドチャネルありの AXI4-Stream インターフェイスを使用する場合、Vitis HLS ツールでは RGBPixel などの構造体 を axis インターフェイスを介して送信できません。独自の構造体を定義するために ap_axiu 構造体をオーバーロー ドすることはできません。この制限を回避するには、構造体初期化関数を使用して意図する結果を取得します。
struct RGBPixel { unsigned char r;
unsigned char g;
unsigned char b;
unsigned char a;
RGBPixel(ap_int<32> d) : r(d.range(7,0)), g(d.range(15,8)), b(d.range(23,16)), a(d.range(31,24)) {
#pragma HLS INLINE }
operator ap_int<32>() {
#pragma HLS INLINE
return (ap_int<8>(a), ap_int<8>(b), ap_int<8>(g), ap_int<8>(r));
}
}__attribute__((aligned(4)));
• プロセッサで実行されるコードと一緒に使用できる C ドライバーファイルが出力できます。
注記: これにより、C アプリケーション プログラム インターフェイス (API) 関数のセットが提供されるので、ソフ トウェアからハードウェアを簡単に制御できるようになります。これは、デザインを IP カタログにエクスポート する場合に便利です。
次は、Vitis HLS で関数リターンを含む複数の引数が AXI4-Lite インターフェイスとしてインプリメントされる 例を示
しています。各インターフェイスで bundle オプションに同じ名前が使用されるので、各ポートが同じ AXI4-Lite イ ンターフェイスにまとめられます。
void example(char *a, char *b, char *c)
{#pragma HLS INTERFACE s_axilite port=return bundle=BUS_A
#pragma HLS INTERFACE s_axilite port=a bundle=BUS_A
#pragma HLS INTERFACE s_axilite port=b bundle=BUS_A
#pragma HLS INTERFACE s_axilite port=c bundle=BUS_A offset=0x0400
#pragma HLS INTERFACE ap_vld port=b *c += *a + *b;
}
注記: bundleオプションを使用しない場合、Vitis HLS は AXI4-Lite インターフェイスを使用して、指定されたすべて の引数を同じデフォルトのバンドルにまとめ、自動的にポートに名前を付けます。
また、I/O プロトコルも AXI4-Lite インターフェイスにまとめられたポートへ割り当てることができます。上記の例の
場合、Vitis HLS はポート b を ap_vld インターフェイスとしてインプリメントしてから 、ポート b を AXI4-Lite イン
ターフェイスにまとめます。このため、AXI4-Lite インターフェイスには、ポート b のデータ用のレジスタ、ポート b が読み出されたことを承認する出力用のレジスタ、ポート b の入力有効信号用のレジスタが含まれます。
ポート b が読み出されるたびに、Vitis HLS は自動的に入力有効信号をクリアにして、ロジック 0 にレジスタをリセ ットします。入力 valid レジスタがロジック 1 に設定されない場合、b データ レジスタのデータは有効だと判断され ないので、デザインが停止し、valid レジスタの設定を待機する状態になります。
推奨: ザイリンクスでは、デザインの操作中に使用しやすいように、AXI4-Lite インターフェイスにまとめられたポ ートに追加の I/O プロトコルは含めないようにしておくことを勧めしています。ただし、ザイリンクスでは、 AXI4-Lite インターフェイスの return ポートに関連するブロック レベルの I/O プロトコルは含めることを勧めしていま す。
配列は、bram インターフェイスを使用して AXI4-Lite インターフェイスに割り当てることができません。配列は、デ フォルトの ap_memory インターフェイスを使用してのみ AXI4-Lite インターフェイスに割り当てることができま す。I/O プロトコルの ap_stable で指定した引数も AXI4-Lite インターフェイスには割り当てることができません。
AXI4-Lite インターフェイスにまとめられた変数は関数引数であり、それ自体は C コードでデフォルト値を割り当て ることができないので、AXI4-Lite インターフェイスのどのレジスタもデフォルト値を割り当てられない可能性があり ます。レジスタは config_rtl コマンドを使用するとリセットを付けてインプリメントできますが、それ以外のデ フォルト値を割り当てることはできません。
デフォルトでは、Vitis HLS で AXI4-Lite インターフェイスにまとめられる各ポートのアドレスが自動的に割り当てら れます。Vitis HLS からは、C ドライバー ファイルに割り当てられたアドレスが提供されます。詳細は、C ドライバー ファイル を参照してください。アドレスを明示的に定義するには、上記の例の引数 c で示したように、offset オプ ションを使用します。
重要: AXI4-Lite インターフェイスの場合、Vitis HLS ではブロック レベル I/O プロトコル信号および割り込み制御に 対してアドレス 0x0000 ~ 0x000C が予約されます。
合成後、Vitis HLS は次の図に示すように AXI4-Lite インターフェイスにポートをインプリメントします。Vitis HLS は、AXI4-Lite インターフェイスに関数リターンを含めて、割り込みポートを作成します。割り込みは、AXI4-Lite イ ンターフェイスを使用してプログラムできます。割り込みは、次のブロック レベル プロトコルから駆動することも できます。
• ap_done: 関数がすべての操作を終了したことを示します。
• ap_ready: 関数が新しい入力データを受信する準備ができたことを示します。
インターフェイスは、C ドライバー ファイルを使用してプログラムできます。
図 61: まとめられた RTL ポートを含む AXI4-Lite スレーブ インターフェイス
AXI4-Lite インターフェイスの制御クロックおよびリセット
デフォルトでは、Vitis HLS では AXI4-Lite インターフェイスと合成済みデザインに同じクロックが使用されます。ま
た、Vitis HLS では、AXI4-Lite インターフェイスのすべてのレジスタが 合成されたロジック (ap_clk) に使用されるク
ロックに接続されます。
INTERFACE 指示子に clock オプションを使用すると、AXI4-Lite ポートごとに別々のクロックを指定できます (オプ ション)。クロックを AXI4-Lite インターフェイスに接続する場合は、次のプロトコルを使用する必要があります。
• AXI4-Lite インターフェイス クロックは、合成されたロジック (ap_clk) に使用されるクロックと同期している必 要があります。つまり、どちらのクロックも同じマスター ジェネレーター クロックから派生している必要があり ます。
• AXI4-Lite インターフェイスクロックの周波数は、合成されたロジック (ap_clk) に使用されるクロックの周波数 以下にする必要があります。
インターフェイス指示子にclockオプションを使用する場合、clockオプションは各バンドルの 1 つの関数引数に 指定するだけです。Vitis HLS では、バンドル内のその他すべての関数引数が同じクロックとリセットを使用してイン プリメントされます。Vitis HLS では、リセット信号が ap_rst_ の後にクロック名が付いた名前で生成されます。生 成されるリセット信号は、config_rtl コマンドとは関係なくアクティブ Low になります。
次の例では、Vitis HLS で関数引数 a および b が AXI_clk1 というクロックと関連するリセット ポートと一緒に AXI4-Lite ポートにまとめられるところを示しています。
// Default AXI-Lite interface implemented with independent clock called AXI_clk1
#pragma HLS interface s_axilite port=a clock=AXI_clk1
#pragma HLS interface s_axilite port=b
次の例では、Vitis HLS で関数引数 c および d が CTRL1 というクロックと関連するリセット ポートを使用して AXI4-Lite ポートの AXI_clk2 にまとめられるところを示しています。
// CTRL1 AXI-Lite bundle implemented with a separate clock (called AXI_clk2)
#pragma HLS interface s_axilite port=c bundle=CTRL1 clock=AXI_clk2
#pragma HLS interface s_axilite port=d bundle=CTRL1
C ドライバー ファイル
AXI4-Lite スレーブ インターフェイスがインプリメントされると、C ドライバー ファイルのセットが自動的に作成さ れます。これらの C ドライバー ファイルは、CPU で実行されるどのソフトウェアにも統合できる API を含んでおり、
AXI4-Lite スレーブ インターフェイスを介してデバイスとの通信に使用されます。
C ドライバー ファイルは、デザインが IP カタログで IP としてパッケージされると作成されます。
ドライバー ファイルは、スタンドアロン モードと Linux モード用に作成されます。スタンドアロン モードの場合、
ドライバーがその他のザイリンクススタンドアロンドライバーと同じように使用されます。Linux モードの場合、す べての C ファイル (.c) とヘッダー ファイル (.h) がソフトウェア プロジェクトにコピーされます。
合成では、ドライバー ファイルと API 関数に最上位関数からの名前が一部使用されます。上記の例の場合、最上位関 数の名前は example です。最上位関数が DUT であれば、次の説明に使用されている「example」は「DUT」になり ます。ドライバー ファイルがパッケージされた IP (solution フォルダー内の impl ディレクトリ) に作成されます。
表 12: example というデザインの C ドライバー ファイル
ファイル パス 使用モード 説明
data/example.mdd スタンドアロン ドライバー定義ファイル。
data/example.tcl スタンドアロン ソフトウェアを SDK プロジェクトに統合
するために SDK で使用。
src/xexample_hw.h 両方 すべての内部レジスタのアドレス オフセ
ットを定義。
src/xexample.h 両方 API 定義
src/xexample.c 両方 標準 API インプリメンテーション
src/xexample_sinit.c スタンドアロン 初期化 API インプリメンテーション
src/xexample_linux.c Linux 初期化 API インプリメンテーション