File: t_export_packed_struct.v

package info (click to toggle)
verilator 5.038-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 162,552 kB
  • sloc: cpp: 139,204; python: 20,931; ansic: 10,222; yacc: 6,000; lex: 1,925; makefile: 1,260; sh: 494; perl: 282; fortran: 22
file content (133 lines) | stat: -rw-r--r-- 3,304 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// 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

typedef logic [5:0] udata6_t;

typedef union soft packed {
    udata6_t      a;
    logic [2 : 0] b;
} sub_t;

typedef struct packed {
  logic [40:0]   a;
  udata6_t [3:0] nullptr;  // name confict test
  sub_t          get;      // name confict test
} in_t  /*verilator public*/;

typedef struct packed {
  udata6_t [3:0] nullptr;
  sub_t          get;
  logic [40:0]   a;
} out_t  /*verilator public*/;

// struct in1_t should cover parts of VL_ASSIGNSEL_II functions
typedef struct packed {
  logic [3:0]  a;
  logic [11:0] b;
} in1_t  /*verilator public*/;  // 4 + 12 = 16

typedef struct packed {
  logic [11:0] b;
  logic [3:0]  a;
} out1_t  /*verilator public*/;

// struct in2_t should cover all VL_ASSIGNSEL_II functions
typedef struct packed {
  logic [2:0]  a;
  logic [8:0]  b;
  logic [18:0] c;
} in2_t  /*verilator public*/;  // 3 + 9 + 19 = 31

typedef struct packed {
  logic [8:0]  b;
  logic [18:0] c;
  logic [2:0]  a;
} out2_t  /*verilator public*/;

// struct in3_t should cover all VL_ASSIGNSEL_XQ functions
typedef struct packed {
  logic [1:0]  a;
  logic [8:0]  b;
  logic [16:0] c;
  logic [32:0] d;
} in3_t  /*verilator public*/;  // 33 + 17 + 9 + 2 = 61

typedef struct packed {
  logic [8:0]  b;
  logic [1:0]  a;
  logic [32:0] d;
  logic [16:0] c;
} out3_t  /*verilator public*/;

// struct in4_t should cover all VL_ASSIGNSEL_XW functions
typedef struct packed {
  logic [4:0]  a;
  logic [12:0] b;
  logic [24:0] c;
  logic [48:0] d;
  logic [80:0] e;
} in4_t  /*verilator public*/;  // 5 + 13 + 25 + 49 + 81 = 173

typedef struct packed {
  logic [24:0] c;
  logic [48:0] d;
  logic [80:0] e;
  logic [4:0]  a;
  logic [12:0] b;
} out4_t  /*verilator public*/;

module add (
  input  in_t   op1,
  input  in_t   op2,
  output out_t  out,
  // Add some extra ports to test all VL_ASSIGNSEL_XX functions
  input  in1_t  op1a,
  input  in1_t  op1b,
  output out1_t out1,
  // Add some extra ports to test all VL_ASSIGNSEL_XX functions
  input  in2_t  op2a,
  input  in2_t  op2b,
  output out2_t out2,
  // Add some extra ports to test all VL_ASSIGNSEL_XX functions
  input  in3_t  op3a,
  input  in3_t  op3b,
  output out3_t out3,
  // Add some extra ports to test all VL_ASSIGNSEL_XX functions
  input  in4_t  op4a,
  input  in4_t  op4b,
  output out4_t out4
);
  assign out.a = op1.a + op2.a;
  generate
    for (genvar i = 0; i < 4; ++i) begin
      assign out.nullptr[i] = op1.nullptr[i] + op2.nullptr[i];
    end
  endgenerate
  assign out.get.a = op1.get.a + op2.get.a;

  // out1
  assign out1.a    = op1a.a + op1b.a;
  assign out1.b    = op1a.b + op1b.b;

  // out2
  assign out2.a    = op2a.a + op2b.a;
  assign out2.b    = op2a.b + op2b.b;
  assign out2.c    = op2a.c + op2b.c;

  // out3
  assign out3.a    = op3a.a + op3b.a;
  assign out3.b    = op3a.b + op3b.b;
  assign out3.c    = op3a.c + op3b.c;
  assign out3.d    = op3a.d + op3b.d;

  // out4
  assign out4.a    = op4a.a + op4b.a;
  assign out4.b    = op4a.b + op4b.b;
  assign out4.c    = op4a.c + op4b.c;
  assign out4.d    = op4a.d + op4b.d;
  assign out4.e    = op4a.e + op4b.e;

endmodule