15. Skew, period, width и nochange Verilog HDL

Проверка синхронизации сигнала
Содержание

15.3 Проверка синхронизации тактовых и управляющих сигналов

В этом подпункте рассматриваются следующие проверки синхронизации:
$skew $timeskew $fullskew $period $width $nochange

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

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

Проверка смещения(расфазировка) сигнала имеет два различных механизма обнаружения нарушений: на основе событий и на основе таймера. Проверка смещения на основе событий выполняется только при переходе сигнала, а проверка перекоса на основе таймера происходит, как только истекает время моделирования, равное пределу перекоса.

Проверка $nochange включает в себя три события, а не два.

15.3.1 $skew

$skew — функция, которая проверяет смещение сигналов. $skew является ужатой функцией относительно $timeskew и $fullskew.

Синтаксис проверки синхронизации $skew показан в Синтаксисе 15-9.

$skew_timing_check ::= $skew ( reference_event , data_event , timing_check_limit [ , [ notifier ] ] ) ; data_event ::= timing_check_event reference_event ::= timing_check_event timing_check_limit ::= expression
Синтаксис 15-9 — Синтаксис для $skew

В таблице 15-7 определена проверка синхронизации $skew.

Таблица 15-7 — $skew аргументы
АргументОписание
reference_event(событие отсчета)Временная метка события(Timestamp)
data_event(событие данных)Событие проверки времени(Timecheck)
limit(ограничение)Неотрицательное константное выражение
нотификатор (необязательно)Регистр

Проверка синхронизации $skew сообщает о нарушении в следующем случае:

(время проверки) — (время временной метки) > предел

Одновременные переходы по сигналу отсчета и данных не должны вызывать сообщение $skew о нарушении синхронизации, даже если предельное значение перекоса равно нулю.

Проверка синхронизации $skew основана на событиях. Она оценивается только после события данных. Если событие данных никогда не наступает (т.е. событие данных бесконечно запаздывает), проверка $skew никогда не будет оценена, и о нарушении синхронизации никогда не будет сообщено. Напротив, проверки $timeskew и $fullskew по умолчанию основаны на таймере, и их следует использовать, если сообщения о нарушении абсолютно необходимы, а событие данных может быть очень поздним или вообще отсутствовать. Эти проверки обсуждаются в разделах 15.3.2 и 15.3.3.

После обнаружения события отсчета $skew будет бесконечно долго ждать события данных и не сообщит о нарушении синхронизации, пока не произойдет событие данных. Второе последовательное событие ссылки отменяет старое ожидание события данных и начинает новое.

После события отсчета проверка синхронизации $skew никогда не должна прекращать проверку событий данных на нарушение синхронизации. $skew сообщает о нарушении временных рамок для всех событий данных, происходящих за пределом после события отсчета.

15.3.2 $timeskew

$timeskew — функция, которая проверяет смещение сигналов. $timeskew является расширенной функцией относительно $skew.

Синтаксис для $timeskew показан в Синтаксисе 15-10.

Синтаксис 15-10 — Синтаксис для $timeskew
$timeskew_timing_check ::= $timeskew ( reference_event , data_event , timing_check_limit [ , [ notifier ] [ , [ event_based_flag ] [ , [ remain_active_flag ] ] ] ] ) ; data_event ::= timing_check_event event_based_flag ::= constant_expression reference_event ::= timing_check_event remain_active_flag ::= constant_expression timing_check_limit ::= expression

В таблице 15-8 определены аргументы проверки синхронизации $timeskew.

Таблица 15-8 — $timeskew аргументы
АргументОписание
reference_event (событие отсчета)Временная метка события (Timestamp)
data_event (событие данных)Событие проверки времени (Timecheck)
limit (ограничение)Неотрицательное константное выражение
нотификатор (необязательно)Регистр
event_based_flag (необязательно)Константное выражение
remain_active_flag (необязательно)Константное выражение

Проверка времени $timeskew сообщает о нарушении только в следующем случае:

(время проверки) — (время временной метки) > предел

