File: t_randomize_union.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 (168 lines) | stat: -rwxr-xr-x 6,319 bytes parent folder | download | duplicates (2)
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2024 by PlanV GmbH.
// SPDX-License-Identifier: CC0-1.0

typedef union packed {
    int int_value;
    bit [31:0] bits;
} SimpleUnion;

typedef struct packed {
    rand bit [3:0] field_a;
    rand bit [7:0] field_b;
} PackedStruct;

typedef union packed {
    PackedStruct struct_fields;
    bit [11:0] inner_bits;
} StructInUnion;

typedef union packed {
    StructInUnion inner_union;
    bit [11:0] outer_bits;
} UnionInUnion;

// SimpleUnion Constrained Test Class
class SimpleUnionConstrainedTest;
    rand SimpleUnion union_instance;

    function new();
        union_instance.bits = 32'b0;
    endfunction

    constraint union_constraint {
        union_instance.bits[11:0] inside {[0:4095]};
    }
endclass

// SimpleUnion Unconstrained Test Class
class SimpleUnionUnconstrainedTest;
    rand SimpleUnion union_instance;

    function new();
        union_instance.bits = 32'b0;
    endfunction
endclass

// StructInUnion Constrained Test Class
class StructInUnionConstrainedTest;
    rand StructInUnion union_instance;

    function new();
        union_instance.inner_bits = 12'b0;
    endfunction

    constraint union_constraint {
        union_instance.inner_bits inside {[0:4095]};
    }
endclass

// StructInUnion Unconstrained Test Class
class StructInUnionUnconstrainedTest;
    rand StructInUnion union_instance;

    function new();
        union_instance.inner_bits = 12'b0;
    endfunction
endclass

// UnionInUnion Constrained Test Class
class UnionInUnionConstrainedTest;
    rand UnionInUnion union_instance;

    function new();
        union_instance.outer_bits = 12'b0;
    endfunction

    constraint union_constraint {
        union_instance.outer_bits inside {[0:4095]};
    }
endclass

// UnionInUnion Unconstrained Test Class
class UnionInUnionUnconstrainedTest;
    rand UnionInUnion union_instance;

    function new();
        union_instance.outer_bits = 12'b0;
    endfunction
endclass

// Top-Level Test Module
module t_randomize_union;

    // Instances of each test class
    SimpleUnionConstrainedTest test_simple_union_constrained;
    SimpleUnionUnconstrainedTest test_simple_union_unconstrained;
    StructInUnionConstrainedTest test_struct_in_union_constrained;
    StructInUnionUnconstrainedTest test_struct_in_union_unconstrained;
    UnionInUnionConstrainedTest test_union_in_union_constrained;
    UnionInUnionUnconstrainedTest test_union_in_union_unconstrained;

    initial begin
        // Test 1: SimpleUnion Constrained Test
        test_simple_union_constrained = new();
        $display("\n--- Test 1: SimpleUnion Constrained Test ---");
        repeat(10) begin
            int success;
            success = test_simple_union_constrained.randomize();
            if (success != 1) $stop;
            $display("SimpleUnion (Constrained): int_value: %b, bits: %b", test_simple_union_constrained.union_instance.int_value, test_simple_union_constrained.union_instance.bits);
        end

        // Test 2: SimpleUnion Unconstrained Test
        test_simple_union_unconstrained = new();
        $display("\n--- Test 2: SimpleUnion Unconstrained Test ---");
        repeat(10) begin
            int success;
            success = test_simple_union_unconstrained.randomize();
            if (success != 1) $stop;
            $display("SimpleUnion (Unconstrained): int_value: %b, bits: %b", test_simple_union_unconstrained.union_instance.int_value, test_simple_union_unconstrained.union_instance.bits);
        end

        // Test 3: StructInUnion Constrained Test
        test_struct_in_union_constrained = new();
        $display("\n--- Test 3: StructInUnion Constrained Test ---");
        repeat(10) begin
            int success;
            success = test_struct_in_union_constrained.randomize();
            if (success != 1) $stop;
            $display("StructInUnion (Constrained): struct.a: %b, struct.b: %b, inner_bits: %b", test_struct_in_union_constrained.union_instance.struct_fields.field_a, test_struct_in_union_constrained.union_instance.struct_fields.field_b, test_struct_in_union_constrained.union_instance.inner_bits);
        end

        // Test 4: StructInUnion Unconstrained Test
        test_struct_in_union_unconstrained = new();
        $display("\n--- Test 4: StructInUnion Unconstrained Test ---");
        repeat(10) begin
            int success;
            success = test_struct_in_union_unconstrained.randomize();
            if (success != 1) $stop;
            $display("StructInUnion (Unconstrained): struct.a: %b, struct.b: %b, inner_bits: %b", test_struct_in_union_unconstrained.union_instance.struct_fields.field_a, test_struct_in_union_unconstrained.union_instance.struct_fields.field_b, test_struct_in_union_unconstrained.union_instance.inner_bits);
        end

        // Test 5: UnionInUnion Constrained Test
        test_union_in_union_constrained = new();
        $display("\n--- Test 5: UnionInUnion Constrained Test ---");
        repeat(10) begin
            int success;
            success = test_union_in_union_constrained.randomize();
            if (success != 1) $stop;
            $display("UnionInUnion (Constrained): outer_bits: %b, inner_union.struct: %b, b: %b", test_union_in_union_constrained.union_instance.outer_bits, test_union_in_union_constrained.union_instance.inner_union.struct_fields.field_a, test_union_in_union_constrained.union_instance.inner_union.struct_fields.field_b);
        end

        // Test 6: UnionInUnion Unconstrained Test
        test_union_in_union_unconstrained = new();
        $display("\n--- Test 6: UnionInUnion Unconstrained Test ---");
        repeat(10) begin
            int success;
            success = test_union_in_union_unconstrained.randomize();
            if (success != 1) $stop;
            $display("UnionInUnion (Unconstrained): outer_bits: %b, inner_union.struct: %b, inner_union.inner_bits: %b", test_union_in_union_unconstrained.union_instance.outer_bits, test_union_in_union_unconstrained.union_instance.inner_union.struct_fields, test_union_in_union_unconstrained.union_instance.inner_union.inner_bits);
        end
        $write("*-* All Finished *-*\n");
        $finish;
    end

endmodule