Add regression tests for task and function call lookup
Check that a closer variable, named event, or parameter hides a task or function used as a statement. Also check object method lookup and recursive function calls used as statements. Check that a later compilation-unit task or function takes precedence over a matching subroutine in an enclosing instance. Check that different instances of the same module resolve task calls through their respective enclosing instances. Check ordinary lexical ordering for a task-call receiver declared before or after the reference. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
This commit is contained in:
parent
7c5c1acf02
commit
b3d0677d08
|
|
@ -0,0 +1,13 @@
|
||||||
|
// Check that a later named event in the local scope hides a compilation-unit
|
||||||
|
// function used as a statement.
|
||||||
|
|
||||||
|
function void value;
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
module test;
|
||||||
|
|
||||||
|
initial value();
|
||||||
|
|
||||||
|
event value;
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
// Check that a later parameter in the local scope hides a compilation-unit
|
||||||
|
// function used as a statement.
|
||||||
|
|
||||||
|
function integer value;
|
||||||
|
value = 0;
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
module test;
|
||||||
|
|
||||||
|
initial value();
|
||||||
|
|
||||||
|
parameter value = 1;
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
// Check that a later local variable hides a compilation-unit function used
|
||||||
|
// as a statement.
|
||||||
|
|
||||||
|
function integer value;
|
||||||
|
value = 0;
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
module test;
|
||||||
|
|
||||||
|
initial value();
|
||||||
|
|
||||||
|
integer value;
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
// Check that a recursive non-void function can call itself as a statement.
|
||||||
|
|
||||||
|
module test;
|
||||||
|
|
||||||
|
integer calls;
|
||||||
|
|
||||||
|
function automatic integer recurse(input integer count);
|
||||||
|
calls = calls + 1;
|
||||||
|
if (count > 0) begin
|
||||||
|
recurse(count - 1);
|
||||||
|
end
|
||||||
|
recurse = 0;
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
calls = 0;
|
||||||
|
recurse(2);
|
||||||
|
|
||||||
|
if (calls == 3) begin
|
||||||
|
$display("PASSED");
|
||||||
|
end else begin
|
||||||
|
$display("FAILED");
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
// Check that a compilation-unit function takes precedence over a function in
|
||||||
|
// an enclosing instance when called as a statement.
|
||||||
|
|
||||||
|
integer result;
|
||||||
|
|
||||||
|
module child;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
result = 0;
|
||||||
|
value();
|
||||||
|
|
||||||
|
if (result == 1) begin
|
||||||
|
$display("PASSED");
|
||||||
|
end else begin
|
||||||
|
$display("FAILED");
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
function void value;
|
||||||
|
result = 1;
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
module test;
|
||||||
|
|
||||||
|
child i_child();
|
||||||
|
|
||||||
|
function void value;
|
||||||
|
result = 2;
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
// Check that task calls in different instances of the same module are
|
||||||
|
// resolved through each enclosing instance.
|
||||||
|
|
||||||
|
module child(output reg [7:0] result);
|
||||||
|
|
||||||
|
initial set_value(result);
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module parent_a(output wire [7:0] result);
|
||||||
|
|
||||||
|
task set_value;
|
||||||
|
output [7:0] result;
|
||||||
|
result = 8'ha1;
|
||||||
|
endtask
|
||||||
|
|
||||||
|
child i_child(result);
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module parent_b(output wire [7:0] result);
|
||||||
|
|
||||||
|
task set_value;
|
||||||
|
output [7:0] result;
|
||||||
|
result = 8'hb2;
|
||||||
|
endtask
|
||||||
|
|
||||||
|
child i_child(result);
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module test;
|
||||||
|
|
||||||
|
wire [7:0] result_a;
|
||||||
|
wire [7:0] result_b;
|
||||||
|
reg failed;
|
||||||
|
|
||||||
|
parent_a i_parent_a(result_a);
|
||||||
|
parent_b i_parent_b(result_b);
|
||||||
|
|
||||||
|
`define check(val, exp) \
|
||||||
|
if (val !== exp) begin \
|
||||||
|
$display("FAILED(%0d). '%s' expected %h, got %h", `__LINE__, \
|
||||||
|
`"val`", exp, val); \
|
||||||
|
failed = 1'b1; \
|
||||||
|
end
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
failed = 1'b0;
|
||||||
|
#1;
|
||||||
|
|
||||||
|
`check(result_a, 8'ha1)
|
||||||
|
`check(result_b, 8'hb2)
|
||||||
|
|
||||||
|
if (!failed) begin
|
||||||
|
$display("PASSED");
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
// Check that a local class object hides an outer scope when calling a task
|
||||||
|
// method.
|
||||||
|
|
||||||
|
class C;
|
||||||
|
|
||||||
|
task run;
|
||||||
|
$display("PASSED");
|
||||||
|
endtask
|
||||||
|
|
||||||
|
endclass
|
||||||
|
|
||||||
|
module object_type;
|
||||||
|
|
||||||
|
task run;
|
||||||
|
$display("FAILED");
|
||||||
|
endtask
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module child;
|
||||||
|
|
||||||
|
C object;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
object = new;
|
||||||
|
object.run();
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module test;
|
||||||
|
|
||||||
|
object_type object();
|
||||||
|
child i_child();
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
// Check that a later named event in the local scope hides a compilation-unit
|
||||||
|
// task.
|
||||||
|
|
||||||
|
task value;
|
||||||
|
endtask
|
||||||
|
|
||||||
|
module test;
|
||||||
|
|
||||||
|
initial value();
|
||||||
|
|
||||||
|
event value;
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
// Check that a later parameter in the local scope hides a compilation-unit
|
||||||
|
// task.
|
||||||
|
|
||||||
|
task value;
|
||||||
|
endtask
|
||||||
|
|
||||||
|
module test;
|
||||||
|
|
||||||
|
initial value();
|
||||||
|
|
||||||
|
parameter value = 1;
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
// Check that a later local variable hides a compilation-unit task.
|
||||||
|
|
||||||
|
task value;
|
||||||
|
endtask
|
||||||
|
|
||||||
|
module test;
|
||||||
|
|
||||||
|
initial value();
|
||||||
|
|
||||||
|
integer value;
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
// Check lexical ordering for the receiver of a task call.
|
||||||
|
|
||||||
|
class C;
|
||||||
|
|
||||||
|
task set_value(output integer result);
|
||||||
|
result = 11;
|
||||||
|
endtask
|
||||||
|
|
||||||
|
endclass
|
||||||
|
|
||||||
|
C before_object = new;
|
||||||
|
|
||||||
|
module holder;
|
||||||
|
|
||||||
|
task set_value;
|
||||||
|
output integer result;
|
||||||
|
result = 22;
|
||||||
|
endtask
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module child;
|
||||||
|
|
||||||
|
integer before_value;
|
||||||
|
integer after_value;
|
||||||
|
reg failed;
|
||||||
|
|
||||||
|
`define check(val, exp) \
|
||||||
|
if (val !== exp) begin \
|
||||||
|
$display("FAILED(%0d). '%s' expected %0d, got %0d", `__LINE__, \
|
||||||
|
`"val`", exp, val); \
|
||||||
|
failed = 1'b1; \
|
||||||
|
end
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
failed = 1'b0;
|
||||||
|
|
||||||
|
before_object.set_value(before_value);
|
||||||
|
after_object.set_value(after_value);
|
||||||
|
|
||||||
|
`check(before_value, 11)
|
||||||
|
`check(after_value, 22)
|
||||||
|
|
||||||
|
if (!failed) begin
|
||||||
|
$display("PASSED");
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module test;
|
||||||
|
|
||||||
|
holder before_object();
|
||||||
|
holder after_object();
|
||||||
|
child child_instance();
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
C after_object = new;
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
// Check that a compilation-unit task takes precedence over a task in an
|
||||||
|
// enclosing instance.
|
||||||
|
|
||||||
|
integer result;
|
||||||
|
|
||||||
|
module child;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
result = 0;
|
||||||
|
value();
|
||||||
|
|
||||||
|
if (result == 1) begin
|
||||||
|
$display("PASSED");
|
||||||
|
end else begin
|
||||||
|
$display("FAILED");
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
task value;
|
||||||
|
result = 1;
|
||||||
|
endtask
|
||||||
|
|
||||||
|
module test;
|
||||||
|
|
||||||
|
child i_child();
|
||||||
|
|
||||||
|
task value;
|
||||||
|
result = 2;
|
||||||
|
endtask
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -362,6 +362,11 @@ sv_function_call_chain_unit_precedence vvp_tests/sv_function_call_chain_unit_pre
|
||||||
sv_function_call_receiver_unit_order vvp_tests/sv_function_call_receiver_unit_order.json
|
sv_function_call_receiver_unit_order vvp_tests/sv_function_call_receiver_unit_order.json
|
||||||
sv_function_call_unit_import_precedence vvp_tests/sv_function_call_unit_import_precedence.json
|
sv_function_call_unit_import_precedence vvp_tests/sv_function_call_unit_import_precedence.json
|
||||||
sv_function_call_unit_precedence vvp_tests/sv_function_call_unit_precedence.json
|
sv_function_call_unit_precedence vvp_tests/sv_function_call_unit_precedence.json
|
||||||
|
sv_function_statement_order_event_fail vvp_tests/sv_function_statement_order_event_fail.json
|
||||||
|
sv_function_statement_order_parameter_fail vvp_tests/sv_function_statement_order_parameter_fail.json
|
||||||
|
sv_function_statement_order_variable_fail vvp_tests/sv_function_statement_order_variable_fail.json
|
||||||
|
sv_function_statement_recursive vvp_tests/sv_function_statement_recursive.json
|
||||||
|
sv_function_statement_unit_precedence vvp_tests/sv_function_statement_unit_precedence.json
|
||||||
sv_interface vvp_tests/sv_interface.json
|
sv_interface vvp_tests/sv_interface.json
|
||||||
sv_interface_identifier_block_name vvp_tests/sv_interface_identifier_block_name.json
|
sv_interface_identifier_block_name vvp_tests/sv_interface_identifier_block_name.json
|
||||||
sv_interface_identifier_instance_name vvp_tests/sv_interface_identifier_instance_name.json
|
sv_interface_identifier_instance_name vvp_tests/sv_interface_identifier_instance_name.json
|
||||||
|
|
@ -470,7 +475,14 @@ sv_soft_packed_union vvp_tests/sv_soft_packed_union.json
|
||||||
sv_soft_packed_union_fail1 vvp_tests/sv_soft_packed_union_fail1.json
|
sv_soft_packed_union_fail1 vvp_tests/sv_soft_packed_union_fail1.json
|
||||||
sv_string_method_substr_too_few_arg_fail vvp_tests/sv_string_method_substr_too_few_arg_fail.json
|
sv_string_method_substr_too_few_arg_fail vvp_tests/sv_string_method_substr_too_few_arg_fail.json
|
||||||
sv_super_member_fail vvp_tests/sv_super_member_fail.json
|
sv_super_member_fail vvp_tests/sv_super_member_fail.json
|
||||||
|
sv_task_call_instance_lookup vvp_tests/sv_task_call_instance_lookup.json
|
||||||
|
sv_task_call_object_shadow vvp_tests/sv_task_call_object_shadow.json
|
||||||
|
sv_task_call_order_event_fail vvp_tests/sv_task_call_order_event_fail.json
|
||||||
|
sv_task_call_order_parameter_fail vvp_tests/sv_task_call_order_parameter_fail.json
|
||||||
|
sv_task_call_order_variable_fail vvp_tests/sv_task_call_order_variable_fail.json
|
||||||
sv_task_call_receiver_unit_precedence vvp_tests/sv_task_call_receiver_unit_precedence.json
|
sv_task_call_receiver_unit_precedence vvp_tests/sv_task_call_receiver_unit_precedence.json
|
||||||
|
sv_task_call_receiver_unit_order vvp_tests/sv_task_call_receiver_unit_order.json
|
||||||
|
sv_task_call_unit_precedence vvp_tests/sv_task_call_unit_precedence.json
|
||||||
sv_type_identifier_ams_name_fields vvp_tests/sv_type_identifier_ams_name_fields.json
|
sv_type_identifier_ams_name_fields vvp_tests/sv_type_identifier_ams_name_fields.json
|
||||||
sv_type_identifier_assert_item_label vvp_tests/sv_type_identifier_assert_item_label.json
|
sv_type_identifier_assert_item_label vvp_tests/sv_type_identifier_assert_item_label.json
|
||||||
sv_type_identifier_assert_label vvp_tests/sv_type_identifier_assert_label.json
|
sv_type_identifier_assert_label vvp_tests/sv_type_identifier_assert_label.json
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"type" : "CE",
|
||||||
|
"source" : "sv_function_statement_order_event_fail.v",
|
||||||
|
"iverilog-args" : [ "-g2005-sv" ]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"type" : "CE",
|
||||||
|
"source" : "sv_function_statement_order_parameter_fail.v",
|
||||||
|
"iverilog-args" : [ "-g2005-sv" ]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"type" : "CE",
|
||||||
|
"source" : "sv_function_statement_order_variable_fail.v",
|
||||||
|
"iverilog-args" : [ "-g2005-sv" ]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"type" : "normal",
|
||||||
|
"source" : "sv_function_statement_recursive.v",
|
||||||
|
"iverilog-args" : [ "-g2005-sv" ],
|
||||||
|
"vlog95" : {
|
||||||
|
"__comment" : "Automatic functions are not supported",
|
||||||
|
"type" : "CE"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"type" : "normal",
|
||||||
|
"source" : "sv_function_statement_unit_precedence.v",
|
||||||
|
"iverilog-args" : [ "-g2005-sv" ]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"type" : "normal",
|
||||||
|
"source" : "sv_task_call_instance_lookup.v",
|
||||||
|
"vlog95" : {
|
||||||
|
"__comment" : "vlog95 cannot preserve instance-dependent subroutine binding",
|
||||||
|
"type" : "NI"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"type" : "normal",
|
||||||
|
"source" : "sv_task_call_object_shadow.v",
|
||||||
|
"iverilog-args" : [ "-g2005-sv" ],
|
||||||
|
"vlog95" : {
|
||||||
|
"__comment" : "Class scopes are not currently translated",
|
||||||
|
"type" : "CE"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"type" : "CE",
|
||||||
|
"source" : "sv_task_call_order_event_fail.v",
|
||||||
|
"iverilog-args" : [ "-g2005-sv" ]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"type" : "CE",
|
||||||
|
"source" : "sv_task_call_order_parameter_fail.v",
|
||||||
|
"iverilog-args" : [ "-g2005-sv" ]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"type" : "CE",
|
||||||
|
"source" : "sv_task_call_order_variable_fail.v",
|
||||||
|
"iverilog-args" : [ "-g2005-sv" ]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"type" : "normal",
|
||||||
|
"source" : "sv_task_call_receiver_unit_order.v",
|
||||||
|
"iverilog-args" : [ "-g2012" ],
|
||||||
|
"vlog95" : {
|
||||||
|
"__comment" : "Class scopes are not currently translated",
|
||||||
|
"type" : "CE"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"type" : "normal",
|
||||||
|
"source" : "sv_task_call_unit_precedence.v",
|
||||||
|
"iverilog-args" : [ "-g2005-sv" ]
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue