【问题标题】:Synthesis global instance count综合全局实例计数
【发布时间】:2017-02-01 19:29:14
【问题描述】:

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

在某些背景下,我写这篇文章时考虑到了 FPGA 开发,但我敢打赌它也可以用于 ASIC 设计。

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

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

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

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

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

【问题讨论】:

标签: vhdl verilog hdl synthesis


【解决方案1】:

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

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

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

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

【讨论】:

  • 我不应该使用乘数示例。我知道乘数推断基本上给了我这个功能。我将此功能设想为在我的设计中自动构建更大组件的一种方式。我的基本用例是硬件加速。我已经积累了许多来自不同家庭的开发板,我想在所有开发板上运行相同的计算代码(除非有其他问题)。另一个例子是一个更好的用例。一个工具不知道自己将我的乘法累加链切换到分布式算术滤波器。有时间我会修改问题。
  • @hops 我认为我的回答也适用于这种情况。无论您用完了什么资源,脚本都可以确定这一点,并根据构成脚本一部分的一组规则,使用泛型或其他方法适当地修改设计。这不是完全您要求的,但我认为这是您将得到的最接近的。
  • 非常接近我要找的你是对的。事实上,我之前已经通过脚本完成了这项工作。这就是我想到的地方。我可以接受这个作为答案。我真希望我能在标准文档或工具文献中找到某种合乎逻辑的理由或一行来证明纯 HDL 是不可能的。
  • 如果我在几天内没有收到带有证据证明不可能的答案,我会接受这个答案。
【解决方案2】:

你所追求的并不存在。但是,可以制作一些 cmets。

首先,您应该能够(在合理范围内)估计实现您的设计所需的资源量。如果它超出了您芯片的容量,您可能需要重新考虑设计或升级。其次,如果您尝试实现一个设计并利用所有 DSP 资源(例如推断乘法器),综合工具足够智能,它们会尝试将其余组件“拟合”到通用逻辑中。这可能会产生许多不良后果;组合逻辑可能会很快爆发(取决于您正在实现的内容),并且几乎可以保证会对最大时钟频率产生重大影响。最后,如果您想明确控制事物的实现方式,这一点更为相关,您可以使用综合指令(这会因供应商/语言而异)。

使用 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;

例如,如果您有一个“复数乘法器”模块想要控制它的实现方式,则可以使用泛型来控制它(实例化时)。

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;

【讨论】:

  • 您的附加 cmets 基本上就是我在“我意识到只需以正确的方式设计我的系统架构即可做一些非常接近我想要的事情”的段落中得到的内容。但我想要这个功能的原因是使用相同的 HDL 代码库(顶层和模块等)来针对不同的芯片。我怀疑你是对的,这是不可能的(因为我已经找了很长时间了)。如果它提供了某种证据证明这是不可能的,而不是简单地说明这是不可能的,我可以接受你的回答。
  • 综合指令(Altera 中;Xilinx 中的 AKA 综合属性)是供应商向综合工具提供提示的方式(或“指导”综合工具,如您所说)。没有选项可以实现您想要的(XilinxAltera
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多