5.3.1. 例 : 深さ方向へのメモリーのマージ
hls_merge("<mem_name>","depth") 属性を使用し、 インテル®HLSコンパイラー プロ・エディションに強制して、同じメモリーシステム内に変数を実装させ、そのメモリーを深さごとにマージします。
変数は、hls_merge 属性の <mem_name> ラベルセットが同じ場合はすべてマージされます。
次のコンポーネント・コードについて検討します。
component int depth_manual(bool use_a, int raddr, int waddr, int wdata) {
int a[128];
int b[128];
int rdata;
// mutually exclusive write
if (use_a) {
a[waddr] = wdata;
} else {
b[waddr] = wdata;
}
// mutually exclusive read
if (use_a) {
rdata = a[raddr];
} else {
rdata = b[raddr];
}
return rdata;
}
このコードによる インテル®HLSコンパイラー プロ・エディションへの指示によって、ローカルメモリー a および b の実装をそれぞれ独自のロード/ストア命令を備えた 2つのオンチップ・メモリーブロックとして行います。
ローカルメモリー a および b に対するロード/ストア命令は相互排他的であるため、アクセスのマージが可能です。サンプルコードは次のとおりです。メモリーアクセスのマージによって、ロード/ストア命令の数が減り、オンチップ・メモリー・ブロックの数も半減します。
component int depth_manual(bool use_a, int raddr, int waddr, int wdata) {
int a[128] hls_merge("mem","depth");
int b[128] hls_merge("mem","depth");
int rdata;
// mutually exclusive write
if (use_a) {
a[waddr] = wdata;
} else {
b[waddr] = wdata;
}
// mutually exclusive read
if (use_a) {
rdata = a[raddr];
} else {
rdata = b[raddr];
}
return rdata;
}
ローカルメモリーを深さに対してマージすると、メモリーアクセスの効率が低下する場合があります。ローカルメモリーのマージを深さに対して行うかどうかを決定する前に、HLDレポート ( <result>.prj/reports/report.html) を使用して、予想されるメモリー・コンフィグレーションの生成が、予想される数のロードおよびストア命令で行われたことを確認します。次の例では、 インテル®HLSコンパイラー プロ・エディションによるアクセスのマージは、ローカルメモリー a と b に対しては行うべきではありません。これは、各メモリーへのロード命令とストア命令は相互排他的ではないためです。
component int depth_manual(bool use_a, int raddr, int waddr, int wdata) {
int a[128] hls_merge("mem","depth");
int b[128] hls_merge("mem","depth");
int rdata;
// NOT mutually exclusive write
a[waddr] = wdata;
b[waddr] = wdata;
// NOT mutually exclusive read
rdata = a[raddr];
rdata += b[raddr];
return rdata;
}
この場合、 インテル®HLSコンパイラー プロ・エディションでは、メモリーシステムをダブルパンプし、すべてのアクセスに十分なポートを提供する可能性があります。それ以外の場合、アクセスにはポートを共有してください。これによって、ストールフリーのアクセスを防止します。