15. Setup, hold, setuphold и recovery в Verilog HDL

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

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

15.1 Обзор

Проверки синхронизации могут быть размещены в specify блоках для проверки временных характеристик проекта, чтобы убедиться, что критические события происходят в заданных временных пределах. Синтаксис для проверки синхронизации системы приведен в Синтаксисе 15-1.

system_timing_check ::= $setup_timing_check | $hold_timing_check | $setuphold_timing_check | $recovery_timing_check | $removal_timing_check | $recrem_timing_check | $skew_timing_check | $timeskew_timing_check | $fullskew_timing_check | $period_timing_check | $width_timing_check | $nochange_timing_check $setup_timing_check ::= $setup ( data_event , reference_event , timing_check_limit [ , [ notifier ] ] ) ; $hold_timing_check ::= $hold ( reference_event , data_event , timing_check_limit [ , [ notifier ] ] ) ; $setuphold_timing_check ::= $setuphold ( reference_event , data_event , timing_check_limit , timing_check_limit [ , [ notifier ] [ , [ stamptime_condition ] [ , [ checktime_condition ] [ , [ delayed_reference ] [ , [ delayed_data ] ] ] ] ] ] ) ; $recovery_timing_check ::= $recovery ( reference_event , data_event , timing_check_limit [ , [ notifier ] ] ) ; $removal_timing_check ::= $removal ( reference_event , data_event , timing_check_limit [ , [ notifier ] ] ) ; $recrem_timing_check ::= $recrem ( reference_event , data_event , timing_check_limit , timing_check_limit [ , [ notifier ] [ , [ stamptime_condition ] [ , [ checktime_condition ] [ , [ delayed_reference ] [ , [ delayed_data ] ] ] ] ] ] ) ; $skew_timing_check ::= $skew ( reference_event , data_event , timing_check_limit [ , [ notifier ] ] ) ; $timeskew_timing_check ::= $timeskew ( reference_event , data_event , timing_check_limit [ , [ notifier ] [ , [ event_based_flag ] [ , [ remain_active_flag ] ] ] ] ) ; $fullskew_timing_check ::= $fullskew ( reference_event , data_event , timing_check_limit , timing_check_limit [ , [ notifier ] [ , [ event_based_flag ] [ , [ remain_active_flag ] ] ] ] ) ; $period_timing_check ::= $period ( controlled_reference_event , timing_check_limit [ , [ notifier ] ] ) ; $width_timing_check ::= $width ( controlled_reference_event , timing_check_limit [ , threshold [ , notifier ] ] ) ; $nochange_timing_check ::= $nochange ( reference_event , data_event , start_edge_offset , end_edge_offset [ , [ notifier ] ] ) ;
Синтаксис 15-1 Синтаксис для проверки синхронизации системы

Синтаксис для условий проверки времени и проверки времени событий приведен в Синтаксисе 15-2.

checktime_condition ::= mintypmax_expression controlled_reference_event ::= controlled_timing_check_event data_event ::= timing_check_event delayed_data ::= terminal_identifier | terminal_identifier [ constant_mintypmax_expression ] delayed_reference ::= terminal_identifier | terminal_identifier [ constant_mintypmax_expression ] end_edge_offset ::= mintypmax_expression event_based_flag ::= constant_expression notifier ::= variable_identifier reference_event ::= timing_check_event remain_active_flag ::= constant_expression stamptime_condition ::= mintypmax_expression start_edge_offset ::= mintypmax_expression threshold ::= constant_expression timing_check_limit ::= expression timing_check_event ::= [timing_check_event_control] specify_terminal_descriptor [ &&& timing_check_condition ] controlled_timing_check_event ::= timing_check_event_control specify_terminal_descriptor [ &&& timing_check_condition ] timing_check_event_control ::= posedge | negedge | edge_control_specifier specify_terminal_descriptor ::= specify_input_terminal_descriptor | specify_output_terminal_descriptor edge_control_specifier ::= edge [ edge_descriptor { , edge_descriptor } ] edge_descriptor ::= 01 | 10 | z_or_x zero_or_one | zero_or_one z_or_x zero_or_one ::= 0 | 1 z_or_x ::= x | X | z | Z timing_check_condition ::= scalar_timing_check_condition | ( scalar_timing_check_condition ) scalar_timing_check_condition ::= expression | ~ expression | expression == scalar_constant | expression === scalar_constant | expression != scalar_constant | expression !== scalar_constant scalar_constant ::= 1'b0 | 1'b1 | 1'B0 | 1'B1 | 'b0 | 'b1 | 'B0 | 'B1 | 1 | 0
Синтаксис 15-2 Синтаксис для условий проверки времени и проверки времени событий
Для удобства изложения данные проверки времени разделены на две группы. Первая группа временных проверок описывается в портах временных окон стабильности:
$setup $hold $setuphold $recovery $removal $recrem
Проверки времени во второй группе проверяют тактовые и управляющие сигналы и описываются в портах разницы во времени между двумя событиями (проверка $nochange включает три события):
$skew $timeskew $fullskew $width $period $nochange

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

