揮発性データの理解 - 2023.2 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語

インターフェイスのマルチアクセス ポインター のコードは、入力ポインター d_i および出力ポインター d_o を、RTL で FIFO (またはハンドシェイク) インターフェイスとしてインプリメントすることを意図して記述されています。これにより、次のことが確実になります。

  • アップストリームのプロデューサー モジュールは、RTL ポート d_i で読み出しが実行されるたびに新しいデータを供給します。
  • ダウンストリームのコンシューマー モジュールは、RTL ポート d_o で書き込みが実行されるたびに新しいデータを受信します。

このコードが標準 C/C++ コンパイラでコンパイルされる場合、各ポインターへの複数アクセスが 1 つのアクセスに削減されます。コンパイラについては、d_i 上のデータが関数の実行中に変化することが示されないので、関係あるのは d_o への最終の書き込みのみです。ほかの書き込みは、関数が完了するまでに上書きされます。

Vitis HLS での処理は、gcc コンパイラの動作と一致しており、複数の読み出しおよび書き込みは 1 つの読み出し操作および 1 つの書き込み操作に最適化されます。RTL が検証されると、各ポートでは 1 つの読み出しおよび書き込み操作のみが実行されます。

このデザインの基本的な問題は、テストベンチとデザインで RTL ポートが設計者の意図どおりにインプリメントされるように記述されていないことです。

  • RTL ポートは、トランザクション中に複数回読み出しおよび書き込みされ、データ入力および出力をストリーミングすることが可能であるはずです。
  • テストベンチは 1 つの入力値だけを供給し、1 つの出力値だけを返します。インターフェイスのマルチアクセス ポインター の C/C++ シミュレーションの結果は次のようになり、各入力が 4 回累積されていることを示しています。同じ値が 1 回読み出され、毎回累積されており、4 つの個別の読み出しが実行されるわけではありません。
    Din Dout
    0   0
    1   4
    2   8
    3   12

このデザインで RTL ポートに対して読み出しおよび書き込みが複数回実行されるようにするには、インターフェイスのマルチアクセス ポインターに示すように、volatile 修飾子を使用します。volatile 修飾子を使用すると、C/C++ コンパイラおよび Vitis HLS でポインター アクセスに関して何も想定されず、最適化で削除されることはなくなります。データが揮発性であり変化する可能性があると解釈されます。

volatile 修飾子により、次のように処理されます。
  • ポインター アクセスが最適化されなくなります。
  • 入力ポート d_i で読み出しが 4 回実行され、出力ポート d_o で書き込みが 2 回実行される RTL デザインが得られます。

volatile キーワードを使用しても、ポインターに複数回アクセスするこのコーディング スタイルには、関数とテストベンチに読み出しおよび書き込みが明示的に記述されていないという問題がまだあります。この場合、読み出しは 4 回実行されますが、同じデータが 4 回読み出されています。書き込みは 2 回、それぞれ正しいデータで実行されますが、テストベンチでは最後の書き込みのデータのみが取り込まれます。

ヒント: 中間アクセスを表示するには、cosim_design -trace_level を使用にして RTL シミュレーション中にトレース ファイルを作成し、適切なビューアーでそのトレース ファイルを確認します。

マルチアクセス volatile ポインター インターフェイスは、ワイヤ インターフェイスを使用してインプリメントできます。FIFO インターフェイスが指定される場合は、Vitis HLS で各読み出しごとに新しいデータをストリーミングする RTL テストベンチが作成されます。テストベンチから使用できる新しいデータはないので、RTL の検証はエラーになります。テストベンチでは、正しく読み出しおよび書き込みが記述されません。