综合全局实例计数

Synthesis global instance count

我找不到与此相关的任何问题,但可能是我不知道要搜索什么。使用综合工具时(如果您需要特定工具,我们可以说 Synplify,但最好有一个跨工具工作的标准兼容版本),是否可以跟踪模块实例的数量并帮助它指导合成?我怀疑不是,但我可以看到很多这样的用例。让我举几个例子来说明我的意思。

一些上下文,我写这篇文章时考虑到了 FPGA 开发,但我敢打赌它也会用于 ASIC 设计。

假设我在一个设备上有 10 个乘法器,并且我有一些操作(如复数乘法器)我想在许多位置(不仅在生成循环中,而且在整个设计中)实例化。假设我有一个使用专用乘法器实现此功能的实现,但我还有一个使用结构的复杂乘法器。我希望我的复杂乘法器在转到结构实现之前耗尽专用乘法器。

是否可以通过包装器实例化复数乘法器,并且每次在精化过程中实例化该包装器时,都会增加一个全局实例计数,以便我可以跟踪使用了多少个乘法器?此外,我是否可以在 generate-if 语句或其他构造中使用此全局变量,以根据已使用的乘法器模块的实例数在两个实现之间做出决定?

我以乘数为例。我意识到我可以通过推断乘数来获得这种行为。我想象我可能想要根据这个全局变量的当前值推断出不同的滤波器结构(例如,抽头延迟线 FIR 滤波器与分布式算术 FIR 滤波器)的设计。当将代码移植到新的 FPGA 时,这肯定会有所帮助。

我一直在寻找类似的东西,但我怀疑它不存在。我意识到我可以通过简单地以正确的方式设计我的系统架构来做一些非常接近我想要的事情。这里的目的更多是关于在我的设计中自动化该过程,以便将来对我的设计进行更改不需要我重构整个系统布局(除非出现时间或资源限制)。我也认为这是一种帮助我保持我的代码在资源分配非常不同的同一系列设备之间可移植的方法(这个有更多的 DSP 片,那个有更多的 LUT,等等)。

如果这只存在于一种工具或一种语言中,那对我来说仍然是一个可以接受的解决方案。如果您能提供明确的证据或它无法工作的合乎逻辑的原因,那对我来说也是一个可以接受的解决方案。

你要的不存在。但是,有几点可以提出。

首先,您应该能够(在合理范围内)估计实施您的设计所需的资源量。如果超过了你芯片的容量,你可能需要重新考虑设计或升级。其次,如果您尝试实现设计并利用所有 DSP 资源(例如推断乘法器),综合工具足够智能,它们将尝试 "fit" 通用逻辑中的其余组件。这可能会产生许多不良后果;组合逻辑可能会很快爆炸(取决于您正在实现的是什么),并且几乎可以肯定会对最大时钟频率产生重大影响。最后,如果您想明确控制事物的实现方式,这一点更为相关,您可以使用综合指令(vendor/language 之间会有所不同)。

使用 DSP 资源的指令示例(对于 Altera 设备,在 VHDL 中)是 (taken from here):

signal a, b : unsigned(8 downto 0);
signal res : unsigned(17 downto 0);
attribute multstyle : string;
attribute multstyle of res : signal is "dsp"; -- Alternatively, use "logic"
res <= a * b;

例如,如果您有一个 "complex multiplier" 模块,您想要控制它的实现方式,则可以使用泛型来控制它(在实例化时)。

entity complex_mult is
   generic(
      MULT_TYPE : string := "dsp"
   );
   port(
      ...
   );
end entity;

architecture rtl of complex_mult is

begin

   signal my_res : unsigned(15 downto 0); -- Obviously define res width depending on what you are doing
   attribute multstyle : string;
   attribute multstyle of my_res : signal is MULT_TYPE;
   -- Do stuff
end rtl;

您是否真的尝试过实现一种推断出比设备中更多乘法器的设计?我希望该工具在用完 DSP 块后自动开始使用 LUT 资源。但是,假设这不会发生:

您可以使用 Xilinx Vivado 和自定义 TCL 脚本在一定程度上实现这一点。我不会详细说明确切的命令和脚本,因为这会很耗时,但基本流程如下所示:

  1. 向实现乘法器的实体添加 generic 参数。将这些与设计顶层的 generic 参数联系起来。
  2. 脚本设置一组初始通用参数,使每个实体都使用专用 DSP 块。
  3. 脚本运行 synth_design-generic 开关控制 DSP 块的使用。
  4. 综合完成后,脚本会解析 report_utilization 的输出以确定是否超出了 DSP 模块的数量。如果不是,转到步骤 5。如果是,修改通用参数集,以便更多实体使用替代乘法器实现,然后返回到步骤 3。
  5. 综合设计适合设备,脚本继续执行步骤。

不使用泛型的上述过程的替代方法是保持相同的基本步骤,但在特定的乘法器实例上使用 set_property 命令来控制它们的实现,而不是设置泛型。