Постоянная инициализация из синтеза пользовательских функций занимает много времени, но легко создается в симуляции - PullRequest
0 голосов
/ 10 января 2019

Я создал функцию «my_func» в пакете, которая при вводе с x производит матрицу целых чисел формы [log2 (x), x]. Я хочу поместить этот фрагмент в память ПЗУ для синтеза.

Ради синтеза я присоединяю счетчик к ПЗУ и считываю один регистр за цикл clk. Я смог смоделировать это и получить ожидаемые ответы. Синтез кода никогда не заканчивается, даже когда общий управляющий функции очень мал, как показано в коде.

Меня смущает, почему Vivado может очень быстро смоделировать желаемый дизайн, но его синтез может длиться вечно. Я не получаю ошибок от Вивадо, говоря, что дизайн не подлежит обсуждению.

Кто-нибудь еще сталкивался с этой проблемой, и какие шаги я могу предпринять, чтобы избежать этой проблемы в будущем?

Пожалуйста, смотрите мой код синтеза ниже и фрагмент кода функции ниже

Для записи по этому вопросу. Synthesis = Elaborate Design (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;
...