systemverilog конкатенация распакованных массивов - PullRequest
2 голосов
/ 24 марта 2020

Я пытаюсь создать распакованный массив следующим образом:

logic [3:0] AAA[0:9];

Я хотел бы инициализировать этот массив следующими значениями:

AAA = '{1, 1, 1, 1, 2, 2, 2, 3, 3, 4};

Для эффективности I ' Я хотел бы использовать конструкции повторения, но это когда вещи разваливаются. Это невозможно или неправильно пишу? Любая помощь приветствуется.

AAA = { '{4{1}}, '{3{2}}, '{2{3}}, 4 };

Ответы [ 3 ]

1 голос
/ 25 марта 2020

У меня было другое решение, но я не уверен, что оно может быть синтезировано. Будет ли работать потоковый оператор здесь? По сути, я беру литерал упакованного массива и передаю его в структуру данных AAA. Я положил его на EDA Playground

module tb;

  logic [3:0] AAA[0:9];

  initial begin
    AAA = { >> int {
      {4{4'(1)}},
      {3{4'(2)}},
      {2{4'(3)}},
      4'(4)
    } };
    $display("%p",AAA);
  end

endmodule

Вывод:

Compiler version P-2019.06-1; Runtime version P-2019.06-1;  Mar 25 11:20 2020
'{'h1, 'h1, 'h1, 'h1, 'h2, 'h2, 'h2, 'h3, 'h3, 'h4} 
           V C S   S i m u l a t i o n   R e p o r t 
Time: 0 ns
CPU Time:      0.580 seconds;       Data structure size:   0.0Mb
Wed Mar 25 11:20:07 2020
Done
1 голос
/ 25 марта 2020

Во-первых, используемая вами конструкция фактически называется оператором репликации . Это может помочь вам в будущих поисках, например, в 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}}
0 голосов
/ 25 марта 2020

Вы не можете выполнить произвольную репликацию распакованных элементов массива.

Если ваш код не нуждается в синтезе, вы можете сделать

module top;
  typedef logic [3:0] DAt[];

  logic [3:0] AAA[0:9];

  initial begin
    AAA = {DAt'{4{1}}, DAt'{3{2}}, DAt'{2{3}}, 4};
    $display("%p",AAA);
  end
endmodule
...