From d1aecf452ca9737f29bce7c96f35a601321ad779 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Sun, 6 Feb 2022 15:27:24 +0100 Subject: [PATCH] Add regression test for return in tasks Check support for using the return statement in a task. * That it is possible to exit form a task using the `return` statement without affecting other concurrently running instances of the same task * That it is possible to use return in a named block in a task * That using a return value in a task results in a elaboration error * Returning from inside a parallel block in a task results in a elaboration error Signed-off-by: Lars-Peter Clausen --- ivtest/ivltests/task_return1.v | 31 +++++++++++++++++++++++++ ivtest/ivltests/task_return2.v | 22 ++++++++++++++++++ ivtest/ivltests/task_return_fail1.v | 15 ++++++++++++ ivtest/ivltests/task_return_fail2.v | 18 ++++++++++++++ ivtest/regress-vvp.list | 4 ++++ ivtest/vvp_tests/task_return1.json | 5 ++++ ivtest/vvp_tests/task_return2.json | 5 ++++ ivtest/vvp_tests/task_return_fail1.json | 5 ++++ ivtest/vvp_tests/task_return_fail2.json | 5 ++++ 9 files changed, 110 insertions(+) create mode 100644 ivtest/ivltests/task_return1.v create mode 100644 ivtest/ivltests/task_return2.v create mode 100644 ivtest/ivltests/task_return_fail1.v create mode 100644 ivtest/ivltests/task_return_fail2.v create mode 100644 ivtest/vvp_tests/task_return1.json create mode 100644 ivtest/vvp_tests/task_return2.json create mode 100644 ivtest/vvp_tests/task_return_fail1.json create mode 100644 ivtest/vvp_tests/task_return_fail2.json diff --git a/ivtest/ivltests/task_return1.v b/ivtest/ivltests/task_return1.v new file mode 100644 index 000000000..ae96bffba --- /dev/null +++ b/ivtest/ivltests/task_return1.v @@ -0,0 +1,31 @@ +// Check that it is possible to exit from a task using the return statement with +// affecting other concurrently running instances of the same task. + +module test; + + task automatic t(input integer a, output integer b); + if (a == 0) begin + b = 1; + return; + end + #10 + b = 100; + endtask + + integer b1; + integer b2; + + initial begin + fork + t(0, b1); + t(1, b2); + join + + if (b1 == 1 && b2 == 100) begin + $display("PASSED"); + end else begin + $display("FAILED b1=%0d, b2=%0d", b1, b2); + end + end + +endmodule diff --git a/ivtest/ivltests/task_return2.v b/ivtest/ivltests/task_return2.v new file mode 100644 index 000000000..d82c8fc64 --- /dev/null +++ b/ivtest/ivltests/task_return2.v @@ -0,0 +1,22 @@ +// Check that it is possible to return from a named sub-block of a task using a +// `return` statement. + +module test; + + task t(input integer a); + begin : subblock + if (a == 1) begin : condition + return; + end + end + $display("FAILED"); + $finish; + endtask + + initial begin + t(1); + #10 + $display("PASSED"); + end + +endmodule diff --git a/ivtest/ivltests/task_return_fail1.v b/ivtest/ivltests/task_return_fail1.v new file mode 100644 index 000000000..044116e16 --- /dev/null +++ b/ivtest/ivltests/task_return_fail1.v @@ -0,0 +1,15 @@ +// Check that using a return value when using the return statement in a task +// results in an error. + +module test; + + task t; + return 10; // This is an error, tasks can not have return values. + endtask + + initial begin + t(); + $display("FAILED"); + end + +endmodule diff --git a/ivtest/ivltests/task_return_fail2.v b/ivtest/ivltests/task_return_fail2.v new file mode 100644 index 000000000..a6b6ac37e --- /dev/null +++ b/ivtest/ivltests/task_return_fail2.v @@ -0,0 +1,18 @@ +// Check that using a return statment inside a parallel block in a task results +// in an error. + +module test; + + task t; + fork + // This is an error it is not possible to return from inside a parallel block + return; + join + endtask + + initial begin + t(); + $display("FAILED"); + end + +endmodule diff --git a/ivtest/regress-vvp.list b/ivtest/regress-vvp.list index 2dd09bb7a..01a976b3c 100644 --- a/ivtest/regress-vvp.list +++ b/ivtest/regress-vvp.list @@ -36,3 +36,7 @@ struct_packed_write_read2 vvp_tests/struct_packed_write_read2.json sv_foreach9 vvp_tests/sv_foreach9.json sv_foreach10 vvp_tests/sv_foreach10.json sdf_header vvp_tests/sdf_header.json +task_return1 vvp_tests/task_return1.json +task_return2 vvp_tests/task_return2.json +task_return_fail1 vvp_tests/task_return_fail1.json +task_return_fail2 vvp_tests/task_return_fail2.json diff --git a/ivtest/vvp_tests/task_return1.json b/ivtest/vvp_tests/task_return1.json new file mode 100644 index 000000000..d6fcc1d2c --- /dev/null +++ b/ivtest/vvp_tests/task_return1.json @@ -0,0 +1,5 @@ +{ + "type" : "normal", + "source" : "task_return1.v", + "iverilog-args" : [ "-g2005-sv" ] +} diff --git a/ivtest/vvp_tests/task_return2.json b/ivtest/vvp_tests/task_return2.json new file mode 100644 index 000000000..1bac64c1d --- /dev/null +++ b/ivtest/vvp_tests/task_return2.json @@ -0,0 +1,5 @@ +{ + "type" : "normal", + "source" : "task_return2.v", + "iverilog-args" : [ "-g2005-sv" ] +} diff --git a/ivtest/vvp_tests/task_return_fail1.json b/ivtest/vvp_tests/task_return_fail1.json new file mode 100644 index 000000000..3511d078c --- /dev/null +++ b/ivtest/vvp_tests/task_return_fail1.json @@ -0,0 +1,5 @@ +{ + "type" : "CE", + "source" : "task_return_fail1.v", + "iverilog-args" : [ "-g2005-sv" ] +} diff --git a/ivtest/vvp_tests/task_return_fail2.json b/ivtest/vvp_tests/task_return_fail2.json new file mode 100644 index 000000000..0ea73f5b4 --- /dev/null +++ b/ivtest/vvp_tests/task_return_fail2.json @@ -0,0 +1,5 @@ +{ + "type" : "CE", + "source" : "task_return_fail2.v", + "iverilog-args" : [ "-g2005-sv" ] +}