|
|
  |
synplify + ise не размещают oe_триггер в iob- как победить? |
|
|
|
Feb 4 2009, 06:02
|

Местный
  
Группа: Свой
Сообщений: 216
Регистрация: 15-06-04
Из: Менделеево
Пользователь №: 30

|
synplify 9.6 используется для синтеза. ise 10 implementation. virtex 2 pro. В схеме iob 2 триггера присутствуют: для oe и data. ise триггер sdram_dq_out размещает в iob. ise триггер sdram_dq_en не размещает в iob - как победить? Спасибо. Код module top ( .... inout [63:0] sdram_dq; wire [63:0] sdram_dq, sdram_dq_o, sdram_dq_oe;
bufif0 sdram_dq_buf [63:0] (sdram_dq, sdram_dq_o, sdram_dq_oe);
memory_hub memory_hub_insertion (.sdram_dq_i(sdram_dq),.sdram_dq_o(sdram_dq_o),.sdram_dq_oe(sdram_dq_oe));
..... Код entity memory_hub is port( sdram_dq_i : in std_logic_vector(63 downto 0); sdram_dq_o : out std_logic_vector(63 downto 0); sdram_dq_oe: out std_logic_vector(63 downto 0); signal sdram_dq_out : std_logic_vector(63 downto 0); signal sdram_dq_en : std_logic_vector(63 downto 0); attribute syn_keep of sdram_dq_en : signal is true; attribute syn_keep of precharge_enable : signal is true; attribute xc_props of sdram_dq_en : signal is "IOB=TRUE"; attribute xc_props of sdram_dq_out : signal is "IOB=TRUE"; ................................. sdram_dq_o <= sdram_dq_out; sdram_dq_oe <= sdram_dq_en; process (wb_clk) begin if (wb_clk'event and wb_clk = '1') then if cmd_write then sdram_dq_out <= sdram_di; precharge_enable <= false; sdram_dq_en <= (others => '0'); else sdram_dq_out <= sdram_dq_out; sdram_dq_en <= (others => '1'); precharge_enable <= true; end if; end if; end process; Код Maximum Data Path: memory_hub_insertion/precharge_enable to sdram_dq[55] Location Delay type Delay(ns) Physical Resource Logical Resource(s) ------------------------------------------------- ------------------- SLICE_X50Y21.YQ Tcko 0.419 sdram_dq_oe[0] memory_hub_insertion/precharge_enable J29.T1 net (fanout=68) 6.397 sdram_dq_oe[0] J29.PAD Tiotp 3.031 sdram_dq[55] sdram_dq_iobuf[55]/OBUFT sdram_dq[55] ------------------------------------------------- --------------------------- Total 9.847ns (3.450ns logic, 6.397ns route) (35.0% logic, 65.0% route)
-------------------------------------------------------------------------------- Slack: 8.047ns (requirement - (clock arrival + clock path + data path + uncertainty)) Source: memory_hub_insertion/precharge_enable (FF) Destination: sdram_dq[53] (PAD) Source Clock: PLL_XC_H_c rising at 0.000ns Requirement: 20.000ns Data Path Delay: 9.577ns (Levels of Logic = 1) Clock Path Delay: 2.376ns (Levels of Logic = 2) Clock Uncertainty: 0.000ns
Прикрепленные файлы
iob.pdf ( 19.85 килобайт )
Кол-во скачиваний: 106
|
|
|
|
|
Feb 4 2009, 08:25
|
Частый гость
 
Группа: Свой
Сообщений: 195
Регистрация: 9-01-09
Из: Москва
Пользователь №: 43 085

|
Цитата(andrew_b @ Feb 4 2009, 11:14)  Ну а в логах synplify и map есть что-нибудь про этот сигнал? Эти тригера по одному синхросигналу работают, или по разным? Если по разным, - то не разместит, на IOB только один синхросигнал заходит, плюс еще там по парам ограничение есть. Если по одному,- можно еще атрибут задать для этих тригеров (map_iob или как-то так).
|
|
|
|
|
Feb 5 2009, 15:06
|

Местный
  
Группа: Свой
Сообщений: 216
Регистрация: 15-06-04
Из: Менделеево
Пользователь №: 30

|
Цитата(starley @ Feb 4 2009, 11:25)  Эти тригера по одному синхросигналу работают, или по разным? Если по разным, - то не разместит, на IOB только один синхросигнал заходит, плюс еще там по парам ограничение есть. Если по одному,- можно еще атрибут задать для этих тригеров (map_iob или как-то так). Похоже, что в iob сигналы размещаются, если в модуль верхнего урованя вывести dat_o, dat_oe, и там сделать bufif0 dat_buf[31:0] (dat, dat_o, dat_oe). Причем именно bufif0. И наверх вывести 32 сигнала dat_oe. Обязятельно ли выходные буфера размещать в модуле top (vhdl/verilog)?
|
|
|
|
|
Feb 9 2009, 06:00
|

Местный
  
Группа: Свой
Сообщений: 216
Регистрация: 15-06-04
Из: Менделеево
Пользователь №: 30

|
Цитата(gosha @ Feb 5 2009, 18:06)  Похоже, что в iob сигналы размещаются, если в модуль верхнего урованя вывести dat_o, dat_oe, и там сделать bufif0 dat_buf[31:0] (dat, dat_o, dat_oe). Причем именно bufif0. И наверх вывести 32 сигнала dat_oe.
Обязятельно ли выходные буфера размещать в модуле top (vhdl/verilog)? Дополнение: 64 триггера dat_oe на этапе синтеза synplify оставляет. На этапе implementation, ice 64 триггера dat_oe оптимизирует в один. И, соотв., 1 триггер не может быть в 64 iob одновременно. Как победить?
|
|
|
|
|
Feb 9 2009, 07:27
|
Злополезный
   
Группа: Свой
Сообщений: 608
Регистрация: 19-06-06
Из: Russia Taganrog
Пользователь №: 18 188

|
Поглядел свой старенький проект для PCI... И нашел аналогичное место: сигнал AD_nOE должен синхронно разрешать работу 32 выходных буферов. Естественно пришлось создать 32 IOB триггера для AD_nOE. Из constraint'ов я обнаружил только следующее: attribute IOB of AD_nOE: signal is "true";, но и IOBUF находился в модуле верхнего уровня. Также были выполнены все ограничения налагаемые используемым семейством ПЛИС (Spartan-2), т.е. CLK и RST един для всех IOB триггеров, CE - индивидуален; все сбросы одного типа (синхронные). Проверьте FPGA_Editor'ом, что можно разместить в IOB вашей ПЛИС, и то ли генерирует Synplify.
В более поздних проектах (синтезируемых XST) в которых IOBUF находился вместе с описанием триггеров, к IOB дописывался и attribute NOREDUCE of nOE: signal is "true";
Почитайте про constraint KEEP, в его описании упоминается NOMERGE, очень похоже, что Вам нужен именно NOMERGE.
|
|
|
|
|
Feb 10 2009, 07:42
|
Участник

Группа: Свой
Сообщений: 58
Регистрация: 13-03-05
Пользователь №: 3 314

|
Попробуйте директиву syn_useioff
Из хелпа synplify: entity test is port (d : in std_logic_vector (3 downto 0); clk : in std_logic; q : out std_logc_vector (3 downto 0); attribute syn_useioff : boolean; attribute syn_useioff of q : signal is true; end test;
У меня помогло, правда я на верилоге делал.
|
|
|
|
|
Feb 10 2009, 12:49
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 23-06-05
Пользователь №: 6 251

|
Используй метокомментарий в synplify : // synthesis attribute equivalent_register_removal of sdram_dq_oe is "no"
Можно прочитать : wp231.pdf (HDL Coding Practices to Accelerate Design Performance)
Пример :
attribute EQUIVALENT_REGISTER_REMOVAL : string; attribute EQUIVALENT_REGISTER_REMOVAL of ce1 : signal is "NO"; attribute EQUIVALENT_REGISTER_REMOVAL of ce2 : signal is "NO";
begin -- Clock enable register with 64 fanout -- replicated once
process (clk) begin if (rising_edge(clk)) then ce1 <= ce; ce2 <= ce; end if; end process;
process (clk) begin if (rising_edge(clk)) then if (ce1='1') then res(31 downto 0) <= a_data(31 downto 0); end if; if (ce2='1') then res(63 downto 32) <= a_data(63 downto 32); end if; end if; end process;
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|