Подтвердить что ты не робот

Как объявить и использовать массивы 1D и 2D байтов в Verilog?

Как объявить и использовать массивы 1D и 2D байтов в Verilog?

например. как сделать что-то вроде

byte a_2D[3][3];
byte a_1D[3];

// using 1D
for (int i=0; i< 3; i++)
{
    a_1D[i] = (byte)i;
}

// using 2D
for (int i=0; i< 3; i++)
{
    for (int j=0; j< 3; j++)
    {
        a_2D[i][j] = (byte)i*j;
    }
}
4b9b3361

Ответ 1

Verilog думает в битах, поэтому reg [7:0] a[0:3] даст вам массив размером 4x8 (= массив размером 4x1 байт). Из этого вы получите первый байт с помощью a[0]. Третий бит второго байта - a[1][2].

Для двумерного массива байтов сначала проверьте свой симулятор/компилятор. Старые версии (до '01, я считаю) не поддержат это. Тогда reg [7:0] a [0:3] [0:3] даст вам 2D-массив байтов. Доступ к одному биту можно получить, например, с помощью a[2][0][7].

reg [7:0] a [0:3];
reg [7:0] b [0:3] [0:3];

reg [7:0] c;
reg d;

initial begin

   for (int i=0; i<=3; i++) begin
      a[i] = i[7:0];
   end

   c = a[0];
   d = a[1][2]; 


   // using 2D
   for (int i=0; i<=3; i++)
      for (int j=0; j<=3; j++)
          b[i][j] = i*j;  // watch this if you're building hardware

end

Ответ 2

В дополнение к Marty excellent Ответ, спецификация SystemVerilog предлагает тип данных byte. Следующее объявляет 4х8-битную переменную (4 байта), присваивает каждому байту значение, затем отображает все значения:

module tb;

byte b [4];

initial begin
    foreach (b[i]) b[i] = 1 << i;
    foreach (b[i]) $display("Address = %0d, Data = %b", i, b[i]);
    $finish;
end

endmodule

Это выдает:

Address = 0, Data = 00000001
Address = 1, Data = 00000010
Address = 2, Data = 00000100
Address = 3, Data = 00001000

Это похоже на концепцию Marty reg [7:0] a [0:3];. Однако byte - это тип данных с двумя состояниями (0 и 1), но reg - 4-состояние (01xz). Использование byte также требует вашей цепочки инструментов (симулятор, синтезатор и т.д.) Для поддержки этого синтаксиса SystemVerilog. Обратите внимание также на более компактный синтаксис цикла foreach (b[i]).

Спецификация SystemVerilog поддерживает широкий спектр типов многомерных массивов. LRM может объяснить их лучше, чем я могу; см. IEEE Std 1800-2005, глава 5.

Ответ 3

На самом деле просто, как и программирование на C, вам просто нужно передать индексы массива с правой стороны во время объявления. Но да, синтаксис будет как [0: 3] для 4 элементов.

reg a[0:3]; 

Это создаст 1D массива одного бита. Аналогично, 2D-массив может быть создан следующим образом:

reg [0:3][0:2];

Теперь в C предположим, что вы создаете 2D-массив из int, тогда он будет внутренне создавать 2D-массив из 32 бит. Но, к сожалению, Verilog - это HDL, поэтому он думает в битах, а не в кучке битов (хотя int datatype присутствует в Verilog), он может позволить вам создавать любое количество бит для хранения внутри элемента массива (что не является case с C, вы не можете хранить 5 бит в каждом элементе 2D-массива в C). Поэтому для создания 2D-массива, в котором каждый отдельный элемент может содержать 5-битное значение, вы должны написать это:

reg [0:4] a [0:3][0:2];