3
0
Fork 0
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:
clairexen 2020-06-04 18:26:07 +02:00 committed by GitHub
commit 352731df4e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 688 additions and 202 deletions

View 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

View 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

View 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