説明
BIND_STORAGE プラグマは、コードの特定の変数 (配列または関数引数) を RTL のメモリ タイプ (type
) に割り当てます。このプラグマを指定しない場合、Vitis HLS ツールにより使用するメモリ タイプが自動的に決定されます。HLS ツールは、指定したインプリメンテーション (impl
) を使用してハードウェアにメモリをインプリメントします。
たとえば、配列をインプリメントするのに使用するメモリ タイプを指定するために使用できます。これにより、配列をシングル ポート RAM またはデュアル ポート RAM のどちらとしてインプリメントするかをユーザーが制御できます。
重要:
インターフェイスの配列 に説明されているように、配列に関連付けられているメモリ タイプによって RTL で必要なポートの数とタイプが決まるので、これは最上位関数インターフェイスの配列には重要な機能です。ただし、最上位関数の引数に割り当てられた変数の場合は、INTERFACE プラグマまたは指示子の
-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 | 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
変数がライブラリからの BRAM コアにインプリメントされたシングル ポート RAM を使用するように指定しています。
#pragma HLS bind_storage variable=coeffs type=RAM_1P impl=bram
ヒント:
coeffs
の値にアクセスするために RTL に作成されるポートは、RAM_1P で定義されます。