|
|
  |
Почему один и тотже триггер реализуется по-разному?, как с этим бороться? |
|
|
|
Mar 27 2014, 03:20
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 18-03-14
Пользователь №: 80 976

|
Извиняюсь, что не совсем четко сформулировал суть проблемы, попробую исправиться  Есть следующий код: CODE module TRIGGERS(DATA, SIGNALa, CLK); output [3:0] DATA; input SIGNALa; input CLK; reg [3:0] triggers; always @(posedge CLK) triggers <= {4{SIGNALa}}; assign DATA = triggers; endmodule В RTL Viewer’е он выглядит так:
В Technology Map Viewer(Post-Fitting):
Как видно появились ячейки комбинаторной логики, выполняющие непонятную мне функцию, но бог с ними меня они не беспокоят. Проблема в том, что при каких-то условиях (например после добавления нового кода), этот кусок может собраться так(далее фотошоп):
Здесь один из триггеров реализуется по другому - без feeder’а, в связи, с чем длина пути к нему больше чем к остальным. Мне нужно чтобы путь ко всем четырем триггерам был одинаковым, т.е. одинаковая реализация. Поэтому хочется знать, от чего она зависит. Отмечу, что пути к этим регистрам исключены из временного анализа, а значит реализация не связана с обеспечением setup/hold условий. Также, по наблюдению, внутри одного LABа триггеры реализуются одинаково. Что касается возникшего здесь спора, результирующие файлы будут идентичны, при неизменном коде, параметрах компиляции, и версии Quartus(32bit и 64bit отличаются). Это из моего опыта, около 3х месяцев
|
|
|
|
|
Mar 27 2014, 03:38
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 18-03-14
Пользователь №: 80 976

|
Цитата(alexadmin @ Mar 27 2014, 07:26)  Да забейте, никому ваш триггер не интересен. В этой теме теперь серьезные дядьки бьются ;-) А вдруг  Покрайне мере с подсказки SM одно из решений нашлось.
|
|
|
|
|
Mar 27 2014, 03:42
|

Знающий
   
Группа: Свой
Сообщений: 815
Регистрация: 7-06-06
Из: Харьков
Пользователь №: 17 847

|
Цитата(o_khavin @ Mar 26 2014, 18:21)  Не то чтобы я Вам не верил, но за всю свою практику я ни разу не сталкивался с невоспроизводимостью проекта при сохранении исходников и настроек. Т.е. не то чтобы я считаю это аксиомой, но на роль не опровергнутой теории вполне сойдёт.  Что и подтверждается вышеотписавшимися товарищами. Правда, существенная и ранняя часть моего опыта была именно с Xilinx-ом, так что за Квартус более чем пятилетней давности я не ручаюсь. Но в любом случае, если такое поведение имеет место, то это явный глюк. Поэтому я и просил Вас прислать мне пример, чтобы с этим глюком ознакомиться и иметь его ввиду. P.S. Может быть на тех курса подразумевалось, что при изменениях в коде проекта, по другому разведутся и те куски, которые не менялись? Такая версия вполне разумна и соответствует действительности. Не в одном из постов ТС-а нет утверждений, что разница возникает при полном сохранении исходных условий - настроек и кода. Ха! Я уже 4 года как на Xilinx-е сижу... Скорее всего дело в настройках проекта...
|
|
|
|
|
Mar 27 2014, 05:55
|
Местный
  
Группа: Участник
Сообщений: 230
Регистрация: 29-08-09
Пользователь №: 52 094

|
Цитата(warrior-2001 @ Mar 27 2014, 05:43)  Не холивара ради... Взял простой проект в 13.1 версии Квартуса. Собрал. Взял те же исходники, собрал новый проект с теми же параметрами. Собрал. Результат разный, но полностью рабочий в комнатных условиях. Как-то так... Скорее всего дело в порядке следования исходников. Файлы проекта сравнивали между собой?
|
|
|
|
|
Mar 27 2014, 05:58
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(Viwon @ Mar 27 2014, 07:20)  Здесь один из триггеров реализуется по другому - без feeder’а, в связи, с чем длина пути к нему больше чем к остальным. Мне нужно чтобы путь ко всем четырем триггерам был одинаковым, т.е. одинаковая реализация. Поэтому хочется знать, от чего она зависит. От того, как показалось удобнее синтезатору. Хотите однозначности - описывайте этот кусок схемы в примитивах FPGA, запрещаете его оптимизацию в синтезаторе и вводите констрейны на физическое размещение элементов. Я не в курсе, как это делается в Quartus'е, сам работаю с Xilinx Цитата Отмечу, что пути к этим регистрам исключены из временного анализа, А зря, было бы неплохо на них тоже какие нибудь констрейны наложить. А так синтезатор имеет полное право сделать с этими путями все, что ему захочется. Даже провести их через весь кристалл (3 раза  )
|
|
|
|
|
Mar 27 2014, 06:04
|
Местный
  
