对于一个工具,我试图正确解析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的优先规则编码成一个很好的语法似乎很难......
答案 0 :(得分:0)
通常,编程语言将一元运算符定义为始终具有比二元运算符更高的优先级。在这种情况下,always
是一个一元运算符,其优先级低于until
,一个二元运算符。
Perl也有类似的情况,not
运算符(一元)的优先级低于&&
(二进制)。从概念上讲,您的表达式类似于以下Perl表达式:
! not $r1 && $r2
如果您尝试对r1
和r1
的所有值进行评估,您会看到Perl将其解释为:
! not ($r1 && $r2)
这在概念上与您的模拟器的解释相同。为什么它是这样的,我无法肯定地说。我猜是因为解释2会违反until
优先于always
的内容。