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

Тайминги для "чайников". Концептуальный вопрос.

Доброго времени суток!

 

Начал пробовать работать с Verilog-ом, (Xilinx Spartan-3,XC3s50A, ISE 14.7 ) ну и первоначальная "радость простоты" разбилась об суровую реальность невозможности обеспечения тайминга всех сигналов. Получаю сообщения ошибки вида: Пример

Мануалы, к которым отсылает система, имеют примеры в виде схем, а не языка. Поэтому, "что делать" понятно только в сильно общем виде. Посему имею вопросы:

1) есть ли стандартные паттерны проектирования по верилогу, которые обеспечивают отсутсвие тайминговых проблем внутри ФПЖА (читал например, что лучше делать 2 16-разрядные счетчики чем 1 32-разрядный и т.д.)

2) Может быть лучше сразу делать систему в виде схемы, безо всяких Verilog-ов?

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

4) Как лучше писать программу - с точки зрения программиста (не особо обращая внимание на то, какая схема получится) или схемотехника (разбивать на модули - дешифраторы, счетчики и тд)?

 

Спасибо.

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


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

тайминги - это физическая сущность этого мира (задержка прохождения сигнала через транзисторы и провода внутри ПЛИС), в отличие от "идеальных программ".

то есть независимо от того, нарисована схема или написан код на верилоге, тайминги будут одинаковые.

 

есть вероятность, что в коде новичок опишет какую-то фигню - чтобы проверить себя, нужно посмотреть нетлист (netlist) - это схема, как ее понял транслятор из кода в схему. я не помню уже где в ISE-овском project navigator-е просмотрщик нетлиста - что-то типа меню-tools

 

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

 

компоновка кода (с точки зрения программиста, писателя верилога, просто человека) должна быть такая, что отдельную сущность (функцию, процедуру, блок внутри модуля и т.д.) можно было бы достаточно просто охватить взглядом и понять - ну то есть в один экран могут уложиться мастера, четко понимающие, что получится в конце, только начиная писать, но 3 экрана по-любому уже максимум, даже для новичка :)

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


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

1) Практически нет. Есть общее правило хотите поднять частоту увеличивайте число ступеней конвейера. Если ваша схема без лишних движений в частоту не ложится с генеральским запасом, то придется вам хорошо над ней подумать, общих рецептов не будет, такие схемы эксклюзив.

2) Хуже на порядки, схематик как инструмент на порядок неудобнее.. Если уж хочется схему городить в элементах, то и их можно описать верилогом. Это будет управляемо, читаемо и понимаемо. Плюс есть бонусы см. 4 пункт. Рисовать схему - это точно шаг назад

3) Конечно разбиение программы на модули играет роль в тайминге, но только пока вы не поставите галочку не сохранять иерархию. После этого синтезатор разбирет весь проект и собирет заново, максимально занимаясь оптимизацией. Модули в этом режиме нужны лишь для читаемости и понятности кода. В больших и сложных проектах иногда фиксируют удачные разводки модулей, но это проекты не для спартана.

4) Большая часть форума считает что надо думать и описывать схемами. Однако это уже не актуально. Авторы синтезаторов уже открыто пишут описывайте задачу максимально абстрактно, это даст нам больше маневра для оптимизации. Так что вам надо описывать суть, и задавать режимы синтезатора, он умеет выбирать баланс между площадью и скоростью.

Один момент надо уточнить. Нельзя описывать суть бездумно.

К примеру если ставить программисткое if(Counter >= 10), это хуже чем if(Coutner == 10), и хуже чем если бы он считал от 10 до нуля и сравнение было бы if(Coutner == 0). Это очень просто объяснить, Проверка на >= покрывает больше вариантов и потому разделить их на лож и истину сложнее чем проверка на константу, а константа сложнее чем проверка на просто 0.

Если вы делаете one hot вектор, то проверять надо my_vector == 1'b1, а не my_vector == (1 << i). Потому что во втором случае проверяется не только что i бит равен единице, но что и остальные равны нулю.

 

Так что правильнее думать задачей, но рассматривать ее критически, прикидывая какого уровня сложности схемы вы пораждаете. Чем меньше условий описывает результат, тем меньше будет слоев логики и тем быстрее будет схема. И наоборот чем жестче условие, тем сложнее выбор из множества входов, тем дольше оно будет считаться..

 

