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

    

timing in Vivado

Всем привет.

Возникла такая проблема. На virtex7 реализован жирный мультиплексор 16 высокоскоростных потоков в один. Идея в том, что по 16 каналам валяться 64 битные слова с частотой 312МГц. Валяться они пакетами и скважность этих пакетов плавает со временем. Выходной поток имеет такую же пропускную способность(64 бит слова, 312МГц). Чтобы не потерять данные, пока в выходной поток пишем данные с одного канала, данные с других каналов пишутся в fifo. Каждый канал имеет своё собственное fifo размерностью 16384x64. Реализован алгоритм постепенного чтения из каждого фифо в определённой очереди, чтобы ни одно фифо не успело переполниться. Фифо получились большие и места этот мультиплексор занимает очень много.

 

В итоге всё работает и ничего не теряется, но возникла проблема.

Компиляция производится при помощи vivado 2014 и из раза в раз получается разный результат по таймингам. То их нет, то получаются большие тайминги(до 0.5нс). Причём мультиплексор давно написан и никаких изменений в нём не делается. Ему отведён отдельный регион на кристале где ему разводится и другой логики от других модулей там нет. Из сборки к сборке он не меняется.

 

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

 

Может кто-нибудь посоветует как с этим бороться. Можно ли зафиксировать как-то результат разводки мультиплексора, или сказать компилятору разводить его пока не будет ошибок по таймингам?

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


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

Попробуй Vivado 2015.3, текущий. У старых версий Vivado вообще куча проблем существует.

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


Ссылка на сообщение
Поделиться на другие сайты
Попробуй Vivado 2015.3, текущий. У старых версий Vivado вообще куча проблем существует.

 

нет возможности, только 2014.4

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


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

Каждое ФИФО гвоздями приколотите.

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


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

Вообще, через Floorplan можно залочить любой элемент.

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


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

После удачной разводки выгрузите размещение компонент вашего мультиплексора в файл констрейнтов (xdc) и затем используйте этот файл при дальнейших сборках вашего проекта.

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


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

FIFO и до этого были приколочены, обложил констрейнами 2/3 всех сигналов в мультиплексоре и он стал почти всегда собираться без таймингов.

После удачной разводки выгрузите размещение компонент вашего мультиплексора в файл констрейнтов (xdc) и затем используйте этот файл при дальнейших сборках вашего проекта.

Подскажите пожалуйста как это сделать в vivado?

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


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

Посмотрите на Vivado XDC Macros

 

обложил констрейнами 2/3 всех сигналов в мультиплексоре и он стал почти всегда собираться без таймингов.

 

По хорошему все сигналы должны подпадать под констрейнты.

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


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

Ну все сигналы тактируются от одного клока, на который есть констрейн. По моей логише это должно автоматически накладывать констрейн на распространение сигналов между регистрами, тактируемые этим клоком. Но вивадо почемуто на них забивает. Частично помогает явное указане set_max_delay в констрейнах на интересуемый сигнал, который собирается с таймингами. Так же немного улучшило ситуацию директива NoTimingRelaxation для route. Ситуация улучшилась, но всёже иногда тайминги вылезают. Неужто на все сигналы мультиплексора необходимо явно указывать set_max_delay?

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


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

Посмотри отчёты о таймингах, какие клоки вивадо видит. Обычно все работает автоматом, и дополнительно требуется задавать лишь клоки, идущие на выходные пины.

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


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

Собственно вот какие я выводы сделал. Я не знаю как точно там сделано в вивадо, но при работе с большими проетами(заполненность плис больше 70%) и при довольно больших частотах(больше 200МГц) с разводкой всё плохо. Похоже при процессе рутинга естественно некоторые констрейны не совпадают и вивадо начинает пытаться их исправить переставляя местами регистры и луты, как я понял перестановке подвергаются и те регистры с которыми всё было ок. И вот она исправляет тайминг одного сигнала, но при этом часто портит другого, и всё повторяется. На какомто этапе она всёже останавляивается и иногда с таймингами на некоторых сигналах. Выход из положения это использование OOC. Суть в том что вы компилите и разводите большие и критически важные блоки отдельно. при этом вивадо пытается срутить только его и ей это удаётся(если нет, то переписывай код). Полученный dcp файл потом используется как black box в большом проекте. Этот файл содержит ваш модуль без таймингов и при компиляции большого проекта он не будет его рутить я просто возьмёт из dcp файла, где описано какие элементы и какие луты куда класть. BINGO!

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


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

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

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

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

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

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

Войти

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

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