1

对于一个工具,我正在尝试正确解析 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 的优先规则编码成一个好的语法......

4

1 回答 1

0

通常编程语言将一元运算符定义为始终具有比二元运算符更高的优先级。在这种情况下always,是一个优先级低于until二元运算符的一元运算符。

Perl 也有类似的情况,not运算符 (unary) 的优先级低于&&(binary)。从概念上讲,您的表达式类似于以下 Perl 表达式:

! not $r1 && $r2

r1如果您尝试对and的所有值进行评估r1,您会看到 Perl 将其解释为:

! not ($r1 && $r2)

这在概念上与您的模拟器相同。为什么会这样,我不能肯定地说。我想这是因为解释 2 会until违反always.

于 2015-10-17T11:58:45.207 回答