Одновременные переходы по сигналу отсчета и данных не должны вызывать сообщение $timeskew о нарушении синхронизации, даже если предельное значение перекоса равно нулю. $timeskew также не должен сообщать о нарушении, если новое событие временной метки происходит точно по истечении лимита времени.

Поведение по умолчанию для $timeskew основано на таймере. О нарушении сообщается немедленно по истечении времени после события отсчета, равного пределу, и проверка переходит в режим покоя и больше не сообщает о нарушениях (даже в ответ на события данных) до следующего события отсчета. Однако, если событие данных происходит в пределах limit, то о нарушении не сообщается, и проверка немедленно переходит в спящий режим. Эта проверка также должна стать неактивной, если она обнаружит обусловленное событие отсчета, когда ее условие ложно и флаг remain_active_flag не установлен.

Поведение проверки $timeskew по умолчанию, основанное на таймере, может быть изменено на основанное на событиях с помощью флага event_based_flag. Она ведет себя как $skew, когда установлены и флаг event_based_flag, и флаг remain_active_flag. Проверка $timeskew ведет себя как $skew, когда установлен только флаг event_based_flag, за исключением того, что она становится неактивной после сообщения о первом нарушении или если она обнаруживает обусловленное событие отсчета, когда ее условие ложно.

Например:

$timeskew (posedge CP &&& MODE, negedge CPN, 50,, event_based_flag, remain_active_flag);
Рисунок 15-1 - Пример $timeskew в Verilog HDL
Рисунок 15-1 — Пример $timeskew

Случай 1: флаг event_based_flag не установлен, флаг remain_active_flag не установлен.

После первого события отсчета на CP в A, как только пройдет 50 единиц времени, в B будет сообщено о нарушении, в результате чего проверка $timeskew станет неактивной, и дальнейшие нарушения не будут сообщаться.

Случай 2: флаг event_based_flag установлен, флаг remain_active_flag не установлен.

После первого события отсчета на CP в точке A отрицательный переход на CPN в точке C вызывает нарушение синхронизации, что делает проверку $timeskew неактивной, и дальнейшие нарушения не регистрируются. Второе событие отсчета в точке F происходит, когда MODE является ложным. Поэтому проверка $timeskew остается неактивной.

Случай 3: установлен флаг, основанный на событиях, установлен флаг remain_active_flag.

После первого события отсчета на CP в точке A первые три отрицательных перехода на CPN в точках C, D и E приводят к нарушению синхронизации. Второе событие отсчета в точке F происходит, когда MODE ложно, но поскольку установлен флаг remain_active_flag, проверка $timeskew остается активной. Поэтому сообщается о дополнительных нарушениях в точках G, H, I и J. Другими словами, все отрицательные переходы на CPN вызывают нарушения, что идентично поведению $timeskew.

Случай 4: флаг event_based_flag не установлен, флаг remain_active_flag установлен.

Для формы сигнала, изображенной в таблице 15-1, $timeskew имеет такое же поведение в примере 4, как и в примере 1. Разница между этими двумя случаями иллюстрируется формой сигнала на рисунке 15-2.

Рисунок 15-2 - Пример $timeskew с установленным флагом remain_active_flag в Verilog HDL
Рисунок 15-2 — Пример $timeskew с установленным флагом remain_active_flag

Хотя событие ссылки на CP в F происходит, когда MODE ложно, оно не переводит проверку $timeskew в спящий режим, поскольку флаг remain_active_flag установлен. Следовательно, в момент времени B будет зафиксировано нарушение, тогда как в случае 1, где флаг remain_active_flag не установлен. Проверка $timeskew перейдет в спящий режим в F, и нарушение не будет зафиксировано.

15.3.3 $fullskew

$fullskew — функция, которая проверяет смещение сигналов. $fullskew является расширенной функцией относительно $timeskew и $skew.

Синтаксис для $fullskew показан в Синтаксисе 15-11.

$fullskew_timing_check ::= $fullskew ( reference_event , data_event , timing_check_limit , timing_check_limit [ , [ notifier ] [ , [ event_based_flag ] [ , [ remain_active_flag ] ] ] ] ) ; data_event ::= timing_check_event event_based_flag ::= constant_expression reference_event ::= timing_check_event remain_active_flag ::= constant_expression timing_check_limit ::= expression
Синтаксис 15-11 — Синтаксис для $fullskew

