Я создал функцию «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;