综合全局实例计数

时间:2017-02-01 19:29:14

标签: vhdl verilog hdl synthesis

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

在某些情况下,我正在考虑FPGA开发,但我敢打赌它也会用于ASIC设计。

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

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

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

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

如果这仅存在于一种工具或一种语言中,那对我来说仍然是可接受的解决方案。如果你能提供明确的证据或合理的理由,为什么它无法运作,那对我来说也是一个可以接受的解决方案。

2 个答案:

答案 0 :(得分:2)

您是否真的尝试过实现一种能够推断出比设备更多倍数的设计?我希望该工具在DSP块耗尽后自动开始使用LUT资源。但是,假设没有发生这种情况:

您可以使用Xilinx Vivado和自定义TCL脚本实现这一目标。我不会详细说明确切的命令和脚本,因为这样做很费劲,但基本流程看起来像这样:

  1. generic参数添加到实现乘数的实体。将这些参数绑定到设计顶层的generic参数。
  2. 脚本设置一组初始参数,使每个实体都使用专用的DSP块。
  3. 脚本运行synth_design-generic开关控制DSP块使用。
  4. 合成完成后,脚本解析report_utilization的输出以确定是否超出了DSP块的数量。如果没有,请转到步骤5.如果是,请修改通用参数集,以便更多实体使用备用乘数实现,并返回步骤3.
  5. 合成设计适合设备,脚本继续实施步骤。
  6. 不使用泛型的上述过程的替代方法是保持相同的基本步骤,但在特定乘数实例上使用set_property命令以控制其实现,而不是设置泛型。

答案 1 :(得分:0)

你所追求的是不存在的。但是,可以提出一些意见。

首先,您应该能够(在合理范围内)估算实施设计所需的资源量。如果它超出了芯片的容量,您可能需要重新考虑设计或升级。其次,如果您尝试实现设计并利用所有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;