インテルのみ表示可能 — GUID: ccw1479135033107
Ixiasoft
1.9.3. hls_bankbits 属性での使用例
{b0, b1, ... ,bn} 引数はHLSコンパイラーがバンク選択ビットで使用すべきワードアドレス・ビットを参照します。hls_bankbits(b0, b1, ..., bn) 属性を指定することは、バンク数が 2^( バンクビット数 ) と同等であることを意味します。
hls_bankbits 属性の実装例
次のコンポーネント・コードを考察します。
component int bank_arb_consecutive_multidim (int raddr, int waddr, int wdata, int upperdim) { int a[2][4][128]; #pragma unroll for (int i = 0; i < 4; i++) { a[upperdim][i][(waddr & 0x7f)] = wdata + i; } int rdata = 0; #pragma unroll for (int i = 0; i < 4; i++) { rdata += a[upperdim][i][(raddr & 0x7f)]; } return rdata; }
下の図に示すように、このコード例は複数のロード / ストアー命令を生成します。ただし、命令数に対するポート数が不足しているため、ストール可能なアクセスと II の値は 66 になります。
hls_bankbits属性を指定することで、ロード / ストアー命令がローカルメモリーにアクセスする方法を制御できます。変更されたコード例と下の図に示すように、ローカルメモリーaにアクセスするたびに一定のバンク選択ビットを選択すると、ロード / ストアー命令の各ペアはメモリーバンクの 1 つに接続するためのみに必要になります。このアクセスパターンは II の値を 66 から 1 に大幅に減少させます。
component int bank_arb_consecutive_multidim (int raddr, int waddr, int wdata, int upperdim) { int a[2][4][128] hls_bankbits(8,7); #pragma unroll for (int i = 0; i < 4; i++) { a[upperdim][i][(waddr & 0x7f)] = wdata + i; } int rdata = 0; #pragma unroll for (int i = 0; i < 4; i++) { rdata += a[upperdim][i][(raddr & 0x7f)]; } return rdata; }
hls_bankbits属性でワードアドレス・ビットを指定する場合、バンク選択ビットの結果がローカルメモリーへのアクセスごとに一定であることを確認します。下の図に示すように、ローカルメモリーのアクセスパターンは、選択されたバンク選択ビットがアクセスごとに一定であるという保証がないようなものです。結果として、ロード / ストアー命令の各ペアは、すべてのローカルメモリー・バンクに接続する必要があり、ストール可能なアクセスとなります。
component int bank_arb_consecutive_multidim (int raddr, int waddr, int wdata, int upperdim){ int a[2][4][128] hls_bankbits(5,4); #pragma unroll for (int i = 0; i < 4; i++) { a[upperdim][i][(waddr & 0x7f)] = wdata + i; } int rdata = 0; #pragma unroll for (int i = 0; i < 4; i++) { rdata += a[upperdim][i][(raddr & 0x7f)]; } return rdata; }