mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-23 00:55:32 +00:00
Merge pull request #2041 from PeterCrozier/struct
Implementation of SV structs.
This commit is contained in:
commit
352731df4e
10 changed files with 688 additions and 202 deletions
48
tests/svtypes/struct_simple.sv
Normal file
48
tests/svtypes/struct_simple.sv
Normal file
|
@ -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
|
42
tests/svtypes/typedef_struct.sv
Normal file
42
tests/svtypes/typedef_struct.sv
Normal file
|
@ -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
|
72
tests/svtypes/union_simple.sv
Normal file
72
tests/svtypes/union_simple.sv
Normal file
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue