verilator/test_regress/t/t_constraint_global_arr_uns...

87 lines
2.6 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;
2025-10-29 14:40:24 +01:00
rand int m_x;
rand int m_y;
2025-10-26 12:44:43 +01:00
endclass
class Middle;
2025-10-29 14:40:24 +01:00
rand Inner m_obj;
rand Inner m_arr[3];
2025-10-26 12:44:43 +01:00
endclass
class Outer;
2025-10-29 14:40:24 +01:00
rand Middle m_mid;
rand Middle m_mid_arr[2];
2025-10-26 12:44:43 +01:00
2025-10-29 14:40:24 +01:00
function new();
m_mid = new;
m_mid.m_obj = new;
foreach (m_mid.m_arr[i]) m_mid.m_arr[i] = new;
foreach (m_mid_arr[i]) begin
m_mid_arr[i] = new;
m_mid_arr[i].m_obj = new;
foreach (m_mid_arr[i].m_arr[j]) m_mid_arr[i].m_arr[j] = new;
end
endfunction
2025-10-26 12:44:43 +01:00
2025-10-29 14:40:24 +01:00
// Case 1: Simple nested member access (should work)
constraint c_simple {
m_mid.m_obj.m_x == 100;
m_mid.m_obj.m_y == 101;
}
2025-10-26 12:44:43 +01:00
2025-10-29 14:40:24 +01:00
// Case 2: Array indexing in the path (may not work)
constraint c_array_index {
m_mid.m_arr[0].m_x == 200;
m_mid.m_arr[0].m_y == 201;
}
2025-10-26 12:44:43 +01:00
2025-10-29 14:40:24 +01:00
// Case 3: Nested array indexing
constraint c_nested_array {
m_mid_arr[0].m_obj.m_x == 300;
m_mid_arr[0].m_obj.m_y == 301;
}
2025-10-26 12:44:43 +01:00
2025-10-29 14:40:24 +01:00
// Case 4: Multiple array indices
constraint c_multi_array {
m_mid_arr[1].m_arr[2].m_y == 400;
}
2025-10-26 12:44:43 +01:00
endclass
module t_constraint_global_arr_unsup;
2025-10-29 14:40:24 +01:00
initial begin
Outer o = new;
if (o.randomize()) begin
$display("Case 1 - Simple: mid.obj.x = %0d (expected 100)", o.m_mid.m_obj.m_x);
$display("Case 1 - Simple: mid.obj.y = %0d (expected 101)", o.m_mid.m_obj.m_y);
$display("Case 2 - Array[0]: mid.arr[0].x = %0d (expected 200)", o.m_mid.m_arr[0].m_x);
$display("Case 2 - Array[0]: mid.arr[0].y = %0d (expected 201)", o.m_mid.m_arr[0].m_y);
$display("Case 3 - Nested[0]: mid_arr[0].obj.x = %0d (expected 300)", o.m_mid_arr[0].m_obj.m_x);
$display("Case 3 - Nested[0]: mid_arr[0].obj.y = %0d (expected 301)", o.m_mid_arr[0].m_obj.m_y);
$display("Case 4 - Multi[1][2]: mid_arr[1].arr[2].y = %0d (expected 400)", o.m_mid_arr[1].m_arr[2].m_y);
2025-10-26 12:44:43 +01:00
2025-10-29 14:40:24 +01:00
// Check results
if (o.m_mid.m_obj.m_x == 100 && o.m_mid.m_obj.m_y == 101 &&
o.m_mid.m_arr[0].m_x == 200 && o.m_mid.m_arr[0].m_y == 201 &&
o.m_mid_arr[0].m_obj.m_x == 300 && o.m_mid_arr[0].m_obj.m_y == 301 &&
o.m_mid_arr[1].m_arr[2].m_y == 400) begin
$display("*-* All Finished *-*");
$finish;
end else begin
$display("*-* FAILED *-*");
$stop;
end
end else begin
$display("*-* FAILED: randomize() returned 0 *-*");
$stop;
2025-10-26 12:44:43 +01:00
end
2025-10-29 14:40:24 +01:00
end
2025-10-26 12:44:43 +01:00
endmodule
/* verilator lint_off WIDTHTRUNC */