説明
set_directive_bind_storage コマンドは、コードの変数 (配列または関数引数) を RTL の特定のメモリ タイプ (type) に割り当てます。このプラグマを指定しない場合、Vitis HLS ツールにより使用するメモリ タイプが自動的に決定されます。HLS ツールは、指定したインプリメンテーション (impl) を使用してハードウェアにメモリをインプリメントします。たとえば、set_directive_bind_storage コマンドを使用して、メモリのタイプと、配列に使用するインプリメンテーションを指定できます。また、配列をシングル ポート RAM とデュアル ポート RAM のどちらとしてインプリメントするかを制御することも可能です。
-storage_type および -storage_impl オプションを使用して、メモリ タイプとインプリメンテーションを割り当てる必要があります。
-latency オプションを使用すると、インプリメンテーションのレイテンシを指定できます。インターフェイスのブロック RAM の場合、-latency オプションを指定すると、たとえばレイテンシ 2 または 3 の SRAM をサポートするなど、インターフェイスにオフチップの標準でない SRAM を記述できます。内部演算の場合、-latency オプションを使用すると、演算をより多くのパイプライン段を使用してインプリメントできます。これらの追加のパイプライン段により、RTL 合成中にタイミング問題を解決しやすくなります。
-latency オプションを使用するには、使用可能な複数段のインプリメンテーションを演算に含める必要があります。HLS ツールは、すべてのブロック RAM に対して複数段のインプリメンテーションを生成します。より良い結果を得るため、AMDでは、C の場合は -std=c99 を、C および C++ の場合は -fno-builtin を使用することを勧めします。-std=c99 などの C コンパイル オプションを指定するには、Tcl コマンドの add_files に -cflags オプションを使用します。または、HLS コンポーネントの作成 に説明されているように、Project Settings ダイアログ ボックスの Edit CFLAGs ボタンをクリックします。
構文
set_directive_bind_storage [OPTIONS] <location> <variable>
-
<location>: 変数を含める場所をfunction[/label]の形式で指定します。 -
<variable>: 割り当てる変数を指定します。ヒント: 変数が最上位関数の引数である場合は、INTERFACE プラグマまたは指示子の-storage_typeおよび-storage_implオプションを使用してください。
オプション
-
-type - 指定した変数に割り当てるメモリ タイプを定義します。
-
-impl <value> - 指定したストレージ タイプのインプリメンテーションを指定します。サポートされるインプリメンテーションには、次に示すように
bram、bram_ecc、lutram、uram、uram_ecc、srl、memory、およびautoがあります。 -
-latency <int> - ストレージ タイプをインプリメンテーションに割り当てる際のデフォルト レイテンシを指定します。有効なレイテンシは、
typeおよびimplの指定によって異なります。デフォルトは -1 で、Vitis HLS によりレイテンシが選択されます。
| タイプ | インプリメンテーション | 最小レイテンシ | 最大レイテンシ |
|---|---|---|---|
| FIFO | BRAM | 1 | 4 |
| FIFO | LUTRAM | 1 | 4 |
| FIFO | MEMORY | 1 | 4 |
| FIFO | SRL | 1 | 4 |
| FIFO | URAM | 1 | 4 |
| RAM_1P | AUTO | 1 | 3 |
| RAM_1P | BRAM | 1 | 3 |
| RAM_1P | LUTRAM | 1 | 3 |
| RAM_1P | URAM | 1 | 3 |
| RAM_1WNR | AUTO | 1 | 3 |
| RAM_1WNR | BRAM | 1 | 3 |
| RAM_1WNR | LUTRAM | 1 | 3 |
| RAM_1WNR | URAM | 1 | 3 |
| RAM_2P | AUTO | 1 | 3 |
| RAM_2P | BRAM | 1 | 3 |
| RAM_2P | LUTRAM | 1 | 3 |
| RAM_2P | URAM | 1 | 3 |
| RAM_S2P | BRAM | 1 | 3 |
| RAM_S2P | BRAM_ECC | 1 | 3 |
| RAM_S2P | LUTRAM | 1 | 3 |
| RAM_S2P | URAM | 1 | 3 |
| RAM_S2P | URAM_ECC | 1 | 3 |
| RAM_T2P | BRAM | 1 | 3 |
| RAM_T2P | URAM | 1 | 3 |
| ROM_1P | AUTO | 1 | 3 |
| ROM_1P | BRAM | 1 | 3 |
| ROM_1P | LUTRAM | 1 | 3 |
| ROM_2P | AUTO | 1 | 3 |
| ROM_2P | BRAM | 1 | 3 |
| ROM_2P | LUTRAM | 1 | 3 |
| ROM_NP | BRAM | 1 | 3 |
| ROM_NP | LUTRAM | 1 | 3 |
set_directive_bind_storage ではサポートされません。例
次の例では、coeffs[128] 変数は func1 関数に対する引数です。この指示子は、coeffs にライブラリからの BRAM コアにインプリメントされたシングル ポート RAM を使用するよう指定します。
set_directive_bind_storage -impl bram "func1" coeffs RAM_1P
coeffs の値にアクセスするために RTL で作成されるポートは、RAM_1P コアで定義されます。