Некоторые проверки синхронизации могут принимать отрицательные предельные значения. Эта тема подробно рассматривается в разделе 15.8.

Все проверки синхронизации имеют событие отчета и данных, и с каждым из них могут быть связаны булевы условия. Некоторые проверки имеют два аргумента сигнала, один из которых является опорным событием, а другой — событием данных. Другие проверки имеют только один сигнальный аргумент, и события ссылки и данных являются производными от него. Эталонные события и события данных должны быть обнаружены проверками синхронизации только тогда, когда соответствующие условия истинны. Дополнительную информацию об условиях в проверках синхронизации см. в разделе 15.6.

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

Для некоторых проверок событие ссылки всегда является событием метки времени, а событие данных всегда является событием проверки времени. В то время как для других проверок верно обратное. Для других проверок решение о том, какое событие является меткой времени, а какое — событием проверки времени, основано на факторах, которые более подробно обсуждаются в 15.2 и 15.3.

Каждая проверка синхронизации может включать необязательный нотификатор, который переключается всякий раз, когда проверка синхронизации обнаруживает нарушение. Модель может использовать нотификатор, чтобы сделать поведение функцией нарушений проверки синхронизации. Более подробно нотификаторы обсуждаются в разделе 15.5.

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

15.2 Проверка времени с использованием окна стабильности

Эти проверки синхронизации обсуждаются в данном подпункте:
$setup $hold $setuphold $recovery $removal $recrem

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

1) Определите временное окно относительно сигнала отсчета, используя указанный предел или пределы.

2) Проверьте время перехода сигнала данных относительно временного окна.

3) Отчет о нарушении синхронизации, если сигнал данных переходит в пределах временного окна.

15.2.1 $setup

$setup — это функция, которая проверяет время предустановки сигнала(информационного). $setup объявляется только в блоке specify.

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

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

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

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

Событием данных(data_event) обычно является сигнал данных, а событием отсчета(reference_event) — сигнал синхронизации. Конечные точки временного окна определяются следующим образом:

(начало временного окна) = (контрольное время) — предел

(конец временного окна) = (контрольное время)

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

(начало временного окна) < (время временной метки) < (конец временного окна)

Конечные точки временного окна не являются частью области нарушения. Если предел равен нулю, проверка $setup никогда не выдаст нарушение.

15.2.2 $hold

$hold — это функция, которая проверяет время удержания сигнала(информационного). $hold объявляется только в блоке specify.

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

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

Таблица 15-2 определяет проверку синхронизации $hold.

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

Событием данных(data_event) обычно является сигнал данных, а событием отсчета (reference_event) — сигнал синхронизации. Конечные точки временного окна определяются следующим образом:

(начало временного окна) = (время временной метки)

(конец временного окна) = (время временной метки) + предел

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

(начало временного окна) <= (контрольное время) < (конец временного окна)

Только конец временного окна не является частью области нарушения. Когда предел равен нулю, проверка $hold никогда не выдает нарушение.

