Subject: [sv-bc] Function declaration proposal
From: Jacobi, Dan (dan.jacobi@intel.com)
Date: Wed Jan 29 2003 - 23:09:41 PST
----- SV-BC Issues -----
This proposal replaces / overlaps / corrects the following SV-BC issues:
- SV-BC-50, A.2.6 signedness in function BNF, P-0290
- SV-BC-19-17a (A.2.6) signed function declarations P-0290
------ Motivation ------
The location of the signing of a function declaration is problematic
the following declarations comply with the currently BNF.
function signed void foo1(...);
Can all function types be signed ?
function signed bit unsigned foo2(...);
Is this function signed or not?
The following proposal will support the signing of a function by adding
the signing token BEFORE the range or type of the function
such as
function signed reg foo; ....
function unsigned [1:0] bar(...); ....
This proposal will also remove disable the declaration of a signal with a
void type (this will align the BNF with the language in 3.4.3 - page 7)
such as :
void aVoid;...
input void aVoidInput;
----- Verilog 2001 -----
In Verilog 2001 the signing is located before the function's type or
range. Also the Verilog 2001 BNF uses a different production to parse the
function type (the production range_or_type parses all the possible function
types - page 716).
-------- Proposal -------
1) Under A.2.6
1.1) REPLACE (adding a footnote)
function_declaration ::=
'function' [ 'automatic' ] [ signing ] [ range_or_type ]
[ interface_identifier '.' ] function_identifier ';'
{ function_item_declaration }
{ function_statement }
'endfunction' [ ':' function_identifier ]
| 'function' [ 'automatic' ] [ signing ] [ range_or_type ]
[ interface_identifier '.' ] function_identifier
'(' function_port_list ')' ';'
{ block_item_declaration }
{ function_statement }
'endfunction' [ ':' function_identifier ]
WITH
function_declaration10 ::= <superscript 10>
'function' [ 'automatic' ] [ signing ] [ range_or_type ]
[ interface_identifier '.' ] function_identifier ';'
{ function_item_declaration }
{ function_statement }
'endfunction' [ ':' function_identifier ]
| 'function' [ 'automatic' ] [ signing ] [ range_or_type ]
[ interface_identifier '.' ] function_identifier
'(' function_port_list ')' ';'
{ block_item_declaration }
{ function_statement }
'endfunction' [ ':' function_identifier ]
1.2) REPLACE
function_prototype ::= 'function' data_type
'(' list_of_function_proto_formals ')'
WITH
function_prototype ::= 'function' function_data_type
'(' list_of_function_proto_formals ')'
see my question at the end of this E-mail regarding this production.
1.3) REPLACE
named_function_proto::= 'function' data_type function_identifier
'(' list_of_function_proto_formals ')'
WITH
named_function_proto::= 'function' function_data_type
function_identifier '(' list_of_function_proto_formals ')'
1.4) REPLACE
range_or_type ::=
{ packed_dimension } range
| data_type
WITH
range_or_type ::=
{ packed_dimension } range
| function_data_type
1.5) ADD the following production:
function_data_type ::=
integer_vector_type { packed_dimension } [ range ]
| integer_atom_type { packed_dimension }
| type_declaration_identifier
| non_integer_type
| 'struct' [' packed' ] '{'{ struct_union_member } '}'
| 'union' [ 'packed' ] '{' { struct_union_member } '}'
| 'enum' [ integer_type { packed_dimension } ]
'{' enum_identifier [ '=' constant_expression ]
{ ',' enum_identifier [ '=' constant_expression ] } '}'
| 'void'
2) Under the foot note section at the end of the BNF:
2.1) Add the following footnote
10 void functions, non integer type functions, and functions with a
typedef type cannot have a signing declaration.
3) Under A.2.2.1:
3.1) REPLACE (removing the void type)
data_type ::=
integer_vector_type [ signing ] { packed_dimension } [ range ]
| integer_atom_type [ signing ] { packed_dimension }
| type_declaration_identifier
| non_integer_type
| 'struct' [' packed' ] [ signing ] '{'{ struct_union_member } '}'
| 'union' [ 'packed' ] [ signing ] '{' { struct_union_member } '}'
| 'enum' [ integer_type [ signing ] { packed_dimension } ]
'{' enum_identifier [ '=' constant_expression ]
{ ',' enum_identifier [ '=' constant_expression ] } '}'
| 'void'
WITH
data_type ::=
integer_vector_type [ signing ] { packed_dimension } [ range ]
| integer_atom_type [ signing ] { packed_dimension }
| type_declaration_identifier
| non_integer_type
| 'struct' [' packed' ] [ signing ] '{'{ struct_union_member } '}'
| 'union' [ 'packed' ] [ signing ] '{' { struct_union_member } '}'
| 'enum' [ integer_type [ signing ] { packed_dimension } ]
'{' enum_identifier [ '=' constant_expression ]
{ ',' enum_identifier [ '=' constant_expression ] } '}'
----- A Question ----
Does any body know where the terminal "function_prototype" is used
in the BNF?
Can we remove the following production from A.2.6 ?
function_prototype ::= 'function' data_type
'(' list_of_function_proto_formals ')'
Dan Jacobi
Phone : (972)-4-8655855
This archive was generated by hypermail 2b28 : Wed Jan 29 2003 - 23:10:23 PST