System verilog SVA断言中链式一元运算符的优先级

System verilog SVA断言中链式一元运算符的优先级,system-verilog,system-verilog-assertions,System Verilog,System Verilog Assertions,作为一个工具,我试图正确解析SystemVerilog断言,但对某些表达式的正确优先级感到困惑。SystemVerilog标准有一个很好的表格,他们说不直到始终优先。但我不太明白,一元运算符的交替是如何工作的 例如,由于not的优先级高于until,我们显然应该: not r1 until r2 ----> (not r1) until r2 always r1 until r2 ----> always (r1 until r2) 由于直到的优先级

作为一个工具,我试图正确解析SystemVerilog断言,但对某些表达式的正确优先级感到困惑。SystemVerilog标准有一个很好的表格,他们说
直到
始终
优先。但我不太明白,一元运算符的交替是如何工作的

例如,由于
not
的优先级高于
until
,我们显然应该:

    not r1 until r2   ---->   (not r1) until r2
    always r1 until r2   ---->  always (r1 until r2)
由于
直到
的优先级高于
始终
,我们显然应该:

    not r1 until r2   ---->   (not r1) until r2
    always r1 until r2   ---->  always (r1 until r2)
但是,正确的解释方法是什么呢

    not always r1 until r2
我可以想象有两种解释可能是正确的:

  • 不总是(r1到r2)
    ,因为
    直到
    总是
    绑定更紧密,或者
  • (不总是r1)直到r2
    ,因为
    直到

看起来NCVerilog 15.10-p001使用了第一种解释。标准中是否有任何地方讨论了我可能遗漏的这一点是否正确?似乎很难将NCVerilog的优先级规则编码成一个好的语法…

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

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

! not $r1 && $r2
如果您尝试对
r1
r1
的所有值求值,您将看到Perl将其解释为:

! not ($r1 && $r2)

这在概念上与模拟器的解释相同。为什么会这样我不能肯定地说。我猜这是因为解释2会违反
,直到
的优先级始终高于
通常编程语言定义一元运算符总是比二元运算符具有更高的优先级。在这种情况下,
始终
是一元运算符,其优先级低于
直到
,它是一个二进制运算符

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

! not $r1 && $r2
如果您尝试对
r1
r1
的所有值求值,您将看到Perl将其解释为:

! not ($r1 && $r2)

这在概念上与模拟器的解释相同。为什么会这样我不能肯定地说。我猜这是因为解释2会违反
,直到
的优先级始终高于

@JaredDavis你可以重新表述这个问题,问为什么Perl中的运算符优先级是这样的,也许可以参考一些规范性文档。@JaredDavis这个视频可能对你来说也很有趣:基于标准中描述的优先级和附录A中的EBNF您可以像guy所描述的那样构造运算符优先级解析器。@JaredDavis您可以重新表述这个问题,询问为什么运算符优先级在Perl中是这样工作的,也许可以参考一些规范性文档。@JaredDavis这个视频对您来说可能也很有趣:根据标准中描述的优先规则和附录A中的EBNF,您可以构建一个像guy所描述的运算符优先解析器。