説明
Vitis HLS は、特定のメモリ リソース (またはタイプ) を使用して、コード内で配列を割り当てます。使用するリソースは、ツールで自動的に決定されます。また、ストレージの設定 で説明するように、syn.storage
を定義して、メモリの種類を指定することもできます。
syn.directive.bind_storage
コマンドは、コード内の特定の変数 (配列や関数の引数) を RTL 内の特定のメモリ タイプ (type
) に割り当てます。たとえば、syn.directive.bind_storage
コマンドを使用して、メモリのタイプと、配列に使用するインプリメンテーションを指定できます。また、配列をシングル ポート RAM とデュアル ポート RAM のどちらとしてインプリメントするかを制御することも可能です。
syn.directive.interface
の storage_type
および storage_impl
オプションを使用して、メモリ タイプとインプリメンテーションを割り当てる必要があります。
syn.directive.bind_storage
の latency
オプションを使用しても、インプリメンテーションのレイテンシを指定できます。インターフェイスのブロック RAM の場合、latency
オプションを指定すると、たとえばレイテンシ 2 または 3 の SRAM をサポートするなど、インターフェイスにオフチップの標準でない SRAM を記述できます。内部演算の場合、latency
オプションを使用すると、演算をより多くのパイプライン段を使用してインプリメントできます。これらの追加のパイプライン段により、RTL 合成中にタイミング問題を解決しやすくなります。
latency
オプションを使用するには、使用可能な複数段のインプリメンテーションをメモリに含める必要があります。HLS ツールは、すべてのブロック RAM に対して複数段のインプリメンテーションを生成します。構文
syn.directive.bind_storage=[OPTIONS] <location> <variable>
-
<location>
: 変数を含める場所をfunction[/label]
の形式で指定します。 -
<variable>
: 割り当てる変数を指定します。ヒント: 変数が最上位関数の引数である場合は、syn.directive.interface
のstorage_type
およびstorage_impl
オプションを使用してください。
オプション
-
type=<value>
- 指定した変数に割り当てるメモリ タイプを定義します。
-
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 |
syn.directive.bind_storage
ではサポートされません。例
次の例では、coeffs[128]
変数は func1
関数の引数です。この指示子は、coeffs
にライブラリからの BRAM コアにインプリメントされたシングル ポート RAM を使用するよう指定します。
syn.directive.bind_storage=func1 coeffs type=RAM_1P impl=bram
coeffs
の値にアクセスするために RTL で作成されるポートは、RAM_1P コアで定義されます。