在具有一元逻辑运算符的表达式中,括号是否真的必要?

时间:2014-10-07 08:57:17

标签: operators vhdl operator-precedence unary-operator

VHDL-2008引入了简化运算符,它接收一维逻辑元素阵列并输出单个位值。引自Verification Horizo​​ns Vol。 8 2012年10月3日:

  

VHDL-2008创建AND,OR,NOR,NAND,XOR和XNOR的一元版本   对于逻辑数组类型(bit_vector,std_logic_vector,...)。该   运算符应用于数组参数的每个元素(a   减少操作)并产生元素结果。一元运营商   具有与杂项运算符相同的优先级(**,ABS和   NOT)。

机制在LRM [9.2.2]中有解释,但是这个问题的动机是[9.1]中的注2:

  

注2 - 涉及一元条件的表达式的语法   运算符或一元逻辑运算符与任何其他运算符组合   operator 要求一元运算符及其操作数为a   带括号的表达。例如,表达式“(和A)和   B“和”A和(和B)“是合法的,而表达”和A和B“   并且“A和B”不是。

但是,ModelSim和ActiveHDL很乐意接受这个:

variable B, Y: bit;
variable A: bit_vector(3 downto 0);
...
Y := and A and B;  -- Should be illegal according to Note 2 [9.1]

而且:

variable A, Y: bit;
variable B: bit_vector(3 downto 0);
...
Y := A and and B;  -- Should be illegal according to Note 2 [9.1]

现在,如果我们继续阅读LRM,[9.2.2]中的另一个注释提供了一些有关其工作原理的线索:

  

注意 - 所有二进制逻辑运算符都属于   优先级最低的运营商。一元逻辑运算符   属于具有最高优先级的运算符类

根据本说明,该工具在理解上述示例中的表达式时应该没有问题。

所以,问题是:我们是否真的需要编写括号,如[9.1]中的注2所示,或者我们可以依赖运算符优先级作为[9.2.2]中的注释建议?

1 个答案:

答案 0 :(得分:1)

请参阅Precedence of Unary Logical Operators 日期2013-11-14。

操作

将杂项运算符的语法生成更改为(注意一元之后的额外空格不应该存在 - 这是一个twiki问题)

miscellaneous_operator :: = ** | abs |不是|一元_logical_operator

删除118顶部的注释2:

“注2 - 涉及一元条件运算符或一元逻辑运算符与任何其他运算符组合的表达式的语法要求一元运算符及其操作数是带括号的表达式。例如,表达式”(和A)和“B”和“A和(和B)”是合法的,而表达“和A和B”和“A和B”不是。同样,“和(和A)”是合法的,而“和和”和“不是。只包含一元条件oprator或一元逻辑运算符的表达式及其操作数不需要括号括起来。”

<小时/> 重新审议后,我会支持它。这就是为什么这样可以消除词汇模糊性,要求在精心制作时捕获原始的NOTE 2合规性,而不是反映在EBNF中。 (如果需要括号,它们应该出现在EBNF中,就像混合具有相同优先级的二进制逻辑运算符一样)。

无法确定何时以及是否会获得批准。