VHDL 从实体中提取常量

VHDL extract constant from entity

我的 VHDL 设计通常包含相当程度的分层 "blocks"(实体):一个子块由多个子块组成,子块又由多个子块组成,等等。

在驱动给定块的输出之前,延迟必须匹配内部块的输出对我来说很常见。当我更改内部块并且它们以不同的延迟结束时,我必须手动重新计算如何补偿相邻块的延迟。如果更新影响给定块的整体延迟,则我必须在包含给定块的任何更高级别的块中重复该过程。

如果一个块可以 "tell" 调用实体它的延迟是什么并自动计算这些补偿,那将会简单得多。

有什么好的方法可以做到这一点吗?类似通用输出的东西?

正确且通用的解决方案是为每个子模块制作一个包,如 mdl_sub_pkg,该子模块中的延迟为常数。然后为封闭模块制作一个包,如 mdl_pkg,并使用 mdl_sub_pkg 包中的常量来计算封闭模块应产生的延迟。最后使用封闭模块中的mdl_pkg,并根据mdl_pkg中计算出的常量生成延迟。请记住在验证中包括延迟常数的测试。

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

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

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

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