繁体   English   中英

防止共享加法器逻辑

[英]Prevent sharing of adder logic

假设以下 VHDL 组件:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity adder is
    port
    (
        iClk : in std_logic;

        iDataA : in unsigned(7 downto 0);
        iDataB : in unsigned(7 downto 0);
        iDataC : in unsigned(7 downto 0);

        oResultA : out unsigned(7 downto 0);
        oResultB : out unsigned(7 downto 0)
    );
end entity;

architecture behaviour of adder is
begin
    process
    begin
        wait until rising_edge(iClk);
        if iDataB /= 0 then
            oResultA <= iDataA + iDataB;
        else
            oResultB <= iDataA + iDataC;
        end if;
    end process;
end behaviour;

可以看出,它包含两个附加项。 我预计综合逻辑也将包含两个加法器。 相反,Quartus 似乎认为只使用一个加法器并将第二个输入复用到它是一个好主意(参见下面的 RTL)。 在我看来,这没有任何意义。 它不节省硬件资源,因为多路复用器需要与加法器所需数量相同的逻辑元件。 此外,多路复用器需要等到 if 条件被评估,这会导致更糟糕的时序。

我在使用更大的组件和大型 state 机器时发生过这种情况,这会导致时序违规。 如何防止这种“优化”? 我已将优化模式设置为“Performace (Aggressive – 增加运行时间和面积)”,但似乎并没有什么不同。 导致预期结果的唯一方法是引入额外的信号,如下所示:

tmpA <= iDataA + iDataB;
tmpB <= iDataA + iDataC;

process
begin
    wait until rising_edge(iClk);
    if iDataB /= 0 then
        oResultA <= tmpA;
    else
        oResultB <= tmpB;
    end if;
end process;

有没有更好的方法来做到这一点,因为它使代码真的很难阅读。 我正在使用带有 Max10 FPGA 的 Quartus 20.1。

RTL 视图: 在此处输入图像描述

检查名为“自动资源共享”的选项(在高级合成器设置中)是否已关闭。 资源共享使合成器能够执行您不想执行的加法器共享。

或者

将您的加法器放在不同的层次结构层中(即在单独的实体中),然后设置一个属性以防止它被优化,称为keep

attribute keep: boolean;
attribute keep of my_adder0: label is true;
attribute keep of my_adder1: label is true;

其中my_adder0my_adder1是您的加法器实例的标签。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM