Во-первых, используемая вами конструкция фактически называется оператором репликации . Это может помочь вам в будущих поисках, например, в SystemVerilog LRM .
Во-вторых, вы используете объединение массивов , а не присвоение массива в вашем последнем блоке кода (обратите внимание на отсутствующий апостроф '
). LRM приводит следующий (простой) пример в Разделе 10.10.1 (Конкатенации распакованных массивов по сравнению с шаблонами назначения массивов), чтобы объяснить разницу:
int A3[1:3];
A3 = {1, 2, 3}; // unpacked array concatenation
A3 = '{1, 2, 3}; // array assignment pattern
LRM в том же разделе говорит, что
... конкатенации неупакованных массивов запрещают репликацию , дефолт и явную типизацию, но они обеспечивают дополнительную гибкость составления значения массива из произвольного набора элементов и массивов.
int A9[1:9];
A9 = {9{1}}; // illegal, no replication in unpacked array concatenation
Давайте также рассмотрим альтернативу: присвоение массива. В том же разделе LRM упоминает, что элементы
... в шаблоне назначения могут быть реплицированы с использованием синтаксиса, такого как '{ n{element} }
, и могут использоваться по умолчанию с использованием синтаксиса default:
. Однако каждый элемент элемента в шаблоне назначения массива должен быть того же типа, что и тип элемента целевого массива.
Если преобразовать его в назначение массива (добавив апостроф), ваш код фактически переводится в:
AAA = '{'{1,1,1,1}, '{2,2,2}, '{3,3}, 4};
Это означает, что интерпретатор SystemVerilog будет видеть только 4 элемента и будет жаловаться, что в назначении было дано слишком мало элементов.
В разделе 10.9.1 ( Шаблоны присвоения массивов), LRM говорит следующее об этом:
Конкатенационные скобки используются для создания и деконструкции простых битовых векторов. Аналогичный синтаксис используется для поддержки построения и деконструкции массивов. Выражения должны соответствовать элементу для элемента, а фигурные скобки должны соответствовать размерам массива. Каждый элемент выражения должен оцениваться в контексте присвоения типу соответствующего элемента в массиве.
[...]
Синтаксис, напоминающий репликации (см. 11.4.12.1), также может использоваться в шаблонах назначения массива. Каждая репликация должна представлять все одно измерение.
Чтобы помочь интерпретировать текст, выделенный жирным шрифтом в приведенной выше цитате, LRM приводит следующий пример:
int n[1:2][1:3] = '{2{'{3{y}}}}; // same as '{'{y,y,y},'{y,y,y}}