Приоритет цепочечных унарных операторов в утверждениях 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,

Другие вопросы по тегам