В таблице 15-9 определены аргументы проверки синхронизации $fullskew.

Таблица 15-9 — $fullskew аргументы
АргументОписание
reference_event(событие отсчета)Временная метка или событие проверки времени (timestamp или timecheck)
data_event(событие данных)Временная метка или событие проверки времени (timestamp или timecheck)
timing_check_limit (предел 1)Неотрицательное константное выражение
timing_check_limit (предел 2)Неотрицательное константное выражение
нотификатор (необязательно)Регистр
event_based_flag (необязательно)Константное выражение
remain_active_flag (необязательно)Константное выражение

$fullskew аналогичен $timeskew, за исключением того, что события отсчета и данных могут переходить в любом порядке. Первое ограничение(timing_check_limit, предел 1) — это максимальное время, на которое событие данных должно следовать за событием отсчета. Второе ограничение(timing_check_limit, предел 2) — это максимальное время, в течение которого событие ссылки должно следовать за событием данных.

Событие отсчета- это событие временной метки, а событие данных — это событие проверки времени, когда событие отсчета предшествует событию данных. Событие данных — это событие метки времени, а событие отсчета — это событие проверки времени, когда событие данных предшествует событию отсчета.

Проверка синхронизации $fullskew сообщает о нарушении только в следующем случае, когда limit установлен в limit1 при первом переходе события отсчета и установлен в limit2 при первом переходе события данных:

(время проверки) — (время временной метки) > предел

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

Поведение по умолчанию для $fullskew основано на таймере (флаг event_based_flag не установлен). О нарушении будет сообщено сразу по истечении лимита времени после события временной метки, если за это время не произойдет событие проверки времени, что переводит проверку времени в спящий режим. Однако, если событие проверки времени происходит в течение этого времени, то о нарушении не сообщается, и проверка времени немедленно переходит в спящий режим.

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

В режиме, основанном на таймере, второе событие временной метки, происходящее в пределах временного лимита, начинает новое временное окно, которое заменяет первое, если только второе событие временной метки не имеет связанного с ним условия, значение которого равно false. В этом случае поведение $fullskew зависит от флага remain_active_flag. Если флаг установлен, то второе событие временной метки просто игнорируется. Если флаг не установлен и если проверка времени активна, то проверка времени переходит в спящий режим.

Стандартное поведение проверки $fullskew, основанное на таймере, может быть изменено на основанное на событии с помощью флага event_based_flag. В этом режиме $fullskew похож на $skew тем, что о нарушении сообщается не по истечении лимита времени после события временной метки (как в режиме, основанном на таймере), а если событие проверки времени происходит после лимита времени. Такое событие завершает первое временное окно и немедленно начинает новое временное окно, где оно действует как событие временной метки нового окна. Событие проверки времени в пределах временного лимита завершает временное окно и переводит проверку времени в спящий режим, и о нарушении не сообщается.

В режиме, основанном на событиях, второе событие временной метки, произошедшее до того, как произошло событие проверки времени, начинает новое временное окно, которое заменяет первое, если только второе событие временной метки не имеет связанного с ним условия, значение которого равно false. В этом случае поведение $fullskew зависит от флага remain_active_flag. Если флаг установлен, то второе событие временной метки просто игнорируется. Если флаг не установлен и если проверка времени активна, то проверка времени переходит в спящий режим.

В режимах на основе таймера и на основе события, если событие метки времени не имеет условия или имеет истинное условие и если проверка времени находится в спящем режиме, то проверка времени активируется.

Например:

$fullskew (posedge CP &&& MODE, negedge CPN, 50, 70,, event_based_flag, remain_active_flag);
Рисунок 15-3 - Пример $fullskew в Verilog HDL
Рисунок 15-3 — Пример $fullskew

Случай 1: флаг event_based_flag не установлен.

Переход в A по CP, пока MODE истина, начинает ожидание отрицательного перехода по CPN, и как только проходит период времени, равный 50 единицам времени, в B сообщается о нарушении. Это сбрасывает проверку и готовит ее к следующему активному переходу.

