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
|