説明
BIND_STORAGE プラグマは、コードの特定の変数 (配列または関数引数) を RTL のメモリ タイプ (type) に割り当てます。このプラグマを指定しない場合、Vitis HLS ツールにより使用するメモリ タイプが自動的に決定されます。HLS ツールは、指定したインプリメンテーション (impl) を使用してハードウェアにメモリをインプリメントします。
たとえば、配列をインプリメントするのに使用するメモリ タイプを指定するために使用できます。これにより、配列をシングル ポート RAM またはデュアル ポート RAM のどちらとしてインプリメントするかをユーザーが制御できます。
-storage_type および -storage_impl オプションを使用して、メモリ タイプとインプリメンテーションを割り当てる必要があります。インプリメンテーションのレイテンシも指定できます。インターフェイスのブロック RAM では、latency オプションを指定すると、たとえばレイテンシ 2 または 3 の SRAM をサポートするなど、インターフェイスにオフチップの標準でない SRAM をモデル化できます。内部演算では、latency オプションを使用すると、メモリをより多くのパイプライン段を使用してインプリメントできます。これらの追加のパイプライン段により、RTL 合成中にタイミング問題を解決しやすくなります。
latency オプションを使用するには、使用可能な複数段のインプリメンテーションを演算に含める必要があります。HLS ツールは、すべてのブロック RAM に対して複数段のインプリメンテーションを生成します。構文
C/C++ ソースの配列変数が定義されている関数の本体内に配置します。
#pragma HLS bind_storage variable=<variable> type=<type>\
[ impl=<value> latency=<int> ]
説明:
-
variable=<variable> - BIND_STORAGE プラグマを適用する変数を定義します。プラグマを指定する際は必ず使用する必要があります。
-
type=<type> - 指定した変数に割り当てるメモリ タイプを定義します。
-
impl=<value> - 指定したストレージ タイプのインプリメンテーションを指定します。サポートされるインプリメンテーションには、次に示すように
bram、bram_ecc、lutram、uram、uram_ecc、srl、memory、およびautoがあります。 -
latency=<int> - 指定したタイプをバインディングする際のデフォルト レイテンシを定義します。次の表に示すように、有効なレイテンシは
typeおよびimplの指定によって異なります。デフォルトは -1 で、Vitis HLS によりレイテンシが選択されます。
| タイプ | インプリメンテーション | 最小レイテンシ | 最大レイテンシ |
|---|---|---|---|
| FIFO | BRAM | 0 | 0 |
| FIFO | LUTRAM | 0 | 0 |
| FIFO | MEMORY | 0 | 0 |
| FIFO | SRL | 0 | 0 |
| FIFO | URAM | 0 | 0 |
| 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 |
- 読み出しデータは、読み出し入力がアクティブになる同じサイクルで FIFO 出力で利用可能になります。
- 書き込みデータは、書き込み入力がアクティブになる同じサイクルで FIFO 入力により受信されます。
read-after-write レイテンシ (たとえば、FIFO に書き込まれたデータが読み出し可能になるまでのサイクル数) は、グローバルにのみ設定できます: config_storage fifo -read_after_write_latency
N
set_directive_bind_storage ではサポートされません。例
プラグマは、coeffs 変数がライブラリからの BRAM コアにインプリメントされたシングル ポート RAM を使用するように指定しています。
#pragma HLS bind_storage variable=coeffs type=RAM_1P impl=bram
coeffs の値にアクセスするために RTL に作成されるポートは、RAM_1P で定義されます。