Есть ли причина для инициализации (не сброса) сигналов в VHDL и Verilog? - PullRequest
4 голосов
/ 15 июня 2011

Я никогда не инициализировал сигналы.Таким образом, любой сигнал, пропускающий сброс или назначение, будет неизвестен или инициализирован.В некоторых ссылочных кодах они имеют инициализацию.Это побеждает то, что я хочу.Кроме того, поскольку инициализация не является синтезируемой, может иметь место несоответствие моделирования / синтеза.

Есть ли основания для инициализации сигналов в этом случае?

РЕДАКТИРОВАТЬ 17.06.11: As @ Adam12спросил, это относится как к элементам хранения (Verilog reg), так и к комбинаторным (проводным) элементам.

Ответы [ 2 ]

14 голосов
/ 16 июня 2011

(следующий совет в значительной степени зависит от архитектуры устройства и инструментов синтеза, я говорю из опыта работы с FPGA Xilinx, такими как детали Virtex-5).

Ваше предположение, что инициализация не является синтезируемой, неверно. Инициализация сигнала абсолютно синтезируема !

Например, это можно синтезировать, чтобы запрограммировать устройство с начальным значением:

signal arb_onebit : std_logic := '0';
signal arb_priority : std_logic_vector(3 downto 0) := "1011"

Кроме того, вы можете добиться лучшего качества результатов (QoR), используя инициализацию сигналов и отказываясь от традиционных асинхронных или синхронизированных схем глобального сброса. Это потому, что инструментам больше не нужно направлять сигналы сброса на все ваши FF вокруг вашей части. Хотя некоторые FPGA старого поколения могли иметь выделенные ресурсы для сброса, это не относится к новым версиям. Это означает, что сброс маршрутизируется так же, как и любой другой сигнал в вашем проекте, замедляя процесс сборки и снижая производительность.

Что вы можете сделать вместо этого? Используйте инициализацию сигнала.

  1. Используйте выделенный "GSR" (глобальная установка / сброс, я считаю) Это доступно через специальный примитив Xilinx. Обратите внимание, что при использовании GSR сбрасываются не все элементы памяти устройства. Например, я считаю, что BRAM сохраняют значения, но FF сбрасываются до инициализированных значений.
  2. ПРОГЛ ваше устройство. Это приведет к перепрограммированию всего устройства из исходного потока битов (расположенного в PROM). Каждый раз, когда устройство загружается из PROM, все элементы памяти (FF, BRAM и т. Д.) Переводятся в известное состояние, продиктованное вашей инициализацией. Если вы не инициализируете, я полагаю, что по умолчанию это состояние "0" Вы можете проверить состояние инициализации элемента памяти, просмотрев результаты с помощью такого инструмента, как редактор FPGA (поставляется как часть набора инструментов Xilinx)

Если вам действительно нужно сбросить только небольшую часть вашего проекта («локальный» сброс), то вам следует справиться с этим так же, как вы обычно выполняете сброс.

Вот несколько ссылок на инструменты Xilinx:

EDIT

После некоторых дальнейших исследований я обнаружил, что указание начальных значений, хотя в некоторых случаях полезно для улучшения QoR, в других может повредить его. Это действительно сводится к тому, как ваш поставщик инструментов синтеза будет соблюдать первоначальную стоимость. По своей сути, начальное значение является ограничением для инструмента. Когда ваш дизайн синтезируется и затем отображается на части, к вашему проекту добавляется примечание, что «когда вы реализуете этот элемент памяти, присвойте ему это начальное значение». Во многих случаях добавление этого ограничения не позволяет оптимизировать элемент (удалить, объединить и т. Д.).

Предложение: Нет жесткого / быстрого / универсального правила для сброса и инициализации. Для лучшей оптимизации и использования ресурсов вы должны знать свой инструмент синтеза, а должны знать целевую технологию.

11 голосов
/ 11 апреля 2014

Существует школа мысли, которая рекламирует инициализацию сигнала вместо замены.Как правило, эти люди нацелены на ПЛИС на основе SRAM, которые гарантируют состояние при запуске.Это будет работать для этих устройств, но в целом это плохая практика.Обычная причина для этого состоит в том, чтобы уменьшить ресурсы маршрутизации и устранить класс сети, который должен соответствовать времени.В некоторых случаях это нормально, но дизайн без сброса трудно исправить, если вы хотите включить его в систему, которая действительно нуждается в сбросе.Часто этот метод используется для разработки потоков данных, которые будут самостоятельно очищать данные от мусора.Опять же, это нормально, но только для тех частей проекта, которые на самом деле самоочищаются.

В общем, вы должны использовать своего рода сброс.Я предпочитаю использовать асинхронный сброс, который запускается синхронно.Он обеспечивает следующие преимущества:

  • Вы можете контролировать инициализацию вашего устройства независимо от логики запуска в ПЛИС.

  • Вы гарантировали инициализациюдаже если часы мертвы.Это важно, если проект имеет двунаправленный ввод-вывод, и вы не хотите рисковать, если драйверы вывода будут зависать.

  • Вы можете легко перенести код в ASICесли нужно.Для реализации BIST и JTAG необходим правильный управляемый сброс.

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

  • Не все синтезаторы обращают внимание на значение инициализации.Вам придется пережить много боли, если вам придется переключиться на инструмент, который этого не делает.

  • Синхронный выпуск гарантирует, что у вас не будет ложной настройки или удержанияНарушения при выходе из перезагрузки.Это, конечно, все еще зависит от настройки правильных временных ограничений.

  • Легко забыть значение инициализации и получить значение по умолчанию, которое вам не нужно.Наличие секции сброса локально в каждом синхронном процессе / блоке удобнее в обслуживании.

Синхронные сбросы часто выводятся для введения дополнительного уровня задержки для управления сбросом.На практике это менее важно для FPGA на основе LUT, особенно для более новых семейств на основе 6-LUT от Xilinx, потому что у вас часто есть запасной вход для LUT, питающий FF, который можно использовать для синхронного сброса без введения другого уровня задержки.Я провел некоторое элементарное тестирование и обнаружил, что, по крайней мере, для простых случаев нет реального недостатка скорости по сравнению с асинхронностью.Я избегаю синхронных сбросов, потому что они не работают, когда часы не работают.

Современные ПЛИС богаты ресурсами маршрутизации и, как правило, имеют большое количество неиспользуемых глобальных сетей.Сбросы, как правило, не виновны в том, что дизайн не может быть выполнен.Если у вас есть проблемы с синхронизацией сбрасываний, маршрутизируемых на обычной матрице, попробуйте вручную создать экземпляры тактовых буферов в ваших сетях сброса, чтобы освободить ресурсы для остальной логики.Эта практика также настраивает ваш дизайн для удобной миграции ASIC.

...