次の RTL コードは、ブロック RAM (実際には ROM) から複数のロジック段数を介してフリップフロップで終了するクリティカル パスを生成します。この RAMB セルはオプションの出力レジスタ (DOA-0) を使用せず推論されており、RAMB 出力パスに 1 ns を超える遅延が追加されます。
上記の RTL コードのクリティカル パスは、ツールで次の図のように表示されます。
合成後およびインプリメンテーションの各段階後にクリティカル パスを確認し、改善が必要なロジック グループを特定することをお勧めします。長いパスや、FPGA のハードウェア機能を最適に利用していないパスがある場合は、RTL コードに戻り、合成されたロジックが最適でない理由を把握し、合成ツールでネットリストが改善されるようにコードを変更します。
Vivado には、高度なデバッグ メカニズムが組み込まれており、エラボレート済みビューから使用できます。RTL コードを手動で検索するのではなく、エラボレート済みビューを使用すると、問題箇所を特定しやすくなります。次の図に、上記の RTL コードのエラボレート済みビューを示します。
エラボレート済みビューでは、このテスト ケースの非効率な構造に関するヒントを得ることができます。このケースでは、メモリ アドレスと青くハイライトされたグルー ロジックを駆動するアドレス レジスタのファンアウト (addr_reg3_reg) が問題の原因です。
合成ツールで RAMB が推論されるようにするには、RTL コードに専用アドレス レジスタが必要ですが、現在のアドレス レジスタ ファンアウトとは互換性がありません。そのため、出力レジスタが、RAMB のオプションの出力レジスタをイネーブルにするために使用されるのではなく、RAMB を推論するためにリタイミングされます。
メモリ アドレスとインターコネクト ロジックおよび FPGA ロジック (ロジックが別々のレジスタで駆動されるように RTL コードでアドレス レジスタを複製すると、RAMB が出力レジスタをイネーブルにした状態で推論されます。
次の図に、手動でレジスタを複製した後の RTL コードとそのエラボレート済みビューを示します。
次の図は、変更した RTL コードのクリティカル パスを表示しています。次に注意してください。
-
addr_reg2_reg
レジスタはブロック RAM のアドレス ピンに接続されています。 -
addr_reg3_reg
レジスタはブロック RAM に吸収されています。 - RAMB 出力レジスタがイネーブルになっており、RAMB 出力のデータパス遅延が大幅に削減されます。図 6. 変更された RTL コードのクリティカル パス