VHDL从实体中提取常量

时间:2016-10-07 20:37:35

标签: generics vhdl constants latency

我的VHDL设计通常包含一个相当级别的分层“块”(实体):子块由多个子块组成,这些子块由多个子块组成,等等。

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

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

有一种漂亮的方法吗?像通用输出那样的东西?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

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