Перейти к содержанию
    

Sinplify

Здравствуйте.

Есть простейший код:

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 получаю красивые картинки

post-45001-1360774723_thumb.png

post-45001-1360774728_thumb.png

Однако стоит заменить строку

sum    <= in_data;

строкой

sum    <= (in_data + 1)

схема вырождается в непонятно что:

post-45001-1360775216_thumb.png

Причём меняю данные на запись, а меняется логика и для регистров "ness_addr"(собственно, проблема). Эксперименты с изменением частоты и использованием "keep" ни к чему не привели. I/O буферы отключены. Стоит подать на запись результат простейшей логики - всё сразу ломается. Жудко увеличиваются ресурсы вместе с незначительным падением частоты.

Буду благодарен за помощь. Сам уже не знаю, где копать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наверное, syn_keep для sum не даёт его заоптимизировать, если его убрать, результаты лучше?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вобщем, пришёл к выводу, что симплифай не очень корректно синтезирует схему, если предполагается использовать LUTs для формирования и "data" и "ce" триггера, оставив их ему на откуп.

Оказалось достаточно явно сформировать "ce" для нескольких групп триггеров, и не дать ему их соптимизировать. Всё стало на свои места :biggrin:

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;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Включены ли глобальные pipelining & retiming? Если да, рекомендую выключить, и включать с помощью атрибута только там, где действительно надо. Иначе, по моим впечатлениям, почти всегда снижается частота и увеличивается объём вот именно из-за таких фокусов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Иначе, по моим впечатлениям, почти всегда снижается частота и увеличивается объём вот именно из-за таких фокусов.

По моим тоже. У меня отключена любая оптимизация, кроме Resource Sharing и Pipelining.

Но тут дело не в этом. Pipelining влияет DSP блки и блочную память. А тут просто латы и триггеры - косяк в синтезе(или в коде - это как посмотреть) :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

 

Чего то я не пойму в чем у Вас проблема ? ведь во втором случае вы добавляете сумматор в код.

sum    <= (in_data + 1)

 

Естественно Synplify добавляет немного железа при синтезе - естественно задержки чуть больше - что тут странного ? Вы на RTL View посмотрите.

 

Формирование логики CE на lut на на входе E триггера зависит как от стиля описания в коде так и от самой логики - очень часто

использования lut для CE выгоднее с точки возможных задержек.

 

Успехов! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...