set_directive_bind_storage - 2023.2 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語

説明

set_directive_bind_storage コマンドは、コードの変数 (配列または関数引数) を RTL の特定のメモリ タイプ (type) に割り当てます。このプラグマを指定しない場合、Vitis HLS ツールにより使用するメモリ タイプが自動的に決定されます。HLS ツールは、指定したインプリメンテーション (impl) を使用してハードウェアにメモリをインプリメントします。たとえば、set_directive_bind_storage コマンドを使用して、メモリのタイプと、配列に使用するインプリメンテーションを指定できます。また、配列をシングル ポート RAM とデュアル ポート RAM のどちらとしてインプリメントするかを制御することも可能です。

重要: インターフェイスの配列 に説明されているように、配列に関連付けられているメモリ タイプによって RTL で必要なポートの数とタイプが決まるので、これは最上位関数インターフェイスの配列には重要な機能です。ただし、最上位関数の引数に割り当てられた変数の場合は、INTERFACE プラグマまたは指示子の -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
指定した変数に割り当てるメモリ タイプを定義します。
サポートされるタイプは、fiforam_1pram_1wnrram_2pram_s2pram_t2prom_1prom_2prom_np です。
表 1. ストレージ タイプ
タイプ 説明
FIFO FIFO。-impl オプションが指定されていない場合は、RTL でのインプリメント方法は Vitis HLS により決定されます。
RAM_1P シングル ポート RAM。-impl オプションが指定されていない場合は、RTL でのインプリメント方法は Vitis HLS により決定されます。
RAM_1WNR 書き込みポートを 1 個、読み出しポートを N 個持ち、内部で N 個のバンクを使用する RAM。
RAM_2P 1 つのポートで読み出し、もう 1 つのポートで読み出しと書き込みの両方を実行可能なデュアル ポート RAM。
RAM_S2P 1 つのポートで読み出し、もう 1 つのポートで書き込みを実行可能なデュアル ポート RAM。
RAM_T2P 両方のポートで読み出しと書き込みの両方をサポートする完全なデュアル ポート RAM。
ROM_1P シングル ポート ROM。-impl オプションが指定されていない場合は、RTL でのインプリメント方法は Vitis HLS により決定されます。
ROM_2P デュアル ポート ROM。
ROM_NP マルチ ポート ROM。
ヒント: PIPO にシングル ポート RAM を指定した場合、バインダーは通常、バンクが 1 つしかない統一済み PIPO を割り当て、リーダーとライターはバンクの異なる半分にアクセスします。HLS コンパイラからレポートされる情報メッセージには、すべてのブロックに単一のメモリを使用して PIPO をインプリメントしているということが表示されます。すべてのバンクが 1 つの RAM ブロックを共有できるような小さな PIPO の場合は、この方がコストが抑えらることが多くあります。ただし、帯域幅をより広くできるように PIPO にデュアル ポート RAM を指定し、スケジューラがプロデューサーまたはコンシューマーのいずれかで両方のポートを使用する場合、バインダーは通常、プロデューサーがポートを 1 つ、コンシューマーが異なるバンクのポートを 2 つ使用するスプリット PIPO を割り当てます。この場合、HLS コンパイラからレポートされる情報メッセージには、各ブロックに個別のメモリを使用して PIPO をインプリメントしているということが表示されます。
-impl <value>
指定したストレージ タイプのインプリメンテーションを指定します。サポートされるインプリメンテーションには、次に示すように brambram_ecclutramuramuram_eccsrlmemory、および auto があります。
表 2. サポートされるインプリメンテーション
名前 説明
MEMORY FIFO に汎用メモリを使用すると、Vivado ツールでインプリメンテーションが選択されます。
URAM UltraRAM リソース
URAM_ECC UltraRAM (ECC あり)
SRL シフト レジスタ ロジック リソース
LUTRAM 分散 RAM リソース
BRAM ブロック RAM リソース
BRAM_ECC ブロック RAM (ECC あり)
AUTO 変数のインプリメンテーションは Vitis HLS で自動的に指定されます。
ヒント: URAM は、同じアドレスへの読み出しと書き込みが同じメモリ ポートにマップされる場合、BRAM とは異なり、read first 出力の write_mode モードをサポートしません。BRAM でサポートされる書き込みモードは、write thruread firstno change です。URAM でサポートされるのは、no change のみです。Vitis HLS は、URAM ポートで同じサイクルのメモリ操作をスケジュールできない場合、次の警告メッセージを表示します。
Usage of URAM can potentially cause worse II as Vitis HLS does not exploit 
read-first mode for URAMs. Consider using BRAMs instead.
表 3. FIFO/RAM/ROM でサポートさるインプリメンテーション
タイプ コマンド/プラグマ スコープ サポートされるインプリメンテーション
FIFO bind_storage 1 ローカル AUTO、BRAM、LUTRAM、URAM、MEMORY、SRL
FIFO config_storage グローバル AUTO、BRAM、LUTRAM、URAM、MEMORY、SRL
RAM* | ROM* bind_storage ローカル AUTO BRAM、BRAM_ECC、LUTRAM、URAM、URAM_ECC
RAM* | ROM* config_storage 2 グローバル N/A
RAM_1P set_directive_interface s_axilite -storage_impl ローカル

AUTO、BRAM、URAM

  config_interface -m_axi_buffer_impl グローバル

AUTO、BRAM、LUTRAM、URAM

  1. インプリメンテーションが指定されていない場合、指示子は AUTOSRL 動作をデフォルトとして使用します。ただし、この値は指定できません。
  2. config_storage では FIFO タイプしかサポートされません。
-latency <int>
ストレージ タイプをインプリメンテーションに割り当てる際のデフォルト レイテンシを指定します。有効なレイテンシは、type および impl の指定によって異なります。デフォルトは -1 で、Vitis HLS によりレイテンシが選択されます。
表 4. サポートされるメモリ タイプ、インプリメンテーション、およびレイテンシ
タイプ インプリメンテーション 最小レイテンシ 最大レイテンシ
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 コアで定義されます。