|
Констрейны на глобальные сигналы: как правильно?, Сделать из багов фичи |
|
|
|
Jan 20 2012, 11:12
|
Знающий
   
Группа: Свой
Сообщений: 972
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543

|
Здравствуйте, уважаемые гуру. Хотца сделать банальнейшую вещь, а именно - использовать глобальные сигналы для передачи своих сигналов. Ну например: секундный импульс. Представляет из себя сигнал, который равен 1 один такт в секунду, всё остальное время он равен нулю. Ну то есть, ____________________________/\________________________________/\__________ Получается этот сигнал при помощи здорового счетчика с не менее здоровым компаратором, соответственно уже имеет значительную задержку. Если его посадить на глобальный сигнал, это добавит задержку пути через буфер этого самого глобального сигнала, в результате чего задержка станет совсем немаленькой, и после дохождения до логики на другом конце микросхемы суммарная задержка начинает немного превышать значение периода такта (5 нс). (необходимо сказать, что тактовая частота везде одна и та же, секундный импульс используется как линия данных в комбинационной логике) Фишка в том, что нет никаких проблем, если к логике этот сигнал будет приходить с задержкой на такт, лишь бы приходил на всей микросхеме в пределах одного такта и с соблюдением времен установки/удержания триггеров. Как это правильно сделать? Применим ли здесь Multicycle, например так: Код set_multicycle_path -from [get_registers {TCNTR_TimeCounter:CNTR_TimeCounter|Time_1S_Pulse}] -to * -setup -end 2 set_multicycle_path -from [get_registers {TCNTR_TimeCounter:CNTR_TimeCounter|Time_1S_Pulse}] -to * -hold -end 1 Ну то есть, насколько я понимаю эти констрейны, они требуют, чтобы сигнал Time_1S_Pulse анализировался относительно 2-го фронта, считая за 0 - фронт генерации Time_1S_Pulse. Сможет ли фиттер обеспечить разводку по таким констрейнам, т.е. добавить необходимую задержку для "перекидывания" сигнала через 1-й фронт. Всем заранее спасибо за ответы. P.S. Altera, TimeQuest.
|
|
|
|
|
Jan 20 2012, 11:43
|
Знающий
   
Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107

|
а зачем вообще кострейн то? Почему нельзя сделать сихронный компаратор и на него поставить еще один триггер? Ну, типа такого: Код if rising_edge( clk ) then count <= count + 1; flag_1s <= '0'; if count = (PERIOD_IN_CYCLES-1) then count <= 0; flag_1s <= '1'; end if;
pulse <= flag_1s; end if; -- rising edge Транслятор будет автоматически делать register duplication для триггера pulse и в итоге всюду будет сфазированный. Я правда, видимо, не понял главного, зачем пихать это в глобальный сигнал.
|
|
|
|
|
Jan 20 2012, 12:08
|
Знающий
   
Группа: Свой
Сообщений: 972
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543

|
Цитата Я правда, видимо, не понял главного, зачем пихать это в глобальный сигнал. В глобальный сигнал - потому что много потребителей у этого импульса. Цитата Транслятор будет автоматически делать register duplication для триггера pulse и в итоге всюду будет сфазированный. Он как-то очень хаотично его делает - то делает, то не делает, причем когда не делает - потом на него же ругается, что из-за него всё тормозит. Цитата а зачем вообще кострейн то? Почему нельзя сделать сихронный компаратор и на него поставить еще один триггер? Собственно, так и есть. TCNTR_TimeCounter:CNTR_TimeCounter|Time_1S_Pulse - это триггер как раз после компаратора. Цитата А если большой счетчик разбить на 2 или несколько счетчиков? Или в крайнем случае большой счетчик с периодом пол-секунды, а после него делитель на 2, ну т.е. один триггер. Он то быстро будет щелкать. И уже сигнал с него рассылать. Не пойдет? Проблема не в самом триггере, а в пути от него до потребителей - микросхема большая, потребителей много, чтобы всё это работало не слишком долго, фиттер тянет все потребляющие этот сигнал цепи к генератору секундного сигнала, что портит разводку.
|
|
|
|
|
Jan 20 2012, 12:45
|
Знающий
   
Группа: Свой
Сообщений: 972
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543

