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.