inicialización de la estructura del systemverilog con default = '1

1

¿Puede alguien arrojar luz sobre lo que debe hacer este código SystemVerilog:

typedef struct {
 logic [15:0] a;
 logic [15:0] b;
 logic [15:0] c;
} my_struct;

localparam my_struct s = '{default:'1, c:0};

¿Esto es legal? No puedo entender la especificación lo suficientemente bien como para decirlo. Esto no funciona bien con Vivado, y no estoy seguro de por qué.

Esto funciona:

localparam my_struct s = '{default:0, c:'1};

Gracias, Nachum

    
pregunta nachum

2 respuestas

3

Sí, es legal SystemVerilog. Consulte IEEE Std 1800-2012 § 10.9 Patrones de asignación

my_struct s = '{default:'1, c:0}; es equivalente a my_struct s = '{a:16'hFFFF, b:16'hFFFF, c:16'h0000};
my_struct s = '{default:0, c:'1}; es equivalente a my_struct s = '{a:16'h0000, b:16'h0000, c:16'hFFFF};

Su versión Vivado podría no haber implementado aún la función default:'1 o podría ser un error en el simulador. Intenta ejecutar la última versión.

Intente con default:16'hFFFF o default:-1 como sea posible.

    
respondido por el Greg
1

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}};
    
respondido por el Joniale

Lea otras preguntas en las etiquetas