假设您正在实现一个带有 cpu、ram、rom 和 mmu 的简单 SoC,以将 ram 和 rom 映射到 cpu 的地址空间。在实例化不同的组件时,这样做会更有意义:
ram 和 rom 在 mmu 中实例化
top
cpu
mmu
ram
rom
或者
所有组件都在顶层实例化并在那里连接在一起
top
cpu
mmu
ram
rom
假设您正在实现一个带有 cpu、ram、rom 和 mmu 的简单 SoC,以将 ram 和 rom 映射到 cpu 的地址空间。在实例化不同的组件时,这样做会更有意义:
ram 和 rom 在 mmu 中实例化
top
cpu
mmu
ram
rom
或者
所有组件都在顶层实例化并在那里连接在一起
top
cpu
mmu
ram
rom
这实际上是一个设计问题,答案取决于您的要求。需要考虑的几点是:
重用
与许多 SoC 项目中的情况一样,您可能希望将模块或子系统从一个项目重用到下一个项目。将模块组合在一起是一个好主意,具体取决于它们在不同上下文中的重用方式。这样,除了设计 RTL(例如测试台、综合约束、断言等)之外的附属物也可以被重用。
依赖项
这与重用的考虑是一致的,但请考虑模块之间的依赖关系。在您的示例中,mmu 是否总是需要RAM 和 ROM?如果是,这是在 mmu 中实例化它们的论据。mmu 会与不同数量的内存一起工作吗?如果是,这是实例化 mmu 之外的内存的论据。
验证范围
在现代 SoC 设计中,验证比设计本身需要更多的时间和资源。因此,以一种有助于且不妨碍验证工作的方式构建层次结构。例如,如果您的示例中的 cpu 要自行验证,则 cpu 应实例化所有子组件,在内部将它们连接起来,并且只显示相关的 cpu 端口。这样,验证环境(也称为测试平台)不必复制 cpu、mmu 和内存之间的所有连接。
一般来说,我认为层次结构(你的两个例子中的第一个)最有意义,也是最常见的。
根据你的问题,没关系。在中等复杂的 ASIC 上,层次结构很重要,因为模块通常用于定义综合边界和电源域等。