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

    

TimeQuest. Борьба со slack.

Работаю c чипом CYCLONE V - 5CSEMA5F31C6. САПР - Quartus 13.1.

Столкнулся с проблемой, что между Fast input register или выходами DDR регистра и регистром-приёмником данных набегает огромная задержка по данным. Из-за чего возникает нарушение по setup.

Для начала опишу кратко дизайн:

Имеем 3 приёмные LVDS линии c DDR регистрами. На вход CLK подается опорная частота, которая на PLL умножается на 10 5, для тактирования приёмников.

RTL.png

 

 

TimeQuest радостно сообщает о том, что у нас нарушение по setup и фиг вам, а не частота приёмников выше 200...230 MHZ.

image.png

 

 

Посмотрим, чуть внимательнее на само нарушение. Набегает огромная задержка почти в 3 нс по данным.

image.png

 

Может Quartus расположил регистры приёмники в другом конце чипа ?

Да нет, ближе практически некуда:

image.png

 

 

На данный момент у меня есть 2 мысли как можно решить проблему:

1. На pll сформировать частоту со сдвигом, и от неё тактировать регистры-приёмники.

2. На LCELL сформировать цепь задержки тактового сигнала регистров приёмников(тупиковый вариант).

 

Хотелось бы услышать совета от более опытных коллег. Может есть какой-то другой способ решения проблемы ?

Пока мой SDC файл выглядит так:

#**************************************************************
# Create Clock
#**************************************************************
set_time_format -unit ns -decimal_places 3
create_clock -name {CLK}  -period 80MHz [get_ports {CLK}]

#**************************************************************
# Create PLL Clock
#**************************************************************
derive_pll_clocks

set_false_path -from [get_clocks {MY_PLL_COMP|my_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -to [get_ports {RX0}]
set_false_path -from [get_clocks {MY_PLL_COMP|my_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -to [get_ports {RX1}]
set_false_path -from [get_clocks {MY_PLL_COMP|my_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -to [get_ports {RX2}]

 

Прикрепляю тестовый проект:

LVDS_RX_3CHANNEL.7z

Изменено пользователем Flip-fl0p

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


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

По идее ДДР должен работать по двум фронтам клока, т.е. при 10-кратной десериализации параллельный клок надо умножать на 5, (а не на 10). ИМХа.

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


Ссылка на сообщение
Поделиться на другие сайты
По идее ДДР должен работать по двум фронтам клока, т.е. при 10-кратной десериализации параллельный клок надо умножать на 5, (а не на 10). ИМХа.

Да действительно. Неправильно написал. У меня умножается на 5. Подправлю.

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


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

А если например в чип-планере выходной сдвиговый регистр погонять по чипу (ближе/дальше от пина), то слак сильно различается?

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


Ссылка на сообщение
Поделиться на другие сайты
Да нет, ближе практически некуда:

Два вопроса:

1. Проверьте задержку в IO буфере (delay chain) и приведите цифру.

2. Где расположена pll, от которой питается вся логика - не в другом ли она конце fpga, точно ли этот клок глобальный (пессимизм большой и сам разброс значений для клока)?

ЗЫ. Я так понимаю пины у Вас жестко привязаны (между ними банк памяти или умножитель, что не есть хорошо)? Ради интереса попробуйте их отвязать и посмотреть результат.

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


Ссылка на сообщение
Поделиться на другие сайты
А если например в чип-планере выходной сдвиговый регистр погонять по чипу (ближе/дальше от пина), то слак сильно различается?

Отличается не сильно. А как вообще правильно вручную двигать ячейки ? У меня после того, как я подвинул и нажал кнопку "Check and Save all netlist changes" quartus начинает компилировать проект, и возвращает все изменения обратно...

 

1. Проверьте задержку в IO буфере (delay chain) и приведите цифру.
2. Где расположена pll, от которой питается вся логика - не в другом ли она конце fpga?
ЗЫ. Я так понимаю пины у Вас жестко привязаны (между ними банк памяти или умножитель, что не есть хорошо)? Ради интереса попробуйте их отвязать и посмотреть результат.

Задержка везде по нулям.

Есть фракционный PLL чуть ближе. :

Сейчас PLL расположен тут(см. картинку)

PLL.png

 

А вот компиляция проекта с "отвязанными" пинами дала поразительный результат: слаки все ушли и времянка выполняется...

Пути совершенно другие стали:

 

image.png

Изменено пользователем Flip-fl0p

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


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

Я обычно в окошке "логик лок регион виндов" создаю некий тематический "рут регион", задаю его координаты, размерность, фиксируемость и в свойствах накидываю всё то барахло, которое хочу в него запихнуть.

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


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

Проанализируйте два отличия:

1. Существенно поменялось время IC (хотя Вы написали, что задержка в io-буферах 0).

2. Существенно уменьшился разброс clocks_patch (все-таки убедитесь, что в первом случае клок пошел по глобальной шине клоков и, по возможности, используйте клокконтрол поближе к рабочей логике).

ЗЫ. Кроме этой логики в проекте есть еще какая-то другая логика, стоящая после этих регистров (проект посмотреть в данный момент времени возможности нет)? Если есть, попробуйте ее убрать.

ЗЫЫ. Ограничения на размещение я обычно прописываю прямо в .qsf- файле. Изначально их можно задавать в assignement editor,.

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


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

1. Существенно поменялось время IC (хотя Вы написали, что задержка в io-буферах 0).

2. Существенно уменьшился разброс clocks_patch (все-таки убедитесь, что в первом случае клок пошел по глобальной шине клоков и, по возможности, используйте клокконтрол поближе к рабочей логике).

ЗЫ. Кроме этой логики в проекте есть еще какая-то другая логика, стоящая после этих регистров (проект посмотреть в данный момент времени возможности нет)? Если есть, попробуйте ее убрать.

ЗЫЫ. Ограничения на размещение я обычно прописываю прямо в .qsf- файле. Изначально их можно задавать в assignement editor,.

Никакой логики в проекте нет (за исключением небольшого ряда мультиплексоров, которые никак не влияют на текущий результат работы). Вот структута приёмника:

image.png

 

 

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


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

А если например поставить в ДДР лпм галочку регистеред аутпут, то до того регистра, тоже будет такая большая задержка?

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


Ссылка на сообщение
Поделиться на другие сайты
А если например поставить в ДДР лпм галочку регистеред аутпут, то до того регистра, тоже будет такая большая задержка?

У меня такой нет :(

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


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

В 5 циклоне похоже таких нет...

 

DDR_REG.png

 

У меня нет ALTLVDS_RX. У меня самописный приёмник. По некоторым причинам ALTLVDS_RX не подходит.

Изменено пользователем Flip-fl0p

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


Ссылка на сообщение
Поделиться на другие сайты
В 5 циклоне похоже таких нет...

У меня нет ALTLVDS_RX. У меня самописный приёмник. По некоторым причинам ALTLVDS_RX не подходит.

Все равно на выходе будет обычный дополнительный регистр на рассыпухе. Входной io буфер для данного случая представляет из себя DDIO in из трех регистров и цепочки delay chain, там физически что-то еще дополнительно засунуть нельзя.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация