インテル®高位合成 (HLS) コンパイラー プロ・エディション: ベスト・プラクティス・ガイド

ID 683152
日付 12/16/2019
Public
ドキュメント目次

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つのオンチップ・メモリーブロックとして行います。

図 13. コンポーネント depth_manual でのローカルメモリーの実装

ローカルメモリー 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;
}
図 14. コンポーネント depth_manual でのローカルメモリーの深さ方向のマージ

ローカルメモリーを深さに対してマージすると、メモリーアクセスの効率が低下する場合があります。ローカルメモリーのマージを深さに対して行うかどうかを決定する前に、HLDレポート ( <result>.prj/reports/report.html) を使用して、予想されるメモリー・コンフィグレーションの生成が、予想される数のロードおよびストア命令で行われたことを確認します。次の例では、 インテル®HLSコンパイラー プロ・エディションによるアクセスのマージは、ローカルメモリー ab に対しては行うべきではありません。これは、各メモリーへのロード命令とストア命令は相互排他的ではないためです。

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

図 15. 相互排他的ではないアクセスを備えたコンポーネント depth_manual のローカルメモリー