Группа: Участник
Сообщений: 230
Регистрация: 29-08-09
Пользователь №: 52 094

|
Цитата(Viwon @ Mar 27 2014, 07:20)  Как видно появились ячейки комбинаторной логики, выполняющие непонятную мне функцию, но бог с ними меня они не беспокоят. Их функция совершенно понятная - фиттеру показалось, что так будет проще реализовать требуемую топологию. Цитата(Viwon @ Mar 27 2014, 07:20)  Проблема в том, что при каких-то условиях (например после добавления нового кода), этот кусок может собраться так. Здесь один из триггеров реализуется по другому - без feeder’а, в связи, с чем длина пути к нему больше чем к остальным. Это тоже нормально, просто теперь фиттеру показалось по другому.  Цитата(Viwon @ Mar 27 2014, 07:20)  Мне нужно чтобы путь ко всем четырем триггерам был одинаковым, т.е. одинаковая реализация. Поэтому хочется знать, от чего она зависит. От того, как фиттеру покажется правильно. Цитата(Viwon @ Mar 27 2014, 07:20)  Отмечу, что пути к этим регистрам исключены из временного анализа, а значит реализация не связана с обеспечением setup/hold условий. Также, по наблюдению, внутри одного LABа триггеры реализуются одинаково. То, что пути исключены из временного анализа, вовсе не говорит, что фиттер не будет их трогать. Во первых ему в любом случае нужно эти пути проложить, а во вторых эти пути должны не мешать другим путям. Единственный вариант принудить фиттер - захардкодить всё в один LAB. Но IMHO, Вы пытаетесь достигнуть конечной цели каким-то не тем путём.
|
|
|
|
|
Mar 27 2014, 07:41
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 18-03-14
Пользователь №: 80 976

|
to XVR, o_khavinИсходный вопрос и его решение можно посмотреть здесь, буду рад, если есть что там добавить. В итоге мне удалось решить ту задачу на приемлемом уровне путем фиксации регистров в соседних LABах, но результат может быть улучшен решением проблемы обсуждаемой в этом топике. Я понимаю, что фиттер разводит не от балды (или от балды?  ), а потому что ему так «удобнее», вот и хочется создать ему комфортные условия для одинаковой разводки, но что это за условия? Пока есть предположения Цитата(SM @ Mar 21 2014, 14:03)  Видимо, ресурсы разводки так разлеглись, что надо было тут подключить через LUT, а напрямую не склалось у роутера. Цитата(ViKo @ Mar 27 2014, 07:49)  Возвращаясь к самой первой картинке - в левой части сигнал приходит на вывод DATAD, а на правой на DATAC. Ну не нашлось других каналов из-за чего-то другого Не понятно что мешает, судя по Chip Planner’у в LABах куда назначены триггеры, нет ничего кроме них самих и их feeder’ов. Но мои знания архитектуры ПЛИС слабы, а Chip Planner могу только запускать  , поэтому пока ни чего не утверждаю.
Сообщение отредактировал Viwon - Mar 27 2014, 07:43
|
|
|
|
|
Mar 27 2014, 08:40
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
То, что пути исключены из временного анализа, как раз и приводит к тому, что оно как развелось, так и развелось, без какой либо оптимизации. Так что, как вариант, второй способ сделать время повторяемым, кроме ручного вставления LUT, может быть, задание жесткого set_max_delay на путь, чтобы он не давал возможностей втыкать эти feeder-ы, или жесткие set_max_delay и set_min_delay одновременно, чтобы он разводку делал в совсем жестких временных рамках...
|
|
|
|
|
Mar 27 2014, 09:32
|
Местный
  
Группа: Свой
Сообщений: 375
Регистрация: 9-10-08
Из: Таганрог, Ростовская обл.
Пользователь №: 40 792

|
Тема весьма бурная и я не поспею ответить всем. Если брать одни и те же исходники и компилить их, не удаляя старую инфу о предыдущей компиляции, то результат будет гарантированно одинаков. С этим не поспоришь. Но если с одинаковыми исходниками собрать несолько ОДИНАКОВЫХ проектов, то результат может отличаться. И в чем тут проблема - разбираться можно долго, ибо исходников САПР нет. Задача размещения элементов на кристалле весьма трудоёмка, и винить в неповторяемости трудно. Если все установки и тайминги выполняются(ну и логика верная), то с большой долей вероятности можно утверждать, что проект рабочий, а как там регистры лягли - дело второе. Если разводить два регистра - повторяемость будет много больше, чем у проекта со 100% загрузкой. Я лишь делюсь своим скромным опытом, и не выдвигаю никаких гипотез.
--------------------
Глупцы игнорируют сложность. Прагматики терпят ее. Некоторые могут избегать ее. Гении ее устраняют.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|