2016-06-20 7 views
0

私はいくつかのユーザー定義データ型(すべてのパックド構造体)を持っています。これらのデータ型の中で最大のビット幅を決定し、このサイズのフラットな配列を作成したいと思います。systemverilogで合成可能なデータ型の最大ビット幅を見つける

私の最初の試みは、ユニオンを使用し、そのサイズを見つけることでした。しかし、私はアルテラFPGA用にコンパイルしており、QuartusはSystemVerilogユニオンをサポートしていません。これをプログラマチックに行うには他にどのようなオプションがありますか? Quartusでコンパイルされない共用体コードを以下に示します。

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; 

答えて

1

SystemVerilogのは、あなたが合成ツールがそれをサポートしていても期待する何を与えないだろう書いたので、何を、アンパック組合のレイアウトを指定しません。

あなたができることは、MAX関数を作成することです。

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))); 
関連する問題