verilator/test_regress/t/t_constraint_global_arr_uns...

87 lines
2.7 KiB
Systemverilog
Raw Normal View History

2025-10-26 12:44:43 +01:00
// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2025 by PlanV GmbH.
// SPDX-License-Identifier: CC0-1.0
/* verilator lint_off WIDTHTRUNC */
class Inner;
rand int x;
rand int y;
endclass
class Middle;
rand Inner obj;
rand Inner arr[3];
endclass
class Outer;
rand Middle mid;
rand Middle mid_arr[2];
function new();
mid = new;
mid.obj = new;
foreach (mid.arr[i]) mid.arr[i] = new;
foreach (mid_arr[i]) begin
mid_arr[i] = new;
mid_arr[i].obj = new;
foreach (mid_arr[i].arr[j]) mid_arr[i].arr[j] = new;
end
endfunction
// Case 1: Simple nested member access (should work)
constraint c_simple {
mid.obj.x == 100;
mid.obj.y == 101;
}
// Case 2: Array indexing in the path (may not work)
constraint c_array_index {
mid.arr[0].x == 200;
mid.arr[0].y == 201;
}
// Case 3: Nested array indexing
constraint c_nested_array {
mid_arr[0].obj.x == 300;
mid_arr[0].obj.y == 301;
}
// Case 4: Multiple array indices
constraint c_multi_array {
mid_arr[1].arr[2].y == 400;
}
endclass
module t_constraint_global_arr_unsup;
initial begin
Outer o = new;
if (o.randomize()) begin
$display("Case 1 - Simple: mid.obj.x = %0d (expected 100)", o.mid.obj.x);
$display("Case 1 - Simple: mid.obj.y = %0d (expected 101)", o.mid.obj.y);
$display("Case 2 - Array[0]: mid.arr[0].x = %0d (expected 200)", o.mid.arr[0].x);
$display("Case 2 - Array[0]: mid.arr[0].y = %0d (expected 201)", o.mid.arr[0].y);
$display("Case 3 - Nested[0]: mid_arr[0].obj.x = %0d (expected 300)", o.mid_arr[0].obj.x);
$display("Case 3 - Nested[0]: mid_arr[0].obj.y = %0d (expected 301)", o.mid_arr[0].obj.y);
$display("Case 4 - Multi[1][2]: mid_arr[1].arr[2].y = %0d (expected 400)", o.mid_arr[1].arr[2].y);
// Check results
if (o.mid.obj.x == 100 && o.mid.obj.y == 101 &&
o.mid.arr[0].x == 200 && o.mid.arr[0].y == 201 &&
o.mid_arr[0].obj.x == 300 && o.mid_arr[0].obj.y == 301 &&
o.mid_arr[1].arr[2].y == 400) begin
$display("*-* All Finished *-*");
$finish;
end else begin
$display("*-* FAILED *-*");
$stop;
end
end else begin
$display("*-* FAILED: randomize() returned 0 *-*");
$stop;
end
end
endmodule
/* verilator lint_off WIDTHTRUNC */