2016-06-20 14 views
0

Ich habe eine Reihe von benutzerdefinierten Datentypen (alle gepackten Strukturen). Ich möchte die Bitbreite des größten dieser Datentypen bestimmen und ein flaches Array dieser Größe erstellen.Finden Sie die größte Bitbreite von synthetisierbaren Datentypen in Systemverilog

Mein erster Versuch war es, eine Union zu verwenden und ihre Größe zu finden. Ich kompiliere jedoch für ein Altera FPGA und Quartus unterstützt keine SystemVerilog-Gewerkschaften. Welche anderen Möglichkeiten habe ich, dies programmatisch zu tun? Mein Union-Code, der nicht in Quartus kompiliert wird, ist unten gezeigt.

typedef logic [7:0] uint8_t; 
typedef logic [15:0] uint16_t; 
typedef logic [31:0] uint32_t; 
typedef logic [63:0] uint64_t; 

typedef struct packed 
{ 
    uint8_t field_1; 
    uint16_t field_2; 
} struct_1_t; 

typedef struct packed 
{ 
    uint8_t field_1; 
    uint16_t field_2; 
    uint32_t field_3; 
} struct_2_t; 

typedef struct packed 
{ 
    uint8_t field_1; 
    uint16_t field_2; 
    uint32_t field_3; 
    uint64_t field_4; 
} struct_3_t; 

typedef union 
{ 
    struct_1_t struct_1; 
    struct_2_t struct_2; 
    struct_3_t struct_3; 
} all_structs_t; 

localparam MAX_STRUCT_SIZE = $bits(all_structs_t); 
logic [MAX_STRUCT_SIZE-1:0] the_buffer; 

Antwort

1

SystemVerilog spezifiziert nicht das Layout der entpackten Gewerkschaften, so was Sie geschrieben haben würden Sie nicht, was Sie erwarten, auch wenn Synthese-Tools es unterstützt.

Was Sie tun können, ist eine MAX-Funktion erstellen.

function int MAX(int X, Y); 
return (X> Y) ? X : Y; 
endfunction 
localparam MAX_STRUCT_SIZE = MAX($bits(struct_1_t), MAX($bits(struct_1_t),$bits(struct_1_t)));