首页 文章

综合全局实例计数

提问于
浏览
3

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

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

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

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

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

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

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

2 回答

  • 2

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

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

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

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

    • generic 参数添加到实现乘数的实体 . 将这些参数绑定到设计顶层的 generic 参数 .

    • 脚本设置一组初始参数,使每个实体都使用专用DSP模块 .

    • 脚本运行 synth_design-generic 开关控制DSP块使用 .

    • 合成完成后,脚本解析 report_utilization 的输出以确定是否为数字超过了DSP块 . 如果不是,请转到步骤5.如果是,请修改通用参数集,以便更多实体使用备用乘数实现,并返回步骤3 .

    • 合成设计适合设备,脚本继续执行实施步骤 .

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

相关问题