これは実際には設計上の問題であり、その答えは要件によって異なります。考慮すべき点は次のとおりです。
再利用
多くの SoC プロジェクトの場合と同様に、ブロックまたはサブシステムを 1 つのプロジェクトから次のプロジェクトに再利用したい場合があります。異なるコンテキストでの再利用方法に応じて、モジュールをグループ化することをお勧めします。このようにして、デザイン RTL 以外の資料 (テストベンチ、合成制約、アサーションなど) も再利用できます。
依存関係
これは再利用に関する考慮事項に沿っていますが、モジュール間の依存関係について考えてみてください。あなたの例では、mmu は常にRAM と ROMを必要としますか? はいの場合、これは mmu 内でそれらをインスタンス化するための引数です。mmu は異なる数の種類の記憶で機能しますか? はいの場合、これは mmu の外でメモリをインスタンス化するための引数です。
検証範囲
最新の SoC 設計では、検証には設計自体よりも多くの時間とリソースが必要です。したがって、検証作業を助け、妨げないように階層を構造化してください。たとえば、例の cpu を単独で検証する場合、cpu はすべてのサブコンポーネントをインスタンス化し、それらを内部で接続し、関連する cpu ポートのみを提示する必要があります。そうすれば、検証環境 (別名テストベンチ) は、CPU、MMU、およびメモリ間のすべての接続を複製する必要がなくなります。
一般的に、階層構造 (2 つの例の最初のもの) が最も理にかなっており、最も一般的だと思います。