Код
type std_logic_array_64xNN is array (511 downto 0) of std_logic_vector(63 downto 0);
-- Инициализирую массив 512х64 функцией read_ini_file.
constant const_init : std_logic_array_64xNN:=read_ini_file(stage_num);
attribute RAM_STYLE : string;
attribute RAM_STYLE of d_out : signal is "block";
begin
-- адрес = выход обычного счетчика
addr <= cnt(stage_num-2 downto 0);
-- здесь я пытаюсь сделать ROM 512х64 на BRAM:
d_out <= const_init(conv_integer(addr)) when rising_edge(clk);
-- Инициализирую массив 512х64 функцией read_ini_file.
constant const_init : std_logic_array_64xNN:=read_ini_file(stage_num);
attribute RAM_STYLE : string;
attribute RAM_STYLE of d_out : signal is "block";
begin
-- адрес = выход обычного счетчика
addr <= cnt(stage_num-2 downto 0);
-- здесь я пытаюсь сделать ROM 512х64 на BRAM:
d_out <= const_init(conv_integer(addr)) when rising_edge(clk);
Хочу: чтобы синтезатор сделал Simple dual-port ROM на одном примитиве RAMB36E1.
Из даташита на 7 серию: Each 36 Kb block RAM can be configured as a ... 512 x 72 in simple dual-port mode.
То есть теоретически это реально, но синтезатор ни в какую не хочет задействовать примитив и делает на рассыпухе.
Причем, атрибуты он игнорирует. XST пишет следующее:
Цитата
The RAM <...> will be implemented on LUTs either because you have described an asynchronous read or because of currently unsupported block RAM features. If you have described an asynchronous read, making it synchronous would allow you to take advantage of available block RAM resources, for optimized device usage and improved timings. Please refer to your documentation for coding guidelines.
Но асинхронного чтения нет, все по клоку. Да и возможности BRAM из 7 серии позволяют использовать режим SDP 512x72.
Пробовал расширять разрядность до 72 - безрезультатно!
Использовать coregenerator не хочу, вставлять напрямую библиотеку unisim/unimacro - тоже. Как быть? Почему XST тупит?