Приоритет цепочечных унарных операторов в утверждениях SVA
Что касается инструмента, я пытаюсь правильно проанализировать утверждения SystemVerilog, и меня смущает правильный приоритет для некоторых выражений. Стандарт SystemVerilog имеет хорошую таблицу, где говорят, что not
> until
> always
для старшинства. Но я не совсем понимаю, как это должно работать с чередованием унарных операторов.
Например, так как not
имеет более высокий приоритет, чем until
очевидно, мы должны иметь:
not r1 until r2 ----> (not r1) until r2
И с тех пор until
имеет более высокий приоритет, чем always
очевидно, мы должны иметь:
always r1 until r2 ----> always (r1 until r2)
Но как правильно интерпретировать следующее?
not always r1 until r2
Я могу представить, что две интерпретации могут быть правильными:
not always (r1 until r2)
, посколькуuntil
связывает более плотно, чемalways
, или же(not always r1) until r2
, посколькуnot
связывает более плотно, чемuntil
Похоже, что NCVerilog 15.10-p001 использует первую интерпретацию. Есть ли где-нибудь в стандарте, где обсуждается, является ли это правильным, что я, возможно, пропустил? Кажется, трудно кодировать правила приоритета NCVerilog в хорошую грамматику...
1 ответ
Обычно языки программирования определяют унарные операторы как всегда имеющие более высокий приоритет, чем бинарные операторы. В этом случае always
унарный оператор с более низким приоритетом, чем until
, бинарный оператор.
Perl также имеет аналогичную ситуацию, с not
оператор (унарный), имеющий более низкий приоритет, чем &&
(Двоичный). Концептуально ваше выражение похоже на следующее выражение Perl:
! not $r1 && $r2
Если вы попытаетесь оценить это для всех значений r1
а также r1
вы увидите, что Perl интерпретирует это как:
! not ($r1 && $r2)
Концептуально это та же интерпретация, что и ваш симулятор. Почему это так, я не могу точно сказать. Я думаю, это потому, что интерпретация 2 будет нарушать until
Приоритет над always
,