VHDL-2008引入了压缩运算符,它接收一个逻辑元素的一维数组,并输出一个位值。引用“核查视野”第8卷第3期2012年10月:
VHDL-2008为逻辑数组类型(bit_vector、std_logic_vector、…)创建了AND、OR、NOR、NAND、XOR和XNOR的一元版本。。运算符应用于数组参数的每个元素(约简操作),并产生一个元素结果。一元运算符与杂项运算符(**、ABS和NOT)具有相同的优先级。
LRM 9.2.2对力学作了解释,但激发这一问题的是9.1中的注2。
注2-涉及一元条件运算符或一元逻辑运算符与任何其他运算符组合的表达式的语法要求一元运算符及其操作数是带括号的表达式。例如,“(和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中的注释那样依赖操作符优先级吗?
发布于 2014-10-07 15:57:34
见2013-11-14年一元逻辑运算符的优先级。
行为
将杂项操作符的语法生成更改为(请注意一元后的额外空间不应该存在--这是twiki问题)
miscellaneous_operator ::= ** \x{e76f} abs \x{e76f}\x{e76f}
删除118顶部注2,内容如下:
“注2--涉及一元条件运算符或一元逻辑运算符与任何其他运算符组合的表达式的语法要求一元运算符及其操作数是括号式表达式。例如,表达式”(和A)和B“和”A和(和B)“是合法的,而表达式”和“A和B”和“A和B”则不是合法的。类似地,“and (和A)”是合法的,而“and和A”则不是。只有一个条件运算器或单逻辑运算符及其运算子组成的表达式不需要带括号。“
在重新讨论了这个问题之后,我会支持它。原因是这消除了词汇歧义,要求最初的注释2遵从在精化时间捕获,而不是反映在EBNF中。(如果需要括号,它们应该出现在EBNF中,就像混合具有相同优先级的二进制逻辑运算符一样)。
不知道何时以及是否会获得批准。
https://stackoverflow.com/questions/26232255
复制相似问题