VHDL - 仅在架构 header 中使用的功能是否占用 FPGA 逻辑?

VHDL - Do Functions used only in the architecture header take up FPGA logic?

如果我有这样的代码:

...

architecture behaviour of ExampleEntity is
  -- type definitions
  type Matrix is array(0 to 1,0 to 1) of signed(NumOfBitsForSignals_1 downto 0);

  -- function definitions

  function TransposeMatrix(MatrixArg : Matrix) return Matrix is  
      -- variable decleration   
      variable Result : Matrix; 
  begin  
    -- behaviour
    for columnNo in Result'range loop 
      for rowNo in Result'range loop    
        Result(columnNo, rowNo) := MatrixArg(rowNo, columnNo); 
      end loop;                                                                   
    end loop;
    return Result; 
  end function;
  -- constant definitions


  constant A00 : std_logic_vector(NumOfBitsForSignals_1 downto 0) := "A00Value";
  constant A01 : std_logic_vector(NumOfBitsForSignals_1 downto 0) := "A01Value";
  constant A10 : std_logic_vector(NumOfBitsForSignals_1 downto 0) := "A10Value";
  constant A11 : std_logic_vector(NumOfBitsForSignals_1 downto 0) := "A11Value";
  constant A : Matrix := ((signed(A00), signed(A01)),                                   

  constant A_Transpose : Matrix := TransposeMatrix(A);

...

并且 TransposeMatrix 函数在这个地方只使用了一次,这个函数是否仍然是合成的,或者编译器会为 A_Transpose 分配适当的值并从合成中删除这个函数?如果不是这种情况,它合成了转置函数,是不是去掉这个函数,手动转置矩阵再输入比较好?

一般来说,综合工具会尽最大努力降低生成的网表的复杂性。这包括计算具有恒定输入的函数的结果,即使这些输入本身是由其他函数生成的,取决于 generic 参数等。这些工具非常擅长这个过程,以至于您的一个简单错误代码可能会导致设计的整个部分被优化掉。

既然如此,函数是否只在声明区域被调用实际上并不重要;无论在何处调用函数,任何可能的简化或优化都将由综合工具执行。

有些工具确实有局限性,例如,如果您的函数从文件中读取,或者在某些情况下,如果它包含一个具有由参数确定的边界的循环。但是,这往往会导致错误或警告,而不是网表中的额外逻辑。