В этом пункте описывается, как проверка синхронизации, использующиеся в 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-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
$setup $hold $setuphold
$recovery $removal $recrem
$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-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-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-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( posedge clk, data, 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-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-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-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( posedge clear, posedge clk, tREC, tREM );
$removal( posedge clear, posedge clk, tREM );
$recovery( posedge clear, posedge clk, tREC );
Если оба предела удаления и восстановления положительны и событие данных происходит первым, конечные точки временного окна определяются следующим образом:
(начало временного окна) = (контрольное время) — предел
(конец временного окна) = (контрольное время)
А проверка синхронизации $recrem сообщает о нарушении синхронизации в следующем случае:
(начало временного окна) < (время временной метки) <= (конец временного окна)
Только начало временного окна не является частью области нарушения. Проверка $recrem сообщает о нарушении синхронизации, если события отсчета и данных происходят одновременно.
Если оба предела удаления и восстановления положительны и событие данных происходит во второй раз, конечные точки временного окна определяются следующим образом:
(начало временного окна) = (время временной метки)
(конец временного окна) = (время временной метки) + предел
А проверка синхронизации $recrem сообщает о нарушении синхронизации в следующем случае:
(начало временного окна) <= (контрольное время) < (конец временного окна)
Только конец временного окна не является частью области нарушения. Проверка $recrem сообщает о нарушении синхронизации, если события ссылки и данных происходят одновременно.
Если оба предела равны нулю, проверка $recrem никогда не выдаст нарушение.