|
Попробовал так, как написал в корне: Код set_multicycle_path -from [get_registers {TCNTR_TimeCounter:CNTR_TimeCounter|Time_1S_Pulse}] -to * -setup -end 2 set_multicycle_path -from [get_registers {TCNTR_TimeCounter:CNTR_TimeCounter|Time_1S_Pulse}] -to * -hold -end 1 В результате, картина маргарином. Период тактового сигнала T = 5.714нс (175 Мгц). Я хочу, чтобы сигнал Time_1S_Pulse приходил в интервале между T и 2*T, т.е. (если не считать времен установки и удержания) от 5.714нс до 11.428. После компиляции, максимальная задержка - 7.968 (нормально, Tsetup выдерживается с запасом), минимальная - 5.209, т.е. время установки не выдерживается больше чем на пол-наносекунды. => то ли я не так задал констрейн на hold, то ли здесь мультициклы вообще неприменимы. Цитата Но вообще на частотах до 200МГц, 3000 нормальный фанаут что бы работало без этих танцев (сыклон 3) Там фанаут тысяч 5... Stratix-IIGX в самой медленной градации...
|
|
|
|
|
Jan 20 2012, 13:26
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(Koluchiy @ Jan 20 2012, 06:45)  Попробовал так, как написал в корне: скрин бы отчета TQ по этому пути. я бы сделал так -to [all_clocks {}] Цитата Период тактового сигнала T = 5.714нс (175 Мгц). Я хочу, чтобы сигнал Time_1S_Pulse приходил в интервале между T и 2*T, т.е. (если не считать времен установки и удержания) от 5.714нс до 11.428. этого, мультицикл не гарантирует. Цитата Там фанаут тысяч 5... Stratix-IIGX в самой медленной градации... не вижу проблем, дуплицирование двух-четырех регистров должно решить проблему.
--------------------
|
|
|
|
|
Jan 20 2012, 14:00
|
Знающий
   
Группа: Свой
Сообщений: 972
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543

|
Цитата я бы сделал так -to [all_clocks {}] Результат идентичный. Скрин положу в понедельник.
|
|
|
|
|
Jan 20 2012, 14:14
|

Лентяй
     
Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843

|
Цитата(Koluchiy @ Jan 20 2012, 17:47)  Суть в том, что в имеющихся условиях глобальные и региональные клоки в большинстве своем висят без использования, а туда можно было бы понавешивать много интересного. Что-то я не могу проникнуться глубиной мысли... Если нужно какой-то сигнал засандалить на глобальную линию, то можно воспользоваться примитивом GLOBAL . Только что это в данном случае даст? Предположим, что сигнал по глобальной линии добегает до всех ALM'ов примерно в одно время. Что с ним ALM'у делать дальше? Насколько я понял, этот сигнал должен попасть в ALUT. Как его вытягивать на Local Interconect с глобальной линии? Или я не прав?
--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
|
|
|
|
|
Jan 21 2012, 08:57
|
Знающий
   
Группа: Свой
Сообщений: 972
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543

|
Цитата временные констрейны используются не для того, для чего вы хотите их использовать Применительно к вводу-выводу они используются именно так, как я хочу их использовать, т.е. для задания минимальных/максимальных задержек. В Вашей же статье про это читал, часть 4 если не путаю  . Правда, там с использованием элементов задержек... Вообще, применительно к данной задаче надо попробовать set_max_delay, set_min_delay  . Но, честно говоря, как-то это совсем уже выглядит стремно. Цитата Если нужно какой-то сигнал засандалить на глобальную линию, то можно воспользоваться примитивом GLOBAL . Логично, так и затягиваю. А что, есть еще способы? Цитата нормально он вытягивается, правда задержка чтобы затащить и вытащить сигнал с этой линии порой перекрывает весь возможный выигрыш Ну так в том и идея - при помощи допзадержки перед подачей сигнала на GLOBAL задержать сигнал грубо говоря на такт (поскольку это не влияет на работу алгоритма) и, таким образом, компенсировать влияние задержек (одинаковых для всех потребителей) по вводу сигнала на GLOBAL и выведения его из GLOBAL. Цитата Лучше дуплицировать. Тоска у него с дуплицированием. Ставлю цепочку из нескольких триггеров, чтобы дуплицированием сделал иерархическое дерево и развел сигнал куда надо. Смотрю результат фиттера - никакого дерева нет, вся цепочка спиралькой расставлена в центре, к концу цепочки стянуты потребители. TimeQuest ругается на то, что часть потребителей не удалось притянуть достаточно близко. Вручную, наверное, дерево можно сделать и результат будет лучше (если сделать так, чтобы синтезатор не выкинул дублирующие триггеры  ).
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|