From 0b6b47ca670b9219bcb81ab7d3599267c2ef7571 Mon Sep 17 00:00:00 2001 From: Peter Crozier Date: Fri, 8 May 2020 14:40:49 +0100 Subject: Implement SV structs. --- tests/svtypes/struct_simple.sv | 39 ++++++++++++++++++++++++++++++++++++++ tests/svtypes/typedef_struct.sv | 42 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 tests/svtypes/struct_simple.sv create mode 100644 tests/svtypes/typedef_struct.sv (limited to 'tests') diff --git a/tests/svtypes/struct_simple.sv b/tests/svtypes/struct_simple.sv new file mode 100644 index 000000000..e29489fb7 --- /dev/null +++ b/tests/svtypes/struct_simple.sv @@ -0,0 +1,39 @@ +module top; + localparam BITS=8; + + struct packed { + logic a; + logic[BITS-1:0] b; + byte c; + logic x, y; + } s; + + struct packed signed { + integer a; + logic[15:0] b; + logic[7:0] c; + bit [7:0] d; + } pack1; + + assign s.a = '1; + assign s.b = '1; + assign s.c = 8'hAA; + assign s.x = '1; + logic[7:0] t; + assign t = s.b; + assign pack1.a = 42; + assign pack1.b = 16'hAAAA; + assign pack1.c = '1; + assign pack1.d = 8'h55; + + always_comb assert(s.a == 1'b1); + always_comb assert(s.c == 8'hAA); + always_comb assert(s.x == 1'b1); + always_comb assert(t == 8'hFF); + always_comb assert(pack1.a == 42); + always_comb assert(pack1.b == 16'hAAAA); + always_comb assert(pack1.c == 8'hFF); + always_comb assert(pack1[15:8] == 8'hFF); + always_comb assert(pack1.d == 8'h55); + +endmodule diff --git a/tests/svtypes/typedef_struct.sv b/tests/svtypes/typedef_struct.sv new file mode 100644 index 000000000..7ae007952 --- /dev/null +++ b/tests/svtypes/typedef_struct.sv @@ -0,0 +1,42 @@ +package p; + +typedef struct packed { + byte a; + byte b; +} p_t; + +endpackage + + +module top; + + typedef logic[7:0] t_t; + + typedef struct packed { + bit a; + logic[7:0] b; + t_t t; + } s_t; + + s_t s; + s_t s1; + + p::p_t ps; + + assign s.a = '1; + assign s.b = '1; + assign s.t = 8'h55; + assign s1 = s; + assign ps.a = 8'hAA; + assign ps.b = 8'h55; + + always_comb begin + assert(s.a == 1'b1); + assert(s.b == 8'hFF); + assert(s.t == 8'h55); + assert(s1.t == 8'h55); + assert(ps.a == 8'hAA); + assert(ps.b == 8'h55); + end + +endmodule -- cgit v1.2.3 From f482c9c0168a6857383e7d9360c8ca1df36ba2bc Mon Sep 17 00:00:00 2001 From: Peter Crozier Date: Tue, 12 May 2020 14:25:33 +0100 Subject: Generalise structs and add support for packed unions. --- tests/svtypes/union_simple.sv | 61 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 tests/svtypes/union_simple.sv (limited to 'tests') diff --git a/tests/svtypes/union_simple.sv b/tests/svtypes/union_simple.sv new file mode 100644 index 000000000..fc23fe6e8 --- /dev/null +++ b/tests/svtypes/union_simple.sv @@ -0,0 +1,61 @@ +module top; + + typedef struct packed { + byte a,b,c,d; + } byte4_t; + + typedef union packed { + int x; + byte4_t y; + } w_t; + + w_t w; + + assign w.x = 'h42; + always_comb begin + assert(w.y.d == 8'h42); + end + + typedef logic[4:0] reg_addr_t; + typedef logic[6:0] opcode_t; + + typedef struct packed { + bit [6:0] func7; + reg_addr_t rs2; + reg_addr_t rs1; + bit [2:0] func3; + reg_addr_t rd; + opcode_t opcode; + } R_t; + + typedef struct packed { + bit[11:0] imm; + reg_addr_t rs1; + bit[2:0] func3; + reg_addr_t rd; + opcode_t opcode; + } I_t; + + typedef struct packed { + bit[19:0] imm; + reg_addr_t rd; + opcode_t opcode; + } U_t; + + typedef union packed { + R_t r; + I_t i; + U_t u; + } instruction_t; + + instruction_t ir1; + assign ir1 = 32'h0AA01EB7; // lui t4,0xAA01 + always_comb begin + assert(ir1.u.opcode == 'h37); + assert(ir1.r.opcode == 'h37); + assert(ir1.u.rd == 'd29); + assert(ir1.r.rd == 'd29); + assert(ir1.u.imm == 'hAA01); + end + +endmodule -- cgit v1.2.3 From 17f050d3c6b8934141c42f96a3418de67a687b2c Mon Sep 17 00:00:00 2001 From: Peter Crozier Date: Tue, 12 May 2020 17:20:34 +0100 Subject: Allow structs within structs. --- tests/svtypes/struct_simple.sv | 9 +++++++++ tests/svtypes/union_simple.sv | 11 +++++++++++ 2 files changed, 20 insertions(+) (limited to 'tests') diff --git a/tests/svtypes/struct_simple.sv b/tests/svtypes/struct_simple.sv index e29489fb7..c74289cc3 100644 --- a/tests/svtypes/struct_simple.sv +++ b/tests/svtypes/struct_simple.sv @@ -15,6 +15,13 @@ module top; bit [7:0] d; } pack1; + struct packed { + byte a; + struct packed { + byte x, y; + } b; + } s2; + assign s.a = '1; assign s.b = '1; assign s.c = 8'hAA; @@ -25,6 +32,7 @@ module top; assign pack1.b = 16'hAAAA; assign pack1.c = '1; assign pack1.d = 8'h55; + assign s2.b.x = 'h42; always_comb assert(s.a == 1'b1); always_comb assert(s.c == 8'hAA); @@ -35,5 +43,6 @@ module top; always_comb assert(pack1.c == 8'hFF); always_comb assert(pack1[15:8] == 8'hFF); always_comb assert(pack1.d == 8'h55); + always_comb assert(s2.b.x == 'h42); endmodule diff --git a/tests/svtypes/union_simple.sv b/tests/svtypes/union_simple.sv index fc23fe6e8..12e4b376f 100644 --- a/tests/svtypes/union_simple.sv +++ b/tests/svtypes/union_simple.sv @@ -58,4 +58,15 @@ module top; assert(ir1.u.imm == 'hAA01); end + union packed { + int word; + struct packed { + byte a, b, c, d; + } byte4; + } u; + assign u.word = 'h42; + always_comb begin + assert(u.byte4.d == 'h42); + end + endmodule -- cgit v1.2.3