在systemverilog中查找可合成数据类型的最大位宽

时间:2016-06-20 13:58:01

标签: struct typedef system-verilog

我有许多用户定义的数据类型(所有打包的结构)。我想确定这些数据类型中最大的数据类型的位宽,并创建一个这种大小的平面数组。

我的第一次尝试是使用联合并找到它的大小。但是,我正在编译Altera 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 个答案:

答案 0 :(得分:1)

SystemVerilog没有指定解压缩联合的布局,所以即使综合工具支持它,你所写的内容也无法满足你的期望。

你可以做的是创建一个MAX函数。

<ol class="songlist">
  <li><a href="linktoURL">Song Title</a></li>
  <li><a href="linktoURL">Song Title</a></li>
  <li><a href="linktoURL">Song Title</a></li>
  <li><a href="linktoURL">Song Title</a></li>
  <li><a href="linktoURL">Song Title</a></li>
</ol>