Generics VHDL从实体中提取常量

Generics VHDL从实体中提取常量,generics,vhdl,constants,latency,Generics,Vhdl,Constants,Latency,我的VHDL设计通常包含相当层次的“块”(实体):子块由多个子块组成,而子块又由多个子块组成,等等 对于我来说,在驱动给定块的输出之前,必须对内部块的输出进行延迟匹配是非常常见的。当我更改内部块时,它们最终具有不同的延迟,我必须手动重新计算如何补偿相邻块的延迟。如果更新影响给定块的整体延迟,那么我必须在包含给定块的任何更高级别块中重复该过程 如果一个块能够“告诉”调用实体它的延迟是什么,并自动计算这些补偿,那么就简单多了 有什么好办法吗?类似于通用输出的东西?正确且通用的解决方案是为每个子模块制

我的VHDL设计通常包含相当层次的“块”(实体):子块由多个子块组成,而子块又由多个子块组成,等等

对于我来说,在驱动给定块的输出之前,必须对内部块的输出进行延迟匹配是非常常见的。当我更改内部块时,它们最终具有不同的延迟,我必须手动重新计算如何补偿相邻块的延迟。如果更新影响给定块的整体延迟,那么我必须在包含给定块的任何更高级别块中重复该过程

如果一个块能够“告诉”调用实体它的延迟是什么,并自动计算这些补偿,那么就简单多了


有什么好办法吗?类似于通用输出的东西?

正确且通用的解决方案是为每个子模块制作一个包,如
mdl\u sub\u pkg
,该子模块中的延迟为常数。然后为封装模块制作一个包,如
mdl_-pkg
,并使用
mdl_-sub_-pkg
包中的常量计算封装模块应生成的延迟。最后使用封装模块中的
mdl\u-pkg
,并根据
mdl\u-pkg
中计算的常数生成延迟。记住在验证中包括对延迟常数的测试


另一种值得怀疑的解决方案是在子模块上创建一个输出端口(作为不存在的通用输出端口的替代),并为其分配一个与子模块中的延迟相匹配的常数。然后,封装模块可以使用子模块的输出端口来计算该模块产生的延迟。然而,此解决方案是否有效并生成最小尺寸的合成设计在很大程度上取决于延迟补偿的实现方式,以及合成工具如何处理包含常量的设计部分的细化和缩减。在某些情况下,这可能是一个可行的解决方案和一个不错的技巧,但它不是一个普遍适用的解决方案。

另一种选择是将您的预期(或期望)延迟作为通用延迟传递

在内部,断言实际延迟=一般延迟,如果错误则失败

或者,如果实际延迟<通用延迟,则插入管道阶段,直到它们匹配;如果实际延迟>通用延迟,则断言/失败;如果它们相等,则不执行任何操作。这提供了一种从顶层同步管道的简单方法