Управление столбцами в двумерном массиве в Verilog

Я работаю с МАТРИЦЕЙ 1023 * 1023 в Verilog. Я пытаюсь сделать следующее: 1) Выберите каждую строку по одной, внесите некоторые изменения, запишите вывод обратно в соответствующую строку. Например, я сначала выбираю row0, вношу в нее изменения и записываю вывод обратно в row0. Я делаю это для всех 1023 строк. 2) Затем я выбираю каждый столбец по одному, делаю некоторые изменения, а затем записываю данные обратно.

Я могу создать двумерный массив, например reg [1022:0] my_array[1022:0]. Теперь доступ к строкам прост. Я могу написать my_array[0] для доступа к первой строке и так далее. Но как мне получить доступ к столбцам?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
941
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Лучше не думать

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, то, учитывая, что всегда будет больше работы для доступа к распакованным измерениям, вы можете рассмотреть возможность распаковки обоих измерений и использования циклов для обоих измерений. .

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