- 11.1 Выполнение модели
- 11.2 Моделирование событий
- 11.3 Стратифицированная очередь событий
- 11.4 Эталонная модель моделирования Verilog
- 11.4.1 Детерминизм
- 11.4.2 Недетерминизм
- 11.5 Условия гонки
- 11.6 Планирование выполнения назначений
- 11.6.1 Непрерывное назначение
- 11.6.2 Процедурное непрерывное назначение
- 11.6.3 Блокирующие назначения
- 11.6.4 Неблокирующее назначение
- 11.6.5 Обработка переключателей (транзисторов)
- 11.6.6 Соединения портов
- 11.6.7 Функции и задачи

11.1 Выполнение модели
В остальных пунктах настоящего стандарта описывается поведение каждого из элементов языка. В данном пункте дается обзор взаимодействия между этими элементами, особенно в отношении планирования и выполнения событий.
Элементы, составляющие Verilog HDL, могут быть использованы для описания поведения электронного оборудования на различных уровнях абстракции. HDL должен быть параллельным языком программирования. Выполнение определенных конструкций языка определяется параллельным выполнением блоков или процессов. Важно понимать, какой порядок выполнения гарантирован пользователю, а какой является неопределенным.
Хотя Verilog HDL используется не только для моделирования. Семантика языка определена для моделирования, а все остальное абстрагировано от этого базового определения.
11.2 Моделирование событий
Verilog HDL определяется в терминах дискретно-событийной модели выполнения. Дискретно-событийное моделирование описано более подробно в этом подпункте, чтобы обеспечить контекст для описания значения и допустимой интерпретации конструкций Verilog HDL. Эти результирующие определения обеспечивают стандартную эталонную модель Verilog моделирования, которую должны реализовывать все совместимые симуляторы. Тем не менее, в последующих определениях имеется большой выбор, и следует ожидать различий в некоторых деталях выполнения между разными симуляторами. Кроме того, симуляторы Verilog HDL могут свободно использовать алгоритмы, отличные от описанных в этом пункте. При условии, что видимый пользователю эффект соответствует эталонной модели.
Проект состоит из связанных потоков выполнения или процессов. Процессы — это объекты, которые могут быть оценены, которые могут иметь состояние и которые могут реагировать на изменения своих входов для получения выходов. Процессы включают primitive, module, initial и always процедурные блоки, непрерывные назначения, асинхронные задачи и процедурные операторы назначения.
Каждое изменение значения сети или переменной в моделируемой цепи, как и названное событие, считается событием обновления.
Процессы чувствительны к событиям обновления. Когда выполняется событие обновления, все процессы, чувствительные к этому событию, оцениваются в произвольном порядке. Оценка процесса также является событием, известным как событие оценки.
Помимо событий, еще одним ключевым аспектом симулятора является время. Термин «время моделирования» используется для обозначения значения времени, поддерживаемого симулятором для моделирования фактического времени, которое потребуется для моделируемой схемы. В данном пункте термин время используется как взаимозаменяемый с термином время моделирования.
События могут происходить в разное время. Чтобы отслеживать события и убедиться, что они обрабатываются в правильном порядке, события хранятся в очереди событий(stack), упорядоченной по времени моделирования. Помещение события в очередь называется планированием события.
11.3 Стратифицированная очередь событий
Очередь событий Verilog логически разделена на пять различных областей. События добавляются в любой из пяти областей, но удаляются только из активного областей.
1) Активные события происходят в текущее время моделирования и могут обрабатываться в любом порядке.
2) Неактивные события происходят в текущее время моделирования, но обрабатываются после обработки всех активных событий.
3) Неблокирующие события обновления назначения были оценены в течение некоторого предыдущего времени моделирования, но должны быть назначены в это время моделирования после обработки всех активных и неактивных событий.
4) События мониторинга(отслеживания) должны обрабатываться после обработки всех событий обновления активных, неактивных и неблокирующих назначений.
5) Будущие события происходят в некоторое будущее время моделирования. Будущие события делятся на будущие неактивные события и будущие неблокирующие события обновления назначений.
Обработка всех активных событий называется циклом моделирования.
Свобода выбора любого активного события для немедленной обработки является существенным источником недетерминизма в Verilog HDL.
Явная нулевая задержка (#0) требует, чтобы процесс был приостановлен и добавлен, как неактивное событие для текущего времени, чтобы процесс был возобновлен в следующем цикле моделирования в текущем времени.
Неблокирующее назначение (см. 9.2.2) создает неблокирующее событие обновления назначения, запланированное на текущее или более позднее время моделирования.
Системные задачи $monitor и $strobe (см. 17.1) создают события монитора для своих аргументов. Эти события постоянно включаются заново на каждом последующем временном шаге. Мониторные события уникальны тем, что они не могут создавать никаких других событий.
Процедуры обратного вызова, запланированные с помощью процедур PLI, таких как vpi_register_cb(cbReadWriteSynch) (см. VPI(27.33)), должны рассматриваться как неактивные события.
11.4 Эталонная модель моделирования Verilog
while (есть события) {
if (нет активных событий) {
if (есть неактивные события) ) {
активировать все неактивные события;
} else if (существуют неблокирующие события обновления назначения) {
активировать все неблокирующие события обновления назначения;
} else if (есть события мониторинга) {
активировать все события $monitor;
} else {
перевести T на следующее время события;
активировать все неактивные события на время T;
}
}
E = любое активное событие;
if (E - событие обновления) {
обновить измененный объект;
добавлять события оценки для чувствительных процессов в очередь событий;
} else { /* должно быть событием оценки */
оцените процесс;
добавлять события обновления в очередь событий;
}
}
11.4.1 Детерминизм
Этот стандарт гарантирует определенный порядок планирования:
- Объявления внутри initial блока должны выполняться в том порядке, в котором они появляются initial блоке. Выполнение утверждений в конкретном блоке begin-end может быть приостановлено в пользу других процессов в модели. Однако, ни в коем случае утверждения в блоке begin-end не должны выполняться в порядке, отличном от того, в котором они появляются в источнике.
- Неблокирующие присваивания должны выполняться в порядке выполнения операторов (см. 9.2.2). Рассмотрим следующий пример:
initial begin
a <= 0;
a <= 1;
end
Когда этот блок будет выполнен, в неблокирующую очередь обновления назначений будут добавлены два события. Предыдущее правило требует, чтобы они были внесены в очередь в порядке источника. Это правило требует, чтобы они были взяты из очереди и выполнены также в порядке источника. Следовательно, в конце времени моделирования переменной a будет присвоен 0, а затем 1.
11.4.2 Недетерминизм
Одним из источников недетерминизма является тот факт, что активные события могут быть сняты с очереди и обработаны в любом порядке. Другим источником недетерминизма является то, что объявление без конструкций контроля времени в поведенческих блоках не обязательно должны выполняться как одно событие. Объявления с контролем времени — это конструкции #-выражение и @-выражение (см. 9.7). В любой момент во время оценки поведенческого объявления симулятор может приостановить выполнение и поместить частично завершенное событие, как ожидающее активное событие в очередь событий. Это позволяет чередовать выполнение процессов, хотя порядок чередующегося выполнения недетерминирован и не контролируется пользователем.
11.5 Условия гонки
assign p = q;
initial begin
q = 1;
#1 q = 0;
$display(p);
end
Симулятор правильно отображает либо 1, либо 0. Присвоение 0 значению q позволяет обновить событие для p. Симулятор может либо продолжить и выполнить задачу $display, либо выполнить обновление для p, после чего выполнить задачу $display.
11.6 Планирование выполнения назначений
Назначения переводятся в процессы и события, как описано в пунктах 11.6.1 — 11.6.7.
11.6.1 Непрерывное назначение
Объявления непрерывное назначения (пункт 6) соответствует процессу, чувствительному к исходным элементам в выражении. Когда значение выражения изменяется, это вызывает добавление активного события обновления в очередь событий, используя текущие значения для определения цели. Процесс непрерывного присваивания также оценивается в момент времени 0, чтобы обеспечить распространение постоянных значений. Сюда входят неявные непрерывные назначения (см. 11.6.6).
11.6.2 Процедурное непрерывное назначение
Процедурное непрерывное назначение(которым является оператор assign или force; см. 9.3) соответствует процессу, который чувствителен к исходным элементам в выражении. Когда значение выражения изменяется, оно вызывает активное событие обновления, которое добавляется в очередь событий, используя текущие значения для определения цели.
Заявление deassign или release деактивирует любое соответствующее заявление assign или force.
11.6.3 Блокирующие назначения
Блокирующий оператор присваивания (см. 9.2.1) с задержкой вычисляет значение правой части, используя текущие значения, затем вызывает приостановку выполняющегося процесса и его планирование как будущего события. Если задержка равна 0, процесс планируется как неактивное событие на текущее время.
Когда процесс возвращается (или возвращается немедленно, если задержка не указана), процесс выполняет присвоение левой части и включает любые события, основанные на обновлении левой части. Значения на момент возобновления процесса используются для определения цели (целей). Затем выполнение может быть продолжено следующим последовательным оператором или другими активными событиями.
11.6.4 Неблокирующее назначение
Неблокирующий оператор назначение(см. 9.2.2) всегда вычисляет обновленное значение и планирует обновление как неблокирующее событие обновления assign, либо на этом временном шаге, если задержка равна нулю, либо как будущее событие, если задержка ненулевая. Значения, действующие на момент помещения обновления в очередь событий, используются для вычисления как правого значения, так и левой цели.
11.6.5 Обработка переключателей (транзисторов)
Алгоритм событийно-ориентированного моделирования, описанный в 11.4, зависит от однонаправленного потока сигналов и может обрабатывать каждое событие независимо. Входы считываются, результат вычисляется, и запланировано обновление.
Verilog HDL обеспечивает моделирование на уровне коммутаторов(переключателей) в дополнение к моделированию поведения и уровня вентилей. Коммутаторы обеспечивают двунаправленный поток сигналов и требуют согласованной обработки узлов, соединенных коммутаторами(переключателей).
Исходные элементы Verilog HDL, моделирующие переключатели, представляют собой различные формы транзисторов, называемые tran, tranif0, tranif1, rtran, rtranif0 и rtranif1.
Обработка коммутатора должна учитывать все устройства в двунаправленной сети, связанной с коммутатором, прежде чем она сможет определить соответствующее значение для любого узла сети, поскольку входы и выходы взаимодействуют. Симулятор может сделать это, используя технику релаксации. Симулятор может обрабатывать tran в любое время. Он может обрабатывать подмножество tran-связанных событий в определенное время, смешивая выполнение других активных событий.
Дальнейшее уточнение требуется, когда некоторые транзисторы имеют значение вентиля x. Концептуально простая техника заключается в многократном решении сети с этими транзисторами, установленными во всех возможных комбинациях полностью проводящих и непроводящих транзисторов. Любой узел, который имеет уникальный логический уровень во всех случаях, имеет устойчивый отклик, равный этому уровню. Все остальные узлы имеют установившийся отклик x.
11.6.6 Соединения портов
Порты соединяют процессы посредством неявных непрерывных объявлений о назначении или неявных двунаправленных соединений. Двунаправленные соединения аналогичны всегда включенному tran-соединению между двумя сетками, но без снижения прочности. Правила соединения портов требуют, чтобы приемник значения был сетью или выражением структурной сети.
Порты всегда можно представить в виде объявленных объектов, соединенных следующим образом:
- Если входной порт, то непрерывное назначение от внешнего выражения к локальной (входной) сети
- Если выходной порт, то непрерывное назначение от локального выходного выражения к внешней сети
- Если вход-выход, то транзистор без понижающего напряжения, соединяющий локальную сеть с внешней сетью
Порты примитивов отличаются от портов модуля. Порты вывода и ввода примитивов должны быть подключены непосредственно к 1-битным сеткам или 1-битным структурным сетевым(проводам) выражениям (см. 12.3.9.2), без вмешательства процесса, который мог бы изменить силу. Изменения от оценок примитивов планируются как активные события обновления на подключенных сетках. Входные порты, подключенные к 1-битовым сеткам или 1-битовым структурным сетевым выражениям, также подключаются напрямую, без каких-либо промежуточных процессов, которые могли бы повлиять на силу. Входные порты, подключенные к другим видам выражений, представляются как неявные непрерывные присваивания от выражения к неявной сети, подключенной к входному порты.
11.6.7 Функции и задачи
Передача аргументов задачи или функции осуществляется по значению, копирование происходит при вызове и копирование при возврате. Функция копирования при возврате ведет себя так же, как и любое блокирующее назначения.