15.2.3 $setuphold

$setuphold — это функция, которая проверяет время предустановки и удержания сигнала(информационного). $setuphold объявляется только в блоке specify. Событием данных обычно является сигнал данных, а событием отсчета — тактовый сигнал.

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

$setuphold_timing_check ::= $setuphold ( reference_event , data_event , timing_check_limit , timing_check_limit [ , [ notifier ] [ , [ stamptime_condition ] [ , [ checktime_condition ] [ , [ delayed_reference ] [ , [ delayed_data ] ] ] ] ] ] ) ; checktime_condition ::= mintypmax_expression data_event ::= timing_check_event delayed_data ::= terminal_identifier | terminal_identifier [ constant_mintypmax_expression ] delayed_reference ::= terminal_identifier | terminal_identifier [ constant_mintypmax_expression ] reference_event ::= timing_check_event stamptime_condition ::= mintypmax_expression timing_check_limit ::= expression
Синтаксис 15-5-Синтаксис для $setuphold

Таблица 15-3 определяет временную проверку $setuphold.

Таблица 15-3 — $setuphold аргументы
АргументОписание
reference_event(событие отсчета)Проверка времени или событие временной метки при положительном пределе предустановки(Timecheck). Событие временной метки при отрицательном пределе предустановки(Timestamp)
data_event(событие данных)Проверка времени или событие временной метки при положительном пределе удержания(Timecheck). Событие временной метки при отрицательном пределе удержания(Timestamp)
setup_limit(ограничение по установке)Константное выражение
hold_limit(ограничение по удержанию)Константное выражение
нотификатор (необязательно)Регистр
timestamp_cond (необязательно)Условие временной метки для проверки отрицательной синхронизации
timecheck_cond (необязательно)Условие проверки времени для проверки отрицательной синхронизации
delayed_reference (необязательно)Задержанный опорный сигнал для проверки отрицательной синхронизации
delayed_data (необязательно)Сигнал данных с задержкой для проверки отрицательной синхронизации

Проверка времени $setuphold может принимать отрицательные предельные значения. Более подробно это обсуждается в разделе 15.8.

Как сказано в определении: Событием данных обычно является сигнал данных, а событием отсчета — тактовый сигнал.

Если и предел предустановки, и предел удержания положительны, то событием проверки времени может быть либо контрольное событие, либо событие данных. Это зависит от того, какое из них произойдет первым в процессе моделирования.

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

setup_limit + hold_limit > (единица точности моделирования)

Проверка времени $setuphold объединяет функциональность проверок времени $setup и $hold в одну проверку времени. Поэтому вызов
$setuphold( posedge clk, data, tSU, tHLD );
эквивалентен по функциональности следующему, если tSU и tHLD не отрицательны:
$setup( data, posedge clk, tSU ); $hold( posedge clk, data, tHLD );

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

(начало временного окна) = (контрольное время) — предел

(конец временного окна) = (контрольное время)

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

(начало временного окна) < (время временной метки) <= (конец временного окна)

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

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

(начало временного окна) = (время временной метки)

(конец временного окна) = (время временной метки) + предел

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

(начало временного окна) <= (контрольное время) < (конец временного окна)

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

Если оба предела равны нулю, проверка $setuphold никогда не выдает нарушение.

15.2.4 $removal

$removal — это функция, которая проверяет время предустановки сигнала(управляющего). $removal объявляется только в блоке specify.

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

$removal_timing_check ::= $removal ( reference_event , data_event , timing_check_limit [ , [ notifier ] ] ) ; data_event ::= timing_check_event reference_event ::= timing_check_event timing_check_limit ::= expression
Синтаксис 15-6-Синтаксис для $removal

В таблице 15-4 определена проверка времени удаления $removal.

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

Событие отсчета(reference_event) обычно является управляющим сигналом, таким как clear, reset или set, а событие данных(data_event) обычно является тактовым сигналом.

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

(начало временного окна) = (контрольное время) — предел

(конец временного окна) = (контрольное время)

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

