verilator/test_regress/t/t_iface_array_multidim_nest...

69 lines
1.8 KiB
Systemverilog

// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain.
// SPDX-FileCopyrightText: 2026 Wilson Snyder
// SPDX-License-Identifier: CC0-1.0
// Multi-dim iface array where outer iface contains an inner iface.
// outer_if oarr[A][B](), outer_if holds a single inner_if instance.
// Access via oarr[i][j].inner.data.
interface inner_if;
logic [7:0] data;
endinterface
interface outer_if;
inner_if inner ();
logic [7:0] tag;
endinterface
module t;
localparam int A = 2;
localparam int B = 2;
outer_if oarr[A-1:0][B-1:0] ();
genvar gi, gj;
generate
for (gi = 0; gi < A; gi++) begin : g_a
for (gj = 0; gj < B; gj++) begin : g_b
initial begin
oarr[gi][gj].tag = 8'(gi * 16 + gj);
oarr[gi][gj].inner.data = 8'(gi * B + gj + 100);
end
end
end
endgenerate
logic [7:0] chk_tag[A-1:0][B-1:0];
logic [7:0] chk_inner[A-1:0][B-1:0];
generate
for (gi = 0; gi < A; gi++) begin : g_a_chk
for (gj = 0; gj < B; gj++) begin : g_b_chk
always_comb chk_tag[gi][gj] = oarr[gi][gj].tag;
always_comb chk_inner[gi][gj] = oarr[gi][gj].inner.data;
end
end
endgenerate
initial begin
#1;
for (int i = 0; i < A; i++) begin
for (int j = 0; j < B; j++) begin
if (chk_tag[i][j] !== 8'(i * 16 + j)) begin
$write("%%Error: oarr[%0d][%0d].tag=%0d expected %0d\n",
i, j, chk_tag[i][j], i * 16 + j);
$stop;
end
if (chk_inner[i][j] !== 8'(i * B + j + 100)) begin
$write("%%Error: oarr[%0d][%0d].inner.data=%0d expected %0d\n",
i, j, chk_inner[i][j], i * B + j + 100);
$stop;
end
end
end
$write("*-* All Finished *-*\n");
$finish;
end
endmodule