From 79043cb849e01b494e1ab432dc52f5f99d5ff4af Mon Sep 17 00:00:00 2001 From: Dag Lem Date: Sun, 19 Feb 2023 23:25:08 +0100 Subject: Out of bounds checking for struct/union members Currently, only constant indices are checked. --- tests/gen-tests-makefile.sh | 2 +- tests/svtypes/struct_array.sv | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) (limited to 'tests') 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..b87f936aa 100644 --- a/tests/svtypes/struct_array.sv +++ b/tests/svtypes/struct_array.sv @@ -18,6 +18,9 @@ module top; end always_comb assert(s==64'h4200_0012_3400_FFFC); + always_comb assert(s.b[23:16]===8'hxx); + always_comb assert(s.b[19:12]===8'hxf); + always_comb assert(s.a[0][3:-4]===8'h0x); struct packed { bit [7:0] [7:0] a; // 8 element packed array of bytes -- cgit v1.2.3 From 0d3423ddea1c24aea74206d64e6dc5196959ad5e Mon Sep 17 00:00:00 2001 From: Dag Lem Date: Tue, 28 Feb 2023 18:45:55 +0100 Subject: Index struct/union members within corresponding wire chunks This guards against access to bits outside of struct/union members via dynamic indexing. --- tests/svtypes/struct_array.sv | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/svtypes/struct_array.sv b/tests/svtypes/struct_array.sv index b87f936aa..bedc05b6f 100644 --- a/tests/svtypes/struct_array.sv +++ b/tests/svtypes/struct_array.sv @@ -12,15 +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); - always_comb assert(s.a[0][3:-4]===8'h0x); struct packed { bit [7:0] [7:0] a; // 8 element packed array of bytes -- cgit v1.2.3 From 1af7d6121f697b60e6eaabcabd50c49c90d09402 Mon Sep 17 00:00:00 2001 From: Dag Lem Date: Wed, 8 Mar 2023 20:25:39 +0100 Subject: Added test for dynamic indexing within struct members --- tests/svtypes/struct_dynamic_range.sv | 67 +++++++++++++++++++++++++++++++++++ tests/svtypes/struct_dynamic_range.ys | 4 +++ 2 files changed, 71 insertions(+) create mode 100644 tests/svtypes/struct_dynamic_range.sv create mode 100644 tests/svtypes/struct_dynamic_range.ys (limited to 'tests') 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 -- cgit v1.2.3