Как работает симулятор
При работе на VHDL программист программирует параллельные операторы, которые выполняются на некоторой виртуальной параллельной вычислительной системе. Нижний уровень программистской модели образует архитектура виртуального процессорного элемента (ВПЭ), который исполняет один параллельный оператор, а верхний уровень - множество ВПЭ, объединенных запрограммированной системой межпроцессорных связей, по которым пересылаются сигналы.
Модель вычислителя с точки зрения программиста не может быть реализована в виде реальной многопроцессорной вычислительной системы из-за чрезмерно высоких аппаратных затрат. С другой стороны, язык VHDL разрабатывался с целью реализации в симуляторах дискретных систем. Собственно, IEEE Standard VHDL Language Reference Manual представляет собой описание синтаксиса конструкций языка и как они должны исполняться в симуляторе. Такой симулятор, как правило, реализован на однопроцессорной ЭВМ. Рассмотрим архитектуру вычислителя VHDL с точки зрения разработчика симулятора.
На рис. условно показана архитектура симулятора VHDL.
В данной модели каждый ВПЭ реализован как отдельный вычислительный процесс (ВП). Все вычислительные процессы разделяют во времени один и тот же аппаратный ресурс - центральный процессорный элемент (ЦПЭ) микропроцессора ПЭВМ.
Все ВП разделены на три подмножества - очередь спящих процессов, очередь готовых процессов и исполняемый процесс. Большинство ВП относится к числу спящих, т.е. к ВП, для исполнения которых нет готовых входных данных. Например, такой ВП ожидает какой-либо входной сигнал, из списка чувствительности его оператора wait. При поступлении сигнала этот ВП переносится в очередь готовых к исполнению ВП. Один из готовых ВП, выбранный произвольно, пересылается в кэш-ОЗУ микропроцессора для исполнения. Исполняемый ВП выполняет свои операторы в соответствии с семантикой функционирования ВПЭ на ресурсах ЦПЭ микропроцессора и алгоритмами соответствующих библиотек процедур. При достижении оператора wait ВП останавливается. Выработанные им сигналы запоминаются и пересылаются другим ВП, которые являются приемниками этих сигналов. Затем данный ВП пересылается в очередь спящих процессов.
Один особенный исполняемый ВП служит диспетчером для остальных процессов. Он называется ядром симулятора и формирует очереди спящих ВП и готовых к исполнению ВП, а также выбирает ВП для исполнения. Он также рассылает сигналы от исполняемого ВП к другим ВП. Кроме того, он ведет счетчик времени моделирования ТС, выполняет связь с консолью, обслуживает обращение к дисковой памяти и памяти глобальных переменных.
Для моделирования программист создает проект – каталог с файлами VHDL, имеющий название проекта. После компиляции в проекте создается библиотека проекта, которая имеет название проекта и содержит все скомпилированные объекты проекта. После запуска программы на моделирование сперва выполняется связывание объектов проекта и назначение начальных значений переменным и сигналам (elaboration).
Затем запускается собственно моделирование. При этом выбранные программистом сигналы записываются в отдельной области памяти в своем развитии и могут быть отображены на дисплее в виде таблиц или графиков.Для того, чтобы сохранить семантику исполнения множества параллельных процессов, такую же, как у системы из ВПЭ, в каждом цикле моделирования, кроме начального, симулятор выполняет следующие шаги:
- Каждый остановленный ВП, для которого произошло событие в предыдущем цикле моделирования, которое ожидает соответствующий оператор wait, запускается на исполнение; в ВП, остановленных для ожидания задержки проверяется окончание этой задержки и если задержка истекла, эти ВП также запускаются.
- Каждый запущенный ВП исполняется до своей остановки на операторе wait, при этом вычисляются новые значения сигналов в операторах присваивания сигналам.
- Вычисляется новое значение текущего времени ТВ как ближайший момент времени, в который будет запущен какой-либо ВП, остановленный на операторе wait ожидания окончания задержки или момент времени следующей активации источников сигнала.
- Счетчик времени принимает новое значение ТС = ТВ .
- Каждому сигналу, для которого было вычислено новое значение, присваивается это значение; эти изменения сигналов проверяются, являются ли они событиями для каких-либо ВП.
Если в следующем цикле моделирования не запускается ВП по окончанию заданной задержки или активация источников сигнала происходит без задержки, то в данном цикле счетчик времени ТС сохраняет свое прежнее значение, измеряемое в фемта- или пикосекундах. В этом случае считается, что время моделирования увеличилось на дельта-задержку.
Моделирование имеет такую особенность, что серия, включающая от нуля до нескольких циклов с дельта-задержкой сменяется одним циклом с конкретной задержкой. Обычно таких циклов в серии 0-10. Если моделируется комбинационная схема из n уровней, каждый из которых задан процессом без задержки, то будет n циклов в серии. Если программа неправильная и зацикливается, тогда циклов в серии будет значительно больше. Так, симулятор Active HDL останавливается, если циклов в цепочке более 1000.
Допустим, что в модели находятся два процесса, обменивающихся одной глобальной переменной. Тогда порядок обмена этой переменной не контролируется программистом, так как он не знает какой из этих процессов сработает первым в серии циклов с дельта-задержкой. Для того, чтобы эти процессы были запущены не в произвольном, а именно в последнем цикле с дельта-задержкой из серии циклов, причем после всех процессов, то такие процессы обозначаются как отложенные, т.е. в программе перед словом process ставится ключевое слово postponed.
При составлении VHDL-программ желательно иметь в виду следующее.
- Даже небольшой процесс занимает в памяти несколько килобайт. А максимальное количество процессов в скомпилированной программе определяется объемом динамической памяти компьютера.
- Смена одного ВП другим ВП представляет собой смену контекста в работе ЦПЭ, которая может длиться несколько тысяч тактов. Следовательно, чем меньше процессов и вообще - параллельных операторов - тем быстрее моделирование.
- Наибольшую долю времени занимает исполнение ВП ядра симулятора, которая возрастает нелинейно с увеличением числа ВП и числа сигналов в списках чувствительности их операторов wait. Поэтому опять же, чем меньше процессов в откомпилированной программе и сигналов в списках чувствительности - тем быстрее выполняется эта программа в симуляторе.
- Не следует программировать процесс без оператора wait (или без списка чувствительности), т.к. после того, как этот процесс станет активным, он монопольно захватит ресурсы ЦПЭ.
Насколько важно следовать этим рекомендациям? Это дело вкуса. В одной из первых моих VHDL- моделей я вставил модель ПЗУ в виде:
А(0) …А(4095)
И долго удивлялся, почему инициализация модели длилась несколько минут, а модель такого простенького ПЗУ занимала в памяти больше 6 Мбайт. Понимание пришло, когда узнал, что каждой такой строчке соответствует отдельный ВП. При замене массива-сигнала на массив- переменную моделирование существенно ускорилось, а модель ПЗУ стала занимать 0,6 Мбайт. А когда ПЗУ было закодировано константой, то место в ОЗУ для его модели уменьшилось до 0,13 Мбайт и соответственно, ускорилось моделирование.