Различия между тем, как симулятор и синтезатор обрабатывают код VHDL

В недавнем вопросе (Разница в инициализации состояния машина между симулятором и синтезатором) Я обнаружил, что симуляторы и синтезаторы не всегда одинаково обрабатывают код VHDL. Например, при инициализации конечного автомата с использованием перечисляемого типа симулятор по умолчанию использует левое значение перечислителя; тем не менее, это не кажется настолько ясным, что касается значения, которое синтезатор использует по умолчанию.

Будучи относительно новым для VHDL и FPGA, я задумался о том, есть ли между ними другие различия, о которых было бы полезно знать. Кто-нибудь знает о каких-либо таких различиях, которые они разделяли бы? Даже ссылки на другие места, объясняющие такие различия, были бы полезны.

Спасибо


person Ron    schedule 22.05.2018    source источник
comment
Этот вопрос лучше подходит для electronics.stackexchange.com.   -  person scary_jeff    schedule 22.05.2018
comment
С одной стороны, вы можете описать поведение, которое невозможно синтезировать. С другой стороны, вы можете написать код, который синтезирует, но имеет другое поведение в моделировании, потому что конструкции используемых языков игнорируются при синтезе. Вы можете написать код, который работает в симуляции, но не может быть сопоставлен с вашим базовым оборудованием. Во всех этих случаях вы создаете несоответствие между моделью синтеза и имитационной моделью.   -  person Paebbels    schedule 22.05.2018
comment
Для перечислимых типов: вы можете заставить синтез использовать двоичное кодирование. Обычно вы хотите, чтобы синтез распознавал специальный шаблон конечного автомата и обрабатывал описание как автомат. Кроме того, вы хотите, чтобы синтез анализировал и оптимизировал FSM. И вы хотите, чтобы он выбрал оптимальную реализацию для вашего FSM. Таким образом, синтез решит, какую кодировку использовать: двоичную, последовательную, быструю, код Грея, код Джонсона, код пользователя. Да, с последней опцией вы можете указать собственную кодировку.   -  person Paebbels    schedule 22.05.2018
comment
Этот вопрос слишком широк: на этот вопрос нет общего ответа. Это вопрос чтения #$#%@ руководства. Каждый поставщик инструментов синтеза определяет свой набор конструкций синтеза, которые они описывают в руководстве пользователя. Возможны и другие конструкции, но вы действительно должны следовать руководству, чтобы быть уверенным, что получите то, что хотите (и даже это иногда может не сработать).   -  person JHBonarius    schedule 23.05.2018


Ответы (1)


Я пришел из Verilog, но применяются примерно те же правила.

1/ Не используйте инициализацию, используйте сброс.
2/ Не используйте список чувствительности. Используйте всегда @( * ) или always_comb
Я не знаю эквивалента этого VHDL, но полагаю, что кто-нибудь скоро укажет на это в комментарии ;-)
3/ Никогда не предполагайте, всегда знайте, какая логика будет сгенерирована. Если вы не уверены, используйте другую языковую конструкцию или узнайте.
4/ Будьте суетливы, дотошны, точны, чрезмерно упорядочены, лучшее описание: будьте анальными!

Кстати, я следил за упомянутым постом и был несколько ошарашен. Я буду честен: мне не нравится VHDL по многим причинам, и я думал, что единственным преимуществом этого является то, что подобные ошибки невозможны из-за жесткой проверки типа и длины вектора. Очевидно, что нет, так что единственная оставшаяся причина для использования VHDL для меня не актуальна.

person Oldfart    schedule 22.05.2018
comment
На самом деле, поскольку all в списке чувствительности не был реализован до VHDL-2008, некоторые инструменты (например, Xilinx ISE 14.7, необходимая для всех FPGA до 7-й серии) по-прежнему не поддерживают его. Таким образом, список конфиденциальности по-прежнему требуется для переносимости. - person JHBonarius; 22.05.2018
comment
Я также был удивлен, обнаружив, что многие инициализации являются фактически синтезируемыми (не блок initial, а инициализация регистров/сигналов). - person Eugene Sh.; 22.05.2018
comment
@ЕвгенийШ. Да, но вы можете прочитать о проблемах здесь: stackoverflow.com/questions/48915064/. Опытные HDL-программисты посоветуют вам избегать этого, если это возможно. Вместо этого используйте сброс. - person Oldfart; 22.05.2018
comment
Я считаю себя достаточно опытным программистом VHDL (более 10 лет опыта работы в промышленности: Philips, ASML, NXP, Bosch) и постоянно использую инициализацию. Он работает как с Intel Altera, так и с Xilinx. Единственные проблемы, о которых я слышал, пришли из мира ASIC. - person JHBonarius; 23.05.2018
comment
Я также являюсь опытным разработчиком VHDL и настоятельно рекомендую использовать значения инициализации для регистров, если целевая технология поддерживает это. - person Juergen; 23.05.2018