Как правильно объявить N-мерную очередь встроенной в SystemVerilog? - PullRequest
1 голос
/ 15 февраля 2020

Если у меня есть 2D-очередь целых, я бы ожидал, что смогу объявить ее встроенной, например:

int my_queue[$][$] = {{1, 2}, {3, 4}};

Я также видел

typedef int int_queue[$];
int_queue my_queue[$] = {{1, 2}, {3, 4}};

Вместо этого, когда я во время компиляции VCS выдает ошибку «Несовместимый комплексный тип»:

  Type of source expression is incompatible with type of target expression. 
  Mismatching types cannot be used in assignments, initializations and 
  instantiations. The type of the target is 'int$[$][$]', while the type of 
  the source is 'bit[63:0]'.

. Это означает, что VCS ожидает правильного преобразования правой части уравнения. Обходной путь, который я использовал:

typedef int int_queue[$];
typedef int_queue int_queue_of_queues[$];
int_queue_of_queues my_queue = int_queue_of_queues'{{1, 2}, {3, 4}};

Но это добавляет N дополнительных typedefs и строк для N измерений, и я бы предпочел сделать это в одну строку. Если бы у меня был способ привести правую часть объявления без typedef, то это было бы просто, но я не знаю, возможно ли это.

1 Ответ

2 голосов
/ 16 февраля 2020

Синтаксис объединения массивов работает только для одного измерения. Вы не можете вкладывать {} из-за случаев неоднозначности между массивом {} и интегральной {} конкатенацией. Вам необходимо использовать шаблон назначения массива во внешнем или обоих измерениях. Я предпочитаю использовать шаблоны присваивания для обоих измерений, чтобы было понятнее, что это элементы массива, а не интегральные объединения.

int my_queue[$][$] = '{'{1, 2}, '{3, 4}};

См. Раздел 10.10 Объединение неупакованных массивов в LRM IEEE 1800-2017.

...