Автоматически дополняет упакованные структуры SystemVerilog, чтобы их можно было объединить - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть следующие структуры:

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 и затем использовать его как литерал диапазона в разделе [???] выше?

Или мне нужно вычислитьэто вручную или через препроцессор `define?

1 Ответ

0 голосов
/ 01 февраля 2019

Дилемма здесь заключается в том, что только один член профсоюза должен быть дополнен до размера другого члена.Но вы не можете иметь член структуры с шириной 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, но сложная задача).не зная больше, что нужно с этим делать.

...