5.1. 例 : 結合メモリー・アーキテクチャーのオーバーライド
メモリー属性をさまざまな組み合わせでコードに使用すると、メモリー・アーキテクチャーのオーバーライドができます。 インテル®HLSコンパイラー プロ・エディションでは、コンポーネントのメモリー・アーキテクチャーを推測します。
次のコード例で示しているのは、次のメモリー属性を使用して結合メモリーをオーバーライドし、FPGAのメモリーブロックを節約する方法です。
- hls_bankwidth(N)
- hls_numbanks(N)
- hls_singlepump
- hls_max_replicates(N)
元のコードによって2つのメモリーアクセスが結合し、結果として、深さ256の位置、64ビット幅 (256x64ビット) のメモリーシステム (2つのオンチップ・メモリー・ブロック) になります。
component unsigned int mem_coalesce_default(unsigned int raddr,
unsigned int waddr,
unsigned int wdata){
unsigned int data[512];
data[2*waddr] = wdata;
data[2*waddr + 1] = wdata + 1;
unsigned int rdata = data[2*raddr] + data[2*raddr + 1];
return rdata;
}
次の画像で示すのは、このコードサンプルの256x64ビットメモリーの構造と、ハイレベルのデザインレポート ( report.html ) でのコンポーネント・メモリー構造の表示方法です。
図 10. mem_coalesce_default 用に生成されたメモリー構造
|
変更されたコードによって実装されるのは、512のワード深さ、32ビット幅で、ストール可能なアービトレーションを備えたオンチップ・メモリー・ブロックです。
component unsigned int mem_coalesce_override(unsigned int raddr,
unsigned int waddr,
unsigned int wdata){
//Attributes that stop memory coalescing
hls_bankwidth(4) hls_numbanks(1)
//Attributes that specify a single-pumped single-replicate memory
hls_singlepump hls_max_replicates(1)
unsigned int data[512];
data[2*waddr] = wdata;
data[2*waddr + 1] = wdata + 1;
unsigned int rdata = data[2*raddr] + data[2*raddr + 1];
return rdata;
}
次の画像で示すのは、このコードサンプルのストール可能なアービトレーションを備えた512x32ビットメモリーの構造と、ハイレベルのデザインレポート ( report.html ) でのコンポーネント・メモリー構造の表示方法です。
図 11. mem_coalesce_default 用に生成されたメモリー構造
|
ハードウェア領域の節約は、コンポーネントに必要なRAMブロック数の削減によってできるように見えますが、ストール可能なアービトレーションの導入により、コンポーネントの実装に必要なハードウェアの量が増えます。次の表では、コンポーネントに必要なALMとFFの数の比較ができます。