// This program is free software; you can redistribute it and/or modify it // under the terms of either the GNU Lesser General Public License Version 3 // or the Perl Artistic License Version 2.0. // SPDX-FileCopyrightText: 2026 Wilson Snyder // SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0 // // DESCRIPTION: Minimal test for sibling interface typedef resolution // This is the SIMPLEST case that demonstrates the t_lparam_dep_iface10 failure pattern: // - Two sibling cells of the same interface type with DIFFERENT parameters // - A module that accesses typedefs from BOTH siblings // // verilog_format: off `define stop $stop `define checkd(gotv,expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d: got=%0d exp=%0d (%s !== %s)\n", `__FILE__,`__LINE__, (gotv), (expv), `"gotv`", `"expv`"); `stop; end while(0); // verilog_format: on package rial; // Configuration structure typedef struct packed { // CCA Parameters int unsigned NumDd; // CC Parameters int unsigned DDNumStuff; int unsigned DDNumStuffThreads; } cfg_t; endpackage package cb; typedef struct packed { int unsigned XdatSize; // raw packet data size } cfg_t; endpackage interface ccia_types_if #( parameter rial::cfg_t cfg = 0 ) (); // 'base' types typedef logic [$clog2(cfg.DDNumStuff)-1:0] wave_index_t; // types for tb typedef struct packed { logic [3:0] e_cmd; logic en; logic csr; wave_index_t wave_index; logic [11:0] reg_addr; logic [64-(4+1+1+$clog2(cfg.DDNumStuff)+12)-1:0] pad0; } tl_reg_cmd_t; typedef struct packed {logic [63:0] raw;} tl_addr_cmd_t; typedef union packed { tl_reg_cmd_t rcmd; tl_addr_cmd_t acmd; } tl_data_fld_t; typedef union packed {tl_data_fld_t [cfg.DDNumStuffThreads-1:0] d_a;} cmd_data_t; typedef struct packed {cmd_data_t d;} cmd_beat_t; endinterface module rial_top #( parameter rial::cfg_t aer_cfg = 0 ) (); // for the types ccia_types_if #(aer_cfg) ccia_types (); // genvars and locally defined types typedef ccia_types.cmd_beat_t cmd_beat_t; // CB and RBUS localparam cb::cfg_t cb_cfg = '{XdatSize: $bits(cmd_beat_t)}; initial begin #1; `checkd($bits(ccia_types.tl_data_fld_t), 64); `checkd($bits(ccia_types.cmd_data_t), 512); `checkd($bits(cmd_beat_t), 512); `checkd(cb_cfg.XdatSize, 512); end endmodule // SOC Top w/IO and SOC configuration module rial_wrap (); parameter rial::cfg_t aer_cfg = '{ NumDd : 3, // CC Parameters DDNumStuff : 4, DDNumStuffThreads : 8 }; // DUT rial_top #(.aer_cfg(aer_cfg)) rial_top (); initial begin #2; $write("*-* All Finished *-*\n"); $finish; end endmodule