Использование списков чувствительности в процессах VHDL для надежного RTL-проектирования
В производственном VHDL процессы обычно управляются списком чувствительности, а не операторами Хотя При написании кода для симулятора я всегда полагаюсь на операторы Синтаксис процесса со списком чувствительности: Обратите внимание: каждый сигнал, считываемый внутри процесса, должен присутствовать в списке. Компилятор VHDL не выдаст предупреждение об отсутствующем сигнале, но его пропуск изменит поведение после синтеза. VHDL-2008 ввел ключевое слово В сопровождающем видеоуроке мы разбираем создание процесса, использующего список чувствительности. Итоговый фрагмент VHDL из этого урока: Запуск этого тестбенча в ModelSim дает: Вывод консоли демонстрирует, что процесс с На практике списки чувствительности являются де-факто стандартом для синтезируемого RTL. Они обеспечивают понятную семантику, позволяют инструментам синтеза генерировать корректное оборудование и избегают двусмысленностей, которые могут вводить операторы Переходите к следующему уроку здесь.wait. Список чувствительности перечисляет все сигналы, изменение которых должно пробудить процесс.wait on и wait until удобны для симуляции, они редко используются в синтезируемом RTL. При синтезе оператор wait часто игнорируется, что приводит к непредсказуемому оборудованию. Наоборот, список чувствительности напрямую отображается в комбинационный или синхронный по такту блок, который инструменты синтеза могут реализовать надежно.Базовые уроки VHDL – Чувствительность процесса
wait для управления временем. Для любого дизайна, который будет синтезирован в кремний, я полностью избегаю wait и использую списки чувствительности. process( signal1, signal2, ... ) is begin -- основная логика здесь end process;
all для автоматического включения всех считываемых сигналов, например process(all). Однако большинство коммерческих синтезаторов до сих пор не поддерживают эту возможность.Упражнение
entity T09_SensitivityListTb is end entity; architecture sim of T09_SensitivityListTb is signal CountUp : integer := 0; signal CountDown : integer := 10; begin process is begin CountUp <= CountUp + 1; CountDown <= CountDown - 1; wait for 10 ns; end process; -- Процесс, запускаемый через Wait On process is begin if CountUp = CountDown then report "Process A: Jackpot!"; end if; wait on CountUp, CountDown; end process; -- Эквивалентный процесс с использованием списка чувствительности process(CountUp, CountDown) is begin if CountUp = CountDown then report "Process B: Jackpot!"; end if; end process; end architecture;
VSIM 2> run # ** Note: Process A: Jackpot! # Time: 40 ns Iteration: 1 Instance: /t09_sensitivitylisttb # ** Note: Process B: Jackpot! # Time: 40 ns Iteration: 1 Instance: /t09_sensitivitylisttb
Анализ
wait on и процесс со списком чувствительности срабатывают при идентичных условиях. Эта эквивалентность верна, потому что список чувствительности неявно ведет себя как wait on, помещенный в конец процесса.wait.
Ключевые выводы
wait on.wait только для кода симуляции; для синтезируемого RTL применяйте списки чувствительности.
VHDL
- Создание списков строк в VHDL: лучшие практики и пример
- Создание Tcl-управляемого тестбенча для VHDL-модуля кодового замка
- Реализация PWM-контроллера в VHDL: проектирование, симуляция и FPGA-демо
- Проектирование надежного кольцевого буфера FIFO на VHDL в блочной ОЗУ
- Как создать самопроверяющийся тестбенч в VHDL — практическое руководство
- Реализация динамического связного списка в VHDL с защищенными типами и указателями доступа
- Использование внутрипроцессных процедур для более чистого проектирования FSM на VHDL
- Использование нечистых функций в VHDL: повышение читаемости и поддерживаемости FSM
- Освоение функций VHDL: практическое руководство по эффективному дизайну
- Проектирование конечного автомата в VHDL: практический пример светофора