Далее в точке C происходит отрицательный переход на CPN, и начинается ожидание положительного перехода на CP, пока MODE истинно. В точке D прошло время, равное 70 единицам времени, без положительного фронта на CP, пока MODE истинен. Поэтому сообщается о нарушении, и проверка снова сбрасывается в ожидании следующего активного перехода.

Переход на CPN в точке E также приводит к нарушению синхронизации, как и переход в точке F, поскольку, хотя CP переходит, MODE уже не истинен. Переходы в точках G и H также приводят к нарушению синхронизации, но не переход в точке I, поскольку за ним следует положительный переход на CP, а MODE истинен.

Случай 2: установлен флаг, основанный на событиях (event_based_flag).

Переход в A CP, когда MODE равен true, начинает ожидание отрицательного перехода на CPN, и в C на CPN регистрируется нарушение, поскольку оно происходит за пределом 50 единиц времени. Этот переход в точке C также начинает ожидание 70 единиц времени для положительного перехода на CP, пока MODE истинен. Но для переходов на CPN в точках C-H нет положительного перехода на CP, пока MODE истинен. Поэтому о нарушениях синхронизации не сообщается. Переход в I на CPN начинает ожидание в 70 единиц времени, которое удовлетворяется положительным переходом на CP в J, пока MODE истинен.

Хотя форма сигнала в этом конкретном примере не показывает роль флага remain_active_flag, следует признать, что этот флаг играет важную роль в определении поведения временной проверки $fullskew, так же как и для временной проверки $timeskew.

15.3.4 $width

$width — функция, осуществляющая контроль времени ширины импульсов сигнала, измеряя время от события отсчета(timestamp) до события данных(timecheck). Поскольку событие данных не передается в $width, оно получается из события отсчета следующим образом:

событие данных = сигнал события отсчета с противоположным фронтом

Синтаксис проверки синхронизации $width показан в Синтаксис 15-12.

$width_timing_check ::= $width ( controlled_reference_event , timing_check_limit[ , threshold [ , notifier ] ] ) ; controlled_reference_event ::= controlled_timing_check_event threshold ::= constant_expression timing_check_limit ::= expression
Синтаксис 15-12 — Синтаксис для $width

В таблице 15-10 определена проверка синхронизации $width.

Таблица 15-10 — $width аргументы
АргументОписание
reference_event(событие отсчета)Временная метка фронта срабатывания события (Timestamp)
(data_event(события данных) — неявный)Событие срабатывания фронта проверки времени (Timecheck)
limit(ограничение, предел)Неотрицательное константное выражение
threshold(порог) (необязательно)Неотрицательное константное выражение
нотификатор (необязательно)Регистр

Из-за способа получения события данных для $width, в качестве события отсчета должно быть передано событие, срабатывающее по фронту. Если событие отсчета не является спецификацией фронта, произойдет ошибка компиляции.

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

порог < (время проверки) — (время метки времени) < предел

Ширина импульса должна быть больше или равна пределу, чтобы избежать нарушения синхронизации, но о нарушении не сообщается для глюков меньше порога.

Аргумент порога должен быть включен, если требуется аргумент нотификатора. Допускается не указывать аргументы порога и нотификатора, при этом значение по умолчанию для порога будет равно нулю. Если присутствует нотификатор, то значение порога также должно быть не нулевым. Вот правильная проверка $width, когда нотификатор требуется, а порог — нет:
$width (posedge clk, 6, 0, ntfr_reg);

Событие данных и отсчета никогда не должны происходить в одно и то же время моделирования, поскольку эти события вызываются противоположными переходами.

Например:

Следующий пример демонстрирует некоторые примеры правильных и неправильных вызовов:
// Правильные Вызовы $width ( negedge clr, lim ); $width ( negedge clr, lim, thresh, notif ); $width ( negedge clr, lim, 0, notif ); // Неправильные Вызовы $width ( negedge clr, lim, , notif ); $width ( negedge clr, lim, notif );

15.3.5 $period

$period — это функция, которая проверяет период сигнала. Поскольку событие данных не передается в качестве аргумента в $period, оно получается из события отсчета следующим образом:

событие данных = сигнал отсчета события с тем же фронтом

