aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorJannis Harder <me@jix.one>2022-12-01 00:58:32 +0100
committerGitHub <noreply@github.com>2022-12-01 00:58:32 +0100
commit4a2b7287ca45b3bafb050088a448cc8bdd1653d0 (patch)
treec4434718f8046a1015eb553f2c244866af82c923 /tests
parentf9db7c0599d87fa7d61b72979029c5894e3dbe6b (diff)
parent64f88eb7f120554ab662baf608b6f48d5eec3e6d (diff)
downloadyosys-4a2b7287ca45b3bafb050088a448cc8bdd1653d0.tar.gz
yosys-4a2b7287ca45b3bafb050088a448cc8bdd1653d0.tar.bz2
yosys-4a2b7287ca45b3bafb050088a448cc8bdd1653d0.zip
Merge pull request #3551 from daglem/struct-array-swapped-range
Support for arrays with swapped ranges within structs
Diffstat (limited to 'tests')
-rw-r--r--tests/svtypes/struct_array.sv131
1 files changed, 131 insertions, 0 deletions
diff --git a/tests/svtypes/struct_array.sv b/tests/svtypes/struct_array.sv
index 873f7befd..f69c4c577 100644
--- a/tests/svtypes/struct_array.sv
+++ b/tests/svtypes/struct_array.sv
@@ -39,4 +39,135 @@ module top;
always_comb assert(s2==80'hFC00_4200_0012_3400_FFFC);
+ // Same as s2, but with little endian addressing
+ struct packed {
+ bit [0:7] [7:0] a; // 8 element packed array of bytes
+ bit [0:15] b; // filler for non-zero offset
+ } s3;
+
+ initial begin
+ s3 = '0;
+
+ s3.a[5:6] = 16'h1234;
+ s3.a[2] = 8'h42;
+
+ s3.a[0] = '1;
+ s3.a[0][1:0] = '0;
+
+ s3.b = '1;
+ s3.b[14:15] = '0;
+ end
+
+ always_comb assert(s3==80'hFC00_4200_0012_3400_FFFC);
+
+ // Same as s3, but with little endian bit addressing
+ struct packed {
+ bit [0:7] [0:7] a; // 8 element packed array of bytes
+ bit [0:15] b; // filler for non-zero offset
+ } s3_b;
+
+ initial begin
+ s3_b = '0;
+
+ s3_b.a[5:6] = 16'h1234;
+ s3_b.a[2] = 8'h42;
+
+ s3_b.a[0] = '1;
+ s3_b.a[0][6:7] = '0;
+
+ s3_b.b = '1;
+ s3_b.b[14:15] = '0;
+ end
+
+ always_comb assert(s3_b==80'hFC00_4200_0012_3400_FFFC);
+
+`ifndef VERIFIC
+ // Note that the tests below for unpacked arrays in structs rely on the
+ // fact that they are actually packed in Yosys.
+
+ // Same as s2, but using unpacked array syntax
+ struct packed {
+ bit [7:0] a [7:0]; // 8 element unpacked array of bytes
+ bit [15:0] b; // filler for non-zero offset
+ } s4;
+
+ initial begin
+ s4 = '0;
+
+ s4.a[2:1] = 16'h1234;
+ s4.a[5] = 8'h42;
+
+ s4.a[7] = '1;
+ s4.a[7][1:0] = '0;
+
+ s4.b = '1;
+ s4.b[1:0] = '0;
+ end
+
+ always_comb assert(s4==80'hFC00_4200_0012_3400_FFFC);
+
+ // Same as s3, but using unpacked array syntax
+ struct packed {
+ bit [7:0] a [0:7]; // 8 element unpacked array of bytes
+ bit [0:15] b; // filler for non-zero offset
+ } s5;
+
+ initial begin
+ s5 = '0;
+
+ s5.a[5:6] = 16'h1234;
+ s5.a[2] = 8'h42;
+
+ s5.a[0] = '1;
+ s5.a[0][1:0] = '0;
+
+ s5.b = '1;
+ s5.b[14:15] = '0;
+ end
+
+ always_comb assert(s5==80'hFC00_4200_0012_3400_FFFC);
+
+ // Same as s5, but with little endian bit addressing
+ struct packed {
+ bit [0:7] a [0:7]; // 8 element unpacked array of bytes
+ bit [0:15] b; // filler for non-zero offset
+ } s5_b;
+
+ initial begin
+ s5_b = '0;
+
+ s5_b.a[5:6] = 16'h1234;
+ s5_b.a[2] = 8'h42;
+
+ s5_b.a[0] = '1;
+ s5_b.a[0][6:7] = '0;
+
+ s5_b.b = '1;
+ s5_b.b[14:15] = '0;
+ end
+
+ always_comb assert(s5_b==80'hFC00_4200_0012_3400_FFFC);
+
+ // Same as s5, but using C-type unpacked array syntax
+ struct packed {
+ bit [7:0] a [8]; // 8 element unpacked array of bytes
+ bit [0:15] b; // filler for non-zero offset
+ } s6;
+
+ initial begin
+ s6 = '0;
+
+ s6.a[5:6] = 16'h1234;
+ s6.a[2] = 8'h42;
+
+ s6.a[0] = '1;
+ s6.a[0][1:0] = '0;
+
+ s6.b = '1;
+ s6.b[14:15] = '0;
+ end
+
+ always_comb assert(s6==80'hFC00_4200_0012_3400_FFFC);
+`endif
+
endmodule