インテル® Quartus® Prime プロ・エディションのユーザーガイド: デザインの推奨事項

ID 683082
日付 8/03/2023
Public
ドキュメント目次

1.4.1.3. Read-During-Write動作の確認

HDLデザインで記述されているメモリーブロックのRead-During-Write動作がターゲットのデバイス・アーキテクチャーと一致していることを確認します。

HDLソースコードでは、同じクロックサイクルで同じメモリーアドレスに対して読み出しと書き込みを行う際のメモリー動作を指定します。読み出しは、そのアドレスの古いデータ、またはそのアドレスに書き込まれた新しいデータのいずれかを返します。これは、メモリーブロックのRead-During-Write動作と呼ばれます。インテル FPGAのメモリーブロックでは、ターゲットのデバイスファミリー、メモリーモード、ブロックタイプに応じて、Read-During-Writeの動作が異なります。

合成ツールは、ソースコードに記述されている機能を保持します。したがって、RAMブロックに対してサポートされていないRead-During-Write動作をソースコードで指定している場合、 インテル® Quartus® Prime開発ソフトウェアは、専用のRAMハードウェアではなく、通常のロジックセルにロジックを実装します。

HDLコードにおける連続読み出し

次の例のように、HDLコードに連続する読み出しがあると、1つのよくある問題が発生します。このようなコーディング・スタイルの使用は避けてください。

//Verilog HDL concurrent signal assignment
assign q = ram[raddr_reg];
-- VHDL concurrent signal assignment
q <= ram(raddr_reg);

このタイプのHDLは、書き込み動作が行われると、読み出しには読み出しクロックに関係なくアドレスの新しいデータがすぐに反映されることを意味します。これは、非同期メモリーブロックの動作です。合成では、この動作を同期メモリーブロックに直接マッピングすることができません。書き込みクロックと読み出しクロックが同じ場合、合成では、メモリーブロックを推論し、バイパスロジックを追加することで、デバイスの動作がHDLの動作と一致するようにします。書き込みクロックと読み出しクロックが異なる場合は、合成ではバイパスロジックをかならずしも確実に追加することができないため、専用のRAMブロックではなく通常のロジックセルにロジックを実装します。次のセクションの例では、Read-During-Write条件のこのような違いのいくつかについて説明します。

さらに、特定のデバイスのロジック・アレイ・ブロック (LAB) のMLABメモリーでは、Read-During-Writeの古いデータまたは新しいデータの動作を専用のデバイス・アーキテクチャーでサポートすることは簡単ではありません。追加ロジックを実装してこの動作をサポートすると、メモリーを介したタイミング・パフォーマンスが大幅に低下します。

注: MLABメモリーで最高のパフォーマンスを達成するには、書き込み動作時に読み出しデータに依存するデザインにならないようにします。

多くの合成ツールでは、Read-During-Write動作がデザインで重要ではないことを宣言することができます (例えば、書き込み先と同じアドレスから同じクロックサイクルで読み出すことがない場合など)。 インテル® Quartus® Prime プロ・エディションの合成では、合成属性の ramstyleno_rw_check に設定することで、 インテル® Quartus® Prime開発ソフトウェアでRAMのRead-During-Write動作を定義できるようになります。HDLコードで指定されている動作は使用しません。この属性により、合成ツールで追加ロジックを使用してメモリーブロックを実装することがないようにします。また、他の方法が取れない場合に、メモリー推論ができるようにします。