Verilog многомерная ошибка

Это утверждение:

reg [7:0] register_file [3:0] = 0;

Выдает эту ошибку:

Error (10673): SystemVerilog error at simpleprocessor.v(27): assignments to unpacked arrays must be aggregate expressions

Прежде всего, я использую Verilog, а не SystemVerilog, так почему он выдает ошибку SystemVerilog?

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

Было бы так, чтобы мои регистры были доступны прямо из инструкции. Например, эта строка:

register_file[instruction[5:4]] <= register_file[instruction[3:2]] + register_file[instruction[1:0]];

Но это не работает. Есть идеи?

2 ответа

Решение

От SystemVerilog LRM:

Термин упакованный массив используется для обозначения измерений, объявленных перед именем идентификатора данных. Термин распакованный массив используется для обозначения измерений, объявленных после имени идентификатора данных.

bit [7:0] c1; // packed array of scalar bit types
real u [7:0]; // unpacked array of real types

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

logic [7:0] register_file [3:0] = {8'b0, 8'b0, 8'b0, 8'b0};

Если вы объявляете упакованный массив, вы можете назначить его так, как если бы он был плоским вектором:

logic [7:0][3:0] register_file = '0;

Вы подразумевали память, но не указали местоположение, которое будет установлено в 0.

Вы можете использовать агрегатные выражения, чтобы определить все значения в одной строке:

reg [7:0] register_file [3:0] = {8'b0, 8'b0, 8'b0, 8'b0};

Если это для FPGA, вы также можете использовать initial:

reg [7:0] register_file [3:0];
initial begin
  for(int i=0; i<4; i++) begin
    register_file[i] = 8'b0
  end
end

В этот момент петля может быть статически развернута и, следовательно, является синтезируемой.

NB Verilog обесценивается. Стандарт Verilog был объединен с SystemVerilog в 2009 году, последняя версия - SystemVerilog 2012.

Другие вопросы по тегам