TRILLER 0 13 февраля, 2013 Опубликовано 13 февраля, 2013 · Жалоба Здравствуйте. Есть простейший код: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; library synplify; use synplify.attributes.all; library UNISIM; use UNISIM.VComponents.all; entity Topol_M is Port ( clk : in std_logic; rst : in std_logic; enable : in std_logic; hash : in std_logic_vector(4 downto 0); hash_p : in std_logic_vector(4 downto 0); in_data : in std_logic_vector(1 downto 0); out_data : out std_logic_vector(1 downto 0)); end Topol_M; architecture Behavioral of Topol_M is ----------------------------------------------------------- ----------------------------------------------------------- attribute syn_hier : string; attribute syn_hier of Behavioral : architecture is "hard"; attribute syn_keep : boolean; ----------------------------------------------------------- ----------------------------------------------------------- signal last_addr_1p : std_logic_vector(31 downto 0); signal last_addr_0p : std_logic_vector(31 downto 0); signal sum : std_logic_vector(1 downto 0); attribute syn_keep of sum : signal is true; signal ness_addr : std_logic_vector(1 downto 0); ----------------------------------------------------------- ----------------------------------------------------------- begin ----------------------------------------------------------- ----------------------------------------------------------- -- sum <= (in_data + 1); -- Проблема здесь!!! sum <= in_data; process (clk) begin if (clk = '1' and clk'event) then if rst = '1' then last_addr_1p <= (others => '0'); last_addr_0p <= (others => '0'); else if enable = '1' then last_addr_1p(conv_integer(hash)) <= sum(1); last_addr_0p(conv_integer(hash)) <= sum(0); end if; end if; end if; end process; ----------------------------------------------------------- ----------------------------------------------------------- process (clk) begin if (clk = '1' and clk'event) then ness_addr(1) <= last_addr_1p(conv_integer(hash_p)); ness_addr(0) <= last_addr_0p(conv_integer(hash_p)); end if; end process; out_data <= ness_addr; Output_Block_M.vhd После синтеза в Sinplify Pro 2012.9 получаю красивые картинки Однако стоит заменить строку sum <= in_data; строкой sum <= (in_data + 1) схема вырождается в непонятно что: Причём меняю данные на запись, а меняется логика и для регистров "ness_addr"(собственно, проблема). Эксперименты с изменением частоты и использованием "keep" ни к чему не привели. I/O буферы отключены. Стоит подать на запись результат простейшей логики - всё сразу ломается. Жудко увеличиваются ресурсы вместе с незначительным падением частоты. Буду благодарен за помощь. Сам уже не знаю, где копать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doublekey 0 13 февраля, 2013 Опубликовано 13 февраля, 2013 · Жалоба Наверное, syn_keep для sum не даёт его заоптимизировать, если его убрать, результаты лучше? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 14 февраля, 2013 Опубликовано 14 февраля, 2013 · Жалоба Вобщем, пришёл к выводу, что симплифай не очень корректно синтезирует схему, если предполагается использовать LUTs для формирования и "data" и "ce" триггера, оставив их ему на откуп. Оказалось достаточно явно сформировать "ce" для нескольких групп триггеров, и не дать ему их соптимизировать. Всё стало на свои места attribute syn_keep of enable_change : signal is true; ---- enable_gen : for i in 0 to 3 generate begin enable_change(i) <= enable when conv_integer(hash(4 downto 3)) = i else '0'; end generate; process (clk) begin if (clk = '1' and clk'event) then for i in 0 to 3 loop if enable_change(i) = '1' then last_addr_1p(i*8 + conv_integer(hash(2 downto 0))) <= sum(1); last_addr_0p(i*8 + conv_integer(hash(2 downto 0))) <= sum(0); end if; end loop; end if; end process; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 14 февраля, 2013 Опубликовано 14 февраля, 2013 · Жалоба 2 TRILLER а какую версию используете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 14 февраля, 2013 Опубликовано 14 февраля, 2013 · Жалоба Synplify_2012_09. Синтезил под Virtex-6. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 14 февраля, 2013 Опубликовано 14 февраля, 2013 · Жалоба Включены ли глобальные pipelining & retiming? Если да, рекомендую выключить, и включать с помощью атрибута только там, где действительно надо. Иначе, по моим впечатлениям, почти всегда снижается частота и увеличивается объём вот именно из-за таких фокусов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 14 февраля, 2013 Опубликовано 14 февраля, 2013 · Жалоба Иначе, по моим впечатлениям, почти всегда снижается частота и увеличивается объём вот именно из-за таких фокусов. По моим тоже. У меня отключена любая оптимизация, кроме Resource Sharing и Pipelining. Но тут дело не в этом. Pipelining влияет DSP блки и блочную память. А тут просто латы и триггеры - косяк в синтезе(или в коде - это как посмотреть) :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 14 февраля, 2013 Опубликовано 14 февраля, 2013 · Жалоба Приветствую! Чего то я не пойму в чем у Вас проблема ? ведь во втором случае вы добавляете сумматор в код. sum <= (in_data + 1) Естественно Synplify добавляет немного железа при синтезе - естественно задержки чуть больше - что тут странного ? Вы на RTL View посмотрите. Формирование логики CE на lut на на входе E триггера зависит как от стиля описания в коде так и от самой логики - очень часто использования lut для CE выгоднее с точки возможных задержек. Успехов! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться