mirror of
https://github.com/verilator/verilator.git
synced 2025-04-04 19:52:39 +00:00
169 lines
6.2 KiB
Systemverilog
Executable File
169 lines
6.2 KiB
Systemverilog
Executable File
// 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
|