87 lines
2.6 KiB
Systemverilog
Executable File
87 lines
2.6 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, 2025 by PlanV GmbH.
|
|
// SPDX-License-Identifier: CC0-1.0
|
|
|
|
/* verilator lint_off WIDTHTRUNC */
|
|
class Inner;
|
|
rand int m_x;
|
|
rand int m_y;
|
|
endclass
|
|
|
|
class Middle;
|
|
rand Inner m_obj;
|
|
rand Inner m_arr[3];
|
|
endclass
|
|
|
|
class Outer;
|
|
rand Middle m_mid;
|
|
rand Middle m_mid_arr[2];
|
|
|
|
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
|
|
|
|
// 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;
|
|
}
|
|
|
|
// 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;
|
|
}
|
|
|
|
// 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;
|
|
}
|
|
|
|
// Case 4: Multiple array indices
|
|
constraint c_multi_array {
|
|
m_mid_arr[1].m_arr[2].m_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.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);
|
|
|
|
// 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;
|
|
end
|
|
end
|
|
endmodule
|
|
/* verilator lint_off WIDTHTRUNC */
|