aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorJannis Harder <me@jix.one>2023-03-10 16:14:56 +0100
committerGitHub <noreply@github.com>2023-03-10 16:14:56 +0100
commitc50f641812deed626bc9ecbfe171f56f36bf8432 (patch)
tree0344e0d36e05dc8e9de1a9309d4c509f8cb92ba5 /tests
parentbaa3659ea54aed3a714ed2fcb8b5242f5332ef37 (diff)
parent1af7d6121f697b60e6eaabcabd50c49c90d09402 (diff)
downloadyosys-c50f641812deed626bc9ecbfe171f56f36bf8432.tar.gz
yosys-c50f641812deed626bc9ecbfe171f56f36bf8432.tar.bz2
yosys-c50f641812deed626bc9ecbfe171f56f36bf8432.zip
Merge pull request #3682 from daglem/struct-member-out-of-bounds
Out of bounds checking for struct/union members
Diffstat (limited to 'tests')
-rwxr-xr-xtests/gen-tests-makefile.sh2
-rw-r--r--tests/svtypes/struct_array.sv4
-rw-r--r--tests/svtypes/struct_dynamic_range.sv67
-rw-r--r--tests/svtypes/struct_dynamic_range.ys4
4 files changed, 76 insertions, 1 deletions
diff --git a/tests/gen-tests-makefile.sh b/tests/gen-tests-makefile.sh
index cde9ab1b9..3df36a963 100755
--- a/tests/gen-tests-makefile.sh
+++ b/tests/gen-tests-makefile.sh
@@ -75,7 +75,7 @@ generate_tests() {
if [[ $do_sv = true ]]; then
for x in *.sv; do
if [ ! -f "${x%.sv}.ys" ]; then
- generate_ys_test "$x" "-p \"prep -top top; sat -verify -prove-asserts\" $yosys_args"
+ generate_ys_test "$x" "-p \"prep -top top; sat -enable_undef -verify -prove-asserts\" $yosys_args"
fi;
done
fi;
diff --git a/tests/svtypes/struct_array.sv b/tests/svtypes/struct_array.sv
index a0b84640d..bedc05b6f 100644
--- a/tests/svtypes/struct_array.sv
+++ b/tests/svtypes/struct_array.sv
@@ -12,12 +12,16 @@ module top;
s.a[2:1] = 16'h1234;
s.a[5] = 8'h42;
+ s.a[-1] = '0;
s.b = '1;
s.b[1:0] = '0;
end
always_comb assert(s==64'h4200_0012_3400_FFFC);
+ always_comb assert(s.a[0][3:-4]===8'h0x);
+ always_comb assert(s.b[23:16]===8'hxx);
+ always_comb assert(s.b[19:12]===8'hxf);
struct packed {
bit [7:0] [7:0] a; // 8 element packed array of bytes
diff --git a/tests/svtypes/struct_dynamic_range.sv b/tests/svtypes/struct_dynamic_range.sv
new file mode 100644
index 000000000..ce1f14670
--- /dev/null
+++ b/tests/svtypes/struct_dynamic_range.sv
@@ -0,0 +1,67 @@
+module range_shift_mask(
+ input logic [2:0] addr_i,
+ input logic [7:0] data_i,
+ input logic [2:0] addr_o,
+ output logic [7:0] data_o
+);
+ // (* nowrshmsk = 0 *)
+ struct packed {
+ logic [7:0] msb;
+ logic [0:3][7:0] data;
+ logic [7:0] lsb;
+ } s;
+
+ always_comb begin
+ s = '1;
+ s.data[addr_i] = data_i;
+ data_o = s.data[addr_o];
+ end
+endmodule
+
+module range_case(
+ input logic [2:0] addr_i,
+ input logic [7:0] data_i,
+ input logic [2:0] addr_o,
+ output logic [7:0] data_o
+);
+ // (* nowrshmsk = 1 *)
+ struct packed {
+ logic [7:0] msb;
+ logic [0:3][7:0] data;
+ logic [7:0] lsb;
+ } s;
+
+ always_comb begin
+ s = '1;
+ s.data[addr_i] = data_i;
+ data_o = s.data[addr_o];
+ end
+endmodule
+
+module top;
+ logic [7:0] data_shift_mask1;
+ range_shift_mask range_shift_mask1(3'd1, 8'h7e, 3'd1, data_shift_mask1);
+ logic [7:0] data_shift_mask2;
+ range_shift_mask range_shift_mask2(3'd1, 8'h7e, 3'd2, data_shift_mask2);
+ logic [7:0] data_shift_mask3;
+ range_shift_mask range_shift_mask3(3'd1, 8'h7e, 3'd4, data_shift_mask3);
+
+ always_comb begin
+ assert(data_shift_mask1 === 8'h7e);
+ assert(data_shift_mask2 === 8'hff);
+ assert(data_shift_mask3 === 8'hxx);
+ end
+
+ logic [7:0] data_case1;
+ range_case range_case1(3'd1, 8'h7e, 3'd1, data_case1);
+ logic [7:0] data_case2;
+ range_case range_case2(3'd1, 8'h7e, 3'd2, data_case2);
+ logic [7:0] data_case3;
+ range_case range_case3(3'd1, 8'h7e, 3'd4, data_case3);
+
+ always_comb begin
+ assert(data_case1 === 8'h7e);
+ assert(data_case2 === 8'hff);
+ assert(data_case3 === 8'hxx);
+ end
+endmodule
diff --git a/tests/svtypes/struct_dynamic_range.ys b/tests/svtypes/struct_dynamic_range.ys
new file mode 100644
index 000000000..d09e1924d
--- /dev/null
+++ b/tests/svtypes/struct_dynamic_range.ys
@@ -0,0 +1,4 @@
+read_verilog -sv struct_dynamic_range.sv
+prep -top top
+flatten
+sat -enable_undef -verify -prove-asserts