ROM のインプリメント - 2023.2 日本語

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

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語
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 デザインにコアは必要ありません。