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
参数等。这些工具非常擅长这个过程,以至于您的一个简单错误代码可能会导致设计的整个部分被优化掉。
既然如此,函数是否只在声明区域被调用实际上并不重要;无论在何处调用函数,任何可能的简化或优化都将由综合工具执行。
有些工具确实有局限性,例如,如果您的函数从文件中读取,或者在某些情况下,如果它包含一个具有由参数确定的边界的循环。但是,这往往会导致错误或警告,而不是网表中的额外逻辑。
如果我有这样的代码:
...
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
参数等。这些工具非常擅长这个过程,以至于您的一个简单错误代码可能会导致设计的整个部分被优化掉。
既然如此,函数是否只在声明区域被调用实际上并不重要;无论在何处调用函数,任何可能的简化或优化都将由综合工具执行。
有些工具确实有局限性,例如,如果您的函数从文件中读取,或者在某些情况下,如果它包含一个具有由参数确定的边界的循环。但是,这往往会导致错误或警告,而不是网表中的额外逻辑。