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

synplify + ise не размещают oe_триггер в iob- как победить?

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

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


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

Ну а в логах synplify и map есть что-нибудь про этот сигнал?

Эти тригера по одному синхросигналу работают, или по разным? Если по разным, - то не разместит, на IOB только один синхросигнал заходит, плюс еще там по парам ограничение есть. Если по одному,- можно еще атрибут задать для этих тригеров (map_iob или как-то так).

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


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

Эти тригера по одному синхросигналу работают, или по разным? Если по разным, - то не разместит, на 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)?

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


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

Похоже, что в 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 одновременно.

 

Как победить?

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


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

Поглядел свой старенький проект для 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.

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


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

Попробуйте директиву 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;

 

У меня помогло, правда я на верилоге делал.

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


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

Используй метокомментарий в 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;

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


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

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

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

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

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

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

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

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

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

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