- [Software Control]: システムは、エンベデッド Arm プロセッサまたは外部 x86 プロセッサ上で実行されるソフトウェア アプリケーションを介して制御され、ドライバーを使用してハードウェア デザインの要素にアクセスし、ハードウェアでレジスタの読み出しと書き込みをして、システム内の IP の実行を制御します。
- [Self Synchronous]: このモードでは、IP がカーネルの起動と停止に使用される信号を公開します。これらの信号は、IP の実行を処理するシステム デザインのほかの IP または要素によって駆動されます。
Vivado IP フローでは、メモリ、ストリーム、およびレジスタ インターフェイス パラダイムがサポートされます。各パラダイムでは、次の表に示すように、外部との通信用に異なるインターフェイス プロトコルがサポートされます。Vitis カーネル フローでは、AXI4 インターフェイス アダプターのみがサポートされますが、このフローではさまざまなインターフェイス タイプがサポートされます。
パラダイム | 説明 | インターフェイスの種類 |
---|---|---|
メモリ | データは、DDR、HBM、PLRAM/BRAM/URAM などのメモリを介してカーネルからアクセスされます。 |
ap_memory 、bram 、AXI4 メモリ マップド (m_axi ) |
ストリーム | データは、ビデオ プロセッサやほかのカーネルなどの別のストリーミング ソースからカーネルにストリーミングされるほか、カーネルからストリーミングすることもできます。 |
ap_fifo 、AXI4-Stream (axis ) |
Register | データは、レジスタの読み書きによって実行されるレジスタ インタフェースを介して、カーネルからアクセスされます。 |
ap_none 、ap_hs 、ap_ack 、ap_ovld 、ap_vld 、および AXI4-Lite アダプター (s_axilite )。 |
デフォルトのインターフェイスは、次の表に示すように、最上位関数の C 引数タイプとデフォルトのパラダイムによって定義されます。
C 引数タイプ | サポートされるパラダイム | デフォルトのパラダイム | デフォルトのインターフェイス プロトコル | ||
---|---|---|---|---|---|
入力 | 出力 | 入出力 | |||
スカラー変数 (値渡し) | Register | Register | ap_none | N/A | N/A |
配列 | メモリ、ストリーム | メモリ | ap_memory | ap_memory | ap_memory |
ポインター | メモリ、ストリーム、レジスタ | Register | ap_none | ap_vld | ap_ovld |
参考資料 | Register | Register | ap_none | ap_vld | ap_vld |
hls::stream
|
ストリーム | ストリーム | ap_fifo | ap_fifo | N/A |
Vivado IP フローのデフォルトの実行モードは順次実行であり、HLS IP は次のタスクを開始する前に 1 つのタスクを完了しておく必要があります。これは、ap_ctrl_hs
ブロック制御プロトコルで指定されます。この制御プロトコルは、ブロック レベルの制御プロトコル の方法に従うと変更できます。
次のコードの vadd
関数は、Vivado IP フローのインターフェイス合成の例を示しています。
#define VDATA_SIZE 16
typedef struct v_datatype { unsigned int data[VDATA_SIZE]; } v_dt;
extern "C" {
void vadd(const v_dt* in1, // Read-Only Vector 1
const v_dt* in2, // Read-Only Vector 2
v_dt* out_r, // Output Result for Addition
const unsigned int size // Size in integer
) {
unsigned int vSize = ((size - 1) / VDATA_SIZE) + 1;
// Auto-pipeline is going to apply pipeline to this loop
vadd1:
for (int i = 0; i < vSize; i++) {
vadd2:
for (int k = 0; k < VDATA_SIZE; k++) {
out_r[i].data[k] = in1[i].data[k] + in2[i].data[k];
}
}
}
}
vadd
関数には、次が含まれます。
-
in1
とin2
の 2 つのポインター入力 - 結果が書き込まれるポインター
out_r
- スカラー値
size
Vivado IP フローで使用されるデフォルトのインターフェイス合成設定では、次の図に示すように、デザインはポートおよびインターフェイスを含む RTL ブロックに合成されます。
デフォルトの Vivado IP フローでは、データおよび制御の両方のフローを処理するため、RTL デザインに 3 つのタイプのインターフェイス ポートが作成されます。
- クロック ポートとリセット ポート:
ap_clk
とap_rst
がカーネルに追加されます。 - [Block-level control protocol]:
ap_ctrl
インターフェイスはs_axilite
インターフェイスとしてインプリメントされます。 - ポート レベルのインターフェイス プロトコル: 最上位関数の各引数および関数の戻り値 (関数が値を返す場合) に対して作成されます。前述の表のように、ほとんどの引数は
ap_none
のポート プロトコルを使用するため、制御信号はありません。前述のvadd
の例では、in1
、in2
、およびsize
などのポートがありましたが、out_r_o
出力ポートはap_vld
プロトコルを使用するので、out_r_o_ap_vld
信号に関連付けられています。
Vivado IP フロー内の AP_Memory
ap_memory
は前述の表に記載されているメモリ パラダイムのデフォルトのインターフェイスです。Vivado IP フローでは、BRAM や URAM などのメモリ リソースとの通信に使用されます。ap_memory
プロトコルは、アドレスおよびデータ フェーズでも使用されます。プロトコルは最初にリソースの読み出し/書き込みを要求し、リソースが使用可能かどうかの承認応答を受信するまで待機します。次に、読み出し/書き込みのデータ転送フェーズを開始します。
ap_memory
では、1 つのビート データを 1 つのアドレスに転送しかできず、バースト アクセスが可能な m_axi
とは異なるということに注意することが重要です。これにより、ap_memory
はほかのプロトコルと比較して軽量なプロトコルになります。
- [Memory Resources]: デフォルトでは、Vitis HLS はシングル ポートの RAM リソースと通信するプロトコルがインプリメントします。INTERFACE プラグマまたは指示子の一部として
storage_type
を指定することで、プロトコルのインプリメンテーションを制御できます。storage_type
では、どのタイプの RAM を使用するか、どの RAM ポート (シングル ポートとデュアル ポートのいずれか) を作成するかを明示的に指定できます。storage_type
を指定しない場合、Vitis HLS は次を使用します。- シングル ポート RAM (デフォルト)。
- 開始間隔またはレイテンシが削減される場合はデュアル ポート RAM。
Vivado IP フローの M_AXI インターフェイス
m_axi
) インターフェイスを使用すると、IP がグローバル メモリ (DDR、HBM、PLRAM) でデータを読み出しおよび書き込みできます。メモリ マップド インターフェイスは、複数の IP 間でデータを共有する便利な方法です。m_axi
インターフェイスの主な利点は、次のとおりです。 - インターフェイスには、独立した読み出しチャネルおよび書き込みチャネルがあります。
- バースト ベースのアクセスをサポートします。
- 未処理のトランザクションのキューを提供します。
- バースト アクセスの理解
-
AXI4 メモリ マップド インターフェイスは、1 つのアドレス位相だけを含む最大 4K バイトの高スループット バーストをサポートします。バースト モード転送では、Vitis HLS で 1 つのベース アドレスを使用してデータが読み出しまたは書き込みされ、その後に複数のシーケンシャル データ サンプルが続くので、より高いデータ スループットを達成できます。バースト モードは、C の
memcpy
関数を使用している場合、またはfor
ループをパイプライン処理している場合に使用できます。詳細は、AXI4 バースト動作の制御 または AXI バースト転送 を参照してください。 - ポートの自動拡張とポート幅の調整
-
ポート幅の自動変更 で説明するように、Vitis HLS には、バースト アクセスに必要な前提条件が揃っている場合に、データ転送を容易にし、ポート幅を自動的に広げてバースト アクセスを改善する機能があります。Vivado IP フローでは、次のコンフィギュレーション設定により、デフォルトでポート幅の自動サイズ変更がディスエーブルになります。この機能をイネーブルにするには、次のコンフィギュレーション オプションを変更する必要があります (1 つのコマンドがビットとして指定され、もう 1 つのコマンドがバイトとして指定されていることに注意してください)。
syn.interface.m_axi_max_widen_bitwidth=0 syn.interface.m_axi_alignment_byte_size=0
- Vivado IP モードのアライメントの指定
-
m_axi
ポートのアライメントにより、ポートが指定されたアライメントに従ってメモリを読み出しおよび書き込みできます。ベスト ケースではパフォーマンスに影響し、ワースト ケースでは機能に影響する可能性があるため、正しいアライメントを選択することが重要です。アライメントされたメモリ アクセスとは、ポインター (またはデータの開始アドレス) がアライメントと呼ばれるタイプ別の値の倍数であることを意味します。アライメントは、(パフォーマンス上の理由などにより) タイプをメモリに格納する必要があるか、または格納するべきである、自然なアドレスの倍数です。たとえば、標準の 32 ビット アーキテクチャでは、32 ビットのワードがメモリにそれぞれ 4 バイトずつ格納されます。データは 1 ワードまたは 4 バイトの境界にアライメントされます。
システム内でアライメントに一貫している必要があります。アライメントは、IP が AXI4 マスター モードで動作しているときに決定され、4 バイト アライメントの 32 ビット アーキテクチャと同じように指定する必要があります。IP がスレーブ モードで動作している場合、アライメントはマスターのアライメントと一致している必要があります。
- オフセットの規則
-
m_axi
オフセットのデフォルトは offset=direct および syn.interface.default_slave_interface=s_axilite です。ただし、Vivado IP フローでは、オフセットと動作モード で説明する方法で変更できます。 - バンドル インターフェイス: パフォーマンスとリソース使用率
-
デフォルトでは、M_AXI バンドル に説明するように、Vitis HLS が互換性のあるオプションを持つ関数引数を 1 つの
m_axi
インターフェイス アダプターにグループ化します。ポートを 1 つのインターフェイスにバンドルすると、AXI4 ロジックを排除してデバイス リソースを節約できるので、密集したデザインで作業する場合に必要になることがあります。ただし、すべてのメモリ転送が 1 つのポートを通ることになるので、1 つのインターフェイス バンドルにより IP のパフォーマンスが制限されてしまうことがあります。
m_axi
インターフェイスには独立した読み出しチャネルと書き込みチャネルがあるので、1 つの場所に対してであれば、1 つのインターフェイスで読み出しと書き込みを同時に実行できます。複数のバンドルを使用すると、複数のインターフェイスを作成してメモリ バンクに接続することで、パフォーマンスを向上させることができます。
Vivado IP フローの S_AXILITE
Vivado IP フローでは、デフォルトの実行制御は、デフォルトの ap_ctrl_hs
制御プロトコルを使用し、s_axilite
インターフェイスを介したレジスタの読み出しと書き込みによって管理されます。IP は、S_AXILITE 制御レジスタ マップ で説明するように、s_axilite
インターフェイスの制御レジスタを読み出しおよび書き込みすることによって、ソフトウェアで制御されます。
s_axilite
インターフェイスには次の機能があります。
- 制御プロトコル
- ブロック レベルの制御プロトコル で指定されるブロック制御プロトコル。
- スカラー引数
-
S_AXILITE 制御レジスタ マップ で説明するように、最上位関数のスカラー引数は、その値用のレジスタを作成する
s_axilite
インターフェイスにマップできます。ソフトウェアは、このレジスタ空間への読み出し/書き込みを実行できます。 - オフセットの規則
- Vivado IP フローでは、最上位関数内の関連する C 引数のデータ型に基づいて、ポートに割り当てられるアドレスのサイズまたは範囲が定義されます。ただし、S_AXILITE オフセット オプション で説明するように、オフセット サイズを手動で定義することもできます。
- バンドルの規則
-
Vivado IP フローでは、
s_axilite
インターフェイスを使用して複数のバンドルを指定できます。これにより、定義したバンドルごとに個別のインターフェイス アダプターが作成されます。ただし、S_AXILITE バンドルの規則 で説明するように、複数のバンドルの使用に関連する規則がいくつかあります。
Vivado IP フローの AP_FIFO
Vivado IP フローでは、ap_fifo
インターフェイス プロトコルがメモリ リソース FIFO との通信用インターフェイスのストリーミング パラダイムのデフォルト インターフェイスであり、IP 内のさまざまな関数間の通信チャネルとしても使用できます。このプロトコルは、データがシーケンシャルにアクセスされる場合にのみ使用する必要があり、AMDでは FIFO をインプリメントする hls::stream<data type>
を使用することを強くお勧めしています。
<data type>
は T_data_type
と同じにすることはできず、インターフェイスでのみ使用する必要があります。Vivado IP フローの AXIS インターフェイス
AXI4-Stream プロトコル (axis
) はストリーミング インターフェイスの代替で、ストリーミング データ用の単一方向チャネルをシーケンシャルに定義します。m_axi
プロトコルとは異なり、AXI4-Stream インターフェイスは無制限にデータをバーストできるので、パフォーマンスがかなり向上します。メモリの読み出し/書き込みにアドレスを必要とする AXI4 メモリ マップド インターフェイスとは異なり、axis
インターフェイスは単にアドレスを必要とせずにデータを別の axis
インターフェイスに渡すだけなので、使用するデバイス リソースが少なくなります。AXI4-Stream インターフェイス で説明するように、これらの機能を組み合わせることで、ストリーミング インターフェイスが軽量でパフォーマンスに優れたインターフェイスになります。