説明
FPGA では、DDR メモリへの非バースト アクセスは非常に高価であり、デザイン全体のパフォーマンスに影響することがあります。このため、必要な情報にアクセスするのに必要な時間を短縮するスキームを考案することが重要です。効率的な解決策は、コードを書き直すか、手動バーストを使用することですが、それでもうまくいかない場合は、キャッシュ メモリを使用するという方法もあります。
キャッシュは、M_AXI アダプターに一時的な記憶領域を提供して、デザインがより迅速にデータを取得できるようにします。キャッシュ メカニズムの有効性は、ヒット/ミス比率で測定され、「参照の局所性」と呼ばれるコンピューター プログラムの特性、つまり、プログラムが短時間に同じメモリ位置に繰り返しアクセスする傾向に基づきます。これは、特定のメモリ ブロックがアクセスされたとき、そのメモリが近い将来に再びアクセスされる可能性が高いということです。たとえば、メモリ内で連続した命令を実行する場合、次にアクセスする命令セットは、近くの連続したデータ ブロック内にある可能性が高くなります。
ヒント:
syn.interface.m_axi_cache_impl
コマンドを使用して、キャッシュ インプリメンテーション リソースを制御します。構文
pragma HLS cache port=<name> lines=<value> depth=<value>
説明:
-
port=<name>
- キャッシュを追加するポートを指定します。
-
lines=<value>
- キャッシュ ラインの数を指定します。ライン数は、1 キャッシュ ラインを示す 1 か、複数のキャッシュ ラインを示す 2 のべき乗で示される 1 より大きい値で指定できます。これはオプションの値で、指定しない場合のデフォルトは 1 になります。
-
depth=<value>
- 各ラインのサイズをワード数で指定します。深さは 2 のべき乗で指定する必要があり、各ラインごとにポインター データ型のサイズをワードで示します。
制限
CACHE 指示子またはプラグマには、次の制限があります。
- キャッシュは読み出し専用ポートに対してのみサポートされます。
- キャッシュはシングル ポート、一方向キャッシュとしてインプリメントされます。
- キャッシュは、同じバンドルに接続された複数のポートではサポートされません。
例
次の例は、アクセスが重なるとバーストがエラーになるデザインを示しています。CACHE プラグマまたは指示子を使用すると、デザインのパフォーマンスが改善します。
extern "C" {
void dut(
const double *in, // Read-Only Vector 1
double *out, // Output Result
int size // Size in integer
)
#pragma HLS INTERFACE m_axi port=in bundle=aximm depth = 1026
#pragma HLS INTERFACE m_axi port=out bundle=aximm depth = 1024
#pragma HLS cache port=in lines=8 depth=128
for(int i = 0; i < size; i++)
{
out[i] = in[i] + in[i + 1];
}
}