diff options
author | clairexen <claire@symbioticeda.com> | 2020-06-04 18:26:07 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-04 18:26:07 +0200 |
commit | 352731df4e0bf344cd20533a5561bc8ba3e07853 (patch) | |
tree | 12c29d3b7b87037b1b0e3a768b764801b7e34d9f /tests | |
parent | ba99c0ea8140131a95ed3d5467c5b2c93d16552e (diff) | |
parent | 0d3f7ea011288e1a1fadd4ae27f1e8a57d729053 (diff) | |
download | yosys-352731df4e0bf344cd20533a5561bc8ba3e07853.tar.gz yosys-352731df4e0bf344cd20533a5561bc8ba3e07853.tar.bz2 yosys-352731df4e0bf344cd20533a5561bc8ba3e07853.zip |
Merge pull request #2041 from PeterCrozier/struct
Implementation of SV structs.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/svtypes/struct_simple.sv | 48 | ||||
-rw-r--r-- | tests/svtypes/typedef_struct.sv | 42 | ||||
-rw-r--r-- | tests/svtypes/union_simple.sv | 72 |
3 files changed, 162 insertions, 0 deletions
diff --git a/tests/svtypes/struct_simple.sv b/tests/svtypes/struct_simple.sv new file mode 100644 index 000000000..c74289cc3 --- /dev/null +++ b/tests/svtypes/struct_simple.sv @@ -0,0 +1,48 @@ +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; + + struct packed { + byte a; + struct packed { + byte x, y; + } b; + } s2; + + 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; + assign s2.b.x = 'h42; + + 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); + always_comb assert(s2.b.x == 'h42); + +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 diff --git a/tests/svtypes/union_simple.sv b/tests/svtypes/union_simple.sv new file mode 100644 index 000000000..12e4b376f --- /dev/null +++ b/tests/svtypes/union_simple.sv @@ -0,0 +1,72 @@ +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 + + 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 |