mirror of
https://github.com/verilator/verilator.git
synced 2025-01-19 12:54:02 +00:00
70 lines
1.6 KiB
Systemverilog
70 lines
1.6 KiB
Systemverilog
// DESCRIPTION: Verilator: Verilog Test module
|
|
//
|
|
// This file ONLY is placed under the Creative Commons Public Domain, for
|
|
// any use, without warranty, 2024 by Kefa Chen.
|
|
// SPDX-License-Identifier: CC0-1.0
|
|
|
|
// Packed struct in package
|
|
package TEST_TYPES;
|
|
typedef union packed {
|
|
logic [64:0] a;
|
|
logic [2:0] b;
|
|
} sub_t;
|
|
typedef struct packed {
|
|
struct packed { // Anonymous packed struct
|
|
logic a;
|
|
} anon;
|
|
TEST_TYPES::sub_t [2:0][2:0][2:0] b;
|
|
} in_t /*verilator public*/;
|
|
typedef struct packed {
|
|
TEST_TYPES::sub_t [2:0][2:0][2:0] b;
|
|
struct packed {logic a;} anon;
|
|
} out_t /*verilator public*/;
|
|
endpackage
|
|
|
|
// Packed struct in class
|
|
class cls_in;
|
|
typedef struct packed {
|
|
logic a;
|
|
TEST_TYPES::sub_t [2:0][2:0][2:0] b;
|
|
} in_t /*verilator public*/;
|
|
in_t in;
|
|
endclass //cls
|
|
|
|
module add (
|
|
input TEST_TYPES::in_t op1,
|
|
//input cls_in op2,
|
|
output TEST_TYPES::out_t out
|
|
);
|
|
cls_in op2 /*verilator public_flat*/;
|
|
|
|
initial begin
|
|
if(op2 != null) $stop;
|
|
op2 = new();
|
|
if(!op2) $stop;
|
|
end
|
|
|
|
assign op2.in.a = op1.anon.a;
|
|
generate
|
|
for (genvar i = 0; i < 3; ++i) begin
|
|
for (genvar j = 0; j < 3; ++j) begin
|
|
for (genvar k = 0; k < 3; ++k) begin
|
|
assign op2.in.b[i][j][k] = op1.b[i][j][k];
|
|
end
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
assign out.anon.a = op1.anon.a + op2.in.a;
|
|
generate
|
|
for (genvar i = 0; i < 3; ++i) begin
|
|
for (genvar j = 0; j < 3; ++j) begin
|
|
for (genvar k = 0; k < 3; ++k) begin
|
|
assign out.b[i][j][k] = op1.b[i][j][k] + op2.in.b[i][j][k];
|
|
end
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
endmodule
|