Лучше не думать о
reg [1022:0] my_array[1022:0];
как о массиве 1023 на 1023;лучше всего думать о нем как о массиве из 1023 1023-битных чисел.Это истинный массив 1023 на 1023:
reg my_array[1022:0][1022:0];
SystemVerilog обобщает массивы и вводит новую терминологию, которая полезна при разговоре о Verilog.(В любом случае, Verilog - это только неофициальное подмножество SystemVerilog.) В SystemVerilog вы объявляете массивы следующим образом
<type> <packed dimensions> <name> <unpacked dimensions>
Итак, эквивалент вашего исходного объявления будет
logic [1022:0] my_array [1022:0];
первый [1022:0]
- это упакованный размер , а второй [1022:0]
- неупакованный размер .В SystemVerilog вы можете иметь столько упакованных измерений, сколько вам нужно, и столько распакованных размеров, сколько хотите.В Verilog вы можете иметь столько распакованных размеров, сколько вам нужно, но вы можете иметь только одно распакованное измерение .
Правила доступа к упакованным измерениям отличаются от правил доступа к неупакованным измерениям.В принципе, правила доступа к неупакованным размерам гораздо более строгие.(Вот почему вы чувствуете разницу в поведении между строками и столбцами.) По сути, для неупакованных измерений вы можете либо
- получить доступ к одному элементу, либо
- получить доступ ко всему массиву водин раз.
Вот и все.Поэтому, когда вы имеете дело с неупакованным измерением, вам придется использовать какой-то цикл, чтобы делать то, что вы хотите.И, если вы действительно работаете с массивом 1023 на 1023 однобитных числа, то, учитывая, что всегда будет больше работы для доступа к распакованным измерениям, вы можете рассмотреть возможность распаковки обоих измерений и использования циклов для обоих измерений..