Vitis HLS では常に ROM がデザイン解析で使用されるように推論されるわけではないので、配列が読み出し専用の場合は、
const
修飾子が推奨されます。ROM の自動推論の一般的な規則では、ローカルの (グローバルでない) static
配列は読み出しの前にすべて書き込まれるようにし、2 度と書き込まれないようにします。次の例のように指定すると、ROM が推論されやすくなります。 - 配列をそれを使用する関数でできるだけ早い段階で初期化します。
- 書き込みをまとめます。
-
array(ROM)
初期化書き込みを初期化コード以外のコードとインターリーブしないようにします。 - 異なる値を同じ配列要素に格納しないようにします (すべての書き込みをコード内でグループ化)。
- 要素値の計算は、初期化ループ カウンター変数を除いて、定数以外 (コンパイル時) のデザイン変数に依存しないようにします。
ROM を初期化するのに複雑な代入が使用される場合 (math.h ライブラリからの関数など)、配列初期化を別の関数に配置すると、ROM が推論されるようになります。次の例では、配列 sin_table[256]
がメモリとして推論され、RTL 合成後は ROM としてインプリメントされます。
#include "array_ROM_math_init.h"
#include <math.h>
void init_sin_table(din1_t sin_table[256])
{
int i;
for (i = 0; i < 256; i++) {
dint_t real_val = sin(M_PI * (dint_t)(i - 128) / 256.0);
sin_table[i] = (din1_t)(32768.0 * real_val);
}
}
dout_t array_ROM_math_init(din1_t inval, din2_t idx)
{
short sin_table[256];
init_sin_table(sin_table);
return (int)inval * (int)sin_table[idx];
}
ヒント:
sin()
関数の結果は定数値なので、sin()
関数をインプリメントするのに RTL デザインにコアは必要ありません。