Синтаксис проверки времени $period показан в Синтаксисе 15-13.

$period_timing_check ::= $period ( controlled_reference_event , timing_check_limit [ , [ notifier ] ] ) ; controlled_reference_event ::= controlled_timing_check_event timing_check_limit ::= expression
Синтаксис 15-13 — Синтаксис для $period

В таблице 15-11 определена проверка времени $period.

Таблица 15-11 — $period аргументы
АргументОписание
reference_event(событие отсчета)Временная метка фронта срабатывания события
(data_event(событие данных) — неявный)Временная метка фронта срабатывания события
limit(ограничение)Неотрицательное константное выражение
нотификатор (необязательно)Регистр

Из-за способа получения события данных для $period в качестве события отсчета должно быть передано событие, срабатывающее по фронту. Если ссылочное событие не является спецификацией фронта, произойдет ошибка компиляции.

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

(время проверки) — (время метки времени) < лимит

15.3.6 $nochange

$nochange — функция, которая проверяет неизменяемость уровня сигнала. Событие отсчета задается с помощью индикаторов фронтов (posedge и negedge). Смещение начального и конечного фронтов может сдвигать для определения длительности сигнала события отсчета после фронта.

Синтаксис $nochange показан в синтаксисе 15-14.

$nochange_timing_check ::= $nochange ( reference_event , data_event , start_edge_offset , end_edge_offset [ , [ notifier ] ] ) ; data_event ::= timing_check_event end_edge_offset ::= mintypmax_expression reference_event ::= timing_check_event start_edge_offset ::= mintypmax_expression
Синтаксис 15-14 — Синтаксис для $nochange

В таблице 15-12 определены аргументы проверки синхронизации $nochange.

Таблица 15-12 — $nochange аргументы
АргументОписание
reference_event(событие отсчета)Срабатывает по фронту метки времени и/или событию проверки времени
data_event(событие данных)Временная метка или событие проверки времени
start_edge_offset(начало смещения фронта)Константное выражение
end_edge_offset(конец смещения фронта)Константное выражение
нотификатор (необязательно)Регистр

Проверка синхронизации $nochange сообщает о нарушении синхронизации, если событие данных происходит во время указанного уровня управляющего сигнала (событие отсчета). Событие отсчета может быть задано с помощью ключевого слова posedge или negedge, но спецификаторы контроля фронта (см. 15.4) не могут быть использованы.

Смещение начального и конечного фронтов может расширять или сужать область нарушения синхронизации, которая определяется длительностью сигнала события отсчета после фронта. Например, если событие отсчета является позиция, то длительность — это период, в течение которого сигнал отсчета находится на высоком уровне. Положительное смещение для начального фронта расширяет область, начиная область нарушения синхронизации раньше. Отрицательное смещение для начального фронта сужает область, начиная область позже. Аналогично, положительное смещение для конечного фронта расширяет область нарушения синхронизации, заканчивая ее позже, а отрицательное смещение для конечного фронта сужает область, заканчивая ее раньше. Если оба смещения равны нулю, размер области не изменяется.

В отличие от других проверок времени, $nochange включает в себя три, а не два перехода. Передний фронт события отчета определяет начало временного окна, а задний фронт события отсчета определяет конец временного окна. Нарушение происходит, если событие данных происходит в любое время в пределах временного окна.

Конечные точки временного окна определяются следующим образом:

(начало временного окна) = (время опережающего опорного фронта) — start_edge_offset

(конец временного окна) = (время запаздывающего опорного фронта) + end_edge_offset

Проверка синхронизации $nochange сообщает о нарушении синхронизации в следующем случае:

(начало временного окна) < (время события данных) < (конец временного окна)

Конечные точки временного окна не учитываются. Значения start_edge_offset и end_edge_offset играют важную роль в определении того, какой сигнал, событие отсчета или данных, является меткой времени или событием проверки времени.

Например:
$nochange( posedge clk, data, 0, 0) ;

В этом примере проверка синхронизации $nochange сообщает о нарушении, если сигнал данных изменяется при высоком уровне clk. Это не будет нарушением, если задержка clk и переход на данные происходят одновременно.