自动填充SystemVerilog打包的结构,以便可以将它们放入联合

时间:2019-01-31 22:41:02

标签: struct system-verilog

我具有以下结构:

typedef struct packed {
  logic vld;
  logic [`ADDR_RNG] addr;
  logic [`CMD_RNG] cmd;
  logic [`IDX_RNG] idx;
} pkt1Type_t;

typedef struct packed {
  logic vld;
  logic [`ADDR2_RNG] addr;
  logic [`CMD_RNG] cmd;
  logic [`IDX_RNG] idx;
} pkt2Type_t;

typedef struct packed {
  logic [???] padding;
  pkt1Type_t pkt;
} pkt1TypePadded_t;
typedef struct packed {
  logic [???] padding;
  pkt2Type_t pkt;
} pkt2TypePadded_t;

typedef union packed {
  pkt1TypePadded_t pkt1;
  pkt2TypePadded_t pkt2;
} pkt_t;

ADDR_RNG和ADDR2_RNG可以不同。

据我了解,用于设计(可综合)的SV结构必须具有相同的大小。有没有一种编程的方法来计算pkt1Type_t和pkt2Type_t的大小,找到2中较大的一个,然后将其用作上面[???]部分中的范围文字?

还是我需要手动或通过预处理器“定义”来计算?

1 个答案:

答案 0 :(得分:2)

这里的困境是只有一个工会会员需要填补另一会员的大小。但是您不能拥有宽度为0的结构成员。因此,您的压缩联合必须比最大成员至少宽1位

parameter MAXSIZE = ($bits(pkt1Type_t) > $bits(pkt2Type_t)) ? 
               $bits(pkt1Type_t) : $bits(pkt2Type_t);

typedef struct packed {
  logic [MAXSIZE-$bits(pkt1Type_t):0] padding;
  pkt1Type_t pkt;
} pkt1TypePadded_t;
typedef struct packed {
  logic [MAXSIZE-$bits(pkt2Type_t):0] padding;
  pkt2Type_t pkt;
} pkt2TypePadded_t;

typedef union packed {
  pkt1TypePadded_t pkt1;
  pkt2TypePadded_t pkt2;
} pkt_t;

针对您要尝试的工作可能有更好的方法(即,标记的联合,let构造,但是在不知道您需要怎么做的情况下很难说。