我具有以下结构:
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中较大的一个,然后将其用作上面[???]部分中的范围文字?
还是我需要手动或通过预处理器“定义”来计算?
答案 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
构造,但是在不知道您需要怎么做的情况下很难说。