我在一个包中创建了一个函数“ 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;