И да. не используйте циклы как циклы:)

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


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

Эх, нет в жизни совершенства :) Спасибо за ответы!

Хотя, думаю для "быстрого старта" было бы полезно обобщить короткие концептуальные рекомендации от "гуру" (типа "не используйте циклы как циклы") в виде "N заповедей плисовода" :)

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


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

константа сложнее чем проверка на просто 0.
Чем ноль отличается от любого другого числа? Сравнение что с нулём, что с константой делается в лутах, а там всё равно, какое число использовать.

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


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

Чем ноль отличается от любого другого числа? Сравнение что с нулём, что с константой делается в лутах, а там всё равно, какое число использовать.

При сравнении с нулем может бить использована логика ускоренного переноса.

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


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

При сравнении с нулем может бить использована логика ускоренного переноса.

А если сравнивать с нулём знаковое число, при условиях x>=0 и x<0 будет проверяться только знаковый бит.

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


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

Еще сравнение с 0 выгоднее когда один счетчик несколько раз используют с разными константами. Константы разные, а схема проверки одна.

 

 

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


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

При сравнении с нулем может бить использована логика ускоренного переноса.

А можно чуть подробнее про это ? Сколько я не проверял, но у меня по скорости, что вычитающий счетчик с проверкой на 0, что суммирующий счетчик с проверкой на константу были одинаковы. Но оценивал я по теоретической максимальной частоте которую выдает Timequest.

Поэтому пока я не обнаружил никакого преимущества вычитающих счетчиков, кроме этого случая:

Еще сравнение с 0 выгоднее когда один счетчик несколько раз используют с разными константами. Константы разные, а схема проверки одна.

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


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

А можно чуть подробнее про это ?

Немного не корректно выразился.

 

В счетчиках (в Spartan-3 это точно UG331 Chapter 9) используется дерево ускоренного переноса, что в счетчиках вверх, что вниз.

 

Если делается счетчик на неполные 2^n, то на его выходе придется ставить компаратор на сравнение с границей счета Nmax, который будет сбрасывать счетчик.

 

Но гораздо проще (для таймингов), если используется выход логики ускоренного переноса (все нули для счетчика вниз или все единицы для счетчика вверх) для установки счетчика в состояние 2^n-Nmax для счетчика вверх, и Nmax для счетчика вниз.

В этом случае из схемы сброса исчезает компаратор, что улучшает тайминги.

 

Правда не во всех схемах возможно применение такого перевернутого счетчика.

Наиболее часто я его применяю при получении стробов деленной частоты. Как заметил Golikov A это позволяет изменять их период загружая счетчик в разные начальные значения.

 

В случае когда нужен счет от 0 до Nmax лучше поставить компаратор на Nmax-1, его выход задержать на такт и использовать для сброса счетчика в 0, тем самым уменьшить число уровней логики.

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


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

В рамках fpga, когда логика ложится в ЛУТ, наверное, правильно сказали выше разницы в скорости сравнения константы и нуля нет, кроме случая нескольких констант, где усложнится схема выбором с какой из констант сравнивать.

 

Схема быстрого переноса все равно работает с выходами лута, которому все равно что на входе 0 или константа. Так что, думаю тут разницы не нарыть.

 

 

А понял. Бит переноса при переполнении счетчика. То есть заряжать счетчик не в 0, а в остаток счета и когда он досчитает ловить признак переполнения. Интересно.... Ну это фактически как анализировать знаковый бит при счете вниз.

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


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

В продолжение таймингов. Можно ли видеть задержки на временных диаграммах про симулировании? Что для этого нужно сделать ?

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


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

В продолжение таймингов. Можно ли видеть задержки на временных диаграммах про симулировании? Что для этого нужно сделать ?

Добавить к исходникам sdf файл, который получается при размещении проекта. Вот только смысла в этом почти никакого нет. Вы что тысячи сигналов глазами проверять будете? С учетом оптимизации, когда треть сигналов исчезнет, зато другая треть автоматически добавится....

 

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


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

В любом случае это все равно будет модель. Для конкретной температуры и питания.

Можно в готовой ПЛИС поглядеть что вышло через сигнал тап или чипскоп опять же в конкретной температуре и на конкретном питании, но как правильно сказали знание это мало что дает, разве что доказывает что это не магия, а просто схема:)

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...