sv: allow typenames as function return types

This commit is contained in:
Zachary Snow 2021-03-18 13:38:25 -04:00 committed by Zachary Snow
parent 6a0d1e117d
commit 4f4e70876f
3 changed files with 46 additions and 0 deletions

View File

@ -861,6 +861,7 @@ task_func_decl:
outreg->children.push_back($4); outreg->children.push_back($4);
outreg->is_signed = $4->is_signed; outreg->is_signed = $4->is_signed;
$4->is_signed = false; $4->is_signed = false;
outreg->is_custom_type = $4->type == AST_WIRETYPE;
} }
current_function_or_task->children.push_back(outreg); current_function_or_task->children.push_back(outreg);
current_function_or_task_port_id = 1; current_function_or_task_port_id = 1;
@ -871,6 +872,11 @@ task_func_decl:
}; };
func_return_type: func_return_type:
hierarchical_type_id {
$$ = new AstNode(AST_WIRETYPE);
$$->str = *$1;
delete $1;
} |
opt_type_vec opt_signedness_default_unsigned { opt_type_vec opt_signedness_default_unsigned {
$$ = makeRange(0, 0, $2); $$ = makeRange(0, 0, $2);
} | } |

View File

@ -0,0 +1,35 @@
typedef logic [1:0] T;
package P;
typedef logic [3:0] S;
endpackage
module gate(
output wire [31:0] out1, out2
);
function automatic T func1;
input reg signed inp;
func1 = inp;
endfunction
assign out1 = func1(1);
function automatic P::S func2;
input reg signed inp;
func2 = inp;
endfunction
assign out2 = func2(1);
endmodule
module gold(
output wire [31:0] out1, out2
);
function automatic [1:0] func1;
input reg signed inp;
func1 = inp;
endfunction
assign out1 = func1(1);
function automatic [3:0] func2;
input reg signed inp;
func2 = inp;
endfunction
assign out2 = func2(1);
endmodule

View File

@ -0,0 +1,5 @@
read_verilog -sv func_typename_ret.sv
proc
equiv_make gold gate equiv
equiv_simple
equiv_status -assert