システム内のメモリ割り当てを管理するシステム コール、たとえば malloc()
、alloc()
、および free()
は、OS のメモリにあるリソースを使用し、ランタイム中に作成およびリリースされます。ハードウェア インプリメンテーションを合成できるようにするには、デザインに必要なリソースがすべて指定され、含まれている必要があります。
メモリ割り当てのシステム コールは、合成前にデザインから削除する必要がありますが、ダイナミック メモリ操作がデザインの機能を定義するために使用されているので、同等の範囲が制限された表現に変換する必要があります。次に、malloc()
を使用するデザインを合成可能なバージョンに変換するコード例を示します。次の 2 つの便利なコーディング スタイル手法が含まれます。
- このデザインでは
__SYNTHESIS__
マクロは使用しません。合成可能なバージョンまたは合成不可能なバージョンの選択には、ユーザー定義の
NO_SYNTH
マクロを使用します。これにより、同じコードが C/C++ でシミュレーションされ、Vitis HLS で合成されます。 -
malloc()
を使用する元のデザインのポインターは、固定サイズのエレメント用に書き直す必要はありません。固定サイズのリソースは作成でき、既存ポインターは単に固定サイズのリソースを指定するようにできます。この方法により、既存デザインを手動で書き直す必要はなくなります。
#include "malloc_removed.h"
#include <stdlib.h>
//#define NO_SYNTH
dout_t malloc_removed(din_t din[N], dsel_t width) {
#ifdef NO_SYNTH
long long *out_accum = malloc (sizeof(long long));
int* array_local = malloc (64 * sizeof(int));
#else
long long _out_accum;
long long *out_accum = &_out_accum;
int _array_local[64];
int* array_local = &_array_local[0];
#endif
int i,j;
LOOP_SHIFT:for (i=0;i<N-1; i++) {
if (i<width)
*(array_local+i)=din[i];
else
*(array_local[i])=din[i]>>2;
}
*out_accum=0;
LOOP_ACCUM:for (j=0;j<N-1; j++) {
*out_accum += *(array_local+j);
}
return *out_accum;
}
コード変更はデザインの機能に影響するので、AMDでは __SYNTHESIS__
マクロの使用はお勧めしません。AMDでは、次の手順を推奨しています。
- ユーザー定義のマクロ
NO_SYNTH
をコードに追加して、コードを修正します。 -
NO_SYNTH
マクロをイネーブルにし、C/C++ シミュレーションを実行して結果を保存します。 -
NO_SYNTH
マクロをディスエーブルにし、C/C++ シミュレーションを実行して結果が同じになるかどうかを検証します。 - このユーザー定義のマクロをディスエーブルにして合成を実行します。
この方法を使用すると、アップデートされたコードが C/C++ シミュレーションで検証され、同じコードが合成されるようにできます。C/C++ でのダイナミック メモリ使用に関する制限と同様、Vitis HLS では、ダイナミックに作成/削除される C/C++ オブジェクトも合成でサポートされません。