| 
     
      
      
      From: Martin W. <ic...@ma...> - 2023-03-30 08:31:02
      
     
   | 
On 30/03/2023 06:51, Niels Möller wrote:
> Hi,
> 
> I've noticed that icarus verilog doesn't like this piece of code:
> 
>    module foo(input [7:0] x, output y);
>       assign y = !&x;
>    endmodule
> 
> I'm running Icarus Verilog version 13.0 (devel)
> (s20141205-283-g437dc10), and it complains
> 
>    error: Operand of unary ! is not a primary expression.
> 
> Other tools, in particular yosys, seems to accept this syntax, and in
> general, I had expected that any stacking of unary operators is
> syntactically ok. Adding a pair of parentheses makes iverilog accept it,
> like
> 
>    module foo(input [7:0] x, output y);
>       assign y = !(&x);
>    endmodule
> 
> So my question is, what does the spec for verilog syntax say?
IEEE 1364-2005 appendix A says
expression ::=
     primary
   | unary_operator { attribute_instance } primary
   | expression binary_operator { attribute_instance } expression
   | conditional_expression
primary ::=
     number
   | hierarchical_identifier [ { [ expression ] } [ range_expression ] ]
   | concatenation
   | multiple_concatenation
   | function_call
   | system_function_call
   | ( mintypmax_expression )
   | string
so !&x is not valid syntax.
IEEE 1800-2017 adds more options, but does not change this.
 |