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

时间:2015-10-16 18:00:28

标签: system-verilog system-verilog-assertions

对于一个工具,我试图正确解析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,因为notuntil
  • 绑定得更紧密

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

1 个答案:

答案 0 :(得分:0)

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

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

! not $r1 && $r2

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

! not ($r1 && $r2)

这在概念上与您的模拟器的解释相同。为什么它是这样的,我无法肯定地说。我猜是因为解释2会违反until优先于always的内容。