реклама на сайте
подробности

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


Местный
***

Группа: Свой
Сообщений: 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
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 8)
andrew_b
сообщение Feb 4 2009, 08:14
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Ну а в логах synplify и map есть что-нибудь про этот сигнал?
Go to the top of the page
 
+Quote Post
starley
сообщение Feb 4 2009, 08:25
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 195
Регистрация: 9-01-09
Из: Москва
Пользователь №: 43 085



Цитата(andrew_b @ Feb 4 2009, 11:14) *
Ну а в логах synplify и map есть что-нибудь про этот сигнал?

Эти тригера по одному синхросигналу работают, или по разным? Если по разным, - то не разместит, на IOB только один синхросигнал заходит, плюс еще там по парам ограничение есть. Если по одному,- можно еще атрибут задать для этих тригеров (map_iob или как-то так).
Go to the top of the page
 
+Quote Post
gosha
сообщение Feb 5 2009, 15:06
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 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)?
Go to the top of the page
 
+Quote Post
gosha
сообщение Feb 9 2009, 06:00
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 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 одновременно.

Как победить?
Go to the top of the page
 
+Quote Post
Boris_TS
сообщение Feb 9 2009, 07:27
Сообщение #6


Злополезный
****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Bar
сообщение Feb 10 2009, 07:42
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 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;

У меня помогло, правда я на верилоге делал.
Go to the top of the page
 
+Quote Post
ilyge
сообщение Feb 10 2009, 12:49
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 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;
Go to the top of the page
 
+Quote Post
gosha
сообщение Feb 10 2009, 13:42
Сообщение #9


Местный
***

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



Ура.
syn_useioff + EQUIVALENT_REGISTER_REMOVAL работает.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 14:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01532 секунд с 7
ELECTRONIX ©2004-2016