Una forma de definir estructuras complejas se puede explicar con un ejemplo.
Sea la siguiente estructura, que es una estructura de matrices de enteros y una subestructura llamada: AXI_PRM_STRCT
//local constant
localparam int MAX_AXI_INTERCONNECT_PORTS=5;//maximun number of input or output ports, the max_input+max_output=10 ports for interconnect
//The sub-struct
typedef struct {
int VERSION = 3; //Default value, this is overwritten in top package
int AXI_LEN_BW = 4;//Default value, this is overwritten in top package
int AWUSER_BW = 0;
int WUSER_BW = 0;
int BUSER_BW = 0;
int ARUSER_BW = 0;
int RUSER_BW = 0;
} axi_extend_param_struct_type;
//the complex/compound struct
typedef struct {
//string AXI_INTERFACE_STRG_ID="";
int N_PORTS_USED=1;
int AXI_ADDRWIDTH[MAX_AXI_INTERCONNECT_PORTS] = '{MAX_AXI_INTERCONNECT_PORTS{32}};//Array values all the same
int AXI_DATAWIDTH[MAX_AXI_INTERCONNECT_PORTS] = '{MAX_AXI_INTERCONNECT_PORTS{32}};//Array values all the same
int AXI_ID_BW[MAX_AXI_INTERCONNECT_PORTS] = '{MAX_AXI_INTERCONNECT_PORTS{1}};//Array values all the same
axi_extend_param_struct_type AXI_PRM_STRCT [MAX_AXI_INTERCONNECT_PORTS];
} axi_interconnect_struct_type;
Esa estructura compleja se puede inicializar con literales de la siguiente manera:
localparam axi_extend_param_struct_type AXI_PRM_STRCT = '{VERSION:3, AXI_LEN_BW:8, AWUSER_BW:32, WUSER_BW:32, BUSER_BW:32, ARUSER_BW:32, RUSER_BW:32};
localparam axi_interconnect_struct_type INPUT_MAST_INTF_STRCT_ARR = '{N_PORTS_USED:2, AXI_ADDRWIDTH:'{MAX_AXI_INTERCONNECT_PORTS{32}}, AXI_DATAWIDTH:'{MAX_AXI_INTERCONNECT_PORTS{32}}, AXI_ID_BW:'{MAX_AXI_INTERCONNECT_PORTS{4}}, AXI_PRM_STRCT:'{MAX_AXI_INTERCONNECT_PORTS{AXI_PRM_STRCT}}};
Hay otras formas de iniciar con literales
localparam axi_interconnect_struct_type INPUT_MAST_INTF_STRCT_ARR = '{N_PORTS_USED:2, AXI_ADDRWIDTH:'{32,32,32,32,32}, AXI_DATAWIDTH:'{32,32,32,32,32}, AXI_ID_BW:'{4,4,4,4,4}, AXI_PRM_STRCT:'{AXI_PRM_STRCT,AXI_PRM_STRCT,AXI_PRM_STRCT,AXI_PRM_STRCT,AXI_PRM_STRCT}};