インテルのみ表示可能 — GUID: ewb1508937330025
Ixiasoft
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コンパイラー プロ・エディションでは、メモリーシステムをダブルパンプし、すべてのアクセスに十分なポートを提供する可能性があります。それ以外の場合、アクセスにはポートを共有してください。これによって、ストールフリーのアクセスを防止します。