(начало временного окна) < (время временной метки) < (конец временного окна)

Конечные точки временного окна не являются частью области нарушения. Если предел равен нулю, то проверка $removal никогда не выдаст нарушение.

15.2.5 $recovery

$recovery— это функция, которая проверяет время удержания сигнала(управляющего). $recovery объявляется только в блоке specify.

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

$recovery_timing_check ::= $recovery ( reference_event , data_event , timing_check_limit [ , [ notifier ] ] ) ; data_event ::= timing_check_event reference_event ::= timing_check_event timing_check_limit ::= expression
Синтаксис 15-7-Синтаксис для $recovery

Таблица 15-5 определяет проверку времени восстановления $recovery.

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

Событие отсчета обычно является управляющим сигналом, таким как clear, reset или set, а событие данных обычно является тактовым сигналом.

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

(начало временного окна) = (время временной метки)

(конец временного окна) = (время временной метки) + предел

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

(начало временного окна) <= (контрольное время) < (конец временного окна)

Только конец временного окна не является частью области нарушения. Когда предел равен нулю, проверка $recovery никогда не выдаст нарушение.

15.2.6 $recrem

$recrem — это функция, которая в себе объединяет две функции: $recovery и $removal. $recrem объявляется только в блоке specify. Событием данных обычно является сигнал данных, а событием отсчета — тактовый сигнал.

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

$recrem_timing_check ::= $recrem ( reference_event , data_event , timing_check_limit , timing_check_limit [ , [ notifier ] [ , [ stamptime_condition ] [ , [ checktime_condition ] [ , [ delayed_reference ] [ , [ delayed_data ] ] ] ] ] ] ) ; checktime_condition ::= mintypmax_expression data_event ::= timing_check_event delayed_data ::= terminal_identifier | terminal_identifier [ constant_mintypmax_expression ] delayed_reference ::= terminal_identifier | terminal_identifier [ constant_mintypmax_expression ] reference_event ::= timing_check_event stamptime_condition ::= mintypmax_expression timing_check_limit ::= expression
Синтаксис 15-8 — Синтаксис для $recrem

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

Таблица 15-6 — $recrem аргументы
АргументОписание
reference_event(Событие отсчета)Проверка времени или событие временной метки при положительном пределе $removal. Событие временной метки при отрицательном пределе $removal
data_event(Событие данных)Проверка времени или событие временной метки при положительном пределе $recovery. Событие временной метки при отрицательном пределе $recovery
recovery_limitКонстантное выражение
removal_limitКонстантное выражение
нотификатор (необязательно)Регистр
timestamp_cond (необязательно)Условие временной метки для проверки отрицательной синхронизации
timecheck_cond (необязательно)Условие проверки времени для проверки отрицательной синхронизации
delayed_reference (необязательно)Задержанный сигнал отсчета для проверки отрицательной синхронизации
delayed_data (необязательно)Сигнал данных с задержкой для проверки отрицательной синхронизации

Проверка времени $recrem может принимать отрицательные предельные значения. Более подробно это обсуждается в разделе 15.8.

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

Когда либо предел удаления, либо предел восстановления отрицательный, ограничение становится следующим:

removal_limit + recovery_limit > (единица точности моделирования)

Проверка времени $recrem объединяет функциональность проверок времени $removal и $recovery в одну проверку времени. Поэтому вызов
$recrem( posedge clear, posedge clk, tREC, tREM );
эквивалентен по функциональности следующему, если tREC и tREM не отрицательны:
$removal( posedge clear, posedge clk, tREM ); $recovery( posedge clear, posedge clk, tREC );

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

(начало временного окна) = (контрольное время) — предел

(конец временного окна) = (контрольное время)

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

(начало временного окна) < (время временной метки) <= (конец временного окна)

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

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

(начало временного окна) = (время временной метки)

(конец временного окна) = (время временной метки) + предел

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

(начало временного окна) <= (контрольное время) < (конец временного окна)

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

Если оба предела равны нулю, проверка $recrem никогда не выдаст нарушение.