用户自定义函数综合进行的常量初始化要花很长时间,但在仿真中很容易创建

时间:2019-01-10 09:45:22

标签: vhdl fpga xilinx vivado

我在一个包中创建了一个函数“ my_func”,当使用x输入该包时,它会生成一个形状为[log2(x),x]的整数矩阵。我希望将此切片放入ROM存储器进行合成。

为了综合起见,我向ROM分配了一个计数器,并在每个clk周期中读出了一个寄存器。我已经能够对此进行模拟并获得预期的答案。即使代码中的通用控制功能很小,代码的综合也永远不会完成。

我对为什么Vivado可以非常快速地模拟所需的设计却花了很长时间进行综合感到困惑。我没有从vivado那里得到任何错误的信息,说该设计不可综合。

其他任何人都遇到过这个问题,我将来可以采取什么步骤来避免该问题?

请在下面查看我的综合代码,并在下面查看功能代码的片段

有关该问题的记录,即综合=精细设计(RTL)

library IEEE;
library WORK;
use WORK.mylib.all;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
use IEEE.math_real.all;

entity try is
    generic(
    x : integer := 8
);
    port(
    clk : in std_logic;
    ouput: out integer;
);
end entity try;

architecture v1 of try is
    constant sig : my_matrix_of_integers(0 to integer(log2(real(x)))-1, 0 to x-1) := my_func(x);
    signal counter : unsigned(integer(log2(real(x)))-1 downto 0);
    begin
        process(clk)
        begin
            if rising_edge(clk) then
                output <= sig(0, to_integer(counter));
                counter <= counter + 1;
            end if;
        end process;
end architecture v1;

这是我的功能代码的一个片段

function my_func (x: integer) return mat_t is
    variable y: integer := integer(log2(real(x)));
    variable cluster : integer;
    variable index : integer;
    variable mat : my_matrix_of_integers(0 to y-1, 0 to x-1);
begin
    for s in 0 to y-1 loop
        index := x/(2**(s+1));
        cluster := x/index;
        for c in 0 to cluster - 1 loop
            for i in 0 to index -1 loop
                if c mod 2 = 0 then
                   mat(s, (c*index) + i) := 0;
                else
                   mat(s, (c*index) + i) := i*(2**(s));
                end if;
            end loop;
        end loop;
    end loop;
    return mat;
end function my_func;

然后输入...

type my_matrix_of_integers is array(integer range <>, integer range <>) of integer;

0 个答案:

没有答案